サーバー OS linux

【CentOS】OpenLDAPをソースからインストールする

2018年6月17日

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の設定をしたいと思います。

参考

-サーバー, OS, linux
-, ,