samba/ldapの覚え書き(暫定版)

マルチポスト元→http://exth.net/~tgbt/wordpress/2010/02/03/2879/


やろうと思う度にはまって時間を無駄にするので、一気に頑張った。オンラインで探すと、古すぎて事情が同じか疑問な資料が多かったり、一気にまとめて設定していたりで、とてもツライ。
この資料では0から順番を追って説明していくので、少なくとも現存するどのドキュメントよりもなんとかなる資料のつもり。ただし、LDAPにおけるdnやdcの説明とか、samba設定ファイルの基本的な書き方とか、そういうのは説明しないので、適当に付け焼き刃を持ってくること推奨。

以下、導入のための覚え書き。間違いが含まれていたらごめんね。

要求仕様

sambaとUNIXユーザー情報の一元化、要するにパスワードなどの共有をしたい。
共通ユーザの情報はLDAPに持たせて、ユーザの管理(追加やパスワード変更やシェル変更など)は(とりあえず)LDAPサーバ上でだけできればOKとする。

構成

ldapサーバ兼sambaサーバ兼ファイルサーバなサーバノードを1台、ldap情報を元にログインやらなんやらを行うクライアントノードが数台。という構成。
より大規模な環境だとldapを別の専用DBサーバするのかなぁ、と思いつつも、ここではそこまででかい話にはしない。
OSはとりあえず手堅く(?)CentOS5.4 x86_64。

手順

パッケージの準備

とりあえず使いそうなものは入れておく。

  • OSインストール時のパッケージ選択でServerを選んでおけば、samba-clientやnfs-utilsなどは勝手に入る模様
  • yum updateしておく
  • openldap-servers(サーバのみ)、openldap-clients(サーバ・クライアント両方)を導入しLDAPを利用可能にする
  • smbldap-toolsの導入
    • smbldap-tools内のsmbldap-populateを使いたいが、CentOSのデフォルトパッケージツリーに存在しないため、まずはrpmforgeを導入
    • http://packages.sw.be/rpmforge-release/以下の該当箇所からrpmforge-release のrpmを拾ってきて、rpm -ivhする
    • 改めてyum install smbldap-toolsすれば導入完了
LDAPサーバの準備
  1. LDAPサーバ起動まで
    • slapd.confにroot情報などを記述
      • suffix,rootdn,rootpwを書き換える
    • ldap鯖の起動
      • chown -R ldap:ldap /var/lib/ldap
      • cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
      • /etc/init.d/ldap start(restart)
      • 起動が確認できたら(/etc/init.d/ldap status)、chkconfig ldap onしておく
  2. LDAPの動作確認
    • ldifファイル(後述)にユーザ情報を記述し、下記コマンドにてDBに投入
      • ldapadd -x -D "slapd.confに書いたrootdn情報" -w slapd.confに書いたrootpw情報 -f ldifファイル
    • slapcatで登録したデータが見えれば成功
      • slapcatはLDAPが起動していなくて使える模様(知らなかった!slapd.confを参照してldapディレクトリを探索しに行くプログラムなのかな?)
  3. LDAPのDBを参照してログインするために
    • authconfig-tuiでLDAPにチェックを入れる、情報入力の画面が出るのでサーバアドレスとrootdnを入れる
    • id 登録したユーザ名 とやって参照できればOK
    • su (-) 登録したユーザ名 でログイン可能、ただしHOMEディレクトリの準備ができているか等は別問題
      • 以上の設定と確認はLDAPクライアントからも可能、もちろんHOMEディレクトリの準備などの問題は別問題
      • authconfig-tuiの結果は/etc/ldap.confや/etc/openldap/ldap.confに書き込まれるようなので、これらのファイルを直接弄っても良い
  4. (補足:LDAPのデータにミスがあった場合の対処)
    • LDAPのDBデータ修正方法
      • (後で書く)
    • LDAPのデータバックアップ・復元方法
      • (後で書く)

テストに使ったldifファイルの例

dn: dc=test,dc=example,dc=net
objectClass: dcObject
objectClass: organization
dc: test
o: test

dn: ou=People,dc=test,dc=example,dc=net
objectClass: organizationalUnit
ou: People

dn: uid=testuser,ou=People,dc=test,dc=example,dc=net
objectClass: account
objectClass: posixAccount
uid: testuser
cn: testuser
userPassword: testuser
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /exports/home/testuser
NFSを使う設定

HOMEディレクトリが共有できないと不便なので、なんとかする

  • /etc/exportsを書き、/etc/init.d/nfs start でnfsdを起動する
    • おそらくnfslockも一緒に起動してくれる
    • chkconfig nfs onやchkconfig nfslock onで自動起動にしておくと良い
  • mountできることを確認する
    • クライアントでmount サーバのIPアドレス:exportsに書いた公開アドレス マウント先 などとやる
    • うまく行ったら/etc/fstabに書く、パラメタは nfs defaults 0 0 など
    • 環境によってはautomountを仕込むべき?
SAMBAと連携するための設定

ここまでの設定で、LDAPを使った複数PC間のログイン認証一元化はできている。さらにsambaの認証もまとめようというのがここでのお話。設定ファイルを書き換えたら適当にldapやsmbをrestartすること。

  • samba.confにldap関連の設定を記述する
    • [global]領域に以下のような情報を書く
security user
passdb backend = ldapsam:ldap://localhost
ldap suffix = dc=省略
ldap admin dn = cn=Manager,dc=省略
ldap user suffix = ou=Users
ldap group suffix = ou=Groups
ldap machine suffix = ou=Computers
ldap passwd sync = yes
    • ou=の項目はsmbldap.confのusersdn=,computersdn=,groupsdn=に対応していると考えられる
      • と言いつつも、間違っていても問題なかったケースと問題だったケースを経験しているので、やや理解が足りていないのが現状
  • smbldap.confのSID,sambaDomain,masterLDAP,masterPort,ldapTLS,suffixあたりを適切に修正する
    • ここまで進んでいればこれらに何を入れればよいかは自明のはず
    • SIDは説明がコメントで書かれているはずだが、net getlocalsidを実行すれば良い
    • slaveLDAP,slavePortは存在しないならコメントアウトしておいた方がよさそう(書いてあると確認しようとする模様)
    • userLoginShellやuserHomeなど、いかにもなオプションは適当に弄っておくと吉
      • NFS上にHOMEディレクトリを置く場合などはuserHomeを弄っておくと幸せ
      • GIDなどもいじれるけど、たぶんデフォルトで問題は起きないかと……
  • smbldap_bind.confのmasterDNとmasterPwを記述する
  • slapd.confにincludeを追加する
    • include /path/to/samba.schema
    • samba.schemaは/usr/share/doc/samba-3.0.33/LDAP/samba.schemaあたりから適当にコピーしておくこと
  • smbldap-populateを実行する
    • samba関係の色々なユーザ情報が追加される
    • 怪しいエラーが出たら各種設定ファイルを見直すべし
    • (最後にパスワードを聞かれるが、これが何に影響するのか良くわからない)
  • sambaからLDAPにアクセスするためのパスワードを登録する
    • smbpasswd -w LDAPの管理者パスワード で登録できる
  • smbclientで動作確認
    • smbclient -U ユーザ名 -L LDAPサーバアドレス でsambaの情報が見えるはず
    • ユーザ名を入れなければ管理者扱い
  • mount -t cifsでマウント

以上にて設定自体は完了。あとはユーザの追加や情報変更をどうするかの問題。

ユーザ管理

passwdやらchshやらが使えるのかというと、使えない。こいつらはldap向けじゃないから。PAMの設定を頑張れば良いのかも知れないけど、私はPAMのカスタマイズまで頑張る気はない。
どうすれば良いかというと、smbldap-toolsを入れればsmbldap-で始まるコマンドがいくつも使えるようになるので、これらを利用する。

  • ユーザ追加
    • smbldap-useradd
      • smbldap-useraddを引数無しで実行すればオプションの概要がわかる。-a -mあたりは付けておくべき。ちなみに-mで作られるHOMEディレクトリは、-dで指定するか、前述のようにsmbldap.confを弄っておくと良い。
  • ユーザ情報の変更
    • パスワードやシェルをどうやって変えるか。パスワードはsmbldap-passwd、その他はsmbldap-usermod。usermodは引数無しで実行すると出力される使い方を見ればだいたいわかるはず。
  • グループの追加・変更
    • "Domain Users"みたいにスペースが入って気持ち悪い!とか、gidの値をもっとでかいエリアに持っていきたい!とか思った場合にどうするか
    • smbldap-groupmodでグループ名の変更やグループの追加をすると良い
    • しかし、単純にグループを smbldap-groupadd -g gid groupname で追加しただけではsmbldap-usermodでユーザのgidとして設定しようとしても弾かれる
    • エラーメッセージにはSIDがどうのこうのと出るはず
    • Domain Usersの情報を見るとsambaSIDが設定されている。gidに使うグループにはこいつが必要。「SIDとして指定した値にgidNumberが付加された値」が設定されているはずなので、これを適当にぱくってsmbldap-groupmod -s S-hogehoge groupnameの形式の指定をしてやれば、smbldap-usermodでgidとして指定可能になる.
      • S-hogehogeの部分については、net getlocalsidで取得し設定した値に-503などの接尾辞が付いているはずである。この値はおそらくsmbldap.confで設定したSIDにdefaultUserGidが追加されているもののはずなので、末尾の値をそれらしく偽装すればOK!

その他

  • LDAPのアクセス設定関係をちゃんとやってない。sldap.confにaccessをいくつか規定しておくべき。
  • sambaの詳細設定をもう少しやるべき。LDAPの特定ユーザ群だけアクセスできる共有フォルダとかまだ作れてない。もちろん許可ユーザ名をだらだら書いちゃえばいけるけど……。
  • LDAPのパスワードを平文から暗号化したものに変えた場合の設定。sambapasswdに喰わせるときに平文が必要かも知れないけど、それ以外たぶん問題ないよね……?
  • クライアントPCからユーザ情報を変更できるか。設定ファイルを書けば問題なくできる気はしている。

追記

  • グループを追加してもSIDで蹴られる問題は、-aオプションで解決するかも。manを見るとそう見える。試してない。(20100208)