ちと実験中。PHPのLDAP関数を使ってActiveDirectoryのグループやユーザ情報を操作したい場合の話。まず可能不可能で言えば「可能です」。
 なおPHPのバージョンは少し古くてCentOS5系列準拠の5.1.6。WinはWinSvr2008R2。

  • まずはTLS接続できること。「変更」をしたい場合は必須っぽい。自作証明書で可。
  • Linuxのphp-ldap経由でADにTLS接続しようとする場合、OpenLDAPクライアントの設定に左右される。で、ADサーバを自作証明書で運用する場合、自作証明書をOpenLDAPに設定するか、あるいは「/etc/openldap/ldap.conf」に「TLS_REQCERT never」の1行を追加して証明書の正当性判断を完全に殺す。後者がてっとり早くはあるがなりすまし判断は全くできなくなるので注意。
  • ldap_connectでの接続先は「ldaps://」ではじめる。
  • 「Administrator」権限でbindできれば一通りはできそうな感じ。
  • ユーザアカウントを特定グループに所属させる場合
    • ユーザ側から見た所属グループのattributeは「memberof」だが、これは操作できないっぽい。
    • なので逆にグループ側のattribute「member」にユーザを追加する。こうするとユーザのmemberofも自動で追加される。
  • ユーザアカウントのパスワードattributeは「unicodePwd」。これはいかなる方法を持っても閲覧は不可、らしい。
  • 別に読めなくても追加や変更はできる。
  • 一般的に、unicodePwdに入る値は「パスワード平文をダブルクォーテーションて括ったもの」を「UTF-16LEに変換」し更に「base64でエンコードする」とある。
  • 上記を真正直に捉えて下記のようにやろうとするとハマる。
    •  $arrEntry['unicodePwd'] = base64_encode(mb_convert_encoding("\"newpass\"","UTF-16LE"));
    •   ldap_mod_replace($ld,$txtDn,$arrEntry);
  • どうもPHPのLDAP関数はbase64エンコードを自動でやってくれるようで、1行目のbase64_encodeは不要っぽい。LDAP関数って前からそうだっけか?
    •  $arrEntry['unicodePwd'] = mb_convert_encoding("\"newpass\"","UTF-16LE");
    

関連タグ:PHPActiveDirectoryLDAP
2012-08-23 [技術・作業]