winbind で Linux 認証 on Ubuntu

2011-06-02 追記: 古くなったんで Natty (11.04) 向けに書きなおした ⇒ winbind による Active Directory 認証 on Ubuntu 11.04 - daily dayflower



winbind で Linux の認証を ActiveDirectory にまかせる - daily dayflowerUbuntu でやろうとしたら,いくらか RedHat 系と勝手が違うところがあったのでメモ書き。


Linux マシンの諸元は下記の通り:

Active Directory Server の諸元は下記の通り:

サンプル名称:

  • ドメイン名: HOGE
  • ActiveDirectory のレルム: hoge.example.com
  • ActiveDirectory の Domain Controller: dc.hoge.example.com
  • Unix サーバの NETBIOS 名: PENGUIN

Kerberos の設定

デフォルトのインストールでは kinit コマンドが使えないので krb5-user パッケージをインストールします。

さらに /etc/krb5.conf は以下のような感じ。

# /etc/krb5.conf:

[libdefaults]
default_realm = HOGE.EXAMPLE.COM

...... snip snip snip ......

[realms]
HOGE.EXAMPLE.COM = {
    kdc = dc.hoge.example.com
    admin_server = dc.hoge.example.com
}

...... snip snip snip ......

[domain_realm]
.hoge.example.com = HOGE.EXAMPLE.COM
hoge.example.com = HOGE.EXAMPLE.COM

...... snip snip snip ......

実際には krb5-config というパッケージをインストールしたときに CUI の設定画面が開いたのでそこで設定しました。ただし,[][domain_realm][] セクションについては設定してくれなかったので,そこは手書きで。

winbindd (Samba) の設定

一般的な設定についてはすっとばして,今回の winbindd に関わる部分の設定のみ書きます。

# /etc/samba/smb.conf:

[global]

name resolve order = wins bcast

workgroup = HOGE
realm = HOGE.EXAMPLE.COM
password server = dc.hoge.example.com
netbios name = PENGUIN

algorithmic rid base = 10000
idmap domains = HOGE
idmap config HOGE:default = Yes
idmap config HOGE:backend = rid
idmap config HOGE:range = 10000-19999
idmap config HOGE:base_rid = 0
winbind nss info = sfu:HOGE
winbind separator = !
winbind cache time = 15
winbind use default domain = Yes
winbind normalize names = Yes
template homedir = /home/%U
template shell = /bin/bash

静的に名前を解決している場合はきちんと /etc/hosts が設定されているからいいんですが,とりあえず DHCP でインストールして適当にホスト名をつけている場合,/etc/hosts に参加したい NETBIOS 名を書いておきます。

# /etc/hosts:
127.0.0.1   localhost
127.0.1.1   penguin.hoge.example.com penguin

# The following lines are desirable for IPv6 capable hosts
...... snip snip snip ......

この 127.0.1.1 って Ubuntu 作法なのかしら。


さて Kerberos と winbind の設定がすんだので,いよいよ ActiveDirectory に Linux マシンを参加させます。

% sudo kinit Administrator
Password for Administrator@HOGE.EXAMPLE.COM: ********

% sudo net ads join -U Administrator
Administrator's password: ********
Using short domain name -- HOGE
Joined 'PENGUIN' to realm 'HOGE.EXAMPLE.COM'

% sudo net ads testjoin
Join is OK

winbindd を立ち上げて,

% sudo /etc/init.d/winbind start
 * Starting the Winbind daemon winbind
   ...done.

% wbinfo -t
checking the trust secret via RPC calls succeeded

% wbinfo -u
administrator
guest
...... snip snip snip ......

nsswitch の設定

Linux からさまざまなネットワーク情報(ユーザアカウントやマシン名等)を取得できるように nsswitch.conf を設定します。

# /etc/nsswitch.conf:
passwd:         compat winbind
group:          compat winbind
shadow:         compat winbind

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4 wins
networks:       files

...... snip snip snip ......

おおもとの設定に winbindwins を付与しただけです。

PAM の設定

/etc/pam.d/common-* に winbind 用の設定を付け加えていきます。ただし common-account については設定する必要はありません。

/etc/pam.d/common-auth の設定は以下の通り。

# /etc/pam.d/common-auth:
auth        sufficient      pam_unix.so nullok_secure
auth        sufficient      pam_winbind.so use_first_pass
auth        required        pam_deny.so

/etc/pam.d/common-password の設定は以下の通り。

# /etc/pam.d/common-password:
password    sufficient      pam_unix.so nullok obscure md5
password    sufficient      pam_winbind.so use_authtok
password    required        pam_deny.so

/etc/pam.d/common-session の設定は以下の通り。

# /etc/pam.d/common-session:
session     required        pam_unix.so
session     required        pam_mkhomedir.so skel=/etc/skel umask=0022
session     optional        pam_foreground.so

pam_unix.sorequired になっているところを sufficient にして,最後に pam_deny.sorequired で追加してます(common-sessionrequired のままです)。つかもう PAM の仕組みを忘れたのでちょっとあやふや。

SFU スキーマにアクセスできるように

さて,以上の設定で Linux のアカウントとして ActiveDirectory の情報が使えるようになったのですが,Home Directory や Login Shell などの SFU スキーマの情報が取得できませんでした。

あれこれ探ったのですが,RedHat 系(CentOS 等)では *_static_modules_idmapidmap_ad が含まれるのに対し,Ubuntu では含まれていないんですね。んで,SFU 情報を取得する関数は実は idmap_ad に含まれているのでこれをなんとかして読み込ませなきゃいけないのです。

最初ダミーのドメインidmap domains に追加してその idmap config backendad にしたのですが,HOGE ドメインでは依然 SFU スキーマにアクセスしないままでした。

で,ちょっと無理やりな解決法をみつけました。Samba 用の動的ライブラリディレクトリに nss_info/sfu.so というファイルがあると winbind nss info = sfu 時にそれを読み込んでくれるので,idmap/ad.so の symbolic link としておいておきます。

% cd /usr/lib/samba

% sudo mkdir nss_info

% sudo ln -s ../idmap/ad.so nss_info/sfu.so

こうすることで nss_info/sfu.so として idmap/ad.so を読み込んでくれるので,idmap config backend = rid 時にも winbind nss info として sfu を使えるようになります。

2008/04/03 追記: Ubuntu 8.04 Hardy Heron ではもともと同じようにシンボリックリンクを貼ってました。Ubuntu 的にはこの対処法で OK ってことで。