DebianでLDAPサーバを立ててみた際の自分用メモ。誤りが多い。無保証。

OpenLDAP server (slapd)を導入

インストール

% sudo apt-get install slapd

% sudo vi /etc/ldap/ldap.conf
...
BASE   dc=example,dc=com
HOST   xxx.xxx.xxx.xxx
TLS_CACERT /etc/ssl/certs/myhost.pem
...
%

基本設定

管理者アカウントを設定する。また、slapd自身の設定を、設定ファイルではなく 設定データベースに記録するよう設定する。

% sudo slappasswd -h '{SSHA}'
...
% sudo vi /etc/ldap/slapd.conf
...
suffix          "dc=example,dc=com"
...
rootdn          "cn=admin,dc=example,dc=com"
rootpw          {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
...
access to attrs=userPassword,shadowLastChange
        by dn="cn=admin,dc=example,dc=com" write
        by anonymous auth
        by self write
        by * none
...
access to *
        by dn="cn=admin,dc=example,dc=com" write
        by * read
...

% sudo /etc/init.d/slapd restart

slapdのTLSの設定

TLSの設定をする。必須ではないけれど。

% sudo apt-get install gnutls-bin

% sudo openssl req \
               -new -x509 -nodes \
               -keyout /etc/ssl/private/foo-key.pem \
               -out /etc/ssl/certs/foo.pem
% sudo chown root.openldap /etc/ssl/certs/foo.pem
% sudo chown root.openldap /etc/ssl/private/foo-key.pem

% sudo vi /etc/ldap/slapd.conf
...
# TLS settings by jdoe
TLSCertificateFile      /etc/ssl/certs/foo.pem
TLSCertificateKeyFile   /etc/ssl/private/foo-key.pem
...
%

% sudo adduser openldap ssl-cert
% sudo /etc/init.d/slapd restart

TBD

SASL

% sudo apt-get install sasl2-bin libsasl2-modules

TBD

テスト

データが何もない状態で、アクセスできるかだけテストしてみる。

% ldapsearch -x "(cn=admin)"
% ldapwhoami -x -D "cn=admin,dc=example,dc=com" -W

既存のアカウント情報をldifに変換する

/etc/passwd, /etc/groupのユーザアカウント情報をldif形式に変換する。 migrationtoolsを使うと楽。

% sudo apt-get install migrationtools
% $PAGER /usr/share/doc/migrationtools/README.Debian
% cd /usr/share/migrationtools

% sudo LDAP_BASEDN="dc=example,dc=com" \
  ./migrate_group.pl /etc/group ~/group.ldif
% sudo LDAP_BASEDN="dc=example,dc=com" \
  ./migrate_passwd.pl /etc/passwd ~/passwd.ldif
% cd -

注意点:

  • passwd情報を抽出する際は、/etc/shadowを読むためにroot権限が必要なので、 sudoを使う。

    念のためpasswd.ldif内のエントリがaccount, posixAccount, shadowAccountを備えているか確認すること。shadowAccountがないと後になっ てからはまりかねない。

  • 認証に失敗したユーザidをキーにslapdのログを検索して、近くに次のような 文字列があったら疑わしい。

    conn=X .. filter="(&(objectClass=shadowAccount)(uid=jdoe))"
    

LDAPにアクセスしているかどうかを区別するために、/etc/passwdには存在し ないldapuserというユーザを定義したldifを用意する(内容は後述)。

% vi ldapuser.ldif

ここで*.ldifを編集して、システムユーザのアカウントやグループなど、不必要 な情報を削除する。

トップレベルを用意する(内容は後述)。

% vi top.ldif

slapdに登録

準備したldifの情報をslapdに追加登録。

% ldapadd -x -W -D "cn=admin,dc=example,dc=com" -f top.ldif
% ldapadd -x -W -D "cn=admin,dc=example,dc=com" -f group.ldif
% ldapadd -x -W -D "cn=admin,dc=example,dc=com" -f passwd.ldif
% ldapadd -x -W -D "cn=admin,dc=example,dc=com" -f ldapuser.ldif

聞かれたらadminのパスワードを入力する。

テスト

適当に検索してみる。

% ldapsearch -x -W -D "cn=admin,dc=example,dc=com" \
             -b "dc=example,dc=com" \
             "uid=nobody"
# extended LDIF
...
# search result
search: 2
result: 0 Success
%

LDAPにしかアカウントがないユーザと、どこにも存在しないユーザの情報を調べ てみる。

% id ldapuser
uid=1502(ldapuser) gid=1502(ldapuser) groups=1502(ldapuser)
% id foo
id: foo: No such user

ローカルには存在せずLDAPにだけ存在するユーザの情報が出力されればOK。

ファイルの内容

ldapuser.ldif: dn: uid=ldapuser,ou=People,dc=example,dc=com uid: ldapuser cn: ldapuser objectClass: account objectClass: posixAccount objectClass: top objectClass: shadowAccount userPassword:: bGRhcHVzZXI= shadowLastChange: 13181 shadowMax: 99999 shadowWarning: 7 loginShell:/bin/bash uidNumber: 1502 gidNumber: 1502 homeDirectory: /home/ldapuser gecos: ldapuser

dn: cn=ldapuser,ou=Group,dc=example,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapuser
userPassword: {crypt}x
gidNumber: 1502

top.ldif: dn: dc=example,dc=com objectClass: dcObject objectClass: organization dc: example o: example.com

dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=example,dc=com
objectClass: organizationalUnit
ou: Group

トラブルシュート

LDAPはたくさんの要素が絡み、しかも親切なソフトウェアが少ないので、はまり やすい。トラブルシュートに役立つ道具を用意しておくと楽。

分析用ツール

  • ldapsearch
    基本。設定やDBに変更を加えたら、まずこれを使って確かめる。

  • Apache Directory Studio
    http://directory.apache.org/studio/
    Eclipseベースのワークベンチ。俯瞰するのに向いている。 ldapsearchと併用すると便利。

slapdの診断

slapdのloglevelを上げていろいろ出力させ、成功時と失敗時を比較するとよ い。loglevelは/etc/ldap/slapd.confで設定する。

% sudo vi /etc/ldap/slapd.conf
...
# Read slapd.conf(5) for possible values
#loglevel        none
loglevel        any trace filter acl shell stats
...
% sudo /etc/init.d/slapd restart
...
% sudo tail -n 10000 /var/log/debug | lv

anyを指定すると何でもかんでも出力する。詳しくはman slapd.conf.

参考

Todo

  • TLS
  • SASL
  • 冗長化