一つ特殊な要件が私の元に舞い込んできた。「WindowsとLinuxでユーザーを一元管理したい。ただし、WindowsとLinuxでユーザー名が違う。」をいをい。どうせえと。
まぁ、パスワードをユーザー自身に変更してもらうにはWindowsの方が圧倒的に楽だよねという事で、ユーザーを一元管理する方法はADにしましょうと。で、SFU3.5(WindowsがWindows Server 2003 R1なので)を入れてLinuxからはLDAPで見に行きましょうという事で基本的な構想をまとめた。以下、その基本構想の中であれこれ試行錯誤をした結果こうすればまぁうまくいくんじゃないかという一案である。
WindowsとLinuxで同一のユーザー名を使用する場合の話はネット上にごろごろ転がっているのだが、内容が不正確なものが意外と多く、特に/etc/ldap.confまわりに若干の混乱が見られるのでそんな情報を求めている人に対しても有用になるようにここで整理しておく事にする。
ADのLDAPを匿名で見れるようにしても良いのだがここではldapproxyなるLDAPにバインドする専用のユーザを作って、ログインはできないように、なおかつcn=Users,dc=mochi,dc=ad配下のみ読み取りできるように設定する。とはいえこの話は今回の事には何の関係もない。また、LDAPSの設定も当然行うがそれも今回の話には関係ないため割愛する。
そしてLinux(Redhat Enterprise Linux 3 ES update 6)にNSSとPAMでLDAPを使えるようにする。LDAPを使えるようにするまでは余裕だが、LDAPでSFUを見に行くようにするのがやや大変だ。と言っても知っていればどうという事はないけど。まず、SFUで作成されるADのUNIX属性はそのままでは全く使いものにならない。ではどこかで使えるように変換をかけてやらないといけないのだが、それをLinux側の/etc/ldap.confで行うわけだ。具体的には、PAMでLDAP認証(と言うかLDAPパスワードサーチ)を行うためにはLDAPサーバーに以下の項目が最低限必要になる。
●ユーザー

・objectClass: posixAccount
・attribute: uid
・attribute: userPassword
・attribute: homeDirectory
・attribute: uidNumber
・attribute: gidNumber
・attribute: loginShell

●グループ

・objectClass: posixGroup
(・attribute: uniqueMember)

こいつらをADのLDAP情報にマップしてやれば良い。具体的には/etc/ldap.confに以下の通りに記述する。

nss_map_objectclass posixAccount user
nss_map_attribute uid mobile
nss_map_attribute userPassword msSFU30Password
nss_map_attribute homeDirectory msSFU30HomeDirectory
nss_map_attribute uidnumber msSFU30UidNumber
nss_map_attribute gidnumber msSFU30GidNumber
nss_map_attribute loginShell msSFU30LoginShell
nss_map_objectclass posixGroup group
nss_map_attribute uniqueMember msSFU30PosixMember

SFU3.5に対してLDAP認証用にマップする場合、uidは普通msSFU30Nameに対してマップする。が、ここではなんとmobile(AD的には電話タブの携帯電話欄)に対してマップしている。で、UNIX拡張を行っており(つまりmsSFU30Passwordなどの属性を持っており)、かつ携帯電話欄に何か入力されているユーザーがLinuxでLDAP認証の対象となり、LinuxでのUIDは携帯電話欄に入力されている値になるという訳だ。このように、自由にマッピングを変更できるのがLDAP認証の強みである。ADで管理されている各項目の正確な項目名(Attribute名)はldapsearchコマンドで一覧してみると良い。Apache Directory Studioなど、GUIでぐいぐい見られるような奴も便利でお薦めだ。
追記:LDAPに接続するDNが分からなければADを構築したサーバーでdsquery userをすれば一覧がずらずら出てくるので参考にすれば良い。