winbind による Active Directory 認証 on Ubuntu 11.04
Ubuntu での winbind による Active Directory 認証は以前 winbind で Linux 認証 on Ubuntu - daily dayflower で書いたんだけど,だいぶ古くなったんで今の環境むけに。一応,対象 Natty だけど Maverick とかたぶん Lucid あたりまで適用できると思う。
面倒といえば面倒なのでそれを回避したいなら LikeWise 使うとか (第174回 Likewise OpenでActive Directoryを利用する:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社 参照)。ただ LikeWise もカスタマイズされた Samba 等を内包してたりするんで,中身が見えないと嫌な人には向いてない。
諸元
Active Directory サーバ
- Windows 2000 Server
- Active Directory with SFU schema
2011年にもなるのに Windows 2000 Server なんてセキュリティの面とかいろいろ間違っている気がするけど,大人の事情。Windows Server 2003 以降なら SFU schema はいらない。というか 2000 Server でもシェル等が決め打ちでよかったりすれば SFU schema はいらない。
凡例
以前のを踏襲。
- ドメイン名
- HOGE
- Active Directory のレルム
- hoge.example.com
- Active Directory のドメインコントローラ
- dc.hoge.example.com
- クライアントホスト名
- Penguin
Kerberos の設定
デフォルトでは入っていないんで krb5-config をインストール。
$ sudo apt-get install krb5-config
以前は krb5-user もインストールしていたんだけど,今は kinit
しなくても net ads join
できるんでインストールする必要はないと思う。実際なくてもできた。
/etc/krb5.conf の抜粋:
[libdefaults] default_realm = HOGE.EXAMPLE.COM [realms] HOGE.EXAMPLE.COM = { kdc = dc.hoge.example.com admin_server = dc.hoge.example.com default_domain = hoge.example.com } [domain_realm] .hoge.example.com = HOGE.EXAMPLE.COM hoge.example.com = HOGE.EXAMPLE.COM
Samba, winbind の設定
samba, winbind をインストール。
$ sudo apt-get install samba winbind
/etc/samba/smb.conf の抜粋:
[global] workgroup = HOGE realm = HOGE.EXAMPLE.COM security = ADS obey pam restrictions = Yes algorithmic rid base = 10000 template homedir = /home/%U template shell = /bin/bash # winbind separator = ! winbind cache time = 60 winbind use default domain = Yes winbind nss info = sfu:HOGE winbind refresh tickets = Yes winbind normalize names = Yes winbind enum users = Yes winbind enum groups = Yes idmap uid = 10000-19999 idmap gid = 10000-19999 idmap backend = rid
winbind separator
を指定するとなぜか pam モジュールでの認証がうまくいかない。winbind separator
を指定した場合というか winbind normalize names
と併用した場合の気がする。なので泣く泣く (?) 指定をはずしている。ま,実際には使うことほとんどないし,DOMAIN\user
な指定はメジャー (かつ Windows 側との整合性もとれてる) んで泣く泣くというほどではない。ただ,いざ使うときはシェル等から使うことが多いからエスケープが必要だったりしてダサい。
Active Directory への参加とテスト
さきほど書いたとおり kinit
は必要ないんでいきなり net ads join
する。
$ sudo net ads join -U Administrator Administrator's password: ******** Using short domain name -- HOGE Joined 'PENGUIN' to realm 'hoge.example.com' No DNS domain configured for penguin. Unabled to perform DNS Update. DNS update failed!
以前書いたとおり,手元の環境では DNS をドメインコントローラに任せていないんで,上記のように怒られている。これでも問題なく使える。
きちんと join できてるかテスト((testjoin
は join の試行を行うのではなく,join がされているかどうか調べるコマンド。名前が悪い。))。
$ sudo net ads testjoin Join is OK
できてる。
いよいよ winbind を立ち上げる。
$ sudo service winbind start * Starting the Winbind daemon winbind ...done.
なぜか winbind だけは upstart 形式になってない。ので SysV init 系の service コマンドで起動 (もちろん /etc/init.d/winbind で実行してもいいけど)。
きちんと winbind が働いているか調べる。
$ wbinfo -t checking the trust secret for domain HOGE via RPC calls failed Could not check secret $ sudo wbinfo -t checking the trust secret for domain HOGE via RPC calls succeeded
一瞬焦ったが,wbinfo -t
に限っては root 権限でないと実行できないようだ。
Active Directory のグループ一覧を取得してみる (こちらはユーザ権限で可; ユーザ一覧は -u
オプション)。
$ wbinfo -g netshow administrators dhcp users dhcp administrators ...... (以下略)
nss の設定
winbind が起動しただけでは,Active Directory のユーザ情報は winbind 内で完結しており Linux から使えない。これを Linux のユーザ情報管理システムと結合するのが nss である。
/etc/nsswitch.conf の抜粋:
passwd: compat winbind group: compat winbind shadow: compat winbind
shadow:
んとこはいらない気もするけど一応。RHEL ではコマンドで設定できたけど,Ubuntu だと全部手書きしなくちゃなんない。
ついでに,Windows マシンの名前解決ができるように hosts に wins をいれておく。
hosts: files mdns4_minimal [NOTFOUND=return] dns wins mdns4
うまくユーザ情報を利用できるかテスト。
$ id dayflower uid=11190(dayflower) gid=10513(domain_users) 所属グループ=10513(domain_users),10512(domain_admins)
できてる。もちろん getent passwd とかでたしかめてもよい。
pam の設定
以上で Active Directory 上のユーザのアカウント (情報) が Linux のアカウントと結合された。だが,ログイン時等の認証は pam 経由でおこなっているのでそちらの設定をする必要がある。
設定に必要なファイルはインストールされているので pam-auth-update を実行するだけでよい。
$ sudo pam-auth-update
のだが,ホームディレクトリが存在していないユーザはログイン等できない。これでは不便なので,認証時にホームディレクトリが存在しない場合,自動的にホームディレクトリを作成するようにする。
ホームディレクトリの作成自体は pam_mkhomedir.so を使えばできる。これをさきほどの pam-auth-update コマンドで導入されるよう,下記のようなファイルを作成する。
/usr/share/pam-configs/mkhomedir :
Name: Automatic User Dir Generation Default: no Priority: 192 Session-Type: Additional Session: optional pam_mkhomedir.so skel=/etc/skel/ umask=0022
実は (いつごろからか忘れたけど) pam_winbind.so に mkhomedir
というオプションが用意され,それを使えばわざわざ pam_mkhomedir.so を利用する必要はなくなった。んでもそっちだと umask=
等のオプションはないし,システム提供の /usr/share/pam-configs/winbind を書き換える必要があるので敬遠してる。
pam の認証とは関係ないが,Domain Admins に所属するユーザは sudo できたほうがいいので,そのように設定する。
$ sudo visudo
/etc/sudoers の抜粋:
# Members of the admin group may gain root privileges %admin ALL=(ALL) ALL %domain_admins ALL=(ALL) ALL
winbind normalize names = Yes
という設定にしているので domain_admins
という指定になっている。普通に書くなら domain\ admins
。
あと,このままだと GNOME 等で音がでなかったり USB 機器が使えなかったりする可能性がある*1ので,/etc/group を編集して,ログインするユーザを各グループに適宜所属させている。人数が多くなると面倒 (だし一元管理の趣旨に反する) ので,その場合は /etc/security/group.conf を設定すればうまくできるのかな?ただ現状 (Natty 11.04) だと pam_group は login にしか記述されてないんでうまくいくのか不明。
起動スクリプト (upstart)
以上で Active Directory に登録されているユーザであればこの Linux マシンにログインできる。
そのためには winbind さえあがっていればよい。Windows マシンからこのホスト名 (例では Penguin) を名前解決するためには nmbd もあがっていたほうがよい。SMB 共有を行わないのであれば smbd はあがっている必要はない。
ということで起動時に smbd をあがらないようにしてみる (Ubuntu だと Samba をインストールすると smbd, nmbd が自動的に起動するようになっているので)。smbd, nmbd は upstart 経由でサービスコントロールされているので,下記のファイルをいじる (のだと思う。 upstart にくわしくないのでほんとうにこれでいいかわからない)。
/etc/init/smbd.conf の抜粋:
#start on (local-filesystems and net-device-up)
start on
というところをコメントアウトした。
あとは今現在あがっている smbd をおとす。
$ sudo initctl stop smbd
もちろん sudo stop smbd でもよい。
*1:惰性で /etc/group いじってしまってるんで,もしいじらなかった場合に使えないのかどうか実は知らない。