dehio3’s diary

仕事、生活、趣味のメモ

OpenLDAP Serverの起動が失敗する

環境

OS : AmazonLinux2 (ami-0148288598227344a #amzn2-ami-hvm-2.0.20181114-x86_64-ebs)

事象

OpenLDAPサーバをインストール後、起動しようとしたところエラーで起動できない

$ sudo systemctl start slapd.service
Failed to start slapd.service: The name org.freedesktop.PolicyKit1 was not provided by any .service files
See system logs and 'systemctl status slapd.service' for details.

ステータスの確認結果

$ sudo systemctl status slapd.service -l
● slapd.service - OpenLDAP Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/slapd.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 水 2019-04-10 06:45:03 UTC; 1min 58s ago
     Docs: man:slapd
           man:slapd-config
           man:slapd-hdb
           man:slapd-mdb
           file:///usr/share/doc/openldap-servers/guide.html
  Process: 12402 ExecStart=/usr/sbin/slapd -u ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS (code=exited, status=1/FAILURE)
  Process: 12388 ExecStartPre=/usr/libexec/openldap/check-config.sh (code=exited, status=0/SUCCESS)

 4月 10 06:45:03 ip-10-90-60-78.ap-northeast-1.compute.internal systemd[1]: Starting OpenLDAP Server Daemon...
 4月 10 06:45:03 ip-10-90-60-78.ap-northeast-1.compute.internal runuser[12391]: pam_unix(runuser:session): session opened for user ldap by (uid=0)
 4月 10 06:45:03 ip-10-90-60-78.ap-northeast-1.compute.internal slapd[12402]: @(#) $OpenLDAP: slapd 2.4.44 (Jul 27 2018 21:48:56) $
                                                                                       mockbuild@ip-10-0-1-79:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/servers/slapd
 4月 10 06:45:03 ip-10-90-60-78.ap-northeast-1.compute.internal slapd[12402]: main: TLS init def ctx failed: -1
 4月 10 06:45:03 ip-10-90-60-78.ap-northeast-1.compute.internal slapd[12402]: slapd stopped.
 4月 10 06:45:03 ip-10-90-60-78.ap-northeast-1.compute.internal slapd[12402]: connections_destroy: nothing to destroy.
 4月 10 06:45:03 ip-10-90-60-78.ap-northeast-1.compute.internal systemd[1]: slapd.service: control process exited, code=exited status=1
 4月 10 06:45:03 ip-10-90-60-78.ap-northeast-1.compute.internal systemd[1]: Failed to start OpenLDAP Server Daemon.
 4月 10 06:45:03 ip-10-90-60-78.ap-northeast-1.compute.internal systemd[1]: Unit slapd.service entered failed state.
 4月 10 06:45:03 ip-10-90-60-78.ap-northeast-1.compute.internal systemd[1]: slapd.service failed.

調査

デーモン停止直前のメッセージが main: TLS init def ctx failed: -1 の為、TLS関連のエラーのよう

定義ファイルを確認

$ egrep -v '^$|^#' /etc/openldap/ldap.conf
TLS_CACERTDIR   /etc/openldap/certs
SASL_NOCANON    on
TLS_CACERTDIR

OpenLDAP Software 2.4 Administrator's Guide: Using TLS

16.2.2.2. TLS_CACERTDIR
This is equivalent to the server's TLSCACertificatePath option. The specified directory must be managed with the OpenSSL c_rehash utility as well. If using Mozilla NSS, may contain a cert/key database.

これはサーバーのTLSCACertificatePathオプションと同等です。指定されたディレクトリもOpenSSLのc_rehashユーティリティで管理する必要があります。 Mozilla NSSを使用している場合は、<path>にcert / keyデータベースが含まれている可能性があります。

指定ディレクトリにファイルが存在するか確認

$ find /etc/openldap/certs -type f
$
TLS_CACERTDIRを無効化

とりあえず起動させたいので無効化する

$ grep TLS_CACERTDIR /etc/openldap/ldap.conf
#TLS_CACERTDIR  /etc/openldap/certs

サービス起動

$ sudo systemctl start slapd.service
Job for slapd.service failed because the control process exited with error code. See "systemctl status slapd.service" and "journalctl -xe" for details.
$ systemctl status slapd.service
● slapd.service - OpenLDAP Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 水 2019-04-10 09:01:33 UTC; 33s ago
     Docs: man:slapd
           man:slapd-config
           man:slapd-hdb
           man:slapd-mdb
           file:///usr/share/doc/openldap-servers/guide.html
  Process: 10627 ExecStart=/usr/sbin/slapd -u ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS (code=exited, status=1/FAILURE)
  Process: 10565 ExecStartPre=/usr/libexec/openldap/check-config.sh (code=exited, status=0/SUCCESS)
 Main PID: 10068 (code=exited, status=0/SUCCESS)

 4月 10 09:01:33 ip-10-90-60-68.ap-northeast-1.compute.internal runuser[10625]: pam_unix(runuser:session): session opened for user ldap by (uid=0)
 4月 10 09:01:33 ip-10-90-60-68.ap-northeast-1.compute.internal runuser[10625]: pam_unix(runuser:session): session closed for user ldap
 4月 10 09:01:33 ip-10-90-60-68.ap-northeast-1.compute.internal slapd[10627]: @(#) $OpenLDAP: slapd 2.4.44 (Jul 27 2018 21:48:56) $
                                                                                       mockbuild@ip-10-0-1-79:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/servers/slapd
 4月 10 09:01:33 ip-10-90-60-68.ap-northeast-1.compute.internal slapd[10627]: main: TLS init def ctx failed: -1
 4月 10 09:01:33 ip-10-90-60-68.ap-northeast-1.compute.internal slapd[10627]: slapd stopped.
 4月 10 09:01:33 ip-10-90-60-68.ap-northeast-1.compute.internal slapd[10627]: connections_destroy: nothing to destroy.
 4月 10 09:01:33 ip-10-90-60-68.ap-northeast-1.compute.internal systemd[1]: slapd.service: control process exited, code=exited status=1
 4月 10 09:01:33 ip-10-90-60-68.ap-northeast-1.compute.internal systemd[1]: Failed to start OpenLDAP Server Daemon.
 4月 10 09:01:33 ip-10-90-60-68.ap-northeast-1.compute.internal systemd[1]: Unit slapd.service entered failed state.
 4月 10 09:01:33 ip-10-90-60-68.ap-northeast-1.compute.internal systemd[1]: slapd.service failed.

状況変わらず

check-configの実行

メッセージを見るとconfigのcheckを実施している箇所がある

 Process: 10565 ExecStartPre=/usr/libexec/openldap/check-config.sh (code=exited, status=0/SUCCESS)

シェルのようなので、手動で実行してみる

 $ sudo sh -x /usr/libexec/openldap/check-config.sh 
+ . /usr/libexec/openldap/functions
++ SLAPD_USER=
++ SLAPD_CONFIG_FILE=
++ SLAPD_CONFIG_DIR=
++ SLAPD_CONFIG_CUSTOM=
++ SLAPD_GLOBAL_OPTIONS=
++ SLAPD_SYSCONFIG_FILE=
++ default_config
++ SLAPD_USER=ldap
++ SLAPD_CONFIG_FILE=/etc/openldap/slapd.conf
++ SLAPD_CONFIG_DIR=/etc/openldap/slapd.d
++ SLAPD_CONFIG_CUSTOM=
++ SLAPD_GLOBAL_OPTIONS=
++ SLAPD_SYSCONFIG_FILE=/etc/sysconfig/slapd
++ id -u
+ '[' 0 -ne 0 ']'
+ load_sysconfig
+ '[' -r /etc/sysconfig/slapd ']'
+ . /etc/sysconfig/slapd
++ SLAPD_URLS='ldapi:/// ldap:///'
++ SLAPD_OPTIONS=
+ '[' -n '' ']'
+ '[' -n /etc/openldap/slapd.d ']'
+ '[' '!' -d /etc/openldap/slapd.d ']'
+ check_everything
+ retcode=0
+ check_config_syntax
+ retcode=0
++ mktemp --tmpdir=/var/run/openldap
+ tmp_slaptest=/var/run/openldap/tmp.HSPleFQeVL
+ run_as_ldap '/usr/sbin/slaptest  -u'
+ '[' 0 -ne 0 ']'
+ rm /var/run/openldap/tmp.HSPleFQeVL
+ return 0
+ check_db_perms
+ retcode=0
++ databases
++ uses_new_config
++ '[' -n /etc/openldap/slapd.d ']'
++ return 0
++ databases_new
++ ldif_value
++ sed 's/^[^:]*: //'
++ grep '^olcDbDirectory: '
++ ldif_unbreak
++ sed ':a;N;s/\n //;ta;P;D'
++ slapcat -c -H 'ldap:///cn=config???(|(objectClass=olcBdbConfig)(objectClass=olcHdbConfig))'
+ for dbdir in '`databases`'
+ '[' -d /var/lib/ldap ']'
++ find /var/lib/ldap -maxdepth 1 -name '*.dbb' -or -name '*.gdbm' -or -name '*.bdb' -or -name '__db.*' -or -name 'log.*' -or -name alock
+ for dbfile in '`find ${dbdir} -maxdepth 1 -name "*.dbb" -or -name "*.gdbm" -or -name "*.bdb" -or -name "__db.*" -or -name "log.*" -or -name "alock"`'
+ run_as_ldap '/usr/bin/test -r "/var/lib/ldap/alock" -a -w "/var/lib/ldap/alock"'
+ /sbin/runuser --shell /bin/sh --session-command '/usr/bin/test -r "/var/lib/ldap/alock" -a -w "/var/lib/ldap/alock"' ldap
+ return 0
+ '[' 0 -ne 0 ']'
+ for dbfile in '`find ${dbdir} -maxdepth 1 -name "*.dbb" -or -name "*.gdbm" -or -name "*.bdb" -or -name "__db.*" -or -name "log.*" -or -name "alock"`'
+ run_as_ldap '/usr/bin/test -r "/var/lib/ldap/__db.001" -a -w "/var/lib/ldap/__db.001"'
+ /sbin/runuser --shell /bin/sh --session-command '/usr/bin/test -r "/var/lib/ldap/__db.001" -a -w "/var/lib/ldap/__db.001"' ldap
+ return 0
+ '[' 0 -ne 0 ']'
+ for dbfile in '`find ${dbdir} -maxdepth 1 -name "*.dbb" -or -name "*.gdbm" -or -name "*.bdb" -or -name "__db.*" -or -name "log.*" -or -name "alock"`'
+ run_as_ldap '/usr/bin/test -r "/var/lib/ldap/__db.002" -a -w "/var/lib/ldap/__db.002"'
+ /sbin/runuser --shell /bin/sh --session-command '/usr/bin/test -r "/var/lib/ldap/__db.002" -a -w "/var/lib/ldap/__db.002"' ldap
+ return 0
+ '[' 0 -ne 0 ']'
+ for dbfile in '`find ${dbdir} -maxdepth 1 -name "*.dbb" -or -name "*.gdbm" -or -name "*.bdb" -or -name "__db.*" -or -name "log.*" -or -name "alock"`'
+ run_as_ldap '/usr/bin/test -r "/var/lib/ldap/__db.003" -a -w "/var/lib/ldap/__db.003"'
+ /sbin/runuser --shell /bin/sh --session-command '/usr/bin/test -r "/var/lib/ldap/__db.003" -a -w "/var/lib/ldap/__db.003"' ldap
+ return 0
+ '[' 0 -ne 0 ']'
+ for dbfile in '`find ${dbdir} -maxdepth 1 -name "*.dbb" -or -name "*.gdbm" -or -name "*.bdb" -or -name "__db.*" -or -name "log.*" -or -name "alock"`'
+ run_as_ldap '/usr/bin/test -r "/var/lib/ldap/log.0000000001" -a -w "/var/lib/ldap/log.0000000001"'
+ /sbin/runuser --shell /bin/sh --session-command '/usr/bin/test -r "/var/lib/ldap/log.0000000001" -a -w "/var/lib/ldap/log.0000000001"' ldap
+ return 0
+ '[' 0 -ne 0 ']'
+ for dbfile in '`find ${dbdir} -maxdepth 1 -name "*.dbb" -or -name "*.gdbm" -or -name "*.bdb" -or -name "__db.*" -or -name "log.*" -or -name "alock"`'
+ run_as_ldap '/usr/bin/test -r "/var/lib/ldap/id2entry.bdb" -a -w "/var/lib/ldap/id2entry.bdb"'
+ /sbin/runuser --shell /bin/sh --session-command '/usr/bin/test -r "/var/lib/ldap/id2entry.bdb" -a -w "/var/lib/ldap/id2entry.bdb"' ldap
+ return 0
+ '[' 0 -ne 0 ']'
+ for dbfile in '`find ${dbdir} -maxdepth 1 -name "*.dbb" -or -name "*.gdbm" -or -name "*.bdb" -or -name "__db.*" -or -name "log.*" -or -name "alock"`'
+ run_as_ldap '/usr/bin/test -r "/var/lib/ldap/dn2id.bdb" -a -w "/var/lib/ldap/dn2id.bdb"'
+ /sbin/runuser --shell /bin/sh --session-command '/usr/bin/test -r "/var/lib/ldap/dn2id.bdb" -a -w "/var/lib/ldap/dn2id.bdb"' ldap
+ return 0
+ '[' 0 -ne 0 ']'
+ return 0
+ return 0
+ exit 0

configの場所として以下の2つをチェックしているよう

++ SLAPD_CONFIG_FILE=/etc/openldap/slapd.conf
++ SLAPD_CONFIG_DIR=/etc/openldap/slapd.d

slapd.confは存在してない

$ ls -l /etc/openldap/slapd.conf
ls: /etc/openldap/slapd.conf にアクセスできません: No such file or directory

/etc/openldap/slapd.dを確認

$ sudo find /etc/openldap/slapd.d -type f
/etc/openldap/slapd.d/cn=config.ldif
/etc/openldap/slapd.d/cn=config/cn=schema.ldif
/etc/openldap/slapd.d/cn=config/cn=schema/cn={0}core.ldif
/etc/openldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif
/etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif
/etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif
/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif

configっぽいファイルを確認

$ sudo cat /etc/openldap/slapd.d/cn=config.ldif
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 7c845aef
dn: 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
structuralObjectClass: olcGlobal
entryUUID: e1889574-efae-1038-95e2-f3c5d785a187
creatorsName: cn=config
createTimestamp: 20190410073455Z
entryCSN: 20190410073455.796912Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20190410073455Z

TLSの設定が入ってるように見える。

対応

色々調べていたら以下のサイトを発見

CentOS7 OpenLDAPの設定

OpenLDAP2.3からConfiguration Backendという機能がサポートされ、テキストファイルに記載して設定を実施するのではなく、LDIFファイルを適用して設定をデータベースに格納し管理する機能であり、リモートから設定変更が可能であったり変更後の再起動が不要などのメリットがあるのですが、やリ方が結構煩わしいので、ここでは従来のslapd.confを編集するやりかたで記載致します。


CentOS6まではslapd.confのサンプルファイル ( /usr/share/openldap-servers/slapd.conf.obsolete ) を/etc/openldapにコピーしていたのですが、CentOS7からはこのファイルすらもなくなったようです。仕方ないのでCentOS6のslapd.conf.obsoleteをとってきて/etc/openldapに配置しました。CentOS6でも7でもOpenLDAPのバージョンは全く同一です。

そもそもslapd.confが存在していない為、上記サイトに従って一度作ってみる。

TLSの設定は無効化しないと同じエラーが出るので無効化

$ grep TLS /etc/openldap/slapd.conf
# The next three lines allow use of TLS for encrypting connections using a
#TLSCACertificatePath /etc/openldap/certs
#TLSCertificateFile "\"OpenLDAP Server\""
#TLSCertificateKeyFile /etc/openldap/certs/password

再度起動

$ sudo systemctl start slapd.service
$ sudo systemctl status slapd.service
● slapd.service - OpenLDAP Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor preset: disabled)
   Active: active (running) since 水 2019-04-10 09:16:06 UTC; 9s ago
     Docs: man:slapd
           man:slapd-config
           man:slapd-hdb
           man:slapd-mdb
           file:///usr/share/doc/openldap-servers/guide.html
  Process: 11004 ExecStart=/usr/sbin/slapd -u ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS (code=exited, status=0/SUCCESS)
  Process: 10947 ExecStartPre=/usr/libexec/openldap/check-config.sh (code=exited, status=0/SUCCESS)
 Main PID: 11007 (slapd)
    Tasks: 3
   Memory: 4.5M
   CGroup: /system.slice/slapd.service
           └─11007 /usr/sbin/slapd -u ldap -h ldapi:/// ldap:/// -f /etc/openldap/slapd.conf -s 512

 4月 10 09:16:06 ip-10-90-60-68.ap-northeast-1.compute.internal runuser[10996]: pam_unix(runuser:session): session closed for user ldap
 4月 10 09:16:06 ip-10-90-60-68.ap-northeast-1.compute.internal runuser[10998]: pam_unix(runuser:session): session opened for user ldap by (uid=0)
 4月 10 09:16:06 ip-10-90-60-68.ap-northeast-1.compute.internal runuser[10998]: pam_unix(runuser:session): session closed for user ldap
 4月 10 09:16:06 ip-10-90-60-68.ap-northeast-1.compute.internal runuser[11000]: pam_unix(runuser:session): session opened for user ldap by (uid=0)
 4月 10 09:16:06 ip-10-90-60-68.ap-northeast-1.compute.internal runuser[11000]: pam_unix(runuser:session): session closed for user ldap
 4月 10 09:16:06 ip-10-90-60-68.ap-northeast-1.compute.internal runuser[11002]: pam_unix(runuser:session): session opened for user ldap by (uid=0)
 4月 10 09:16:06 ip-10-90-60-68.ap-northeast-1.compute.internal runuser[11002]: pam_unix(runuser:session): session closed for user ldap
 4月 10 09:16:06 ip-10-90-60-68.ap-northeast-1.compute.internal slapd[11004]: @(#) $OpenLDAP: slapd 2.4.44 (Jul 27 2018 21:48:56) $
                                                                                       mockbuild@ip-10-0-1-79:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/servers/slapd
 4月 10 09:16:06 ip-10-90-60-68.ap-northeast-1.compute.internal slapd[11007]: slapd starting
 4月 10 09:16:06 ip-10-90-60-68.ap-northeast-1.compute.internal systemd[1]: Started OpenLDAP Server Daemon.

とりあえず起動した

結論

openldapチャント勉強シロ!!