OpenLDAPはCentOSの場合、yumでインストール可能だが、yumインストールしたものだとppolicyがうまく適用できず、ソースからインストールしたほうが早いんじゃない!?
という浅はかな思いからソースインストールしてみたが、ところどころハマったのでメモ
本記事はソースインストールから起動までです。
ソースインストール
rootユーザで実行します
#必要なツールのインストール
yum install gcc openssl gnutls libdb-devel libtool-ltdl-devel cryptsetup-devel cyrus-sasl-devel
cd /usr/local/src
curl -LkvOf ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-2.4.46.tgz
tar xvfz openldap-2.4.46.tgz
#crypt overlays ppolicy sasl tls を有効にしてインストール
cd openldap-2.4.46
./configure --prefix=/opt/ldap/2.4.46 --with-tls --enable-crypt --enable-overlays=yes --enable-modules=yes --enable-ppolicy=mod --with-cyrus-sasl
make depend
make
make test
### make testは2~30分以上かかります。気長に待ちましょう ###
make install
###この状態だとsha2がインストールされていません。
###パスワードをcryptにする場合は不要ですが、sha2で行いたい場合は別途インストールします。
cd contrib/slapd-modules/passwd/sha2/
make
make install
##/usr/local/libexec/openldap配下にインストールされるのでprefixで指定したディレクトリに移動させます。
cp -r /usr/local/libexec /opt/ldap/2.4.46/
rm -rf /usr/local/libexec
##/usr/localにシンボリックリンクの作成
ln -s /opt/ldap/2.4.46 /usr/local/ldap
PATHやライブラリの閲覧を更新します。
/usr/local/ldap/libexec/openldap
###最下部に記載
export PATH=$PATH:/usr/local/ldap/bin:/usr/local/ldap/sbin
修正後、再ログインするか、ldconfig、source /etc/profileで再読み込みしてください。
初期設定
LDAPユーザ作成
ホームディレクトリなし、ログイン不可のldapユーザを作成します。
groupadd -g 389 ldap
useradd -u 389 -g ldap -M -s /sbin/nologin ldap
slapd.ldifの修正
ldapにアクセスするためのパスワードを設定します。
デフォルトは「secret」がパスワードなのですが、セキュリティ的によろしくないため、変更します。
下記より好きなアルゴリズムでハッシュ化を行います。
#crypt(SHA256、8000回Hash作成、ランダム8文字のソルト文字)の作成
slappasswd -h '{CRYPT}' -c '$5$rounds=8000$%.8s'
New password:
Re-enter new password:
{CRYPT}$5$rounds=8000$XtDeDj3F$7f2FxqZjTa3hR1RRkx87gOwjBiT8jEKfQLkXl/YcPz4
#crypt(SHA512、8000回Hash作成、ランダム8文字のソルト文字)の作成
slappasswd -h '{CRYPT}' -c '$6$rounds=8000$%.8s'
New password:
Re-enter new password:
{CRYPT}$6$rounds=8000$UhqzV/Jg$ul43uyDtcp7ivUczOGEVCroYi.l4np5usUVNH56N8SCJwdyyeZR/3vO4HD1DauFqtNMq.F9NovIdalUwr3EIy/
#SSHA256でハッシュ化したい場合はモジュール先の指定を行えば可能です
slappasswd -h '{SSHA256}' -o module-load=/usr/local/ldap/libexec/openldap/pw-sha2.so
New password:
Re-enter new password:
{SSHA256}KpWcrvJ9iprWUQ02mMkaJWTa2HQh2HAKuKjCPRLZ/Rgjfs5N0pQ+0g==
【{CRYPT}…】または【{SSHA***}…】は後の設定に使うのでコピーします。
初期作成用にslapd.ldifを修正します。(修正行を灰色背景で表示)
#
# See slapd-config(5) for details on configuration options.
# This file should NOT be world readable.
#
dn: cn=config
objectClass: olcGlobal
cn: config
#
#
# Define global ACLs to disable default read access.
#
#pidの保存先を変更します
#olcArgsFile: /opt/ldap/2.4.46/var/run/slapd.args
#olcPidFile: /opt/ldap/2.4.46/var/run/slapd.pid
olcArgsFile: /var/run/ldap/slapd.args
olcPidFile: /var/run/ldap/slapd.pid
#
# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#olcReferral: ldap://root.openldap.org
#
# Sample security restrictions
# Require integrity protection (prevent hijacking)
# Require 112-bit (3DES or better) encryption for updates
# Require 64-bit encryption for simple bind
#olcSecurity: ssf=1 update_ssf=112 simple_bind=64
#
# Load dynamic backend modules:
#
#dn: cn=module,cn=config
#objectClass: olcModuleList
#cn: module
#olcModulepath: /opt/ldap/2.4.46/libexec/openldap
#olcModuleload: back_bdb.la
#olcModuleload: back_hdb.la
#olcModuleload: back_ldap.la
#olcModuleload: back_passwd.la
#olcModuleload: back_shell.la
dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema
#cosine.ldif、inetorgperson.ldif、ppolicy.ldifを追加
include: file:///opt/ldap/2.4.46/etc/openldap/schema/core.ldif
include: file:///opt/ldap/2.4.46/etc/openldap/schema/cosine.ldif
include: file:///opt/ldap/2.4.46/etc/openldap/schema/nis.ldif
include: file:///opt/ldap/2.4.46/etc/openldap/schema/inetorgperson.ldif
include: file:///opt/ldap/2.4.46/etc/openldap/schema/openldap.ldif
include: file:///opt/ldap/2.4.46/etc/openldap/schema/ppolicy.ldif
# Frontend settings
#
dn: olcDatabase=frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: frontend
#
# Sample global access control policy:
# Root DSE: allow anyone to read it
# Subschema (sub)entry DSE: allow anyone to read it
# Other DSEs:
# Allow self write access
# Allow authenticated users read access
# Allow anonymous users to authenticate
#
olcAccess: to dn.base="" by * read
#olcAccess: to dn.base="cn=Subschema" by * read
#olcAccess: to *
# by self write
# by users read
# by anonymous auth
#
# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn. (e.g., "access to * by * read")
#
# rootdn can always read and write EVERYTHING!
#
#######################################################################
# LMDB database definitions
#######################################################################
#Config設定
#defaultのままだとconfig設定ができなくなるのでID及びPW(ついでにsasl設定も)を付与
dn: olcDatabase=config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: config
olcRootDN: cn=Manager,cn=config
olcRootPW: {CRYPT}$6$rounds=8000$UhqzV/Jg$ul43uyDtcp7ivUczOGEVCroYi.l4np5usUVNH56N8SCJwdyyeZR/3vO4HD1DauFqtNMq.F9NovIdalUwr3EIy/
olcMonitoring: FALSE
olcAccess: to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage by * none
#DN作成
dn: olcDatabase=mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: mdb
#ドメインの修正
#olcSuffix: dc=my-domain,dc=com
#olcRootDN: cn=Manager,dc=my-domain,dc=com
olcSuffix: dc=kaede,dc=jp
olcRootDN: cn=Manager,dc=kaede,dc=jp
# Cleartext passwords, especially for the rootdn, should
# be avoided. See slappasswd(8) and slapd-config(5) for details.
# Use of strong authentication encouraged.
#先ほど設定したパスワードを設定します。
#olcRootPW: secret
olcRootPW: {CRYPT}$6$rounds=8000$UhqzV/Jg$ul43uyDtcp7ivUczOGEVCroYi.l4np5usUVNH56N8SCJwdyyeZR/3vO4HD1DauFqtNMq.F9NovIdalUwr3EIy/
olcAccess: to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage by * none
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
#DBディレクトリを変更します。
#olcDbDirectory: /opt/ldap/2.4.46/var/openldap-data
olcDbDirectory: /opt/ldap/slapd.d
# Indices to maintain
olcDbIndex: objectClass eq
DB初期化
修正したslapd.ldifを使ってDB初期化を行います。
mkdir /opt/ldap/slapd.d
slapadd -n 0 -F /opt/ldap/slapd.d -l /usr/local/ldap/etc/openldap/slapd.ldif
_#################### 100.00% eta none elapsed none fast!
Closing DB...
#ldapユーザに変更
chown -R ldap:ldap /opt/ldap/slapd.d
#/var/runにldap作成
mkdir /var/run/ldap
chown ldap:ldap /var/run/ldap
エントリ一覧
ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: cn=config
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config
dn: cn={1}cosine,cn=schema,cn=config
dn: cn={2}nis,cn=schema,cn=config
dn: cn={3}inetorgperson,cn=schema,cn=config
dn: cn={4}openldap,cn=schema,cn=config
dn: cn={5}ppolicy,cn=schema,cn=config
dn: olcDatabase={-1}frontend,cn=config
dn: olcDatabase={0}config,cn=config
dn: olcDatabase={1}mdb,cn=config
一覧が表示されたら設定完了です。「No such object (32)」や一覧が表示されない場合は設定がおかしいのでslapd.ldifを見直してください。
dc、ouの追加
以下のファイルを作成します。
dn: dc=kaede,dc=jp
objectClass: dcObject
objectClass: organization
dc: kaede
o: Kaede.
dn: ou=People,dc=kaede,dc=jp
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=kaede,dc=jp
objectClass: organizationalUnit
ou: Group
ファイル作成後、ldapに適用します。
ldapadd -x -D "cn=Manager,dc=kaede,dc=jp" -W -f ./base.ldif
Enter LDAP Password:
adding new entry "dc=kaede,dc=jp"
adding new entry "ou=People,dc=kaede,dc=jp"
adding new entry "ou=Group,dc=kaede,dc=jp"
これでldapの初期設定は完了です。
systemctlの追加
ソースインストールした場合、systemctlに適用するファイルがないため、自分で作ります。
といっても、yumインストールしたものとパクッてますが。
[Unit]
Description=OpenLDAP Server Daemon
After=syslog.target network-online.target
[Service]
Type=forking
PIDFile=/var/run/ldap/slapd.pid
Environment="SLAPD_URLS=ldap:/// ldapi:/// ldaps:///" "SLAPD_OPTIONS="
ExecStart=/usr/local/ldap/libexec/slapd -u ldap -h ${SLAPD_URLS} -F /opt/ldap/slapd.d $SLAPD_OPTIONS
[Install]
WantedBy=multi-user.target
PIDファイルは/var/run/ldapフォルダなので、再起動した際に消えてしまいます。
なので、 /etc/tmpfiles.d/slapd.confを新しく作り、再起動後も自動的にldapフォルダを作るように設定します。
d /var/run/ldap 0755 ldap ldap
あとはsystemctl daemon-reload⇒syetemctl start ldapで起動します。
必要に応じて起動時設定(enable)してください。
ハマる点(ハマった点)
SASL(ldapadd -H ldapi:// -Y EXTERNAL )が使えない
ソースインストールした場合はsasl設定されていないため、EXTERNALが使えないです。
なので「gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth?そんなものでアクセスできないよ。」って怒られます。
なので、sasl認証をしたい場合は、slapd.ldifに記載が必要なのですが、記載方法がよくわからなかった。
olcAccessを追加してあげればOKでした。
cn=configに一切アクセスできない
yumインストール時にSASLでアクセスできるはずのcn=configが一切アクセスできない。
それはわかる…が、configの設定方法がよくわからなかったです。
cn=configを有効化しないとスキーマの拡張とかオーバーレイとか全くできなくて困ってました。
(初期インストール時に指定しればいいんですけどね)
/opt/ldap/slapd.d/cn=config/olcDatabase={0}config.ldif
にolcAccessとかを追記すればいいんだけど非推奨なのでよろしくない。
単純にslapd.ldifに追記すればいいってのに時間がかかりました。
# LMDB database definitions
配下に書くのもそうですが、「dn: olcDatabase=config,cn=config」⇒「dn: olcDatabase=mdb,cn=config」の順に作成しないとダメだったりとかも時間かかりました。
あとはdn間に空行必須とかも。
次はppolicyの設定をしたいと思います。
参考
OpenLDAP Software 2.4 Administrator's Guide
Openldap 2.4 on Centos 7 using mdb
OpenLDAPでユーザー認証までやってみる
slappasswd の動作をソース読んでかじる