次の方法で共有


Active Directory ドメインへログオンする際の Kerberos 認証について

質問

2016年2月24日水曜日 8:32

Active Directory ドメインへログオンする際の Kerberos 認;について
ご教示ください。
ドメインログオン時、ユーザーが入力したパスワードはKDC へ送信されるのでしょうか。

これまでぼんやりと理解したつもりでおり、入力された ID・パスワードは
KDC へ送られ、DB の情報と照会されるものとばかり考えていました。

しかし、あらためて調べてみると、そもそも Kerberos 認;においては
パスワード情報はネットワーク上を流れず、例えばログオン時であれば、
以下のよう処理されるとの情報も確認しました。

 1. ユーザーが ID およびパスワードを入力

 2. KDC へは ID のみが送信され、ID に紐づくパスワードで TGT を暗号化し
    クライアントへ送信

 3. クライアントでは 1. で入力したパスワードで TGT を復号

これであればたしかにパスワードはネットワークを流れないのですが、
パスワードを間違った場合など、DC 上でログに出たりもするよな、、と思い、
どちらの認識が正しいのかわからなくなってしまいました。

以下の情報なども確認すると、ID およびパスワード両方が KDC に送られる、
で正しいような気もするのですが、実際はどちらが正解なのかご教示いただきたいです。
また、その場合、パスワード情報はどのように暗号化されるのでしょうか。

 Kerberos Explained
 <https://msdn.microsoft.com/ja-jp/library/bb742516.aspx>

お手数をおかけしますが、よろしくお願いいたします。

すべての返信 (5)

2016年2月24日水曜日 9:09 ✅回答済み

チャブーンです。

この件ですが、答えとしては「Kerberos認;でパスワードは送信されません」になります。

  1. クライアントは、ログオン時にクレデンシャル(資;情報)を生成しますが、このとき「パスワード文字列に基づくハッシュ」がメモリ上に生成されます。
  2. クライアントからTGT要求されたKDCは「ドメインコントローラ」なので、要求されたアカウントの「パスワード文字列に基づくハッシュ」をActive Directoryに持っていますので、このハッシュを使って暗号化したTGTをクライアントに返します。
  3. TGTを受け取ったクライアントは、1で生成された「パスワード文字列に基づくハッシュ」を使ってTGTを復号し、使用可能にします。

ハッシュは「ある文字列を暗号アルゴリズムに則って変換した」鍵の一種で、同じ内容で暗号/復号ができます。ドメインコントローラ側の(あらかじめ登録された)ハッシュ情報と、クライアント側でパスワード入力で生成されたハッシュ情報が一致すれば、複合が成功しTGTが機能します。一致しない場合は、通常「クライアント側で生成されたハッシュ」が間違っている=パスワード文字列が間違っている、を意味しますので、TGTが復号に失敗した事実を持って「パスワードが間違っていますよ」といえるかと思います。

フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


2016年2月24日水曜日 16:10 ✅回答済み

2. KDC へは ID のみが送信され、ID に紐づくパスワードで TGT を暗号化し
    クライアントへ送信

Kerberosには事前認;というオプションがあり(デフォルトで有効なはず)、事前認;が有効な場合、上記の「KDCへはIDのみが送信され」のAS-REQの送信時に、クライアントから送るデータには以下の3つのデータが含まれています。

  1. ユーザー名(ID) (事前認;が無効な場合でも送る)
  2. 平文の現在時刻情報 (事前認;が無効な場合でも送る)
  3. ログオン時にユーザーが入力したパスワードから生成したハッシュをキーにして上記2.の情報を暗号化した「暗号化された現在時刻情報」 (事前認;有効時のみ送る) ※1

上記のAS-REQを受け取ったKDC(・・・というかAS)は、1のユーザー名をキーにユーザーデータベースからパスワードを取り出し、パスワードからハッシュ値を計算し、ハッシュ値をキーにして上記3の暗号化された現在時刻を復号します。復号した結果が2の平文の現在時刻と一致していたら、クライアントで入力したパスワードは、サーバ側で覚えているパスワードと一致したということになり、正常系のAS-REPで応答して、TGT等を返します。復号した結果が2と一致していなかったら、クライアントで入力したパスワードが間違っていたということですので、クライアントにエラーのAS-REPで応答します。

で、事前認;でエラー返却時に、ドメインコントローラー側ではイベントログに認;失敗を記録し、ロックアウトなどもこれがきっかけになります。(※2)

・・・ということだと思っていますが、間違っていたらすみません。

※1 = 最初の質問に記載されているURLのページの「Example AS Administration」の6行に説明があります。

※2 = 下記のMicrosoft社ブログのページ内を「事前認;」で検索すると、そういう説明があります。

        http://blogs.technet.com/b/jpntsblog/archive/2009/03/19/3215125.aspx


2016年2月25日木曜日 1:44 ✅回答済み

チャブーンです。

#事前認;の話しを入れるつもりが忘れてしまってました...

原則的にはh-yamasakiさんのコメント通りです。ちょっとだけ補足しますね。

まず、Active Directory Kerberosの動作詳細について、一番詳しく書かれているのは以下のページです。質問者さんには、ぜひ確認いただくことをお奨めします。

https://technet.microsoft.com/en-us/library/cc772815(v=ws.10).aspx

事前認;でクライアントから送られる時刻情報は「Authenticator」と呼ばれるもので、本来はman-in-middle攻撃(攻撃者による成りすまし)を避けるためKerberosに標準実装されているものです。事前認;は、このデータをユーザハッシュで暗号化して送ることで、KDC側で復号に成功して(Authenticatorの内容が確認できれば)ユーザが入力したパスワードが問題ない、と確認できます。ちなみに送る内容は

  • UPN
  • ユーザドメイン名
  • 暗号化されたAuthenticator

の3点だったかと。なぜ事前認;が必要なのかですが(非WindowsのKerberosでは未実装なケースが多いです)、事前認;がない場合ルール上、「暗号化されたTGTを渡す」処理が発生し、セキュリティ上危険度が増すから、という理解です(復号できなければ使えませんが、TGT本体があれば理論上クラッキングは可能です)。

実際のログオンでは、TGTを渡されただけでは使用できず、サービス(SPN)にログオンできる必要があります。[LDAP/<DC名>][CIFS/<DC名>][HOST/<PC名>]などが対象ですが、この流れもうえのページには書いてありますので、質問者の方は目を通されると理解が深まるように思います。

フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


2016年2月24日水曜日 9:19

チャブーンさん

早々にご回答いただきありがとうございました。
パスワードは送信されないのですね…。間違って覚えていました。

では、復号に失敗した場合(誤ったパスワードを入力した場合)、
その「異なるパスワードが入力された」という情報はその都度 DC へ送信される
という認識で問題ないでしょうか。
(その情報を基に DC 側で失敗のログが記録されたり、その回数でアカウント
ロックアウトされたり…)


2016年2月25日木曜日 2:26

チャブーンさん
h-yamasakiさん

お二人とも、ご回答ありがとうございました。
大変勉強になりました。

教えていただいたページにも目を通して理解を深めたいと思います。

今後ともよろしくお願いいたします。