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.ldifscp などで新マシンに持ってきて、以下のような感じで追加する。

% 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 などを参照しながら修正すべし。