着信メッセージの検証と解読
このトピックでは、InterSystems IRIS Web サービスまたは Web クライアントが受信したメッセージのセキュリティ要素を検証する方法 (および暗号化された内容を自動的に解読する方法) について説明します。
概要
InterSystems IRIS Web サービスおよび Web クライアントでは、着信 SOAP メッセージの WS-Security ヘッダ要素の検証、および着信メッセージの自動解読を実行できます。
InterSystems IRIS Web サービスおよび Web クライアントでは、署名済みの SAML アサーション・トークンを処理して、シグニチャを検証することもできます。ただし、SAML アサーションの詳細の検証は、アプリケーションで行う必要があります。
セキュリティ・ポリシーを使用している場合、前述のすべてのアクティビティは自動的に行われます。
すべてのシナリオにおいて、InterSystems IRIS は、ルート権限証明書のコレクションを使用します。"設定およびその他の一般的なアクティビティ" を参照してください。
WS-Security ヘッダの検証
着信 SOAP メッセージに記述された WS-Security ヘッダ要素を検証するには、次の操作を実行します。
-
Web サービスまたは Web クライアントで、SECURITYIN パラメータを設定します。以下の値のいずれかを使用します。
-
REQUIRE — Web サービスまたは Web クライアントは、WS-Security ヘッダ要素を検証し、不一致がある場合、またはこの要素が見つからない場合はエラーを出力します。
-
ALLOW — Web サービスまたは Web クライアントは、WS-Security ヘッダ要素を検証します。
いずれの場合も、Web サービスや Web クライアントで、ヘッダ要素 <Timestamp>、<UsernameToken>、<BinarySecurityToken>、<Signature>、および <EncryptedKey> が検証されます。また、ヘッダの SAML アサーションに WS-Security シグニチャが存在する場合は、これも検証されます。必要に応じてメッセージの解読も実行されます。
検証に失敗すると、エラーが返されます。
テストおよびトラブルシューティングに使用する SECURITYIN パラメータには、この他に以下の 2 つの値も設定できます。
-
IGNORE — Web サービスまたは Web クライアントは、"CSP 認証と WS-Security" の説明のように <UsernameToken> 以外の WS-Security ヘッダ要素を無視します。
後方互換性のために、この値が既定値です。
-
IGNOREALL — Web サービスまたは Web クライアントは、WS-Security ヘッダ要素をすべて無視します。
-
使用例は、"メッセージの暗号化の例" を参照してください。
SECURITYIN パラメータは、関連付けられた (そしてコンパイルされた) 構成クラスにセキュリティ・ポリシーがある場合、無視されます。
WS-Security ヘッダの SAML アサーションへのアクセス
WS-Security ヘッダ要素に <Assertion> 要素が含まれている場合、InterSystems IRIS Web サービスまたは Web クライアントでは、その SAML アサーションのシグニチャが自動的に検証されます (署名されている場合)。
検証には、信頼された証明書が必要です。InterSystems IRIS が署名を検証できるのは、中間証明書 (もしあれば) を含め、署名者独自の証明書から、InterSystems IRIS が信頼する認証機関 (CA) の自己署名証明書までの署名者の証明書チェーンを検証できる場合です。
ただし、アサーションが自動的に検証されることはありません。コードでアサーションを取得し、これを検証する必要があります。
SAML アサーションにアクセスするには、セキュリティ・ヘッダ要素の <Assertion> 要素を見つけます。そのためには、次のように、サービスまたはクライアントの SecurityIn プロパティの FindElement() メソッドを使用します。
Set assertion=..SecurityIn.FindElement("Assertion")
これにより %SAML.AssertionOpens in a new tab のインスタンスが返されます。必要に応じてこのオブジェクトのプロパティを検証します。
インスタンス認証と WS-Security
InterSystems IRIS Web サービスでは、IRIS サーバと Web サービス・コードという 2 つの別個のメカニズムが適用されていることを認識しておくと役立ちます。
-
管理ポータルで、Web アプリケーションに許可されていて %Service_WebGateway サービスへのアクセスを制御する認証モードを指定します (詳細は、このドキュメントで前述の "タイムスタンプおよびユーザ名トークンの例" を参照してください。その他の背景情報は、"Web アプリケーション" を参照してください。)[パスワード] オプションを選択すると、Web アプリケーションで InterSystems IRIS のユーザ名とパスワードのペアを受け入れることができます。これをインスタンス認証と呼びます。
-
これとは別に、Web サービスで InterSystems IRIS のユーザ名とパスワードのペアを要求することもできます。
この両機能は以下のように連携して機能します。
-
メッセージの受信時に、Web サービスで、<Security> と呼ばれるヘッダ要素の存在がチェックされます。ただし、この要素の内容は検証されません。
-
<Security> ヘッダ要素が存在せず、SECURITYIN パラメータが REQUIRE である場合、Web サービスは、フォルトを出力して終了します。
-
<Security> ヘッダ要素に <UsernameToken> 要素がある場合は、以下のように処理されます。
-
Web アプリケーションに [パスワード] オプションを選択すると、Web サービスは <UsernameToken> 要素を読み取ってそこからユーザ名とパスワードを取得し、Web アプリケーションにログインします。
Web サービスは、SECURITYIN パラメータの任意の値 (IGNOREALL を除く) に対してこれを実行します。
ユーザ名は、$USERNAME 特殊変数と Web サービスの Username プロパティで使用できます。パスワードは使用できません。
-
[パスワード] オプションを選択しない場合、ログインは行われません。
-
SECURITYIN パラメータは、関連付けられた (そしてコンパイルされた) 構成クラスにセキュリティ・ポリシーがある場合、無視されます。
セキュリティ・ヘッダ要素の取得
場合によっては、WS-Security ヘッダ要素のカスタム処理を追加する必要があることもあります。そのためには、Web サービスまたは Web クライアントの SecurityIn プロパティを使用します。サービスまたはクライアントが WS-Security ヘッダ要素を受信した場合、このプロパティは、このヘッダ要素を含む %SOAP.Security.HeaderOpens in a new tab のインスタンスになります。以下はその例です。
Set secheader=myservice.SecurityIn
そして、そのインスタンスの次のメソッドのいずれかを使用して、ヘッダ要素を取得します。
method FindByEncryptedKeySHA1(encryptedKeySHA1 As %Binary) as %SOAP.Security.Element
指定の EncryptedKeySHA1 引数に対応する <EncryptedKey> 要素からキーを返します。または、一致するものがない場合は、空の文字列を返します。
method FindElement(type As %String, ByRef pos As %String) as %SOAP.Security.Element
位置 pos の後で、指定されたタイプの最初のセキュリティ要素を返します。一致するものがない場合、メソッドは空の文字列を返します (pos を 0 として返します)。
type には、"Timestamp"、"BinarySecurityToken"、"UsernameToken"、"Signature"、または "EncryptedKey" を指定します。
method FindLastElement(type As %String, ByRef pos As %String) as %SOAP.Security.Element
指定のタイプの最後のセキュリティ要素を返します。一致するものがない場合、メソッドは空の文字列を返します (pos を 0 として返します)。
type の詳細は、FindElement() のエントリを参照してください。
これらすべてのメソッドは、要素タイプに応じて、%SOAP.Security.ElementOpens in a new tab のインスタンスまたは以下のサブクラスのインスタンスのいずれかを返します。
要素タイプ | 使用されるサブクラス |
---|---|
"Timestamp" | %SOAP.Security.TimestampOpens in a new tab |
"BinarySecurityToken" | %SOAP.Security.BinarySecurityTokenOpens in a new tab |
"UsernameToken" | %SOAP.Security.UsernameTokenOpens in a new tab |
"Signature" | %XML.Security.SignatureOpens in a new tab |
詳細は、クラスリファレンスを参照してください。
シグニチャの確認のチェック
WS-Security 1.1 <SignatureConfirmation> 機能は、受信した SOAP メッセージが、Web クライアントによって送信された元の要求への応答で生成されたことを、Web クライアントが確認できるようにします。クライアント要求は通常、署名されますが、署名は必須ではありません。このメカニズムでは、Web サービスは、セキュリティ・ヘッダ要素に <SignatureConfirmation> 要素を追加し、Web クライアントは、その <SignatureConfirmation> 要素を検証できます。
Web クライアントの場合、Web サービスから受信した応答内の <SignatureConfirmation> 要素を検証するには、Web クライアントの WSCheckSignatureConfirmation() メソッドを呼び出します。このメソッドは、<SignatureConfirmation> 要素が有効な場合は true を、それ以外の場合は false を返します。
Web サービスが送信するメッセージにシグニチャの確認を追加する方法については、"シグニチャの確認の追加" を参照してください。