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.
参考
-
UNIX USER 2002/1: LDAP特集 (draft)
http://ukai.jp/Articles/2002/uu-ldap/ -
slapd: sporadic errors in SSL connections (“bad record mac”) fromm libnss-ldap and exim4 (gnutls11)
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=325971 - https://bugs.launchpad.net/debian/+source/openldap2.3/+bug/227744
main: TLS init def ctx failed: -64 - openldap user not in ssl-cert group
- http://www.cozmixng.org/~rwiki/?cmd=view;name=slapd
Todo
- TLS
- SASL
- 冗長化
Other Articles
- 13 Oct 2017: 『テスト駆動開発』
- 19 Oct 2016: 『新装版 達人プログラマー 職人から名匠への道』
- 19 Aug 2016: 『プログラミングElixir』
- 20 Oct 2015: Migrating from git-media to git-lfs
- 04 Oct 2015: Git Large File Storageクライアントのインストール
- 12 Aug 2015: isbn.rb
- 22 Apr 2015: 「なるのか、なすのか?」(To Be Or To Do?)