13.3. セキュアリモートパスワード (SRP) の例
本項で示す例では SRP によるユーザーのクライアント側認証だけでなく、ユーザーの資格情報として SRP セッションチャレンジを使用したシンプルな EJB へのセキュアな後続のアクセスについても説明しています。テストコードは、サーバー側のログインモジュール設定と SRP サービスの設定に対する SAR を含む EJB JAR をデプロイします。
サーバー側のログインモジュール設定は、
SecurityConfig MBean を使用して動的にインストールされます。この例では SRPVerifierStore インターフェースのカスタム実装も使用されています。インターフェースは SRPVerifierStoreService により使用されるようなシリアル化されたオブジェクトストアではなく、Java プロパティファイルからシードされるインメモリストアを使用します。
このカスタムサービスは
org.jboss.book.security.ex3.service.PropertiesVerifierStore です。サンプルの EJB と SRP サービスを含む JAR のコンテンツを次に示します。
[examples]$ jar tf output/security/security-ex3.jar META-INF/MANIFEST.MF META-INF/ejb-jar.xml META-INF/jboss.xml org/jboss/book/security/ex3/Echo.class org/jboss/book/security/ex3/EchoBean.class org/jboss/book/security/ex3/EchoHome.class roles.properties users.properties security-ex3.sar
この例の重要な SRP 関連項目は SRP MBean サービス設定と SRP ログインモジュール設定です。
security-ex3.sar の jboss-service.xml 記述子は 例13.3「security-ex3.sar jboss-service.xml 記述子」 で説明します。
例のクライアント側およびサーバー側のログインモジュール設定は 例13.4「クライアント側標準 JAAS 設定」 と 例13.5「サーバー側 XMLLoginConfig 設定」 で説明します。
例13.3 security-ex3.sar jboss-service.xml 記述子
<server>
<!-- The custom JAAS login configuration that installs
a Configuration capable of dynamically updating the
config settings -->
<mbean code="org.jboss.book.security.service.SecurityConfig"
name="jboss.docs.security:service=LoginConfig-EX3">
<attribute name="AuthConfig">META-INF/login-config.xml</attribute>
<attribute name="SecurityConfigName">jboss.security:name=SecurityConfig</attribute>
</mbean>
<!-- The SRP service that provides the SRP RMI server and server side
authentication cache -->
<mbean code="org.jboss.security.srp.SRPService"
name="jboss.docs.security:service=SRPService">
<attribute name="VerifierSourceJndiName">srp-test/security-ex3</attribute>
<attribute name="JndiName">srp-test/SRPServerInterface</attribute>
<attribute name="AuthenticationCacheJndiName">srp-test/AuthenticationCache</attribute>
<attribute name="ServerPort">0</attribute>
<depends>jboss.docs.security:service=PropertiesVerifierStore</depends>
</mbean>
<!-- The SRP store handler service that provides the user password verifier
information -->
<mbean code="org.jboss.security.ex3.service.PropertiesVerifierStore"
name="jboss.docs.security:service=PropertiesVerifierStore">
<attribute name="JndiName">srp-test/security-ex3</attribute>
</mbean>
</server>
例のサービスは
ServiceConfig、PropertiesVerifierStore MBean、SRPService MBean です。PropertiesVerifierStore の JndiName 属性は SRPService の VerifierSourceJndiName 属性と等しく、SRPService は PropertiesVerifierStore に依存していることに注意してください。これが必須な理由は、ユーザーのパスワード検証情報にアクセスするためには SRPService に SRPVerifierStore インターフェースの実装が必要なためです。
例13.4 クライアント側標準 JAAS 設定
srp {
org.jboss.security.srp.jaas.SRPLoginModule required
srpServerJndiName="srp-test/SRPServerInterface"
;
org.jboss.security.ClientLoginModule required
password-stacking="useFirstPass"
;
};
クライアント側ログインモジュール設定では JBoss サーバーコンポーネントの
SRPService JndiName 属性値 (srp-test/SRPServerInterface) に対応する srpServerJndiName オプション値を持つ SRPLoginModule を使用します。また SRPLoginModule により生成されたユーザー認証資格情報を EJB 呼び出しレイヤに伝播するために、ClientLoginModule は password-stacking="useFirstPass" 値で設定する必要があります。
例13.5 サーバー側 XMLLoginConfig 設定
<application-policy name="security-ex3">
<authentication>
<login-module code="org.jboss.security.srp.jaas.SRPCacheLoginModule"
flag = "required">
<module-option name="cacheJndiName">srp-test/AuthenticationCache</module-option>
</login-module>
<login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
flag = "required">
<module-option name="password-stacking">useFirstPass</module-option>
</login-module>
</authentication>
</application-policy>
サーバー側のログインモジュール設定について注意すべき点が 2 つあります。
cacheJndiName=srp-test/AuthenticationCache設定オプションは、SRPServiceに対して認証したユーザーのSRPServerSessionを含むCachePolicyの場所をSRPCacheLoginModuleに伝えます。この値はSRPServiceAuthenticationCacheJndiName属性値に相当します。- 設定には
password-stacking=useFirstPass設定オプションを持つUsersRolesLoginModuleが含まれます。SRP は認証技術でしかないため、SRPCacheLoginModuleを持つ第 2 のログインモジュールを使用する必要があります。関連付けられたパーミッションを決定するプリンシパルのロールを設定するためには、第 2 のログインモジュールはSRPCacheLoginModuleにより検証された認証資格情報を受け入れるように設定する必要があります。
UsersRolesLoginModule はプロパティファイルベースの承認で SRP 認証を補強しています。ユーザーのロールは EJB JAR に含まれる roles.properties ファイルから取得されます。
ブックサンプルのディレクトリから次のコマンドを実行して例の 3 クライアントを実行します。
[examples]$ ant -Dchap=security -Dex=3 run-example
...
run-example3:
[echo] Waiting for 5 seconds for deploy...
[java] Logging in using the 'srp' configuration
[java] Created Echo
[java] Echo.echo()#1 = This is call 1
[java] Echo.echo()#2 = This is call 2examples/logs ディレクトリの ex3-trace.log ファイルには、SRP アルゴリズムのクライアント側の詳細トレースが含まれています。トレースは公開キー、チャレンジ、セッションキー、検証の構成を順を追って示しています。
他のシンプルな例と比べて、クライアントは実行するのに長時間かかります。その理由はクライアントの公開キーの構成にあります。これには強固な暗号化形式の乱数の作成が含まれ、このプロセスを初めて実行する場合はより長くかかります。同じ VM 内での後続の認証試行ははるかに速くなります。
Echo.echo()#2 は認証例外で失敗することに注意してください。クライアントコードは SRPService キャッシュの有効期限の動作を示すための最初の呼び出し後 15 秒間はスリープします。SRPService キャッシュポリシーのタイムアウトはこれを強制するため 10 秒に設定されています。「セキュアリモートパスワード (SRP) の例」 で述べたとおり、キャッシュタイムアウトは正しく設定しなければなりません。そうしないと、失敗時に再認証を行う必要があります。