らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

Amazon Linux に OpenLDAP 2.4.40 をインストールする

Amazon LinuxOpenLDAP サーバをインストールした際の手順をメモしておきます。 LDAP としては問題無いのですが、後述の通り、LDAPS がエラーになってしまい、動作させられませんでした…(課題)

検証環境

検証環境には AmazonLinux 2017.09 を使いました。

# cat /etc/os-release
NAME="Amazon Linux AMI"
VERSION="2017.09"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2017.09"
PRETTY_NAME="Amazon Linux AMI 2017.09"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2017.09:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"

OpenLDAP のパッケージは以下を使いました。

インストール

インストールします。

yum -y install openldap-clients openldap-servers

起動スクリプト/etc/init.d/slapd に配置されます。 インストール直後は起動していません(停止した状態です)。

設定ファイルの用意

設定ファイルを所定のディレクトリにコピーし、所有者を ldap ユーザに変更します。

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap. /var/lib/ldap/DB_CONFIG

OpenLDAP を起動する

OpenLDAP を起動します。 併せて、自動起動の設定も実施しておきます。

service slapd start
chkconfig slapd on

OpenLDAP はデフォルトで 389/TCP を Listen します。

# lsof -i:389
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
slapd   3203 ldap    7u  IPv4  12820      0t0  TCP *:ldap (LISTEN)
slapd   3203 ldap    8u  IPv6  12821      0t0  TCP *:ldap (LISTEN)

管理者パスワードを設定する

管理者パスワードを設定します。 まず、slappasswd を実行してパスワードを生成します。

slappasswd

実行例は以下の通りです。

# slappasswd
New password:
Re-enter new password:
{SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

パスワード設定用の /root/change-root-password.ldif というファイルを以下の内容で新規作成します。 olcRootPW には slappasswd で生成した SSHA 値を指定します。

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

ldapadd を使って反映します。

ldapadd -Y EXTERNAL -H ldapi:/// -f /root/change-root-password.ldif

実行例は以下の通りです。

# ldapadd -Y EXTERNAL -H ldapi:/// -f /root/change-root-password.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"

ドメイン名を設定する

ドメイン名の設定を進める前に、ディレクトリマネージャ用のパスワードを slappasswd で生成します。 具体的な実行例は以下の通りです。

# slappasswd
New password:
Re-enter new password:
{SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

以下の内容で /root/change-domain.ldif というファイルを新規作成します。 DN 名の dc=EXAMPLE,dc=COM 部分は自身の環境に併せて変更します。

dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
  read by dn.base="cn=Manager,dc=EXAMPLE,dc=COM" read by * none

dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=EXAMPLE,dc=COM

dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=EXAMPLE,dc=COM

dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx

dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
  dn="cn=Manager,dc=EXAMPLE,dc=COM" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=EXAMPLE,dc=COM" write by * read

ldapmodify で変更を反映します。

ldapmodify -Y EXTERNAL -H ldapi:/// -f /root/change-domain.ldif

次は以下の内容で /root/set-basedomain.ldif というファイルを新規作成します。

dn: dc=EXAMPLE,dc=COM
objectClass: top
objectClass: dcObject
objectclass: organization
o: EXAMPLE
dc: EXAMPLE

dn: cn=Manager,dc=EXAMPLE,dc=COM
objectClass: organizationalRole
cn: Manager
description: Directory Manager

dn: ou=People,dc=EXAMPLE,dc=COM
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=EXAMPLE,dc=COM
objectClass: organizationalUnit
ou: Group

ldapadd で変更を反映します。

ldapadd -x -D cn=Manager,dc=EXAMPLE,dc=COM -W -f /root/set-basedomain.ldif

ログ出力の設定

OpenLDAP はデフォルト状態だと全くログを出力しません。 ログ出力を行いたい場合は、まず /etc/sysconfig/ldap へ以下のように設定を行います。 今回は OpenLDAP のログを Local4 扱いとしました。

SLAPD_OPTIONS="-l local4 -s 512"

rsyslog 側にも「Local4 は /var/log/ldap.log にロギングする」よう、設定を行います。

echo "local4.*    /var/log/ldap.log" > /etc/rsyslog.d/ldap.conf

OpenLDAP を再起動し、変更を反映します。

service slapd restart

WindowsLDAP Admin をインストールする

Windows から接続確認するには LDAP Admin 等を利用します。

LDAPS を有効化出来ない?

LDAPS を有効化して外部から接続してもエラーになってしまいました… フォーラム等でも同様の事象が報告されているようですが、結局、解決に至りませんでした。 ldapsearchデバッグオプション付きで実行した場合、以下のようなエラーが出ていました。

TLS: certdb config: configDir='/etc/openldap' tokenDescription='ldap(0)' certPrefix='cacerts' keyPrefix='cacerts' flags=readOnly
TLS: cannot open certdb '/etc/openldap', error -8018:Unknown PKCS #11 error.
TLS: could not get info about the CA certificate directory /etc/openldap/cacerts - error -5950:File not found.
TLS: error: tlsm_PR_Recv returned 0 - error 2:No such file or directory
TLS: error: connect - force handshake failure: errno 2 - moznss error -5938
TLS: can't connect: TLS error -5938:Encountered end of file.
ldap_err2string
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)

参考

/etc/sysconfig/ldap

# Options of slapd (see man slapd)
#SLAPD_OPTIONS=

# At least one of SLAPD_LDAP, SLAPD_LDAPI and SLAPD_LDAPS must be set to 'yes'!
#
# Run slapd with -h "... ldap:/// ..."
#   yes/no, default: yes
SLAPD_LDAP=yes

# Run slapd with -h "... ldapi:/// ..."
#   yes/no, default: yes
SLAPD_LDAPI=yes

# Run slapd with -h "... ldaps:/// ..."
#   yes/no, default: no
SLAPD_LDAPS=no

# Run slapd with -h "... $SLAPD_URLS ..."
# This option could be used instead of previous three ones, but:
# - it doesn't overwrite settings of $SLAPD_LDAP, $SLAPD_LDAPS and $SLAPD_LDAPI options
# - it isn't overwritten by settings of $SLAPD_LDAP, $SLAPD_LDAPS and $SLAPD_LDAPI options
# example: SLAPD_URLS="ldapi:///var/lib/ldap_root/ldapi ldapi:/// ldaps:///"
# default: empty
#SLAPD_URLS=""

# Maximum allowed time to wait for slapd shutdown on 'service ldap stop' (in seconds)
#SLAPD_SHUTDOWN_TIMEOUT=3

# Parameters to ulimit, use to change system limits for slapd
#SLAPD_ULIMIT_SETTINGS=""