タイムスタンプおよびユーザ名トークンの追加
このトピックでは、タイムスタンプおよびユーザ・トークンについて説明します。
概要
タイムスタンプは、WS-Security ヘッダの <Timestamp> セキュリティ要素です。タイムスタンプは、厳密にはセキュリティ要素ではありません。ただし、リプレイ攻撃を阻止するためにタイムスタンプを使用できます。タイムスタンプは、カスタム・ログにも役に立ちます。
ユーザ名トークンは、WS-Security ヘッダの <UsernameToken> セキュリティ要素で、ユーザ名が保持されます。また、対応するパスワードも保持されます (オプションにてダイジェスト形式で)。通常、これを認証に使用します。つまり、InterSystems IRIS Web クライアントが、パスワードを必要とする Web サービスを使用できるようにします。
WS-Security ヘッダ要素は、既定ではクリア・テキストで送信されます。<UsernameToken> のパスワードを保護するには、SSL/TLS を使用するか、<UsernameToken> を暗号化するか (別途説明)、これらの手法を組み合わせて使用する必要があります。
タイムスタンプの追加
WS-Security ヘッダ要素にタイムスタンプを追加するには、Web クライアントまたは Web サービスで次の操作を実行します。
-
%SOAP.Security.TimestampOpens in a new tab の Create() クラス・メソッドを呼び出します。このメソッドは、オプションの引数 (秒単位の有効期間) を 1 つ取ります。既定の有効期間は 300 秒です。以下はその例です。
set ts=##class(%SOAP.Security.Timestamp).Create()
このメソッドは、%SOAP.Security.TimestampOpens in a new tab のインスタンスを作成し、その Created、Expires、および TimestampAtEnd プロパティの値を設定して、インスタンスを返します。このインスタンスは、<Timestamp> ヘッダ要素を表します。
-
Web クライアントまたは Web サービスの SecurityOut プロパティの AddSecurityElement() メソッドを呼び出します。このメソッドの引数として、作成した %SOAP.Security.TimestampOpens in a new tab インスタンスを使用します。以下はその例です。
do client.SecurityOut.AddSecurityElement(ts)
-
SOAP メッセージを送信します。"セキュリティ・ヘッダ要素の追加" の一般的な手順を参照してください。
<Timestamp> 要素を含める場合、InterSystems IRIS は、この要素が <Security> 内で最初になるように強制します。
ユーザ名トークンの追加
ユーザ名トークンを追加するには、Web クライアントで次の操作を実行します。
-
必要に応じて、%soap.inc インクルード・ファイルを組み込みます。このファイルには、使用する可能性のあるマクロが定義されています。
-
%SOAP.Security.UsernameTokenOpens in a new tab の Create() クラス・メソッドを呼び出します。以下はその例です。
set user="SYSTEM" set pwd="_SYS" set utoken=##class(%SOAP.Security.UsernameToken).Create(user,pwd)
メソッドには、オプションの 3 番目の引数 (type) があり、これはユーザ名トークンにパスワードを含める方法を指定します。これは次のいずれかである必要があります。
-
$$$SOAPWSPasswordText — プレーン・テキストでパスワードを含めます。これが既定値です。
-
$$$SOAPWSPasswordDigest — パスワードを含めず、代わりにパスワードのダイジェストを含めます。ダイジェスト、Nonce、および Created タイム・スタンプは、WS-Security 1.1 で指定されたように導出されます。
Important:このオプションは、SOAP 対応のサードパーティ製サーバと対話する SOAP クライアントでのみ利用できます。PasswordDigest 認証では、パスワードをサーバに平文で格納する必要がありますが、これは最近のセキュリティ環境では許容されません。PasswordDigest アルゴリズムはレガシー機能であると考える必要があります。<UsernameToken> のパスワードを保護するには、SSL/TLS を使用するか、<UsernameToken> を暗号化するか、これらの手法を組み合わせて使用する必要があります。
-
$$$SOAPWSPasswordNone — パスワードを含めません。
このメソッドは、%SOAP.Security.UsernameTokenOpens in a new tab のインスタンスを作成し、その Username プロパティおよび Password プロパティを設定して、インスタンスを返します。このオブジェクトは、<UsernameToken> ヘッダ要素を表します。
Note:スタジオ・ウィザードによって作成されたポリシーで必要な <UsernameToken> を作成するためにこの手順を使用する場合、ウィザードは他のトークン・タイプを使用するポリシーを生成しないため、既定タイプ $$$SOAPWSPasswordText を使用する必要があります。ただし、HashPassword アサーションを使用するポリシー ($$$SOAPWSPasswordDigest を使用するポリシー) を手動で作成することができます。
-
-
Web クライアントまたは Web サービスの SecurityOut プロパティの AddSecurityElement() メソッドを呼び出します。このメソッドの引数として、作成した %SOAP.Security.UsernameTokenOpens in a new tab インスタンスを使用します。以下はその例です。
do client.SecurityOut.AddSecurityElement(utoken)
-
SOAP メッセージを送信します。"セキュリティ・ヘッダ要素の追加" の一般的な手順を参照してください。
タイムスタンプおよびユーザ名トークンの例
この例では、パスワード認証を必要とする Web サービス、およびその要求メッセージ内でタイムスタンプとユーザ名トークンを送信する Web クライアントを示します。
この例では、ユーザ名とパスワードがクリア・テキストで送信されます。
個々の環境でこの例のとおり機能するようにするには、まず次の手順を実行します。
-
Web サービスが属している Web アプリケーションの場合、パスワード認証のみをサポートするように、そのアプリケーションを構成します。
-
管理ポータルのホーム・ページで、[システム管理]→[セキュリティ]→[アプリケーション]→[Web アプリケーション] を選択します。
-
Web アプリケーションを選択します。
-
[パスワード] オプションのみを選択してから、[保存] を選択します。
-
-
既定値を使用しない場合は、適切な InterSystems IRIS ユーザ名とパスワードを使用するように、クライアントを編集します。
Web サービスは、次のとおりです。
Class Tokens.DivideWS Extends %SOAP.WebService
{
Parameter SECURITYIN = "REQUIRE";
/// Name of the Web service.
Parameter SERVICENAME = "TokensDemo";
/// SOAP namespace for the Web service
Parameter NAMESPACE = "http://www.myapp.org";
/// Divide arg1 by arg2 and return the result. In case of error, call ApplicationError.
Method Divide(arg1 As %Numeric = 2, arg2 As %Numeric = 8) As %Numeric [ WebMethod ]
{
Try {
Set ans=arg1 / arg2
}Catch{
Do ..ApplicationError("division error")
}
Quit ans
}
/// Create our own method to produce application specific SOAP faults.
Method ApplicationError(detail As %String)
{
//details not shown here
}
}
次のクライアント側のクラスは、プロキシ・クライアント (ここには示されていません) を呼び出し、ユーザ名トークンを追加します。
Include %systemInclude
Class TokensClient.UseClient
{
ClassMethod Test() As %Numeric
{
Set client=##class(TokensClient.TokensDemoSoap).%New()
Do ..AddSecElements(.client)
Set ans=client.Divide(1,2)
Quit ans
}
ClassMethod AddSecElements(ByRef client As %SOAP.WebClient)
{
Set utoken=##class(%SOAP.Security.UsernameToken).Create("_SYSTEM","SYS")
Do client.SecurityOut.AddSecurityElement(utoken)
Set ts=##class(%SOAP.Security.Timestamp).Create()
Do client.SecurityOut.AddSecurityElement(ts)
Quit
}
}
このクライアントからのサンプル・メッセージは、次のようになります。
<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope [parts omitted]>
<SOAP-ENV:Header>
<Security xmlns="[parts omitted]oasis-200401-wss-wssecurity-secext-1.0.xsd">
<Timestamp xmlns="[parts omitted]oasis-200401-wss-wssecurity-utility-1.0.xsd">
<Created>2010-03-12T20:18:03Z</Created>
<Expires>2010-03-12T20:23:03Z</Expires>
</Timestamp>
<UsernameToken>
<Username>_SYSTEM</Username>
<Password
Type="[parts omitted]#PasswordText">
SYS
</Password>
</UsernameToken>
</Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
[omitted]
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>