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ではアクセスにこのワークグループ名を入れるので、合わせるだけは合わせておかなければならないのではないか。
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
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を使うようにする。サーバーはすでに動いており、Windowsの認証サーバーとして働いている。また、nfsと組み合わせて動かすのも実証試験が済んでいる。ただpam_mountとの組み合わせは初めて。
libpam-ldap と libnss-ldap を aptitude install を使ってインストール。設定の為に質問をしてくるが,結局それでは動かなかった。(hostの部分をldapi://としてしまうとだめ)
現在の /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
現在の /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といわれる
現在の /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
ldapを入れた時に,ローカル認証との組み合わせで完全に把握できないまま,動くからそのままというところもあった。今回それに加えてマウントの認証が加わる。
rootのコンソールを確保して別のコンソールからまずcuiで認証をする。
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 - 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 - 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 - 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を優先して認証されユーザーホームがマウントされる。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に固定なのでこれでかまわない。
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:安達 順一