UsernameToken を使用した Web サービス・クライアントの認証
WebSphere® Application Server Liberty では、OASIS Web Services Security UsernameToken Profile 1.1 仕様がサポートされます。 この仕様は、Web サービス・クライアントが、ユーザー名を使用して、またオプションとしてパスワードまたはパスワードに相当するものを使用することで、Web サービス・プロバイダーに要求側を識別させる手段として UsernameToken を指定する方法を規定しています。 Web サービス・プロバイダーのポリシーを処理する、Liberty の Web Services Security (WS-Security) ランタイムは、この識別情報を使用してユーザーを認証することができます。
UsernameToken の要件は、WS-Security ポリシーのサポート・トークンのいずれかとして表されます。SupportingTokens、SignedSupportingTokens、SignedEndorsingSupportingTokens、SignedEncryptedSupportingTokens、EncryptedSupportingTokens などのサポート・トークン・アサーションの 1 つで必須トークンとして UsernameToken 要件を追加できます。
<sp:SupportingTokens>
<wsp:Policy>
<sp:UsernameToken
sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken11 />
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SupportingTokens>
ユーザー名またはパスワードを指定するという要件に加えて、UsernameToken に nonce および created タイム・スタンプを含めるようにポリシーを構成できます。
<sp:SupportingTokens>
<wsp:Policy>
<sp:UsernameToken
sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken11 />
<sp13:Created />
<sp13:Nonce />
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SupportingTokens>
<sp:SupportingTokens>
<wsp:Policy>
<sp:UsernameToken
sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken11 />
<sp:HashPassword />
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SupportingTokens>
nonce、created、および各種パスワード・タイプについては、 OASIS WS-Security ポリシー 1.3 仕様を参照してください。
Web サービス・クライアントでのユーザー名とパスワードの指定
Liberty の WS-Security フィーチャーには、UsernameToken を生成したときにクライアント・アプリケーションにユーザー名とパスワードを示すための方法が複数用意されています。ユーザー名とパスワードはプログラムで設定するか、server.xml ファイルで設定することができます。
クライアントは、server.xml ファイルに指定されたユーザー名とパスワードで UsernameToken を生成することができます。 server.xml ファイル内のユーザー名とパスワードはデフォルト構成と見なされ、 クライアントの Web サービス呼び出しの RequestContext に指定された内容でオーバーライドされます。
<wsSecurityClient id="default"
ws-security.username="alice"
ws-security.callback-handler="com.acme.PasswordCallback"
</wsSecurityClient>
- ws-security.username - ユーザー名
- ws-security.password - ws-security.callback-handler が定義されていない場合、ユーザー・パスワード
- ws-security.callback-handler - パスワードの取得に使用される CallbackHandler 実装クラス
Map<String, Object> requestCtx = ((BindingProvider)port).getRequestContext();
requestCtx.put("ws-security.username", "bob_username");
requestCtx.put("ws-security.password", "bob_password");
Web サービス・プロバイダーでの UsernameToken のコンシューム
UsernameToken を受け取ると、WS-Security は自動的に Liberty セキュリティー・ユーザー・レジストリーを使用して、ユーザー名とパスワード (パスワードが必要な場合) を検証します。UsernameToken のパスワードの型が PasswordDigest であるか、派生した鍵を使用している場合は、パスワード・コールバック・ハンドラーの ws-security.callback-handler 実装を server.xml ファイルで構成して、その実装を提供する必要があります。 このコールバック・ハンドラーは、WS-Security ランタイムが SOAP メッセージの値と比較するためにダイジェスト値を計算できるように、 必要なすべてのユーザー名に対して有効なパスワードを戻さなければなりません。 ダイジェスト値の比較が正常に完了すると、ユーザー名とパスワードはユーザー・レジストリーに対して検証されます。
<wsSecurityProvider id="default"
ws-security.callback-handler="com.acme.PasswordCallback"
</wsSecurityProvider>
パスワードの CallbackHandler
パスワードの CallbackHandler は、 WS-Security がユーザー・パスワードの取得に使用します。 Liberty では、このパスワードの CallbackHandler クラスを Liberty フィーチャーとしてパッケージ化する必要があります。パスワードの CallbackHandler について詳しくは、 『WS-Security 用のパスワード・コールバック・ハンドラーの開発』を参照してください。
コールバック・ハンドラー実装の要件と制限について詳しくは、 『X.509 トークンを使用した Web サービスの保護』の 『秘密鍵のパスワードの CallbackHandler』のセクションを参照してください。
SOAP メッセージ内の UsernameToken の保護
<UsernameToken>
<Username>myusername</Username>
<Password
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">
mypassword
</Password>
</UsernameToken>
PasswordText で UsernameToken を送信する場合は、 HTTPS の使用や EncryptedSupportingToken ポリシー・アサーションによるトークンの暗号化など、メッセージに追加の保護を検討してください。 ポリシーで HTTPS トランスポートを使用する必要性について詳しくは、 『Liberty: Web Services Security HTTPS トランスポートのポリシー・アサーション』を参照してください。
UsernameToken 鍵派生
Web Services Security UsernameToken Profile 1.1 仕様では、次のように記述されています。
ユーザー名に関連付けられたパスワードは、メッセージ内容を保護する保全性や機密性を目的として共有秘密鍵の派生に使用することができます。
パスワードは各種攻撃の対象になり、それが派生鍵の漏えいにつながることに注意する必要があります。 この鍵派生手順では、鍵への攻撃のリスクをできる限り最小に抑えることを意図していますが、 人間が記憶して標準キーボードで入力することが可能であるというパスワードの危険性によって究極的に限界があります。
パスワードから鍵を派生できるようにするには、追加で 2 つのエレメントが必要です。 それらは <wsse11:Salt> と <wsse11:Iteration> です。 これらの値は秘密ではなく、鍵派生の使用時に Username トークンで伝達される必要があります。 鍵派生が使用される場合、パスワードを Username トークンに含めてはなりません。 受信側は、パスワードの情報を利用して、送信側と同じ鍵を派生します。
プロバイダー・アプリケーションについて、UsernameToken が鍵派生を使用している場合は、パスワード・コールバック・ハンドラーの ws-security.callback-handler 実装を server.xml ファイルで構成して、その実装を提供する必要があります。
<sp:SymmetricBinding>
<wsp:Policy>
<sp:ProtectionToken>
<wsp:Policy>
<sp:UsernameToken
sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken10 />
<sp:RequireDerivedKeys />
</wsp:Policy>
</sp:UsernameToken>
<wsp:Policy>
</sp:ProtectionToken>
</wsp:Policy>
</sp:SymmetricBinding>
<wsse:UsernameToken wsse:Id="...">
<wsse:Username>...</wsse:Username>
<wsse11:Salt>...</wsse11:Salt>
<wsse11:Iteration>...</wsse11:Iteration>
</wsse:UsernameToken>