セキュリティの概要
Windows Web Services API (WWSAPI) のセキュリティ フレームワークには、次のものが用意されています。
- トランスポート セキュリティを使用したメッセージの整合性、機密性、再生検出、サーバー認証。
- SOAP メッセージ セキュリティまたはトランスポート セキュリティを使用した、セキュリティ トークンの検証、証明書の信頼と失効チェックなどのクライアント認証。
セキュリティ プログラミング モデル
セキュリティは 通信チャネルに関連付けられています。 チャネルのセキュリティ保護は、次の手順で構成されます。
- アプリケーションのセキュリティ要件に適した 1 つ以上の セキュリティ バインド を作成して初期化します。
- これらのセキュリティ バインディングを含むセキュリティ の説明 を作成します。
- チャネルまたはサービス プロキシ (クライアント側) を作成するか、そのセキュリティの説明を渡すリスナーまたはサービス ホスト (サーバー側) を作成します。
- Open、Accept、Send、Receive、Close などの通常のチャネル プログラミング手順を実行します。
チャネルで送受信されるメッセージは、指定されたセキュリティの説明に従ってランタイムによって自動的に保護されます。 必要に応じて、セキュリティの説明で 1 つ以上の チャネル全体のセキュリティ設定 を指定するか、セキュリティ バインディングで バインド全体のセキュリティ設定 を指定することで、これらの手順を微調整できます。
送信者 ID の必要な承認は、受信した各メッセージに添付された セキュリティ処理の結果 を使用して、アプリケーションで行う必要があります。 承認手順は、セキュリティの説明では指定されず、ランタイムによって自動的に実行もされません。
サポートされていないバインド、適用できないプロパティ/フィールド、必要なプロパティ/フィールドの不足、無効なプロパティ/フィールド値など、セキュリティの説明にエラーが発生すると、チャネルまたはリスナーの作成が失敗します。
セキュリティ バインドの選択
アプリケーションのセキュリティを設計する場合、主な決定は、セキュリティの説明に含めるセキュリティ バインディングの選択です。 アプリケーションのセキュリティ シナリオに適したセキュリティ バインドを選択するためのガイドラインを次に示します。 便利なヒューリスティックは、まず、アプリケーションで使用できるセキュリティ資格情報の種類 ( X.509 証明書、 Windows ドメインのユーザー名/パスワード、 アプリケーション定義のユーザー名/パスワードなど) を理解し、その資格情報の種類を使用できるセキュリティ バインドを選択することです。
トランスポート・セキュリティーは、トランスポート・バイト・ストリーム・レベル (SOAP メッセージ境界の下) で適用される場合に考慮すべき最初のオプションです。
インターネット シナリオの場合、および X.509 証明書をサーバーに展開できるイントラネット シナリオでは、アプリケーションで WS_SSL_TRANSPORT_SECURITY_BINDINGを使用できます。 このオプションの例を次に示します。 クライアント: HttpClientWithSslExample サーバー: HttpServerWithSslExample。
HTTP ヘッダー認証によるクライアント認証が必要な場合は、 その 機能を提供するWS_HTTP_HEADER_AUTH_SECURITY_BINDINGを追加できます。
Kerberos、NTLM、SPNEGO などの Windows 統合認証プロトコルが適切なイントラネット シナリオでは、アプリケーションで WS_TCP_SSPI_TRANSPORT_SECURITY_BINDINGを使用できます。 次の例は、このオプションを示しています。Client: RequestReplyTcpClientWithWindowsTransportSecurityExample Server: RequestReplyTcpServerWithWindowsTransportSecurityExample。
名前付きパイプ経由のクライアント: RequestReplyNamedPipesClientWithWindowsTransportSecurityExample
名前付きパイプ上のサーバー: RequestReplyNamedPipesServerWithWindowsTransportSecurityExample
Kerberos、NTLM、SPNEGO などの Windows 統合認証プロトコルが適切なローカル コンピューターのシナリオでは、アプリケーションで WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING または WS_NAMEDPIPE_SSPI_TRANSPORT_SECURITY_BINDINGを使用できます。 このようなシナリオでは、トラフィックがマシンから出ないことを保証するため、WS_NAMEDPIPE_CHANNEL_BINDING が推奨されます (これは WS_NAMEDPIPE_CHANNEL_BINDINGのプロパティです)。
トランスポート セキュリティが接続を保護し、SOAP メッセージのWS-Security ヘッダーがクライアント認証を提供する混合モード セキュリティは、次に考慮すべきオプションです。 次のバインディングは、前のセクションで説明したトランスポート セキュリティ バインドの 1 つと組み合わせて使用します。
クライアントがアプリケーション レベルのユーザー名とパスワードのペアによって認証されると、アプリケーションは WS_USERNAME_MESSAGE_SECURITY_BINDING を使用して認証データを提供できます。 次の例は、このバインディングを WS_SSL_TRANSPORT_SECURITY_BINDINGと組み合わせて使用する方法を示しています。
クライアントが Kerberos チケットによって認証されると、アプリケーションは WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING を使用して認証データを提供できます。
セキュリティ コンテキストを使用する場合、クライアントは最初にサーバーでセキュリティ コンテキストを確立し、そのコンテキストを使用してメッセージを認証します。 この機能を有効にするには、セキュリティの説明に WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDINGが含まれている必要があります。 確立されると、軽量トークンを使用してセキュリティ コンテキストを送信できます。これにより、潜在的に大きく計算コストの高いクライアント資格情報をすべてのメッセージで送信する必要がなくなります。
フェデレーション セキュリティ シナリオでは、クライアントは最初にセキュリティ トークン サービス (STS) によって発行されたセキュリティ トークンを取得し、発行されたトークンをサービスに提示します。 クライアント側: STS からセキュリティ トークンを取得するために、アプリケーションで WsRequestSecurityToken を使用できます。 または、アプリケーションで CardSpace や LiveID などのクライアント側のセキュリティ トークン プロバイダー ライブラリを使用し、その出力を使用して WsCreateXmlSecurityToken を使用してセキュリティ トークンをローカルに作成することもできます。 いずれの方法でも、クライアントがセキュリティ トークンを使用できるようになったら、 WS_XML_TOKEN_MESSAGE_SECURITY_BINDINGを含むセキュリティの説明を使用してサービスに提示できます。 サーバー側: STS によって発行されたセキュリティ トークンが SAML トークンである場合、サーバーはセキュリティの説明と WS_SAML_MESSAGE_SECURITY_BINDINGを使用できます。
注意
Windows 7 および Windows Server 2008 R2: WWSAPI では、軽量 Web サービス セキュリティ プロファイル (LWSSP) で定義されている Ws-Trust と Ws-SecureConversation のみがサポートされます。 Microsoft の実装の詳細については、LWSSP の MESSAGE 構文 に関するセクションを参照してください。
考慮すべき最後のオプションは、WS_SSL_TRANSPORT_SECURITY_BINDINGなどの保護バインドを使用せずに認証バインドを使用 することです。 これにより、資格情報がクリア テキストで送信され、セキュリティに影響を与える可能性があります。 このオプションの使用は、結果として脆弱性がないことを確認するために慎重に評価する必要があります。 潜在的な用途の例として、セキュリティで保護されたプライベート ネットワーク経由でバックエンド サーバー間でメッセージを交換する方法があります。 次の構成では、このオプションがサポートされています。
- WS_HTTP_HEADER_AUTH_SECURITY_BINDING では、すべての構成でこのオプションがサポートされます。
- WS_USERNAME_MESSAGE_SECURITY_BINDING は、トランスポートとして HTTP を使用する場合に、サーバーでこのオプションをサポートします。
- WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING は、トランスポートとして HTTP を使用する場合にサーバーでこのオプションをサポートします。
- WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING は、トランスポートとして HTTP を使用する場合に、サーバーでこのオプションをサポートします。
- WS_SAML_MESSAGE_SECURITY_BINDING は、トランスポートとして HTTP を使用する場合にサーバーでこのオプションをサポートします。
このオプションを有効にするには、 WS_PROTECTION_LEVELを WS_PROTECTION_LEVEL_SIGN_AND_ENCRYPT以外の値に明示的に設定する必要があります。
チャネルとセキュリティ
前述のように、セキュリティのスコープはチャネルです。 さらに、チャネル操作は、すべてのセキュリティ バインディングにわたって一貫してセキュリティステップにマップされます。
- チャネルの作成: セキュリティの説明で指定されたセキュリティ バインドのセットが検証され、その後もチャネルに対して固定されたままになります。 チャネル スタックの形状 (WS-Trust ベースのネゴシエーションに使用される任意のサイド チャネルを含む) も決定されます。
- チャネルを開く: セキュリティ バインディングの一部として提供されるすべての資格情報が読み込まれ、セキュリティ セッションが確立されます。 一般に、開いているチャネルには "ライブ" のセキュリティ状態が含まれています。 クライアント チャネルを開くと、ランタイムによって実行されるサーバー認証に対するサーバーのエンドポイント アドレスも指定されます。
- チャネルのオープンとクローズの間: このフェーズでは、メッセージを安全に送受信できます。
- メッセージ送信: セキュリティ コンテキスト トークンは必要に応じて取得または更新され、セキュリティの説明に従って送信される各メッセージにセキュリティが適用されます。 セキュリティの適用時に発生したエラーは、送信エラーとしてアプリケーションに返されます。
- メッセージ受信: セキュリティの説明に従って、受信した各メッセージでセキュリティが検証されます。 メッセージ セキュリティ検証エラーは、受信エラーとしてアプリケーションに返されます。 これらのメッセージごとのエラーは、チャネルの状態や後続の受信には影響しません。 アプリケーションは、失敗した受信を破棄し、別のメッセージの受信を再起動する場合があります。
- チャネルの中止: チャネル上のすべての I/O を停止するために、チャネルをいつでも中止できます。 中止すると、チャネルはエラー状態になり、それ以上の送受信は許可されません。 ただし、チャネルは "ライブ" のセキュリティ状態を保持している可能性があるため、すべての状態をクリーンに破棄するには、後続のチャネルクローズが必要になります。
- チャネルクローズ: オープン時に作成されたセキュリティ状態は破棄され、セッションは破棄されます。 セキュリティ コンテキスト トークンは取り消されます。 チャネル スタックは残りますが、"ライブ" のセキュリティ状態や読み込まれた資格情報が含まれていません。
- チャネルフリー: 作成時に構築されたチャネル スタックが、すべてのセキュリティ リソースと共に解放されます。
セキュリティ API
セキュリティに関する API ドキュメントは、次のトピックにグループ化されています。
セキュリティ
WWSAPI Security APIを使用する場合、アプリケーションはいくつかのセキュリティ リスクに直面します。
-
誤った構成の誤り
-
WWSAPI では、さまざまなセキュリティ関連の構成オプションがサポートされています。 WS_SECURITY_BINDING_PROPERTY_IDの例を参照してください。 これらのオプションの一部 ( WS_SECURITY_BINDING_PROPERTY_ALLOW_ANONYMOUS_CLIENTS など) では、さまざまなセキュリティ バインディングによって提供される既定のセキュリティ レベルをアプリケーションで下げることができます。 このようなオプションの使用は、結果として得られる攻撃ベクトルがないことを確認するために慎重に評価する必要があります。
さらに、前述のように、WWSAPI を使用すると、アプリケーションは、セキュリティ資格情報が送信されている場合でも暗号化を無効にするなど、メッセージ交換を完全にセキュリティで保護するために必要な特定の手順を意図的に無効にすることができます。 これは特定の特定のシナリオを有効にすることができ、一般的な通信には使用しないでください。 このシナリオを有効にするには 、WS_PROTECTION_LEVEL を特に下げる必要があります。そうすると、セキュリティで保護された構成を確保するように設計された多くのチェックが無効になるため、アプリケーションは絶対に必要でない限り、その値を変更しないでください。
-
機密情報をメモリに格納する
-
メモリに格納されているパスワードなどの機密情報は、たとえばページ ファイルによって特権を持つ攻撃者によって抽出される可能性があります。 WWSAPI では、指定された資格情報のコピーが作成され、そのコピーが暗号化され、元のデータは保護されません。 元のインスタンスを保護するのはアプリケーションの責任です。 さらに、暗号化されたコピーは使用中に一時的に復号化され、ウィンドウが開いて抽出されます。
-
サービス拒否
-
セキュリティ処理では、大量のリソースが消費される可能性があります。 セキュリティ バインディングを追加するたびに、これらのコストが増加します。 WWSAPI は、セキュリティ検証エラーが発生するとすぐにセキュリティ処理を中止しますが、承認の決定などの特定のチェックは、重要な作業が実行されるまで実行されない場合があります。
サーバーでメッセージが処理されている間、セキュリティ状態はメッセージ ヒープに格納されます。 アプリケーションでは、WS_MESSAGE_PROPERTY_HEAP_PROPERTIESを通じてそのヒープのサイズを小さくすることで、セキュリティ処理中のメモリ消費量を制限できます。 さらに、WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDINGなどの特定のセキュリティ バインドにより、サーバーがクライアントに代わってリソースを割り当てる可能性があります。 これらのリソースの制限は、次の WS_SECURITY_BINDING_PROPERTY_ID 値を使用して構成できます。
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_MAX_PENDING_CONTEXTS
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_MAX_ACTIVE_CONTEXTS
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_RENEWAL_INTERVAL
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_ROLLOVER_INTERVAL
これらの制限を低い値に設定すると、メモリの最大消費量が減少しますが、クォータに達すると正当なクライアントが拒否される可能性があります。