ボクの環境では複数の仮想マシンが動いており、さらにOS / Postfix / Devecot / Samba / Apache HTTP Server などがそれぞれ別々にパスワード管理していると面倒なので、LDAPで一元管理している。以下は OpenLDAP 2.4.39 を CentOS 7.1 にインストールする方法だが、Red Hat Enterprise Linux (RHEL) / Oracle Linux (OL) / Scientific Linux (SL) でも同様だろう。
まずはバイナリのインストール。OpenLDAP 2.4 からは自身の設定ファイルもLDAPデータベースで管理されており、設定を修正するたびにLDIFを書いてldapmodify
して……というのが非常に面倒なので、viでファイルを編集する感覚で使えるldapviというコマンドがEPELにあるので、合わせてインストールしておく。
1 2 3 4 5 6 |
[root@bravo ~]# yum install openldap-clients openldap-servers ldapvi ...... Installed: ldapvi.x86_64 0:1.7-20.el7 openldap-clients.x86_64 0:2.4.39-6.el7 openldap-servers.x86_64 0:2.4.39-6.el7 Complete! |
OpenLDAPが内部で使用している Oracle Berkeley DB の設定ファイルのサンプルをコピーし、ファイル所有者を変更する。小規模環境ならサンプル・ファイルそのままで問題ないだろう。
1 2 |
[root@bravo ~]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG [root@bravo ~]# chown ldap:ldap /var/lib/ldap/DB_CONFIG |
上記で書いたとおり、OpenLDAP自身の設定もLDAPデータベース内にあるので、まずはOpenLDAPを起動しないと設定も変更できない。また、忘れないように、合わせてOS起動時にOpenLDAPが自動起動するようにしておこう。
1 2 3 |
[root@bravo ~]# systemctl start slapd [root@bravo ~]# systemctl enable slapd ln -s '/usr/lib/systemd/system/slapd.service' '/etc/systemd/system/multi-user.target.wants/slapd.service' |
設定は、ベースDNをcn=configにして (-b cn=config
)、SASL認証にして(-Y EXTERNAL
)、IPC接続する (-H ldapi:///
) することで、rootユーザーからはパスワードなしで読み書きできる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[root@bravo ~]# ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config | tail SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 olcRootDN: cn=Manager,dc=my-domain,dc=com olcDbIndex: objectClass eq,pres olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub # search result search: 2 result: 0 Success # numResponses: 8 # numEntries: 7 |
デフォルトのDCがサンプルのdc=my-domain,dc=comになっているので、まずはこれを自分のものに変更しよう。ldapviの引数はホスト名のキーが-h
で、ldapsearchの-H
と微妙に違う点だけ注意。
1 |
[root@bravo ~]# ldapvi -Y EXTERNAL -h ldapi:/// -b cn=config |
457 458 459 460 461 462 463 464 465 466 467 468 469 470 |
5 olcDatabase={1}monitor,cn=config objectClass: olcDatabaseConfig olcDatabase: {1}monitor olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=rewse,dc=jp" read by * none 6 olcDatabase={2}hdb,cn=config objectClass: olcDatabaseConfig objectClass: olcHdbConfig olcDatabase: {2}hdb olcDbDirectory: /var/lib/ldap olcSuffix: dc=rewse,dc=jp olcRootDN: cn=Manager,dc=rewse,dc=jp olcDbIndex: objectClass eq,pres olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub |
viを保存して閉じると、以下のようなプロンプトが出る。y
で「変更を保存」、e
で「編集状態に戻る」、Q
で「編集を破棄して終了」、v
で「変更をLDIFで表示」だ。
1 2 |
add: 0, rename: 0, modify: 2, delete: 0 Action? [yYqQvVebB*rsf+?] |
同様に、デフォルトではログをまったく出力しないようになっているので、statsレベルに変更する。
1 |
[root@bravo ~]# ldapvi -Y EXTERNAL -h ldapi:/// -b cn=config |
9 10 11 12 13 14 15 16 17 |
0 cn=config objectClass: olcGlobal cn: config olcArgsFile: /var/run/openldap/slapd.args olcPidFile: /var/run/openldap/slapd.pid olcTLSCACertificatePath: /etc/openldap/certs olcTLSCertificateFile: "OpenLDAP Server" olcTLSCertificateKeyFile: /etc/openldap/certs/password olcLogLevel stats |
statsレベルにすると問い合わせ1件ごとにログが複数行記録されるが、/var/log/messages ではなくjournalにしか記録されないので問題ないだろう。journalからログは以下のようにして取得できる。
1 |
[root@bravo ~]# journalctl -u slapd |
cn=Manager,dc=rewse,dc=jpのパスワードを設定する。ldapviだけでSSHAハッシュする機能があるのだが、これを使うとなぜか認証が通らない(何かゴミが交ざってハッシュされている?)ので、slappasswdで事前作成した。
1 2 3 4 5 |
[root@bravo ~]# slappasswd New password: Re-enter new password: {SSHA}jXipXQxAXtfh7yDmZSDPCuBviWls76yP [root@bravo ~]# ldapvi -Y EXTERNAL -h ldapi:/// -b olcDatabase={2}hdb,cn=config |
16 17 18 |
olcRootDN: cn=Manager,dc=rewse,dc=jp olcSuffix: dc=rewse,dc=jp olcRootPW: {SSHA}jXipXQxAXtfh7yDmZSDPCuBviWls76yP |
OSログインにLDAPを使用する場合はNISスキーマを読み込む必要がある。NISスキーマはCosineスキーマに依存しているので、事前にCosineスキーマも読み込む。
1 2 3 4 5 6 7 8 9 10 11 |
[root@bravo ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=cosine,cn=schema,cn=config" [root@bravo ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=nis,cn=schema,cn=config" |
LDAPデータベースのアクセス権限を設定する。以下では、userPassword属性は自分自身のものであれば変更可能だが他人は認証にしか使えず、それ以外の属性は自分自身のものであれば変更可能だが他人は読込みしか行えない。
1 |
[root@bravo ~]# ldapvi -Y EXTERNAL -h ldapi:/// -b olcDatabase={1}monitor,cn=config |
9 10 11 12 13 |
0 olcDatabase={1}monitor,cn=config objectClass: olcDatabaseConfig olcDatabase: {1}monitor olcAccess: {0}to * by self write by * read olcAccess: {1}to attrs=userPassword by self write by * auth |
自宅で使う規模で索引が本当に必要なのか怪しいが、とりあえず索引を定義する。
1 |
[root@bravo ~]# ldapvi -Y EXTERNAL -h ldapi:/// -b olcDatabase={2}hdb,cn=config |
17 18 19 |
olcDbIndex: objectClass eq,pres olcDbIndex: ou,cn,mail,surname,givenName,memberUid,uid eq,pres,sub olcDbIndex: uidNumber,gidNumber,loginShell,member,uniqueMember eq,pres |
これで初期設定が終わったので、自身のデータベースをあとは作成するだけだ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
dn: dc=rewse,dc=jp objectClass: organization objectClass: dcObject o: Rewse Lab. dc: rewse dn: cn=Manager,dc=rewse,dc=jp objectClass: organizationalRole cn: Manager dn: ou=People,dc=rewse,dc=jp objectClass: organizationalUnit ou: People dn: ou=Groups,dc=rewse,dc=jp objectClass: organizationalUnit ou: Groups |
4 5 6 7 8 9 10 11 12 |
[root@bravo ~]# ldapadd -D cn=Manager,dc=rewse,dc=jp -xW -h localhost -f /tmp/base.ldif Enter LDAP Password: adding new entry "dc=rewse,dc=jp" adding new entry "cn=Manager,dc=rewse,dc=jp" adding new entry "ou=People,dc=rewse,dc=jp" adding new entry "ou=Groups,dc=rewse,dc=jp" |
1 2 3 4 5 |
dn: cn=tats,ou=Groups,dc=rewse,dc=jp cn: tats gidNumber: 1000 objectClass: posixGroup objectClass: top |
1 |
[root@bravo tmp]# ldapadd -D cn=Manager,dc=rewse,dc=jp -xW -h localhost -f /tmp/groups.ldif |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
dn: uid=tats,ou=People,dc=rewse,dc=jp cn: Tats gecos: Tats Shibata gidNumber: 1000 homeDirectory: /home/tats host: bravo.rewse.jp loginShell: /bin/bash objectClass: account objectClass: posixAccount objectClass: top uid: tats uidNumber: 1000 userPassword: {SSHA}3SlqLcGyMEsm9nLZVkjBs8+k+pmQ6CAS |
1 |
[root@bravo tmp]# ldapadd -D cn=Manager,dc=rewse,dc=jp -xW -h localhost -f /tmp/people.ldif |