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 等を内包してたりするんで,中身が見えないと嫌な人には向いてない。

諸元

Linux マシン
Active Directory サーバ

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 マシンの名前解決ができるように hostswins をいれておく。

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.somkhomedir というオプションが用意され,それを使えばわざわざ 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_grouplogin にしか記述されてないんでうまくいくのか不明。

起動スクリプト (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 いじってしまってるんで,もしいじらなかった場合に使えないのかどうか実は知らない。