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 ポリシーのサポート・トークンのいずれかとして表されます。SupportingTokensSignedSupportingTokensSignedEndorsingSupportingTokensSignedEncryptedSupportingTokensEncryptedSupportingTokens などのサポート・トークン・アサーションの 1 つで必須トークンとして UsernameToken 要件を追加できます。

以下の例は、パスワード・テキストを含む UsernameToken を SOAP メッセージのセキュリティー・ヘッダーで Web サービス・プロバイダーに送信する必要がある、サンプル・ポリシーの断片を示しています。
<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 タイム・スタンプを含めるようにポリシーを構成できます。

以下の例は、パスワード・テキスト、nonce、および created タイム・スタンプを含む UsernameToken を SOAP メッセージのセキュリティー・ヘッダーで Web サービス・プロバイダーに送信する必要がある、サンプル・ポリシーの断片を示しています。
<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>
以下の例は、パスワード・テキストではなくパスワード・ダイジェストを含む 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 />
        <sp:HashPassword />
      </wsp:Policy>
    </sp:UsernameToken>
  </wsp:Policy>
</sp:SupportingTokens>

noncecreated、および各種パスワード・タイプについては、 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>
プログラムで決定されたユーザー名とパスワードで UsernameToken を生成するには、 クライアントの Web サービス呼び出しの RequestContext で次の CXF プロパティーを設定することができます。
  • 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 メッセージの値と比較するためにダイジェスト値を計算できるように、 必要なすべてのユーザー名に対して有効なパスワードを戻さなければなりません。 ダイジェスト値の比較が正常に完了すると、ユーザー名とパスワードはユーザー・レジストリーに対して検証されます。

以下の例は、server.xml ファイル内のパスワード・ダイジェストに関するサンプル構成を示しています。
<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 が指定される際、パスワードの型はデフォルトでパスワード・テキスト (PasswordText) になります。 パスワード・テキストで送信されるパスワードは、メッセージ内でそのまま送信されます。 以下の例は、パスワードの型 PasswordText を使用した 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 ファイルで構成して、その実装を提供する必要があります。

以下の例は、鍵派生を使用した保護トークンとしての UsernameToken のポリシーの断片を示しています。
<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>
以下の例は、鍵派生が使用された場合のセキュリティー・ヘッダー内の UsernameToken のサンプルを示しています。
<wsse:UsernameToken wsse:Id="...">
  <wsse:Username>...</wsse:Username>
  <wsse11:Salt>...</wsse11:Salt>
  <wsse11:Iteration>...</wsse11:Iteration>
</wsse:UsernameToken>

トピックのタイプを示すアイコン 概念トピック

ファイル名: cwlp_wssec_utoken.html