2017年11月21日火曜日

389 Directory と AD の連携 (AD->LDAP PassSync編)

先日の389 Directory と AD の連携 (AD-> LDAP 編)の続き。

前回は AD からアカウントの同期は出来るようになった。今回は AD 側でユーザが変更した(管理者が変更するのでもOK)パスワードを、389 Directory に送って同期するようにしてみる。

似たような仕組みは以前自分でも会社のプロジェクトで作ったことがあって、そのときは Windows 上の LSA(Local Security Authority) ってのがコールバックする PasswordChangeNotify() 関数を実装したけどおそらく同じ仕組みだろう。後で 389 のソース確認してみる->自分。

  1. まずは、389 Directory を LDAPS 化する。生でも行けるのかも知れんが、99 % のお客さんは暗号化して欲しいって言ってくるだろう。ただそんな場合でもオレオレ証明書(Self-Signed)で十分。なのでまずは 389 Directory に入れる証明書と秘密鍵を作って certutil に噛ませるために PKCS#12 にする。ここで -name で指定する friendlyname は Server-Cert という名前にしないと後で苦労するっぽい(この情報は Web のどこかに書いてあったんだけど見失ってしまった...)
  2. openssl req -x509 -newkey rsa:2048 -keyout 389.key -out 389.crt
    openssl pkcs12 -export -out 389.p12 -inkey 389.key -in 389.crt -name Server-Cert
    
  3. 上記でできた 389.p12 ファイルを pk12util で /etc/dirsrv/slapd-<インスタンス名>/ 下の NSS データベースに登録。
  4. pk12util -i 389.p12 -d /etc/dirsrv/slapd-ryo/
    
    PKCS#12 のパスワードやデータベースのパスワードを聞かれるので適切に応答する。そして登録できたか確認
    # certutil -L -d /etc/dirsrv/slapd-ryo
    Certificate Nickname                                         Trust Attributes
                                                                 SSL,S/MIME,JAR/XPI
    Windows Server AD CA cert                                    P,,  
    Server-Cert                                                  u,u,u
    
    Server-Cert って証明書があるのがわかる。ちなみにその上の Windows Server AD CA cert ってのは前回作った Windows Server 側の証明書。秘密鍵も確認。
    # certutil -K -d /etc/dirsrv/slapd-ryo
    certutil: Checking token "NSS Certificate DB" in slot "NSS User Private Key and Certificate Services"
    Enter Password or Pin for "NSS Certificate DB":
    < 0> rsa      1xxxxxxxxxxxxxxxaff5b7826ec1dxxxxxxxxxx   Server-Cert
    
    ちなみに何らか失敗して p12 ファイルの登録をやり直したい場合に証明書と秘密鍵を消すが、これを certutil の -D で証明書だけ消すと秘密鍵が消せなくなるので注意。この場合は再度同じ p12 を登録してから certutil の -F オプションを使うとよい。数年前のコミュニティの ML でバグだって言っている人がいたが、直してないところをみるとディベロッパはバグじゃないと思ってるんだろう。

  5. あとは 389 Directory の設定に証明書の情報を入れるため以下 ldif を ldapmodify (-D "cn=Directory Manager")で登録。詳細は公式ドキュメント参照。
  6. dn: cn=encryption,cn=config
    changetype: modify
    replace: nsSSL3
    nsSSL3: off
    -
    replace: nsSSLClientAuth
    nsSSLClientAuth: allowed
    -
    add: nsSSL3Ciphers
    nsSSL3Ciphers: +all
    
    dn: cn=config
    changetype: modify
    add: nsslapd-security
    nsslapd-security: on
    -
    replace: nsslapd-ssl-check-hostname
    nsslapd-ssl-check-hostname: off
    
    続けて同様に ldapmodify で、以下 ldif を登録。これは後述の /etc/dirsrv/dirsrv/slapd-<インスタンス名>/下の pin.txt ってファイル(これも ldif ぽい)に関する設定のようだ。以下の nsSSLToken というのは、pin.txt の中の属性名を指し示している模様。
    dn: cn=RSA,cn=encryption,cn=config
    changetype: add
    objectclass: top
    objectclass: nsEncryptionModule
    cn: RSA
    nsSSLPersonalitySSL: Server-Cert
    nsSSLToken: internal (software)
    nsSSLActivation: on
    
  7. NSS データベースのパスワードファイル /etc/dirsrv/slapd-<インスタンス名>/pin.txt を以下のように作成。左辺の「internal (software)」は上記の nsSSLToken の値であることに注意。
  8. internal (software):secret
    
    パーミッションを dirsrv:dirsrv の 0400 にする。
    # chown dirsrv:dirsrv /etc/dirsrv/slapd-ryo/pin.txt
    # chmod 400 /etc/dirsrv/slapd-ryo/pin.txt
    
  9. あとは dirsrv (ns-slapd)を再起動するだけ。
  10. systemctl restart dirsrv@ryo
    
    ss すれば 636 で listen してるはず。

  11. 上記までで LDAPS 化は完了して、あとは AD 側の設定。公式ドキュメント(Installing PassSync)のところに Windows 用バイナリのリンクがあるので、ダウンロードしてインストールする。インストーラの最初の画面で以下の項目を入力する必要がある。
    • Host Name: 389 Directory サーバの FQDN
    • Post Number: LDAPS ポート(636)
    • User Name: 前回 389 Directory 上に作ったレプリケーション用ユーザ (cn=sync user,cn=config)
    • Password: 上記レプリケーション用ユーザのパスワード
    • Cert Token: よくわからない。必須でないので空っぽ。
    • Search Base: 同期するユーザの 389 Directory 側の Base DN

  12. Windows Server に PassSync をインストールし終わったら、PassSync に 389 Directory の LDAPS のサーバ証明書を certutil.exe でインポートする。公式ドキュメント(Configuring PassSync)参照のこと。ここで注意したいのが、前回同様 certutil.exe の -t オプションを "P,," とすること。
  13. cd "C:\Program Files\389 Directory Password Synchronization"
    certutil.exe -d . -A -n "DS CA cert" -t "P,," -a -i \path\to\389.crt
    
    ここで Windows お得意のマシンごと再起動。

  14. 389 Directory に戻ってひとつだけ前回にやっていなかったことがあって、それをやらなくてはならない。前回はレプリケーション用ユーザの "cn=sync user" を 389 Directory 上に作ったが、このユーザに userPassword 属性の書込を許可する aci を与えていなかった。以下 ldif を ldapmodify (-D "cn=Directory manager") で登録する必要がある
  15. dn: ou=people,dc=example,dc=com
    changetype: modify
    add: aci
    aci: (targetattr="userPassword")(version 3.0;acl "password sync";allow (write,compare) userdn="ldap:///cn=sync user,cn=config";)
    

  16. 上記までで設定は完了。 AD 側で、あるユーザのパスワードを変更すると 389 Directory 側の対応するユーザの userPassword 属性が変更されるはず。うまく行かない場合は、Windows Server 側の C:\Program Files\389 Directory Password Synchronization/passsync.log を確認すると良い。



0 件のコメント:

コメントを投稿