Active Directory Federation Services (AD FS) の役割がインストールされた Windows Server 2012 R2 を再起動した後、クライアント端末から認証回りの動作でエラーになっていました。
イベント ログを確認すると、「ソース: AD FS、イベント ID: 102 レベル: エラー」が記録、TCP ポート 49443 で競合しているためにエラーが発生していたことが判明しました。
性質が悪いことにイベント ログにはエラーが記録されているにも関わらず、AD FS サービス (adfssrv) は「実行中」となっているので、「エラーは出ているけど、サービスは動いているので現状問題なし」になりかねない状況でした。
発生原因については、コマンド プロンプトから「netstat -ano」で TCP ポート 49443 を使用しているプロセスIDを確認、「tasklist /SVC」で確認したプロセス ID から TCP ポート 49443 を使用しているプロセス (サービス) 名を確認することで、競合しているプロセス (サービス) 名を特定することはできます。
しかし、実際に確認したところ競合しているプロセス (サービス) 名を特定することはできず、TCP ポート 49443 は ephemeral (一時) ポートの範囲内であること、また AD FS サービスは「自動 (開始遅延)」であることから、サービス起動前に TCP ポート 49443 を用いて他のサーバとの通信 (生死監視、通知など) を行っていた、と推測しています。
Technet サイトやブログの情報では、TCP ポート 49443 に対する使用、およびファイアウォールの解放などの記載はありますが、回避方法については確認した限り特にアナウンスされていません (現象発生頻度が少ないのか、単に現象に気が付いていないのか、はたまたサービス、システムの再起動で回避できているので問題なしとしているか…)。
- AD FS Requirements
https://technet.microsoft.com/en-us/library/dn554247.aspx - ADFS needs port 49443 – Paul Jones – Microsoft Corporation
http://blogs.technet.com/b/pauljones/archive/2014/06/10/adfs-needs-port-49443.aspx
運用していく中で現象が再発しても困るため、TCP ポート 49443 を待受ポートして使用するプロセス (サービス) が存在していなければ、回避策としては以下の 2つとなるかと。
- TCP ポート 49443 を ephemeral ポート範囲外に変更する方法
- Set-AdfsProperties コマンドレットを用いてユーザー証明書認証で使用する TCP ポート 49443 から変更する方法
問題が回避されたかどうかは、回避策実行後にイベント ログから「ソース: AD FS、イベント ID: 100 レベル: 情報」が記録されていれば大丈夫かと思います。
ちなみに、netsh コマンドを用いたポートの除外は Windows Server 2012、Windows Server 2012 R2 環境ではうまく動作しませんでした。
- Windows で除外されたポートへの 2 回目のバインドが失敗したときにエラー 10013 (WSAEACCES) が表示される
https://support.microsoft.com/ja-jp/kb/3039044
TCP ポート 49443 を ephemeral ポート範囲外に変更する方法
※フェデレーション サーバー ファームを構成している場合、ファーム内のすべてのサーバ上で実施する必要があります。
- 管理者権限でコマンド プロンプト (cmd.exe) を起動します。
- 以下のコマンドを入力、実行し、ephemeral ポート範囲 (開始ポート、ポート数) を表示します。
netsh int ipv4 show dynamicport tcp netsh int ipv4 show dynamicport udp netsh int ipv6 show dynamicport tcp netsh int ipv6 show dynamicport udp
- 以下のコマンドを入力、実行し、ephemeral ポート範囲 (開始ポート、ポート数) を変更、設定します。
netsh int ipv4 set dynamicport tcp start=<ephemeral ポート開始番号> num=<ephemeral ポート確保数> netsh int ipv4 set dynamicport udp start=<ephemeral ポート開始番号> num=<ephemeral ポート確保数> netsh int ipv6 set dynamicport tcp start=<ephemeral ポート開始番号> num=<ephemeral ポート確保数> netsh int ipv6 set dynamicport udp start=<ephemeral ポート開始番号> num=<ephemeral ポート確保数>
例:
netsh int ipv4 set dynamicport tcp start=59152 num=6384 netsh int ipv4 set dynamicport udp start=59152 num=6384 netsh int ipv6 set dynamicport tcp start=59152 num=6384 netsh int ipv6 set dynamicport udp start=59152 num=6384
- 以下のコマンドを入力、実行し、変更後の ephemeral ポート範囲 (開始ポート、ポート数) を表示します。
netsh int ipv4 show dynamicport tcp netsh int ipv4 show dynamicport udp netsh int ipv6 show dynamicport tcp netsh int ipv6 show dynamicport udp
- 以下のコマンドを入力、実行し、ADFS サービスを再起動します。
net stop adfssrv net start adfssrv
Set-AdfsProperties コマンドレットを用いてユーザー証明書認証で使用する TCP ポートを変更する方法
- 管理者権限で Windows PowerShell を起動、以下のコマンドレットを入力、実行し、ADFS モジュールをインポートします。
Import-Module ADFS
- 以下のコマンドレットを入力、実行し、ユーザー証明書認証で使用する TCP ポート (TlsClientPort) を確認します。
Get-AdfsProperties
- 以下のコマンドレットを入力、実行し、ユーザー証明書認証で使用する TCP ポートを設定します。
※設定する TCP ポートが他のプロセス (サービス) で使用していないことを確認した上で実施する必要があります。Set-AdfsProperties -TlsClientPort <TlsClient で使用するポート番号>
例:
Set-AdfsProperties -TlsClientPort 32443
- ファイアウォールなどが設置されている場合、設定した TCP ポートでアクセス可能なように設定します。
- 以下のコマンドを入力、実行し、ADFS サービスを再起動します。
※フェデレーション サーバー ファームを構成している場合、ファーム内のすべてのサーバ上で実施する必要があります。net stop adfssrv net start adfssrv
- 以下のコマンドレットを入力、実行し、ユーザー証明書認証で使用する TCP ポート (TlsClientPort) が変更されていることを確認します。
Get-AdfsProperties
参考
- AD FS Requirements
https://technet.microsoft.com/en-us/library/dn554247.aspx - ADFS needs port 49443 – Paul Jones – Microsoft Corporation
http://blogs.technet.com/b/pauljones/archive/2014/06/10/adfs-needs-port-49443.aspx - Set-AdfsProperties
https://technet.microsoft.com/en-us/library/dn479342(v=wps.630).aspx