もくじ
もくじ

ldap認証とpam_mount(2007/9/22)

pam_mount

unixの伝統的な手法ではサーバーのユーザーホームをnfsとautomountを使ってログイン時にマウントする。しかし、ユーザー認証が入らないので他ユーザーのデータにアクセスすることができてしまう。さすがにrootに対してはroot squash で制限をかけられるがそのほかのユーザーに対してはIPアドレスで制限をかけることしかできない。

そこで,ユーザー認証ができるマウントを捜して pam_mount を見つけた。pamの認証時にマウントもしてしまう。マウントの方法は選択できるのでsmbを使うことにする。多少不具合が残るので,ユーザー認証の入った新しいnfsであるnfsv4を心待ちにしたい。

必要なパッケージをインストール

pam_mountのためのパッケージ libpam-mount と sambaのための smbfs をインストールする。歴史的にはsmbのクライアントだとsmbclientだが今回の用途ではいらない。

# aptitude install libpam-mount
# aptitude install smbfs

smbfsの他,samba-commonが自動でインストールされる。自動でconfigurationが動き,workgroup/Domainを聞かれるのでwindowsの時に使用していたvineを答えた。つぎに「smb.confをDHCPからのWINSの設定を使うようにするか」と聞かれた。デフォルトのまま[No]と答えた。winsはネットワークに参加しているPCを登録しておくものだが名前解決についてはDNSがあるのでいらないはず。Linuxクライアントではドメインに参加するわけでなくグループも一つしかないので存在意義はない。Windows9Xのときもかつては同じグループでなければ通信できなかったことがあるが最近はきわめて柔軟。ブラウジング(参加しているコンピュータの一覧)が必要なければほって置いてよい。ところが、Debianではアクセスにこのワークグループ名を入れるので、合わせるだけは合わせておかなければならないのではないか。

pam.d

Howto: CIFS + pam_mount(Last updated 2 August 2005)に従って次のように設定。

/etc/pam.d/common-auth の最後に

auth       optional /lib/security/pam_mount.so use_first_pass

/etc/pam.d/common-session の最後に

session    optional    /lib/security/pam_mount.so

pam_mount.conf

smbmount に /usr/bin/smbmount でなく、/sbin/mount.cifs を使うようにする。これは上記の Howto: CIFS + pam_mount にある注意書き。やってみるとやはり smbmount では不具合がある。

volumeはlogin時にどこをマウントするかの指示

vine38:/home/c3a05# vi /etc/security/pam_mount.conf 

## smbmount /usr/bin/smbmount   //%(SERVER)/%(VOLUME) %(MNTPT) -o "username=%(USER),uid=%(USERUID),gid=%(USERGID)%(before=\",\" OPTIONS)"
## adachi
smbmount /sbin/mount.cifs   //%(SERVER)/%(VOLUME) %(MNTPT) -o "user=%(USER),iocharset=utf8,uid=%(USERUID),gid=%(USERGID)%(before=\",\" OPTIONS)"
ncpmount /usr/bin/ncpmount   %(SERVER)/%(USER) %(MNTPT) -o "pass-fd=0,volume=%(VOLUME)%(before=\",\" OPTIONS)"
   
## smbumount /usr/bin/smbumount %(MNTPT)
## adachi
smbumount /sbin/umount.cifs %(MNTPT)

#adachi
volume * smbfs jonah & /home/& dmask=0710 - -

iocharset=utf8 はシステムのロケールがutf-8であるから。WindowsMeの時代からSAMBAはshift_JISでアクセスしてきたファイル名をutf-8で記録するようにしていたから。

テストユーザー

betaがgdmでログインしていない状態でコンソールログインすればいいだけなのだが,(上記だってログインしていれば問題)もう一人テストユーザー(c3s05)を作った

uidが一致しないとまずいはず。

fish37:/home/beta# addgroup --group --gid 1791 c3s05
Adding group `c3s05' (GID 1791) ...
終了。
fish37:/home/beta# adduser -uid 1791 -gid 1791 c3s05
Adding user `c3s05' ...
Adding new user `c3s05' (1791) with group `c3s05' ...
Creating home directory `/home/c3s05' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:

マウント成功

この段階では認証はローカルなので、テストはテストユーザー以外のユーザーでログインし、テストユーザーで追加ログインをする形で行えばいちいち再起動する必要がない。[Ctrl]+[Alt]+[F2]などでコンソールを切り替えてコンソールログインができるし(GUIに戻るには[Ctrl]+[Alt]+[F7])、メニューからは別ユーザーでの追加ログインもある。

コンソールでもGUIでもログインするとマウントされる。

login: c3s05
Password:
Last login: .................

$ ls -l
合計 9
-rwxr-xr-x 1 c3s05 c3s05  291 2006-05-10 11:53 log.txt
drwxr-x--- 1 c3s05 c3s05 4096 2005-04-07 14:33 tb
drwxr-x--- 1 c3s05 c3s05 4096 2005-11-26 14:57 user

LDAP認証

次にldapを使うようにする。サーバーはすでに動いており、Windowsの認証サーバーとして働いている。また、nfsと組み合わせて動かすのも実証試験が済んでいる。ただpam_mountとの組み合わせは初めて。

libpam-ldap と libnss-ldap を aptitude install を使ってインストール。設定の為に質問をしてくるが,結局それでは動かなかった。(hostの部分をldapi://としてしまうとだめ)

libpam-ldap

現在の /etc/pam_ldap.conf

vine40:~# cat /etc/pam_ldap.conf |grep  '^\w'
host 10.30.30.2
base dc=st,dc=seiai,dc=ed,dc=jp
ldap_version 3
pam_password crypt
nss_base_passwd ou=People,dc=st,dc=seiai,dc=ed,dc=jp?one
nss_base_shadow ou=People,dc=st,dc=seiai,dc=ed,dc=jp?one
nss_base_group  ou=Groups,dc=st,dc=seiai,dc=ed,dc=jp?one
nss_base_hosts  ou=Hosts,dc=st,dc=seiai,dc=ed,dc=jp?one

libnss-ldap

現在の /etc/libnss-ldap.conf

vine40:~# cat /etc/libnss-ldap.conf |grep '^\w'
host 10.30.30.2
base dc=st,dc=seiai,dc=ed,dc=jp
ldap_version 3
rootbinddn cn=admin,dc=st,dc=seiai,dc=ed,dc=jp
nss_base_passwd ou=People,dc=st,dc=seiai,dc=ed,dc=jp?one
nss_base_shadow ou=People,dc=st,dc=seiai,dc=ed,dc=jp?one
nss_base_group  ou=Groups,dc=st,dc=seiai,dc=ed,dc=jp?one
nss_base_hosts  ou=Hosts,dc=st,dc=seiai,dc=ed,dc=jp?one

インストール時の設定スクリプトで LDAP root account password: を聞かれる。/etc/libnss-ldap.secret に平文で記録された。

nsswitch.conf not managed automaticallyといわれる

nsswitch.conf

現在の /etc/nsswitch.conf

vine40:~# cat /etc/nsswitch.conf |grep  '^\w'
passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap
hosts:          files dns
networks:       files
protocols:      db files
services:       db files
ethers:         db files
rpc:            db files
netgroup:       nis

pamの設定

ldapを入れた時に,ローカル認証との組み合わせで完全に把握できないまま,動くからそのままというところもあった。今回それに加えてマウントの認証が加わる。

rootのコンソールを確保して別のコンソールからまずcuiで認証をする。

/etc/pam.d/common-auth

pam_mount.so を optional で入れろとあるがこれではうまくいかない。ldapがある関係でsufficient を使わざるを得ないが optionalをその後に置いても見てくれない。

pam_mount.so try_first_pass を required で置きたいが,rootはローカル認証,他はldap認証,パスワードは1回の入力というようにはなかなかいかない。

英語圏のサイトで2ヶ所ぐらい次のような書き方を紹介していた。mountが最初というのは意外だが,うまくいく。

#
# /etc/pam.d/common-auth - authentication settings common to all services
#
auth    optional        pam_group.so
auth    required        pam_mount.so
auth    sufficient      pam_ldap.so use_first_pass
auth    required        pam_unix.so nullok_secure use_first_pass

/etc/pam.d/common-session

これは納得がいかないのだがこうしないとだめな様子。

#
# /etc/pam.d/common-session - session-related modules common to all services
#
session    required    pam_unix.so
session    optional    pam_ldap.so
session    optional    pam_mount.so

/etc/pam.d/common-account

#
# /etc/pam.d/common-account - authorization settings common to all services
#
account required        pam_unix.so
account [default=bad success=ok user_unknown=ignore service_err=ignore system_err=ignore authinfo_unavail=ignore] pam_ldap.so

/etc/pam.d/common-password

#
# /etc/pam.d/common-password - password-related modules common to all services
#
password   sufficient   pam_unix.so nullok obscure min=4 max=8 md5
password   sufficient   pam_ldap.so use_authtok

ldap認証-マウントの結論

これでldapを優先して認証されユーザーホームがマウントされる。rootはldapに登録されていないので、ローカルのrootとして認証される。マウントは必要ないのだが、機構上マウントを試みてエラーとなってあきらめているようだ。

ちなみにローカルのrootになってもマウントされた他のユーザーのホームディレクトリにはアクセスできない。smbマウントがrootを排するようにしているからである。必要な時はサーバー側からサーバーのrootになってアクセスすればよい。

機構上は以下が順当のように思うので、もう一度やってみたところこれでもうまくいった。当時は他の条件もありうまくいかなかったようだ。

#
# /etc/pam.d/common-auth - authentication settings common to all services
#
auth	optional	pam_group.so
auth	sufficient	pam_unix.so nullok_secure 
auth	required	pam_mount.so use_first_pass
auth	sufficient	pam_ldap.so use_first_pass
auth	required	pam_deny.so

しかし、root以外のローカルに登録されたユーザーでも、マウントが起こりそのために2度目のパスワードを打たなければならない。どうやらcommon-sessionでのマウントのようだが、"session required pam_unix.so" を sufficient にするとldapに登録されたユーザーもマウントされなくなる。

どちらにせよ/home以下のユーザーディレクトリはマウント時に自動で作られてログオフ時に削除されるはずで、最初はできていたのだがある時から消えなくなった。アンマウントはされるのでフォルダのみ残る。

いくつかの不具合

ネットワーク

NICがeth0にならない。dmesgでは一度eth0と認識されudevによりeth1にrenameされる。その後ieee-1394がeth0になる。その後eth1が100Mbpsでリンクアップする。

これによる不都合もあるがeth0にするにはMACアドレスとの対応を書かなければならない。これだと1台1台やらなければならないので,partimageによるシステムのコピーができない。

そうこうしているうちにudevが勝手に初回の起動でMACアドレスとの対応を記録するようになった。毎回割り振りが異なるのは困るとの声で仕様変更になったのだろう。これはpartimageによるシステムのコピーのときには消しておかないとコピー先ではeth1が予約済みということになりeth2が作られることになる。

この件はあきらめてeth1にあわせて /etc/network/interfaces を設定をした。

dhcpでMACアドレスによる固定IP配布にしている。起動時にこれを受け取れないことがある。

これは dhcdbd(DHCP D-BUSデーモン)をアンインストールすることで解決した。単なるdhcpにしたということ。これは後のgroup設定に関わることかもしれないが,ネットワークはNICに固定なのでこれでかまわない。

group追加

ldapが動く前にudevだったかが、グループの問い合わせをする。登録していないグループなのにどうして問うのかは理解できないが、nsswitch.confに compat ldpap としてある関係で、file(/etc/group) にないのでldapに問い合わせてエラーになる。止まることはないが無駄な時間を費やし、画面もにぎやかになる。なんのgroupか分からないがローカルに登録すれば治まる。

/etc/passwd には( shadow にもそれなりに)

tss:x:402:402:udev2ldap,,,:/nonexistent:/bin/false

/etc/group には

tss:x:402:
nvram:x:403:
rdma:x:404:
fuse:x:405:
kvm:x:406:
安達 順一
http://www.seiai.ed.jp/
Last update: