LoginSignup
4
2

More than 1 year has passed since last update.

信頼関係のあるAD配下でのADFS認証フロー

Last updated at Posted at 2020-08-30

概要

信頼関係を設定している2つのActive Directoryの一方にADFSを構築して認証させる際のネットワークフローです。
パケットキャプチャした内容等をもとに記載していますが、推測で記載しているところも多々ありますので、あくまで参考程度としてください。

想定シナリオ

Active Directory ドメインAとドメインBが存在し、AとBにおいて2-wayの信頼関係を設定。
ADFSはドメインA配下のサーバーに構築。
この環境において、ドメインB配下のWindows10 PCからADFS経由でSAML連携で外部サービスにアクセスする。認証はWindows統合認証とする。

ネットワークフロー

  1. PCから外部サービスにアクセスすると、ADFSへリダイレクトするようレスポンスが返る

    https://adfs.main.hishi/adfs/ls?SAMLRequest=XXXXXXXXXXXXXXXXX
    
  2. PCからADFSにアクセスすると、Windows統合認証ページにリダイレクトされる。ADFSは401 Unauthorizedを返す。

    https://adfs.main.hishi/adfs/ls/wia?SAMLRequest=XXXXXXXXXXXXXXXXX
    
  3. ADFSは401を返す。

    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: Negotiate
    WWW-Authenticate: NTLM
    
  4. PCからドメインBに対してKRB-AS-REQ を送信。PCへはKRB-AS-REPでTGTを返却。

  5. PCからドメインBにTGTを添えてadfs-serverのPrincipalのSTを要求。ドメインBはPRINCIPAL-UNKNOWNを返す。

  6. PCから https://adfs-server/adfs/ls/wia?SAMLRequest=XXXXXXXXXXXXXXXXX にアクセスする。この時HTTPヘッダでAuthorization: Negotiate AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAを送る。 (この時InitializeSecurityContextでNTLMのコンテキストを送っている模様)

  7. ADFSは再度401を返す。

    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: Negotiate BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
    
  8. PCから https://adfs-server/adfs/ls/wia?SAMLRequest=XXXXXXXXXXXXXXXXX に再度アクセスする。この時HTTPヘッダでAuthorization: Negotiate CCCCCCCCCCCCCCCCCCCCCCCCCを送る。

  9. ADFSからドメインAにポートマッピングリクエストの後、NetrLogonSamLogonEx をリクエスト (詳細不明)

  10. ADFSがDNSに接続し、_ldap._tcp.Default-First-Site-Name._sites.dc._msdcs.DOMAIN.NAME のSRVレコードを検索し、ドメインBのAレコード(IPアドレス)を取得

  11. ADFSからドメインBにLDAP Ping (UDP Port 389)。この時、ADFS自身を検索している模様。((&(&(&(DnsDomain=DOMAIN-B)(Host=ADFSのホスト名))(NtVer=0x20000016))(DnsHostName=ADFSのFQDN)))

  12. ADFSからドメインBにKerberos接続 (TCP Port 88)。ユーザーを検索しようするが、ドメインBはeRR-PREAUTH-REQUIREDを返す。

  13. ADFSからドメインBにKerberos接続 (TCP Port 88)。krb-tgs-reqでADFSのプリンシパルを送信してticketを取得

  14. ADFSからドメインBにLDAP Ping (UDP Port 389)。先ほどのLDAP pingと同じ内容。(かつ2回、合計3回)

  15. ADFSからドメインBにLDAP 接続 (TCP Port 389) searchRequest (objectClass=*)で検索しているようだが詳細不明

  16. ADFSからドメインBにKerberos接続 (TCP Port 88)。STを取得

  17. ADFSからドメインBにLDAP 接続 (TCP Port 389) STをつけてbindRequest後、LDAP検索

  18. ADFSからPCにSAMLレスポンスを返す

  19. PCから外部サービスに接続しログイン

ここでKerberos通信はキャッシュするらしく、2度目のリクエストからはLDAPの通信のみ発生する模様。

Revision History

Rev 1 2020年08月30日 初版
Rev 2 2021年06月22日 Kerberosの記載を追加

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2