概要

クライアント証明書をユーザ毎に異なるものを発行して運用している環境で、クライアント証明書のみによる認証を行ってSSLVPN接続を実現している場合、APMでは1ユーザあたりのセッション数を制限する設定がそのままでは動作しません。クライアント証明書認証の場合にユーザあたりのセッション数を制限する方法について紹介します。

詳細手順

BIG-IP APMでは、Virtual Serverに割り当てるAccess Profilesの設定では下記のようなパラメータがあらかじめ用意されています。(画面はv11.6のものです)

※クリックすると拡大します

Inactivity Timeout
セッションにアクティビティがない場合、どれくらいの時間でセッションを失効させるかの設定(秒)

Access Policy Timeout
VPEのSTARTからEnding(Allow、Deny等)に到達するまでの間にこの値を超えたらセッションを失効させる設定(秒)ログオン画面で放置された場合などを想定したタイムアウト値

Maximum Session Timeout
1セッションあたりの最大時間(秒)

Minimum Authentication Failure Delay
Maximum Authentication Failure Delay
認証失敗時にMinimum~Maximumの間の乱数秒だけ意図的に待ってから再度ログオンページを出す。Active Directory、HTTP、Kerberos、LDAP、local user database、one-time password verification、Oracle Access Manager、RADIUS、SecurID、TACACS+で使用可能。Access Policy Timeoutの半分以下の値にするのが常識的

Max Concurrent Users
最大同時接続ユーザ数。Access Profile毎に最大値を制限することで複数APMサービスに対しAccess Session数の割り振りができる

Max Sessions Per User
1ユーザあたりの最大セッション数。1~1000で設定可能

Max In Progress Sessions Per Client IP
VPEのSTARTからEnding(Allow, Deny等)に到達するまでのセッション数をクライアントIPに対して制限する。デフォルト値は128。0にすることで無制限になるがセキュリティ上推奨しない

Restrict to Single Client IP
1セッションに対して1IPアドレスに制限

ここで設定可能な Max Sessions Per User の設定は通常、BIG-IP APMのLogon Pageでユーザが入力したユーザ名(username)が識別される形となるため、このままではクライアント証明書認証を行ったユーザは特にLogon Pageでユーザ名を入力してログオンしていないため、ユーザあたりの制限が正しく動作しません。

この問題を解決するためには、クライアント証明書の情報をクライアント証明書が全ユーザに同一のものが配布されている場合は区別しようがありませんが、ユーザを区別する情報をクライアント証明書のSubject情報などから取得してユーザ名であるとAPMに認識させることで、ユーザあたりのセッション数制限を正しく動作させることができるようになります。

その場合、APMにユーザ名として識別させるために、session.で始まるAPMのセッション変数をVariable Assignで定義することで実現できます。具体的には、下記のセッション変数を

session.logon.last.username : Reportの部分に表示されるユーザ名
session.logon.last.logonname : Max sessions per userの設定で識別されるユーザ名

をクライアント証明書のSubjectやシリアル番号などの情報から取得して設定する必要があります。例えば、クライアント証明書のSubject情報が

emailAddress=kitty@pslab.local,CN=Hello Kitty,OU=IT,O=HELLO KITTY COMPANY,ST=TOKYO,C=JP

となっているとセッション変数session.ssl.cert.subjectにクライアント証明書のSubject情報が入ります。このSubject情報のうち、2つめの要素の Hello Kitty をユーザ名として識別したい場合、

[On-Demand Cert Auth]あるいは[Client Cert Auth]などの後ろに[Variable Assign]というアイテムを追加して

session.logon.last.username
expr { [lindex [split [lindex [split [mcget {session.ssl.cert.subject}] ,] 1] =] 1] }

session.logon.last.logonname
expr { [lindex [split [lindex [split [mcget {session.ssl.cert.subject}] ,] 1] =] 1] }

の2つのセッション変数を定義します。この青字の部分は、Subject情報のうち , (カンマ)区切りして2つ目の要素を取り出し(CN=Hello Kitty)ます。次にオレンジ色の部分はCN=Hello Kittyから = (等号)区切りして2つ目の要素を取り出し(Hello Kitty)ます。

emailAddress=kitty@pslab.local,CN=Hello Kitty,OU=IT,O=HELLO KITTY COMPANY,ST=TOKYO,C=JP

設定例

※クリックすると拡大します

こうすると、APMのReport画面より

※クリックすると拡大します

のようにユーザ名の確認と、Max sessions per user制御が有効になります。また、Max sessions per userを2以上にした場合、同じクライアントルート証明書により発行された別のユーザも

※クリックすると拡大します

のように問題なくログオンできます。

このようにBIG-IP APMではセッション変数に対する操作を行うことでさまざまな設定を実現することができます。