389DSにldapsで通信する

今回は前回の続きで、CentOS7にインストールした389DSにldapsで通信する際の設定をまとめました。
ここまでの操作はこちらの記事を参照してください。
demiglacesource.hatenablog.com

まずは現状確認

Listenポートの一覧を確認してみます。
現在636ポートはListenされていませんね。

# ss -lnt
State      Recv-Q Send-Q        Local Address:Port          Peer Address:Port 
LISTEN     0      100               127.0.0.1:25                       *:*     
LISTEN     0      128                       *:22                       *:*     
LISTEN     0      100                     ::1:25                      :::*     
LISTEN     0      128                      :::389                     :::*     
LISTEN     0      128                      :::22                      :::*     

当然、ldapsearchでもldapsで通信することはできません。

# ldapsearch -H ldaps://localhost -D "cn=Directory Manager" -w password -b dc=example,dc=demiglacesource,dc=net -ZZ *
ldap_start_tls: Can't contact LDAP server (-1)

それでは389DSにldapsで通信できるようにするための設定を行っていきましょう。

証明書を作成

今回はオレオレ証明書を作成します。
まずはサーバーのホスト名を確認してみましょう。

# hostname
example.demiglacesource.net

ではオレオレ証明書を作成します。
-subjCN=の後には先ほど確認したサーバーのホスト名を入力してください。
パスワードは、証明書のパスワードとして任意の文字列を入力してください。

# cd /tmp
# openssl req -x509 -nodes -days 3650 -subj '/C=XX/L=Default City/O=Default Company Ltd/CN=example.demiglacesource.net' -newkey rsa:2048 -keyout key.pem -out cert.pem
# openssl pkcs12 -export -inkey key.pem -in cert.pem -out crt.p12 -nodes -name Server-Cert
Enter Export Password: password
Verifying - Enter Export Password: password

後の手順では、ここでできあがった crt.p12 を使います。

証明書をインポート

389DSに、先ほど作成した証明書をインポートします。
パスワードなどは、逐次入力してください。

# pk12util -i /tmp/crt.p12 -d /etc/dirsrv/slapd-example
Enter a password which will be used to encrypt your keys.
The password should be at least 8 characters long,
and should contain at least one non-alphabetic character.

Enter new password: password
Re-enter password: password
Enter password for PKCS12 file: password
pk12util: PKCS12 IMPORT SUCCESSFUL

証明書がインポートされていることを確認します。
Server-Certという名前の証明書がインポートされているため、これで問題なさそうですね。

# certutil -d /etc/dirsrv/slapd-example -L
Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

Server-Cert                                                  u,u,u

TLS/SSLを有効化

389DSのTLS/SSLを有効化します。
設定はGUIのadminツールで行うか、CUIからldapmodifyで行うことができます。

今回はCUIで全てやってしまいましょう。

# vim /tmp/ssl_enable.ldif
dn: cn=encryption,cn=config
changetype: modify
replace: nsSSL3
nsSSL3: off
-
replace: nsSSLClientAuth
nsSSLClientAuth: allowed
-
add: nsSSL3Ciphers
nsSSL3Ciphers: +all

dn: cn=config
changetype: modify
add: nsslapd-security
nsslapd-security: on
-
replace: nsslapd-ssl-check-hostname
nsslapd-ssl-check-hostname: off

dn: cn=RSA,cn=encryption,cn=config
changetype: add
objectclass: top
objectclass: nsEncryptionModule
cn: RSA
nsSSLPersonalitySSL: Server-Cert
nsSSLToken: internal (software)
nsSSLActivation: on

このldifを使いldapmodifyを行います。

# ldapmodify -x -D "cn=Directory Manager" -w password -f /tmp/ssl_enable.ldif
modifying entry "cn=encryption,cn=config"

modifying entry "cn=config"

adding new entry "cn=RSA,cn=encryption,cn=config"

無事設定変更ができたようです。

パスワードファイルの作成

証明書のパスワードを書いたテキストファイルを作成します。
password の部分は証明書のパスワードが入ります。逐次読み替えてください。

# vim /etc/dirsrv/slapd-example/pin.txt
Internal (Software) Token:password

パスワードが書かれていますので、ファイルの権限を正しく設定しておきましょう。

# chmod 400 /etc/dirsrv/slapd-example/pin.txt

389DSを再起動

ここまでの設定を反映するために389DSを再起動します。

# systemctl restart dirsrv.target

動作確認

さっそくポートを確認してみましょう。

# ss -lnt
State      Recv-Q Send-Q        Local Address:Port          Peer Address:Port 
LISTEN     0      128                       *:22                       *:*     
LISTEN     0      10                127.0.0.1:25                       *:*     
LISTEN     0      128                      :::389                     :::*     
LISTEN     0      128                      :::22                      :::*     
LISTEN     0      128                      :::636                     :::*  

636がListenされていますね。
次にldapsearchはどうでしょうか。

# ldapsearch -D "cn=Directory Manager" -w password -b dc=example,dc=demiglacesource,dc=net -ZZ *
# ldap_start_tls: Connect error (-11)
#   additional info: TLS error -8172:Peer's certificate issuer has been marked as not trusted by the user.

bindできませんね。。。

調べてみると、どうやら実行ユーザーのホームディレクトリに .ldaprc というファイルを保存しTLSを許可する設定が必要なようです。

# vim ~/.ldaprc
TLS_REQCERT allow

改めてldapsearchを行ってみます。

# ldapsearch -D "cn=Directory Manager" -w password -b dc=example,dc=demiglacesource,dc=net -ZZ *
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=demiglacesource,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: cert8.db certmap.conf dse.ldif dse.ldif.bak dse.ldif.startOK dse_original.ldif key3.db pin.txt schema secmod.db slapd-collations.conf 
#

# example.demiglacesource.net
dn: dc=example,dc=demiglacesource,dc=net

[snip]

bindできました。

付録

この状態でbind時にldapsを必須化してみます。
まずはldifを作成しましょう。

# vim /tmp/require_ldaps.ldif
dn: cn=config
changetype: modify
replace: nsslapd-require-secure-binds
nsslapd-require-secure-binds: on

こいつをldapmodifyです。

# ldapmodify -x -D "cn=Directory Manager" -w password -f /tmp/require_ldaps.ldif
modifying entry "cn=config"

念のため389DSの再起動も行っておきましょう。

# systemctl restart dirsrv.target

これでldapsの状態でしか、389DSに対する操作を行えなくなりました。