Debian 8.0 (jessie)でLDAPサーバを構築
概要
Debian 8.0 (jessie)のslapdは2.4.40で、設定の仕方が今までとは異なるようなのでメモ。 と言っても、昔の設定方法を知っているわけではないのだが。
環境は以下の通り。
% cat /etc/debian_version
8.0
% uname -a
Linux hoge 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24) x86_64 GNU/Linux
% /usr/sbin/slapd -V
@(#) $OpenLDAP: slapd (Apr 12 2015 14:28:03) $
root@chimera:/tmp/buildd/openldap-2.4.40+dfsg/debian/build/servers/slapd
インストール
Debianなので apt-get
するがよろし。
管理者パスワードを聞かれるので設定する。
ldap-utils
はクライアントプログラムだけど、LDAPサーバにアクセスすることは多々あるため一緒に導入しておく。
% sudo apt-get install slapd ldap-utils
これで設定ファイルのひな形が /etc/ldap
の下にできる。
% cd /etc/ldap
% ls
ldap.conf sasl2/ schema/ slapd.d/
以前の slapd
であれば slapd.conf
というファイルを編集して設定していたらしいが、今のバージョンは設定もデータベース上に作成されるとのこと。
これにより、設定を変更しても slapd
を再起動させる必要がなくなるとかいう噂。
ldap.conf
はクライアント( ldap-utils
)の設定なので、先にいじっておく。
この記事ではベースDNが dc=hoge,dc=com
として作成したものとして説明する。
% sudo vi ldap.conf
...
BASE dc=hoge,dc=com ← ★追加する
URI ldap://localhost ← ★追加する
...
そしてdebianらしく dpkg-reconfigure
で初期設定をしよう。
インストール時の設定とぶつかることがあるので、データを全消去した状態から設定をスタートする。
% sudo /etc/init.d/slapd stop
% sudo rm -rf /var/lib/ldap
% sudo dpkg-reconfigure slapd
設定は以下のような感じだ。
- OpenLDAPサーバの設定を省略しますか?
- いいえ
- DNSドメイン名:
- 自分の使っているドメイン名。これを元にしてベースDNが作成されるとのことだ。 デフォルトはマシンのドメインを元に設定されているので、普通は変更する必要はない。
- 組織名
- ベースDNの属性
o
に入る組織名。 - 管理者のパスワード
- LDAP管理者のパスワード。インストール時にも聞かれたと思うけど、再設定をしているのでもう1回入力しないとダメ。
- 利用するデータベースバックエンド
- 好きなやつでいいけど、とりあえず
MDB
で。 - slapdをパージしたときにデータベースを削除しますか?
- はい(slapdを消したらデータベースも不要だよね・・・)
- 古いデータベースを移動しますか?
- 新しくインストールしたのであれば「いいえ」でOK。 古いマシンを再設定しているのであれば「はい」にしてバックアップをとるべし。
- LDAPv2プロトコルを許可しますか?
- イマドキなら「いいえ」にしたいのだが、古いシステムが生きててLDAPv2が必要なら「はい」にする。
とりあえず設定を見てみる。
設定は cn=config
に格納されている。
-Y EXTERNAL
と -H ldapi:///
を指定することでシステムの認証を使ってアクセスできる。
エラーなくずらずらっと表示されればOK。
% sudo ldapsearch -Y EXTERNAL -H ldapi:/// -LLL -b cn=config | less
初期設定
設定には ldapvi
を使うことにするので、まずはこれをインストール。
% sudo apt-get install ldapvi
インストール時にベースDNとかを入力したので、データベースは作成されている。 自分の場合は古いマシンから移行する目的でLDAPサーバを構築しているので、ルートDNを変更する。 なぜインストール時に指定できないのか謎だ。
% sudo ldapvi -Y EXTERNAL -h ldapi:/// -b 'olcDatabase={1}mdb,cn=config'
...
olcRootDN: cn=xxxxx,dc=hoge,dc=com
...
% ldapvi -D "cn=xxxxx,dc=hoge,dc=com" -b "dc=hoge,dc=com"
★パスワード入力を求められたらパスワードを入力する
1 cn=xxxxx,dc=hoge,dc=com ← ★ここを修正
...
cn: xxxxx ← ★ここも変更
olcDatabase={1}mdb,cn=config
の部分はインストールの最後で実行した確認コマンドの結果から探し出せば分かる。
設定
ここまで来ればインストール時に設定したパスワードを使ってデータベースを参照できるはず。 パスワードなしで見える範囲も確認する。
% ldapsearch -x -LLL -D "cn=xxxxx,dc=hoge,dc=com" -W -b "dc=hoge,dc=com"
Enter LDAP Password: ← ★ここでインストール時に設定したパスワードを入力
dn: dc=hoge,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: yyyyyy
dc: hoge
dn: cn=xxxxx,dc=hoge,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
description: LDAP administrator
userPassword:: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
cn: xxxxx
% ldapsearch -x -LLL -b "dc=hoge,dc=com" ★パスワードなしでアクセスしてみる
dn: dc=hoge,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: yyyyyy
dc: hoge
dn: cn=xxxxx,dc=hoge,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
description: LDAP administrator
cn: xxxxx
不要なものは ldapvi
で消せばいい。
自分の場合は dn: cn=xxxxx,dc=hoge,dc=com
は不要なので消してしまった。
configの方に設定してあればアクセスできるので十分だ。
schemaの追加
旧マシンの /etc/ldap/schema
に対象のschemaファイルが存在する。
使っているschemaを新マシンに持ってくる。
自分の場合は samba.schema
のschemaを使っていたので、これを /etc/ldap/schema
に持ってきた。
必要となるschemaファイルを記載したconfigファイルを作成し、 slaptest
コマンドを使ってldifに変換する。
configには依存関係にある全てのschemaを記載する。
% sudo vi /etc/ldap/schema/samba.conf
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/samba.schema
% sudo mkdir /tmp/ldap
% sudo slaptest -f /etc/ldap/schema/samba.conf -F /tmp/ldap
これで /tmp/ldap/cn=config/cn=schema/cn={4}samba.ldif
というファイルができる。
このままでは登録されないそうなので、これを編集して手動で登録する。
% sudo cp /tmp/ldap/cn=config/cn=schema/cn={4}samba.ldif /etc/ldap/schema/samba.ldif
% sudo rm -rf /tmp/ldap
% sudo vi /etc/ldap/schema/samba.ldif
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. ★最初の2行は不要なので消してしまう
# CRC32 xxxxxxxx
dn: cn=samba,cn=schema,cn=config ← ★dnは変更する
objectClass: olcSchemaConfig
cn: samba ← ★cnも変更する
...
structuralObjectClass: olcSchemaConfig ← ★これ以降の行は削除する
entryUUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
creatorsName: cn=config
createTimestamp: YYYYmmddHHMMSSZ
entryCSN: YYYYmmddHHMMSS.uuuuuuZ#000000#000#000000
modifiersName: cn=config
modifyTimestamp: YYYYmmddHHMMSSZ
ldapadd
で登録する。
% sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/samba.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=samba,cn=schema,cn=config"
きちんと登録されているかを確認してみよう。
% sudo ldapsearch -Y EXTERNAL -H ldapi:/// -LLL -b "cn=schema,cn=config" dn
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config
dn: cn={1}cosine,cn=schema,cn=config
dn: cn={2}nis,cn=schema,cn=config
dn: cn={3}inetorgperson,cn=schema,cn=config
dn: cn={4}samba,cn=schema,cn=config
これでschemaが登録された。
アクセス権の設定
schemaを追加したところで、アクセス権を適切に設定する。
旧マシンで /etc/ldap/slapd.conf
に書かれていた以下のような文を参考にして設定していく。
...
access to dn.base=""
by * read
...
使用するデータベースのアクセス権( olcAccess
)を変更する。
旧マシンの /etc/ldap/slapd.conf
に書かれている access
文の to
以降を番号を付けながら順番に書いていけばいい。
% sudo ldapvi -Y EXTERNAL -h ldapi:/// -b 'olcDatabase={1}mdb,cn=config'
...
olcAccess: {0}to attrs=hoge,fuga by self write by * auth
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by * read
...
データの移行
ここまでできればデータの移行は簡単だ。
旧マシンにおいて slapcat
でデータをldifに吐き出し、これを追加すればいい。
まずは旧マシンでldifを吐き出す。
% sudo slapcat -l dat.ldif
slapcat
が見つからない場合は /usr/sbin/
などにあると思われるのでフルパス指定すればいい。
次に dat.ldif
を scp
などで新マシンに持ってきて、以下のような感じで追加する。
% sudo slapadd -l dat.ldif
確認
最後に、きちんとデータを参照できるかを確認して完了だ。
% ldapsearch -h <新マシン> -x -b "dc=hoge,dc=com" | wc -l
% ldapsearch -h <新マシン> -x -W -D "cn=xxxxx,dc=hoge,dc=com" -b "dc=hoge,dc=com"
クライアント側の設定例(2015/06/06 10:30追記)
クライアント側の設定をしてみる。 とりあえず、LDAPサーバ自体のログインもLDAPにしてしまおう。
Ubuntuでは ldap-auth-client
なるパッケージがあるそうなのだが、Debianには存在しない。
残念。
というわけで、手動で各種設定を行う。 まずは必要なパッケージ類の導入。
% sudo apt-get install libpam-ldap libnss-ldap nscd
libnss-ldap
の設定は以下の通り。
- LDAPサーバのURI
ldap://127.0.0.1/
もちろん、新マシンのIPアドレスを入力してもOK。 FQDNは解決が必要になるから使わない方が無難だ。- 検索ベースの識別名
dc=hoge,dc=com
要するにBase DNのこと。- 利用するLDAPバージョン
- 3
- LDAPデータベースはログインを必要とするか?
- いいえ
- rootへの特別なLDAP権限?
- いいえ
- オーナのみ設定ファイルの読み書きができるようにする?
- はい
つづいて libpam-ldap
の設定。
- LDAPサーバのURI
ldap://127.0.0.1/
- 検索ベースの識別名
dc=hoge,dc=com
- 利用するLDAPバージョン
- 3
- LDAP管理アカウントがローカルのrootのように振る舞うことを許すか?
- 普通は「はい」でいいけど、注意書きにあるように
/etc
とかを外に出しているなら「いいえ」にすべき。 - LDAPデータベースはログインが必要?
- いいえ
- パスワードに使うローカル暗号化アルゴリズム
crypt
- 有効化するPAMプロファイル
- お好きにどうぞ。
MacがあったりするとmDNS(Multicast DNS)で .local
が付いた名前を解決したくなるので、 libnss-mdns
を導入して名前解決できるようにしておく。
% sudo apt-get install libnss-mdns
最後に、自動で管理されないという /etc/nsswitch.conf
を編集する。
% sudo vi /etc/nsswitch.conf
...
passwd: files ldap
group: files ldap
shadow: files ldap
...
hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4 ldap
...
_minimal
を付けると、ホスト名の最後に .local
が付いていないかアドレスがmDNSの範囲を超えている場合に名前解決をしなくなる。
なので、上記のように見つからなかった場合を規程しておくことでDNSを見つつローカルネットワークのホストも名前解決できる。
らしい。
ここまでできたら、別コンソールや su -
などによりLDAPに存在するユーザでログインしてみる。
入れない場合はとりあえず /var/log/auth.log
などを参照しながら修正すべし。