LDAP サーバの構築
OpenLDAP を用いた LDAP サーバを構築します。
ここでは jail 環境での構築方法の解説になります。
jail 環境に共通して言える事ですが、ループバックインターフェース ( lo0 ) が使えない事意外は特に注意すべき点はないので jail のホストでも応用が利きます。
DIT
階層格納構造は下記の通り。
+ dc=example,dc=com suffix
+ dc=People アカウント情報
| + cn=test テストアカウント
+ ou=Group グループ情報
+ cn=FTPUser FTPグループ
+ cn=test テストグループ
インストール
まずはインストールから行います。
# cd /usr/ports/net/openldap24-server
# make install clean
# rehash
CA 証明書のコピーとサーバ証明書の発行
TLSを用いて暗号化された通信を行うので CA 証明書とサーバ証明書、サーバ秘密鍵を用意します。
まずは証明書と秘密鍵を格納するディレクトリを作成します。
# mkdir /usr/local/etc/openldap/certs
# mkdir /usr/local/etc/openldap/key
次に CA 証明書とサーバ証明書、サーバ秘密鍵を用意しますが、 CA 証明書とサーバ証明書は /usr/local/etc/openldap/certs 以下に格納し、サーバ秘密鍵は /usr/local/etc/openldap/key 以下に格納することにします。
CA を自前で用意している場合 ( 自己認証局を構築している場合 ) は CA 証明書とサーバ証明書、サーバ秘密鍵を発行します。
ベリサイン等にサーバ証明書を発行してもらった場合はそちらのCA 証明書とサーバ証明書、サーバ秘密鍵をお使いください。
# chown -R ldap:ldap /usr/local/etc/openldap/certs
# chown -R ldap:ldap /usr/local/etc/openldap/key
# chmod 744 /usr/local/etc/openldap/certs
# chmod 444 /usr/local/etc/openldap/certs/*
# chmod 700 /usr/local/etc/openldap/key
# chmod 400 /usr/local/etc/openldap/key/*
RootDN のパスワード設定
RootDN ( 管理者 ) のパスワードを SSHA ( Salted SHA ) 形式で生成します。
ここに表示されているのはあくまでも例なのでコピー & ペーストは行わないこと。
# slappasswd -s passwd
{SSHA}I8H1uziqjgevWfKM4JG9V0M29FY6MkJp
slapd.conf の編集
ベースとなる設定を行います。
# vi /usr/local/etc/openldap/slapd.conf
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/nis.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
modulepath /usr/local/libexec/openldap
moduleload back_bdb
access to attrs=userPassword
by self write
by anonymous auth
by * none
access to *
by self write
by * read
TLSCACertificateFile /usr/local/etc/openldap/certs/ca.crt
TLSCertificateFile /usr/local/etc/openldap/certs/server.crt
TLSCertificateKeyFile /usr/local/etc/openldap/key/server.key
database bdb
suffix "dc=example,dc=com"
rootdn "cn=Manager,dc=example,dc=com"
# password "passwd"
rootpw {SSHA}AcYy8pS+tcwWKuLSM07hwEdOnL8BX824
directory /var/db/openldap-data
index objectClass,uid,uidNumber,gidNumber,memberUid eq
index cn,mail,surname,givenname eq,subinitial
各エントリの objectClass
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/nis.schema
アクセス制御
access to attrs=userPassword
by self write
by anonymous auth
by * none
access to *
by self write
by * read
証明書と秘密鍵
TLSCACertificateFile /usr/local/etc/openldap/certs/ca.crt
TLSCertificateFile /usr/local/etc/openldap/certs/server.crt
TLSCertificateKeyFile /usr/local/etc/openldap/key/server.key
ドメイン
suffix "dc=example,dc=com"
管理者 DN
rootdn "cn=Manager,dc=example,dc=com"
管理者 DN のパスワード
rootpw {SSHA}I8H1uziqjgevWfKM4JG9V0M29FY6MkJp
検索を早くするための index
index objectClass,uid,uidNumber,gidNumber,memberUid eq
ldap.conf の編集
ldapsearch や ldapadd などのクラアイントのデフォルト値を設定します。
# vi /usr/local/etc/openldap/ldap.conf
BASE dc=example,dc=com
URI ldap://ldap.example.com
TLS_CACERT /usr/local/etc/openldap/certs/ca.crt
ベースとなるドメイン
BASE dc=example,dc=com
LDAP URI
URI ldap://ldap.example.com
CA 証明書
TLS_CACERT /usr/local/etc/openldap/certs/ca.crt
自動起動の設定
インストールの時に出てきたメッセージの通り設定します。
# vi /etc/rc.conf
slapd_enable="YES"
slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://ldap.example.com/ ldaps://ldap.example.com/"'
slapd_sockets="/var/run/openldap/ldapi"
起動
全て問題が無ければ起動します。
# /usr/local/etc/rc.d/slapd start
BDB の設定ファイルのコピー
BerkeleyDB の設定ファイルが存在しないと下記のような Warning がログに出力されます。
bdb_db_open: Warning - No DB_CONFIG file found in directory /var/db/openldap-data: (2) Expect poor performance for suffix dc=example,dc=com.
この Warning は BerkeleyDB の設定ファイルをコピーすれば出力されなくなります。
# cp /usr/local/etc/openldap/DB_CONFIG.example /var/db/openldap-data/DB_CONFIG
# chown ldap:ldap /var/db/openldap-data/DB_CONFIG
動作確認
接続出来るかどうか ldapsearch を実行します。
# ldapsearch
初期エントリの作成
テストユーザのパスワードを生成します。
以下の場合では「test」というパスワードが暗号化されています。
# slappasswd -s test
{SSHA}2f/mb1QQl4LTYsSmlKjZWYgvxVLWsQ/n
dc o cn を各自の環境と読み替えてください。
# vi initialize.ldif
################################################################################
# directory hierarchy
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Example
dc: example
dn: ou=People,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: Group
################################################################################
# user account
# test
dn: uid=test,ou=People,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: test
userPassword: {SSHA}2f/mb1QQl4LTYsSmlKjZWYgvxVLWsQ/n
uidNumber: 11000
gidNumber: 11000
cn: test
sn: test
givenname: test
gecos: test user
homeDirectory: /nonexistent
loginShell: /usr/sbin/nologin
mail: test@example.com
shadowLastChange: 0
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
################################################################################
# group
dn: cn=test,ou=Group,dc=example,dc=com
objectClass: top
objectClass: posixGroup
cn: test
gidNumber: 11000
memberUid: test
dn: cn=ftp,ou=Group,dc=example,dc=com
objectClass: top
objectClass: posixGroup
cn: ftp
gidNumber: 10000
memberUid: test
初期エントリの追加
初期エントリを追加するために ldapadd を使用します。
各オプションは下記の通りです。
| -Z[Z] | START TLS で接続する。二回指定すると START TLS が成功した場合のみ接続を続行する |
| -x | SASL を使わない簡易認証 |
| -D | 管理者の DN |
| -W | パスワードプロンプトの出力 |
| -f | ldif ファイルを指定 |
# ldapadd -ZZ -x -D 'cn=Manager,dc=example,dc=com' -W -f initialize.ldif
動作確認
ldapsearch コマンドで初期エントリが追加されているか調べます。
# ldapsearch -ZZ
付録:データリセット
# /usr/local/etc/rc.d/slapd stop
# rm -fr /var/db/openldap-data/*
# cp /usr/local/etc/openldap/DB_CONFIG.example /var/db/openldap-data/DB_CONFIG
# chown ldap:ldap /var/db/openldap-data/DB_CONFIG
# /usr/local/etc/rc.d/slapd start
リンク
この記事を書くに当たって参考にさせて頂いたサイト様。