SharePoint Server 2010 / 2013 でクレームベース認証の Web アプリケーションを構成すると、特定の条件下で Web フロントエンド サーバーの TCP 動的ポートが枯渇する

現象
SharePoint Server 2010 / 2013 ファームでクレームベース認証の Web アプリケーションを非常に多くのユーザーで利用すると、以下の条件下で Web フロントエンド サーバーの TCP 動的ポートが枯渇する場合があります。

- Web アプリケーションの認証方式がクレームベース認証で構成されている
- 100 秒以内に 1 回以上の頻度で、Security Token Service (STS) によって発行されたトークンを保持していない (あるいはトークンの有効期限が切れた) ユーザーからのリクエストが発生し続ける
- アクティブな利用ユーザー数が約 8,000 人以上である

本現象は特に SharePoint Server 2010 において発生する可能性があります。
SharePoint Server 2010 既定の認証方式であるクラシック認証を利用している場合は、本事象は発生しません。

Web フロントエンド サーバーの TCP 動的ポートが枯渇すると、SQL Server や他の SharePoint サーバーとの通信ができなくなるため、サイトを表示できないなどの現象が発生します。上記の現象が発生すると、Web フロントエンド サーバーのシステムイベント ログに以下のイベント ログが出力される場合があります。

---------------------
ログの名前:         System
ソース:           Tcpip
イベント ID:       4227
レベル:           警告
説明:
選択したローカルエンドポイントは、同じリモート エンドポイントに接続するために最近使用されたため、 TCP/IP は発信接続を確立できませんでした。一般にこのエラーが発生するのは、複数の発信接続が高速に開始および終了されることにより、すべての利用可能なローカル ポートがふさがってしまい、TCP/IP が 発信接続のためにローカル ポートを再利用することを強いられる場合です。
データ破損のリスクを最小化するために、TCP/IP 標準では、特定のローカル エンドポイントから特定のリモート エンドポイントに連続 した複数の接続を確立する際に、それぞれの接続間に最小限の時間間隔を空けることを要求しています。
---------------------

上記のイベント ログは、使用済みの TCP ポートを使用してコネクションの新規作成を試みた場合に記録されるものであり TCP ポートが枯渇していない場合においても出力される場合がありますが、頻繁に記録される場合にはポート枯渇が疑われます。
原因
クレームベース認証の Web アプリケーションにユーザーがアクセスする際、Security Token Service (STS) が作成したクレーム トークンを使用してユーザーの認証が行われます。ワーカープロセス (例: SharePoint - 80) がトークンを取得するために STS (http://localhost:32843/SecurityTokenServiceApplication/securitytoken.svc) に接続する際、認証を行うユーザー毎に TCP 動的ポートが使用されてセッションが確立されます。STS の通信が完了した後も、既定で HTTP 1.1 Keep-Alive が有効であるため、TCP 動的ポートは一定時間 (既定値 100 秒) クライアントからの接続を待機するため TCP 動的ポートはすぐに開放されません。また、クライアントから通信されない状況で 100 秒経過した場合においても、STS に対するアクティブな通信が存在する間は、STS に対するすべての TCP 動的ポートは開放されません。(本動作は .NET Framework の HTTP 接続管理の動作に依存します。本動作については後述の More Information を参照してください。)

上記の動作により、STS の認証を必要とするユーザーが SharePoint サイトにアクセスをし続ける状況において、TCP ポートが開放されない現象が発生する場合があります。なお、一度取得されたトークンはワーカープロセスに一定時間キャッシュされるため、2 回目以降の同一ユーザーからのリクエストは STS に対して通信は発生しません。本現象は以下の条件を満たす場合に発生します。

- Web アプリケーションの認証方式がクレームベース認証で構成されている
- 100 秒以内に 1 回以上の頻度で、Security Token Service (STS) によって発行されたトークンを保持していない(あるいはトークンの有効期限が切れた) ユーザーからのリクエストが発生し続ける
- アクティブな利用ユーザー数が約 8,000 人以上である (※補足)

※補足
クレームベース認証における Windows 認証のログオントークンの有効期限は既定では 10 時間に設定されています。
例えば、朝 9:00 にユーザーが SharePoint サイトに初回アクセスする場合、STS によってトークンが生成されますが、このトークンは夕方 19:00 に有効期限が切れるため、それ以降にユーザーがアクセスを行うと再度 STS に通信が発生します。
また、Windows Server 2008 以降の OS の使用可能な TCP 動的ポート数は、既定では 16,383 (49152 - 65535) です。
そのため、トークン生成が必要な約 8,000 のユーザーが 1 日を通して 100 秒の間を空けずにアクセスし続け、トークンの有効期限が切れた 19:00 以降も全員が再度アクセスすると仮定すると、理論上は約 16,000 のポートが使用される可能性があり、19:00 以降 Web サーバーのポートが枯渇する可能性が出てきます。
ただし、SharePoint を企業内のポータルサイトとして利用するシナリオでは、アクセス数は朝 9:00 頃上昇した後 12:00 頃いったん減少するなど 1 日を通してトークンの生成が必要なユーザーがアクセスし続ける状況にはならないため、実際には 8,000 ユーザーによって利用した場合であっても本現象が発生する可能性は低く、現象の発生には数万人規模の利用ユーザー数が必要になると考えられます。この 8,000 というユーザー数は、SharePoint に実際にアクセスするアクティブ ユーザー数であり、アクセスを行わない非アクティブ ユーザーを含めた登録ユーザー数 (SharePoint にアクセス権を持つ企業内の全ユーザー数) は、一般的にはこの数より大きくなります。また、TCP 動的ポート数や STS トークン タイムアウト値を既定値から変更している場合には上記の限りではありません。

SharePoint Server 2013 では分散キャッシュ サービスによってログオン トークンがキャッシュされ、ファーム内の Web フロントエンド サーバーで共有されるため、SharePoint Server 2010 と比較して本事象が発生する可能性が低くなっています。
例えば、ファーム内に 7 台の Web フロントエンド サーバーが存在する場合、SharePoint Server 2010 ではトークンがキャッシュされていないユーザーが 7 台の各サーバーにアクセスするたびに STS によってトークンが生成され、TCP ポートが使用されますが、SharePoint Server 2013 では 1 台の Web フロントエンド サーバーが生成したトークン キャッシュを残りの 6 台で共有することができます。そのため、同一の構成、コンテンツ、接続数の場合、SharePoint Server 2010 ファームの方が本現象が発生しやすくなります。
回避策
以下の何れかの方法を利用することにより、ポートの枯渇を防止します。

1). STS の通信において、KeepAlive を無効にする
2). Windows で利用する動的ポート数を増やす

1). STS の通信において、KeepAlive を無効にする
以下の手順で、すべての SharePoint サーバーにおいて STS の KeepAlive を無効にします。
同一ユーザーの認証処理で STS に対して連続した通信は発生しないため、通常は STS に関して Keep-Alive の機能を無効化する影響ははありません。

1) SharePoint サーバーで以下のフォルダーを開きます。
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\WebServices\SecurityToken
2) web.config ファイルのバックアップを取得します。
3) web.config をテキスト エディタで開き、以下のように修正して上書き保存します。

※2 個所の <httpTransport> 要素内に keepAliveEnabled="false" を追記します。
-----
    <!-- Binding List: -->
    <bindings>
      <customBinding>
        <binding name="spStsBinding">
          <binaryMessageEncoding>
            <readerQuotas maxStringContentLength="1048576" maxArrayLength="2097152" />
          </binaryMessageEncoding>
          <httpTransport maxReceivedMessageSize="2162688" authenticationScheme="Negotiate" useDefaultWebProxy="false" keepAliveEnabled="false" />
        </binding>
        <binding name="spStsActAsBinding">
          <security authenticationMode="SspiNegotiatedOverTransport" allowInsecureTransport="true" defaultAlgorithmSuite="Basic256Sha256" messageSecurityVersion="WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12" />
          <binaryMessageEncoding>
            <readerQuotas maxStringContentLength="1048576" maxArrayLength="2097152" />
          </binaryMessageEncoding>
          <httpTransport maxReceivedMessageSize="2162688" authenticationScheme="Negotiate" useDefaultWebProxy="false" keepAliveEnabled="false" />
        </binding>
        <binding name="SPWindowsTokenCacheServiceHttpsBinding">
          <security authenticationMode="IssuedTokenOverTransport" />
     <textMessageEncoding>
            <readerQuotas maxStringContentLength="1048576" maxArrayLength="2097152" />
          </textMessageEncoding>
          <httpsTransport maxReceivedMessageSize="2162688" authenticationScheme="Anonymous" useDefaultWebProxy="false" />
        </binding>
     </customBinding>
    </bindings>
-----

2). Windows で利用する動的ポート数を増やす
以下のサポート技術情報 929851 の手順に従い、Web フロントエンド サーバーの TCP 動的ポート数を拡張します。

The default dynamic port range for TCP/IP has changed in Windows Vista and in Windows Server 2008
https://support.microsoft.com/en-us/kb/929851

利用頻度が高く多数のユーザーが利用する環境下で、[現象] セクションに記載されたようなポートが枯渇する現象の発生が懸念される場合には、Keep Alive の無効化などによる対応を検討してください。
詳細
You may run out of available ports when using the ConnectionGroupName property of the System.Net.HttpWebRequest class of the .Net framework 2.0 or .Net framework 4.0
https://support.microsoft.com/en-us/kb/2551125

Understanding System.Net Connection Management and ServicepointManager - Idle connection
http://blogs.msdn.com/b/adarshk/archive/2005/01/02/345411.aspx
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:3081582 - 最終更新日: 09/29/2016 12:29:00 - リビジョン: 6.0

Microsoft SharePoint Server 2010, Microsoft SharePoint Server 2013, Microsoft SharePoint Foundation 2010, Microsoft SharePoint Foundation 2013

  • kbtshoot KB3081582
フィードバック