概要
信頼関係を設定している2つのActive Directoryの一方にADFSを構築して認証させる際のネットワークフローです。
パケットキャプチャした内容等をもとに記載していますが、推測で記載しているところも多々ありますので、あくまで参考程度としてください。
想定シナリオ
Active Directory ドメインAとドメインBが存在し、AとBにおいて2-wayの信頼関係を設定。
ADFSはドメインA配下のサーバーに構築。
この環境において、ドメインB配下のWindows10 PCからADFS経由でSAML連携で外部サービスにアクセスする。認証はWindows統合認証とする。
ネットワークフロー
-
PCから外部サービスにアクセスすると、ADFSへリダイレクトするようレスポンスが返る
https://adfs.main.hishi/adfs/ls?SAMLRequest=XXXXXXXXXXXXXXXXX
-
PCからADFSにアクセスすると、Windows統合認証ページにリダイレクトされる。ADFSは401 Unauthorizedを返す。
https://adfs.main.hishi/adfs/ls/wia?SAMLRequest=XXXXXXXXXXXXXXXXX
-
ADFSは401を返す。
HTTP/1.1 401 Unauthorized WWW-Authenticate: Negotiate WWW-Authenticate: NTLM
-
PCからドメインBに対してKRB-AS-REQ を送信。PCへはKRB-AS-REPでTGTを返却。
-
PCからドメインBにTGTを添えてadfs-serverのPrincipalのSTを要求。ドメインBはPRINCIPAL-UNKNOWNを返す。
-
PCから
https://adfs-server/adfs/ls/wia?SAMLRequest=XXXXXXXXXXXXXXXXX
にアクセスする。この時HTTPヘッダでAuthorization: Negotiate AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
を送る。 (この時InitializeSecurityContextでNTLMのコンテキストを送っている模様) -
ADFSは再度401を返す。
HTTP/1.1 401 Unauthorized WWW-Authenticate: Negotiate BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
-
PCから
https://adfs-server/adfs/ls/wia?SAMLRequest=XXXXXXXXXXXXXXXXX
に再度アクセスする。この時HTTPヘッダでAuthorization: Negotiate CCCCCCCCCCCCCCCCCCCCCCCCC
を送る。 -
ADFSからドメインAにポートマッピングリクエストの後、NetrLogonSamLogonEx をリクエスト (詳細不明)
-
ADFSがDNSに接続し、_ldap._tcp.Default-First-Site-Name._sites.dc._msdcs.DOMAIN.NAME のSRVレコードを検索し、ドメインBのAレコード(IPアドレス)を取得
-
ADFSからドメインBにLDAP Ping (UDP Port 389)。この時、ADFS自身を検索している模様。((&(&(&(DnsDomain=DOMAIN-B)(Host=ADFSのホスト名))(NtVer=0x20000016))(DnsHostName=ADFSのFQDN)))
-
ADFSからドメインBにKerberos接続 (TCP Port 88)。ユーザーを検索しようするが、ドメインBはeRR-PREAUTH-REQUIREDを返す。
-
ADFSからドメインBにKerberos接続 (TCP Port 88)。krb-tgs-reqでADFSのプリンシパルを送信してticketを取得
-
ADFSからドメインBにLDAP Ping (UDP Port 389)。先ほどのLDAP pingと同じ内容。(かつ2回、合計3回)
-
ADFSからドメインBにLDAP 接続 (TCP Port 389) searchRequest (objectClass=*)で検索しているようだが詳細不明
-
ADFSからドメインBにKerberos接続 (TCP Port 88)。STを取得
-
ADFSからドメインBにLDAP 接続 (TCP Port 389) STをつけてbindRequest後、LDAP検索
-
ADFSからPCにSAMLレスポンスを返す
-
PCから外部サービスに接続しログイン
ここでKerberos通信はキャッシュするらしく、2度目のリクエストからはLDAPの通信のみ発生する模様。
Revision History
Rev 1 2020年08月30日 初版
Rev 2 2021年06月22日 Kerberosの記載を追加