samba_with_ldap.html written by Ryo SHIMIZU
2003/07/21 Ver2.0β: 嘘ドキュメントから一新 & Debianize
0.このドキュメントについて |
このドキュメントにおいて、太字でかかれているところは、実際に設定ファイルに書き込む文字列を、
イタリック体でかかれているところは、シェルで入力するコマンドを意味して書いています。
設定ファイルに書き込むっぽいようなことが書いてあっても、そこが太字になっていなければ、それはあくまでも例としてあげているだけのところなので、太字になっているところのみを設定ファイルに記入してください。
また、当たり前ですが、このドキュメントに書かれていることが正しいという保証はまったくありません。よってこのドキュメントに書かれていることを行って何らかの損害が生じても一切の責任を負いません。というか負えません。
1.前提条件 |
Samba と OpenLDAP を使って ActiveDirectory サーバを構築することによって OS をまたぐ形でのユーザの一元管理が楽に行えるようになります。しかし、現在運用しているサーバの構成を変えて、ActiveDirectory に移行することは非常に困難です。このドキュメントは 1 からサーバを構築することを前提に書かれています。
サーバのホスト名とドメイン名はActiveDirectory を構築する上で重要なパラメータとなります。このドキュメントでは
ドメイン名: testnet
サーバのホスト名: test001
としています。違う名前を使ってサーバを運用する場合は、適宜文章を読み替えて下さい。
2.実行環境 |
OS: Debian GNU/Linux woody
Samba: Version 2.2.6(セキュリティ上問題があるバージョンです。もしこのバージョンを使う場合はきちんとパッチを当ててからにしましょう)
3.前準備 |
このシステムに必要なパッケージの大部分は雑誌に収録されているインストール CD に含まれていないものが多いので、インターネットに接続されたサーバを使うことを推奨します。
必要なパッケージは以下のものです。
LDAP に対応させるため、ソースからのコンパイルをします。
Samba-2.2.6 の場合
configure スクリプトで LDAP 対応を指定。
./configure --with-pam --with-ldapsam --with-syslog
で、LDAP に対応する。
あとは普通に make;make install
configure スクリプトでインストール先を指定しなければ、/usr/local/samba 以下にインストールされます。
また、smb.conf は /usr/local/samba/lib/ に設置します。
4. 運営ポリシー |
5. LDAP の情報の形 |
6. LDAP サーバの設定 |
LDAP サーバの挙動を決めるのは /etc/ldap/slapd.conf です。
まずは、Samba 用のスキーマを読み込むように指定します。
Samba のソースを展開したディレクトリ中に /PATH/TO/SAMBA_SOURCE/example/LDAP/samba.schema というファイルがあるので、それを /etc/ldap/schema/ にコピーします。
slapd.conf の最初の方にある、include で始まる行がスキーマ読み込みの指定の部分です。
他の行を真似し
include /etc/ldap/schema/samba.schema
と指定すれば、Samba 用のスキーマが適用されます。
LDAP データベースはデフォルトでは /var/lib/ldap 以下に保存されるように設定されています。
この設定で特に問題がないので、このままにします。
replogfile で始まる行は LDAP のセカンダリサーバを設ける際に必要な設定です。ここでは必要ないのでコメントアウトします。また、設定ファイルの一番最後にある Roming から始まる設定ブロックも必要ないのですべてコメントアウトします。
LDAPに登録されているユーザから LDAP にアクセスがあった場合に、自分の設定を書き換えられるように、また、LDAP における管理者からのアクセスの場合はすべての処理(読み書き)を許す、ということを設定するために、以下の内容を slapd.conf に追加します。
access to attribute=userPassword
by self write
by dn="cn=admin,dc=test,dc=com" write
by anonymous auth
by * none
access to *
by dn="cn=admin,dc=test,dc=com" write
by self write
by * read
管理するグループを指定するために
suffix
で始まる行を変更します。
今回は dc=test,dc=com のグループしか用いないため
suffix "dc=test,dc=com"
と指定します。
次に、LDAP における管理者を指定するために
rootdn
で始まる行を変更します。
これは UNIX の管理者とは関係なく、LDAP での個体表記(dn) cn=hoge,dc=test,dc=com の形で指定します。
rootdn "cn=admin,dc=test,dc=com"
次に、管理者ユーザのパスワードを決定するために
rootpw
で始まる行を変更します。
パスワードは rootroot にします。セキュアでない書き方としては、設定ファイルに rootdn のパスワードを平文で記述します。
rootpw "rootroot"
MD5 で暗号化されたパスワードを設定ファイルに書く方法もあります。この方法をとれば、万が一設定ファイルを第三者に見られたとしても、容易にパスワードを知ることはできません。
slapd パッケージをインストールすると、/usr/sbin/slappasswd というコマンドも同時にインストールされます。
slappasswd -s パスワード -h {MD5}
とコマンドすれば、slapd.conf に書くべき文字列がそのままでてきます。
slappasswd -s rootroot -h {MD5}
その文字列を
rootpw {MD5}tLja9LjqnTlWhxnh4yAHbw==
のように設定ファイルに書き込むことで、平文のパスワードをそのまま書くことを回避できます。
変更点はこれだけです。編集した設定ファイルの最終的な形はこのようになります。
/etc/rc.d/init.d/ldap
というスクリプトがあり、通常の init.d スクリプトと使い方は同じです。
引数: start , stop , restart
LDAP サーバになるマシンは同時に LDAP クライアントにもなります。
ここでは LDAP クライアントとして必要な情報を設定します。
まず LDAP サーバのホスト名を指定するために /etc/ldap.conf を編集します。
URI から始まる行を
URL ldap://localhost
とします。これで LDAP サーバへの接続に必要な情報の設定は終了です。
次に LDAP サーバにアクセスし、情報を取り出すための設定をします。
/etc/libnss-ldap.conf の
rootbinddn から始まる行を
rootbinddn "cn=admin,dc=test,dc=com"
とします。
次に /etc/libnss-ldap.conf のパーミッションを 644 に変えます。
# chmod 644 /etc/libnss-ldap.conf
この作業で LDAP クライアントとしての設定は終わりです。
8. NSS および認証システム(PAM)の設定 |
Unix では、コアの部分の設定(ユーザ、名前解決など)がどこに保持されているかを動的にし、システムをより柔軟に動かすための NSS(Name Service Switch)という機構があります。
普通のシステムではユーザ情報は /etc/passwd というファイルを使って行っていますが、LDAP にユーザ情報を格納してある場合 LDAP サーバからその情報を取り寄せなければいけません。
よって NSS の設定を変えてやる必要があります。
/etc/nsswitch.conf にその設定は書かれています。今回 LDAP で管理する情報はユーザ情報のみなので、ユーザ情報に関する部分の設定を変えます。
おそらくデフォルトでは
passwd compat
となっているはずです。compat というパラメータは /etc/passwd と NIS の連携を使うための設定です。
LDAP をユーザ情報のデータベースとして使うには
passwd ldap files
と書くことで実現できます。nsswitch.conf は
サービス パラメータ
という形で記述されており、パラメータに複数与えられた場合は、書かれた順で処理を行います。つまり
passwd ldap files
と書いた場合は、まず LDAP サーバでユーザ情報を取得しようとし、それに失敗した場合は /etc/passwd を見に行くという処理の流れになります。
/usr/share/doc/libnss-ldap/examples/nsswitch.ldap というファイルに LDAP を用いる場合の nsswitch.conf の雛形があります。既存の /etc/nsswitch.conf の編集が面倒くさい場合はこれをコピーしてもいいでしょう。
ただし、
host
から始まる行は
host files dns
に書き換えて下さい。そうしないと DNS が無いネットワーク構成においてネットワークの名前解決ができなくなってしまいます。
7. 既存情報の LDAP への移行 |
LDAP サーバがきちんと認証を行っているかどうかをチェックするために、あらかじめテスト用のユーザを作っておくと便利です。 上記の migrate_passwd.pl を実行する前に、テスト用のユーザ情報を /etc/passwd に登録しておきます。 useradd test_user paswd test_user テスト用ユーザのパスワードを適当に決める テスト用のユーザを含んだすべてのユーザ情報を LDAP に登録する。 テスト用のユーザの情報を /etc/passwd を消す。 userdel test_user この作業を行うと、テスト用のユーザである test_user は LDAP データベースにしかユーザ情報がない状態になります。ここで test_user としてシステムにログインできれば、LDAP の動作としては完璧です。 ここまでできていれば、LDAP サーバの設定、動作にはまったく問題無いことが確認できます。 もしうまく行かない場合は、一度システムをリブートしてみてください。リブート後もうまく行かない場合は OpenLDAP の設定をどこか間違っています。 |
8. Samba の設定 |
9. smbldap ツールの使い方 |
Samba-2.2.6 には、LDAP の情報の操作、作成を行うことができるフロントエンド的なツールが多く付属しています。
このツールは Perl で記述されており、LDAP の複雑な手順をユーザが意識すること無く、ユーザの追加等を簡単に行えるように設計されています。
samba-2.2.6/examples/LDAP/smbldap-tools/ ディレクトリに、そのツール群はインストールされます。
MigrationTools のときと同様、管理する LDAP の設定(dc を何にするか等) を、このツールで作る LDAP 情報に採り入れるために smbldap_conf.pm というファイルを編集する必要があります。
今回の環境に合わせた設定としては、
$UID_START = 1000;
$GID_START = 1000;
$slaveLDAP = "192.168.0.2";
$masterLDAP = "192.168.0.1";
$suffix = "dc=test,dc=com";
$usersou=''
$usersdn = "$suffix";
$computersou = q(TEST);
$scope = "sub";
$binddn = "cn=admin,dc=test,dc=com";
$bindpasswd = "rootroot";
$_userLoginShell = q(/bin/bash);
$_userHomePrefix = q(/home/);
$_userGecos = q(System User);
$_userSmbHome = q(\\\\test001\\homes);
$_userProfile = q(\\\\test001\\profiles\\);
$_userHomeDrive = q(z:);
のようになります。
samba-2.2.6/examples/LDAP/smbldap-tools/ にインストールされたままだと使い勝手が悪いので、これらのツールを /usr/sbin/ にコピーします。
サフィックスが .pl のファイルはそのままコピーします。
#cp samba-2.2.6/examples/LDAP/smbldap-tools/*.pl /usr/sbin
サフィックスが .pm のファイルはモジュールとなるので、Perl のモジュールがインストールされているディレクトリにコピーします。
#cp samba-2.2.6/examples/LDAP/smbldap-tools/*.pm /usr/lib/perl5/5.6.1
これで、 /usr/sbin にパスが通っていれば、このツール群を簡単に実行することができます。
Samba に付属する LDAP フロントエンド smbldap ツールの中で良く使うものの使い方を説明します。
基本的にはどのスクリプトも
-?
という引数を与えることで、簡単な使い方のヘルプが出て来ます。
ユーザのパスワードを変更するためのスクリプトです。通常の passwd プログラムと同様の挙動をします。
引数にユーザ名をとりますが、引数が無かった場合、実行したユーザのパスワードを変更します。
ユーザの情報を変更するためのスクリプトです。
引数としてオプションと、最後にユーザ名をとります。
ユーザ hoge のシェルを変更する場合は
#smbldap-usermod.pl -s /bin/bash hoge
グループを追加するためのスクリプトです。
引数としてグループの名前をとります。
グループ samba-users を追加する場合は
#smbldap-groupadd.pl samba-users
となります。
特定の複数ユーザを、ひとつのグループにまとめたい場合は、smbldap-groupadd.pl と smbldap-usermod.pl を使うことで実現できます。
#smbldap-groupadd.pl samba-users
samba-users というグループを追加
samba1 ,samba2 ,samba3 というユーザを samba-users に属させる場合
#smbldap-usermod.pl -G samba-users,samba1 samba1
#smbldap-usermod.pl -G samba-users,samba2 samba2
#smbldap-usermod.pl -G samba-users,samba3 samba3
とやることで、samba1 というユーザは samba-users と samba1 というグループに属すことになります。
ユーザの情報を確認するためのスクリプトです。
ユーザ名を引数にとり、そのユーザの LDAP 情報を LDIF 形式で出力します。
10. Windows からのドメイン参加のための設定 |
11. LDAP のスレーブサーバのための設定 |