LDAP の実装の一つ OpenLDAP について、簡単なコマンドサンプルを記載します。
LDAP サーバ slapd (Standalone LDAP Daemon)
sudo yum install openldap-servers
sudo apt install slapd
LDAP クライアントコマンドのインストール
sudo yum install openldap-clients
sudo apt install ldap-utils
systemctl を利用する場合は以下のように起動できます。
systemctl is-enabled slapd.service
sudo systemctl start slapd.service
sudo systemctl status slapd.service
CentOS7、Debian9 の場合は、それぞれ以下の場所が LDAP ディレクトリとして利用されます。
sudo ls /etc/openldap/slapd.d
sudo ls /etc/ldap/slapd.d
Debian9 の場合、既定で以下の LDAP ディレクトリに slapd の設定ファイルが作成されます。
$ ls /etc/ldap/slapd.d/
cn=config cn=config.ldif
$ sudo cat /etc/ldap/slapd.d/cn\=config.ldif
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 bec8a68f
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/slapd/slapd.args
olcLogLevel: none
olcPidFile: /var/run/slapd/slapd.pid
olcToolThreads: 1
structuralObjectClass: olcGlobal
entryUUID: 09b137f8-3421-1038-988a-fb4547d0d90f
creatorsName: cn=config
createTimestamp: 20180814151827Z
entryCSN: 20180814151827.197061Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20180814151827Z
管理者パスワードを生成します。(例: mypass
)
$ /usr/sbin/slappasswd
New password:
Re-enter new password:
{SSHA}EVltfO5ymr5fm0kPBhEBw7GbzSn86AND
LDIF で追加します。以降、簡単のため echo で標準入力から設定しています。
echo 'dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}EVltfO5ymr5fm0kPBhEBw7GbzSn86AND
' | sudo ldapmodify -Y EXTERNAL -H ldapi://
LDAP は RDB 等と異なり参照が主であるため、検索が高速な木構造でデータを格納します。木構造のある階層には一つ以上のエントリが存在します。各エントリは一つ以上の属性および属性値を持っています。属性として必須のものとして cn
(common name) があります。cn
はある階層でエントリを一意に定めるための属性です。ディレクトリ情報ツリー全体でエントリを一意に定めるためには、各階層の cn
を連結すればよいことになります。これを dn
(distinguished name) とよびます。LDAP においては、ファイルシステムにおけるディレクトリのような枠となるエントリは存在せず、すべてファイルのような扱いとなり、各エントリはすべて属性および属性値を持ちます。
各エントリに設定する属性は、そのエントリのオブジェクトタイプに依ります。オブジェクトタイプの MUST 属性と MAY 属性にしたがってエントリの属性値を設定します。LDAP サーバには標準でオブジェクトタイプが用意されています。特に core.schema
は OpenLDAP で必ず提供されているスキーマファイルです。基本的にはこれらスキーマファイルで定義されているオブジェクトタイプを用いてエントリを追加していくことになります。
$ sudo find /etc/ldap/ -name *.schema
/etc/ldap/schema/openldap.schema
/etc/ldap/schema/core.schema
/etc/ldap/schema/nis.schema
/etc/ldap/schema/collective.schema
/etc/ldap/schema/corba.schema
/etc/ldap/schema/cosine.schema
/etc/ldap/schema/java.schema
/etc/ldap/schema/pmi.schema
/etc/ldap/schema/dyngroup.schema
/etc/ldap/schema/duaconf.schema
/etc/ldap/schema/ppolicy.schema
/etc/ldap/schema/inetorgperson.schema
/etc/ldap/schema/misc.schema
エントリを追加するために必要となる、木構造の RootDN cn=Manager,dc=mydomain,dc=local
は以下のコマンドで追加できます。
echo 'dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=mydomain,dc=local
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=mydomain,dc=local
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}EVltfO5ymr5fm0kPBhEBw7GbzSn86AND
' | sudo ldapmodify -Y EXTERNAL -H ldapi:///
以下のようなコマンドで RootDN 以下にエントリを追加できます。
dn: dc=mydomain,dc=local
dn: cn=Manager,dc=mydomain,dc=local
dn: ou=users,dc=mydomain,dc=local
上記三つのエントリを追加しています。
echo 'dn: dc=mydomain,dc=local
objectClass: top
objectClass: dcObject
objectclass: organization
o: mydomain.inc
dc: mydomain
dn: cn=Manager,dc=mydomain,dc=local
objectClass: organizationalRole
cn: Manager
dn: ou=users,dc=mydomain,dc=local
objectClass: organizationalUnit
ou: users
' | sudo ldapadd -x -D cn=Manager,dc=mydomain,dc=local -W
更に dn: ou=users,dc=mydomain,dc=local
以下にユーザエントリを追加してみます。
echo 'dn: uid=user001,ou=users,dc=mydomain,dc=local
objectClass: account
objectClass: posixAccount
uid: user001
cn: user001
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/user001
loginShell: /bin/bash
' | sudo ldapadd -x -D cn=Manager,dc=mydomain,dc=local -W
結果は既定では以下の場所に保存されます。
$ sudo ls /var/lib/ldap/
data.mdb lock.mdb
$ sudo strings /var/lib/ldap/data.mdb | grep user001 | sort | uniq
/home/user001
uid=user001
user001
以下のようなコマンドで追加したエントリを検索できます。以下の二つのコマンドは認証方法が異なるだけで結果は同じです。
ldapsearch -Y EXTERNAL -H ldapi:/// -b ou=users,dc=mydomain,dc=local
ldapsearch -x -D cn=Manager,dc=mydomain,dc=local -W -b ou=users,dc=mydomain,dc=local
LDAP ディレクトリの設定情報も base (-b
) を指定して検索できます。
sudo ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config