July 3, 2015

LDAP で Active Directory をレプリケーションしたい、という話

AD を源泉とした場合、何か理由があってレプリケーションできないよねーと一瞬思ったのだけど、周りに実装した実績あるよな?アレレ???となったので調べた。

なお、この話のターゲットはあくまで『ユーザ/グループ/パスワード』の 3つであって GPO やらは考えていないし、何か致命的な勘違いをして間違った理解をしている可能性が多分にあるので注意する必要があると思われ。

AD は NTLM ハッシュ形式で保持する

  • NTLM ハッシュ形式のパスワード情報は LDAP のパスワードとして使えない
  • AD に SFU がインストールしてあれば ypcat で CRYPT 形式のパスワードが取れる
    • 恐らくPowerShell でもできるだろう
  • SHA1 にする為には結局生パスワードが必要
  • unixUserPassword 属性から、NIS用に暗号化されたパスワードを取り出すことは可能

パスワード変更時にフックするやり方

  • Red Hat Directory Server や 389 Directory Server (旧称: Fedora Directory Server) には Windows Sync と言う機能があり、変更を同期できる
  • その他パスワード変更用の Web UI 経由など、一旦フックするなり手前で吸い出すなりする事で “パスワードの変更” には対応出来るし、いくつかソリューションがある

源泉 AD からの初回同期

  • SHA1 など LDAP に使えるパスワード形式を入手するためには、前項の様にパスワード変更時にフックするか、NTLM を復号する必要がある
  • NTLM の復号は無理ゲーなので他の方法を考える必要がある
  • 初回に関しては Samba の vampire 機能でユーザ/グループ/パスワードの移行ができる
    • ただし AD は LDIF ではパスワードを取り出せない
    • パスワードは posixAccount userpassword ではなく、 SambaSAMaccountNTpassword になる(未検証)
    • よってもう少しこねる必要がある(ハズ)

まともにやろうとすると、次の 2つ 3つ くらいしか選択肢がない雰囲気。もっと言ってしまうと、一個目のやり方は各ユーザがログインして初めてパスワード変更になるので、なかなかログインしてくれない人が居たりすると運用的に回らない場合がある。

  1. 全ユーザのパスワードを一旦有効期限切れにさせてしまう方法
  2. 一律に全てパスワードを変更して強引にフックに拾わせる方法
  3. PTA(Pass-Through Authentication) と、 389DS または RHDS 用 PAM Pass-Through Authentication plug-ins を使って認証をパススルーしつつ、認証が通ったタイミングで userPassword に反映する方法

3. の方法を使うと、AD を後で廃止するパターンでも、そのまま使い続けるパターンでも一番スマートにレプリケーションを作れる雰囲気。 一番のミソは一回でも認証に来てくれれば パスワード変更を伴わずに LDAP で使えるハッシュを回収できる所でしょうか。(この方法は @moriwaka さんに教えて貰いました。ありがとうございます!)

で、結局どうなのか

仕組みのお膳立てや調整が大変だが、初回パスワードのヤマを超えてしまえば、事実上 AD を源泉とした LDAP のレプリケーションは可能。 なお逆方向もやりたい場合、RHDS などを検討するのがよいと思われる。

参考

© Kazuhisa Hara 2014-2022