Agility 2015テクニカル講座「APM実践応用編」課題1の回答 (APMでグループごとに接続元のアクセス制御する方法)
今回から複数回に渡り、2015年2月25日に行われたF5のイベントAgility 2015の中のテクニカル講座「APM実践応用編」の最後に出題されたAPMの5つの課題の回答について順番に紹介させていただきます。
回答は2015年5月15日で締め切りとさせていただき、正解者には粗品ながらプレゼントをお送りさせていただきました。お忙しいところのご参加ありがとうございました。
今回は課題1の「グループごとに接続元のアクセス制御」を行う方法について詳しく紹介いたします。具体的な利用シーン、利用例として、下記のようなケースが考えられるときに役に立つソリューションです。
課題1 グループごとに接続元のアクセス制御
あるお客様で、LDAP Attributeの特定のグループ “MyGroup” に属するユーザーのアクセスは特定のネットワークアドレス 10.24.0.0/12 からのみ許可したい。
グループ属性情報は
session.ldap.last.attr.grp = “MyGroup”
のセッション変数に書かれている。
これを実現するVPEアクセスポリシーを作成せよ。
これは、下記のような課題を抱えるお客様に実際に役立つソリューションとなります。
「イントラネット上のWebアプリケーションへのアクセス環境の提供に、APMを社外からのリモートアクセスだけでなく社内からのアクセスにも利用することを検討している。社内環境は社員と契約社員、外部の常駐員など、グループに応じてアクセスの制御を行うが、特定のITグループのメンバーは社外から接続することはあり得ないので、イントラネットの10.24.0.0/12のネットワークからの接続のみを許可したい」
回答例
まず、10.24.0.0/12からのアクセスのみ、という部分それ自体がトラップになっています。実際には10.24.0.0/12という表現は不適切で、10.16.0.0/12と解釈して10.24.0.0を含む10.16.0.0-10.31.255.254からのみアクセス許可するのか、それとも10.24.0.0/13と解釈して10.24.0.0-10.31.255.254からのみアクセス許可するのか、最初にお客様にこのあたりを最初にご理解いただいた上で正しい要件を確認し直すのが確実です。ここでは、お客様がサブネットマスクの指定をどこかで誤っており、10.24.0.0-10.31.255.254からのアクセスのみを許可したいという意図だったため、10.24.0.0/13が正しい要件だったとします。
次に、社内からのアクセスで利用するVirtual Serverに対し、Source Addressで10.24.0.0/13からのみを許可すれば良い、と安易に考えるケースもあるかも知れません。こうすると10.24.0.0/13以外からのアクセスを認めるために別のVirtual Serverを用意したり、Virtual Server毎に異なるAccess Profileを設定しなければならなくなるなどの問題が出てきます。ネットワーク環境によってはWAN側とLAN側で別のVirtual Serverを立てられないケースも出てくるため、安易にグループ対応のアクセス制御を目的にしたVirtual Serverを複数立てていくのは、ほぼナンセンスとなります。
Logon Pageで入力された資格情報を使用してLDAP Authとした後にLDAP Queryでグループ情報を取得するという流れになりますが、認証を通った後は
A) MyGroupで、かつIPアドレスが10.24.0.0/13の場合
B) MyGroupでない場合
のいずれもアクセス許可としたいため、ここではマクロを新しく作ります。マクロを作ることでマクロのOutは複数個設定可能で、上記のA)、B)いずれの場合もOK、それ以外の
C) MyGroupで、かつIPアドレスが10.24.0.0/13以外の場合
はNGとします。
こうすることで、分岐を増やすことなく同じAdvanced Resource Assignを共有できるメリットもありますが、仮にMyGroupの場合は割り当てるACLも異なる場合は上記の例ですとマクロのMyGroupIPChkの中で合わせてACLを割り当てておくと良いでしょう。
session.ldap.last.attr.grp = “MyGroup” を満たした場合にのみ追加のチェックを行うためのIsIPOKの部分は[Empty]から作成します。[Empty]アイテムを追加し、クライアントのIPアドレスが入ってくるAPMのセッション変数session.user.clientipをチェックするという形になります。
のようにEmptyを追加してから、今回は10.24.0.0/13なので8つしかないためOR構文で複数条件を接続して
のような形で記述するのも一つの方法です。この場合は8つで済むためまだ楽ですが、数十、数百の条件をORで接続するのはエレガントではないほか、この条件文に記述できる長さにも制限がありますので、汎用的なものとしては
のようにcidrAddrにCIDR形式のネットワークアドレス/マスクを記述する形にするのも一つの方法です。