OpenLDAPのSSL設定(Let's Encrypt編)
概要
OpenLDAPのLet's EncryptでのSSL設定について記載します。
環境
OS | RHEL7.5 |
認証管理 | openldap-2.4.44-13.el7.x86_64 |
前提条件
下記プロダクトがインストールされ、構築されていること。
※openldap-clientsも同サーバにインストールされている前提で記載していますが、別サーバでも問題ありません。
- openldap
- openldap-servers
- openldap-clients
解説
OpenLDAPでのSSL化
OpenLDAPでのSSLとは、ldapsearch時など接続時にSSLを実施することになります。
必要になるのは、OpenLDAP側でSSL接続出来るような設定に変えることと、またSSL接続時に利用する証明書です。
今回は Let's Encryptを使った方法をご紹介します。
構築の流れ
- 証明書作成
- 設定変更
- 設定適用
- SSL接続確認
構築方法
[1] 証明書作成
- FQDN設定
- 証明書に登録する予定のFQDNを設定
利用するドメインでのFQDNがすでに設定されている場合はこの操作をスキップしてください。
また、FQDNはすべて仮のものです。適宜読み替えて実施してください。
サーバ名 | rhel-75 |
ドメイン名 | test.domain |
# hostnamectl set-hostname rhel75-blog.test.domain
設定したホスト名を確認します。
# hostname
rhel75-blog.test.domain
- 証明書作成
- 証明書作成
certbot-autoをインストールし、証明書を作成します。
インストール後にオプションを利用して証明書を作成するため、再度証明書を取得したい場合は同じコマンドを流せば再取得可能です。
「Press Enter to Continue」と表示された後にすぐEnterを押してはいけません。
# certbot-auto certonly --debug --manual --email 使用可能なメールアドレス --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns --domain rhel75-blog.test.domain
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for rhel75-blog.test.domain
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.rhel75-blog.test.domain with the following value:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
- TXTレコード追加・確認
上記の出力結果が表示後、TXTを自身がもつDNSのTXTレコードに登録します。
別画面を立ち上げてコマンドを打ち、レコードが伝搬されるのを待ちます。
伝搬されるまで証明書作成を実施しているサーバでEnterキーを押下してはいけません。
# dig _acme-challenge.rhel75-blog.test.domain txt
※以下の様なTXTレコードが表示されれば、伝搬されています。
~省略~
;; ANSWER SECTION:
_acme-challenge.rhel75-blog.test.domain. 300 IN TXT "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
~省略~
- TXTレコードドメイン確認
結果が返ってきた後、Enterキーを押下します。
Let's EncryptはDNSのTXTレコードの確認をし、制御下にあるドメインかを判断します。
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/rhel75-blog.test.domain/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/rhel75-blog.test.domain/privkey.pem
Your cert will expire on 2020-04-20. To obtain a new or tweaked
version of this certificate in the future, simply run certbot-auto
again. To non-interactively renew *all* of your certificates, run
"certbot-auto renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
- 証明書移動
Let's Encryptは証明書を「/etc/letsencrypt/」配下に作成します。
ですが、今回のOpenLDAPの仕様では「/etc/openldap/certs/」という、証明書を配置するディレクトリに置かずにOpenLDAPの証明書設定を登録すると「ldap_modify: Other (e.g., implementation specific) error (80)」というエラーが表示されてしまいます。
登録しようとしている証明書で何かしらの不備がある場合にこちらのエラーが出力されるのですが、原因を全く教えてくれないため、要因特定は困難です。
そのため、先ほど作成したファイルを事前にこちらに移動しておきましょう。
# cd /etc/letsencrypt/archive/rhel75-blog.test.domain/
# cp cert1.pem /etc/openldap/certs/cert.pem
# cp chain1.pem /etc/openldap/certs/chain.pem
# cp privkey1.pem /etc/openldap/certs/privkey.pem
# ls /etc/openldap/certs/
cert.pem cert8.db chain.pem fullchain.pem
key3.db password privkey.pem secmod.db
- 権限変更
移動したファイルをldapユーザが読み込めるように権限を変更します。
# chown ldap:ldap /etc/openldap/certs/*.pem
# ls -l /etc/openldap/certs/
合計 308
-rw-r--r-- 1 ldap ldap 1935 1月 21 16:27 cert.pem
-rw-r--r--. 1 root root 65536 8月 1 15:33 cert8.db
-rw-r--r-- 1 ldap ldap 1647 1月 21 16:27 chain.pem
-rw-r--r-- 1 ldap ldap 3554 1月 21 14:05 fullchain.pem
-rw-r--r--. 1 root root 16384 8月 1 15:33 key3.db
-r--r-----. 1 root ldap 45 7月 23 2018 password
-rw------- 1 ldap ldap 1704 1月 21 16:27 privkey.pem
-rw-r--r--. 1 root root 16384 7月 23 2018 secmod.db
[2] 設定変更
ファイル変更前にはバックアップを取っておくことをオススメします。
- 接続時オプション設定変更
# vi /etc/sysconfig/slapd
(変更前)
SLAPD_URLS="ldapi:/// ldap:///"
(変更後)
SLAPD_URLS="ldapi:/// ldap:/// ldaps:///"
※ちなみにですが、SLAPD_URLSの記述内容を制限(ldapiのみやldapsのみ等)することによってLDAP接続を制限することが可能です。
実施する際はよく検討した上で実施してください。
- 動的設定用ファイル作成
更新用ldifファイルを作成します。
# vi /etc/openldap/ssl.ldif
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/certs/chain.pem
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/cert.pem
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/privkey.pem
- クライアント側の接続時オプション設定
# vi /etc/sysconfig/slapd
(追加)
TLS_REQCERT never
[3] 設定適用
- 動的設定の適用
# ldapadd -Y EXTERNAL -H ldapi:// -f /etc/openldap/ssl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
- サービス再起動
サービスを再起動し、サービスが正常に上がっていることを確認します。
# systemctl restart slapd
# systemctl status slapd
- ポート確認
LDAPS(636)が立ち上がっていれば接続可能です。
# ss -natu | grep 636
tcp LISTEN 0 128 *:636 *:*
[4] SSL接続確認
特に問題が起きなかった場合は確認してみましょう。
元々接続できていたldapsearch文を使うのが分かりやすくていいかと思います。
- LDAP検索
- 結果取得可能なldapsearchを確認
# ldapsearch -x -D "cn=Manager,dc=testdomain,dc=com" -w 設定したパスワード -b "dc=testdomain,dc=com"
- ldapsを追加指定して確認
# ldapsearch -x -D "cn=Manager,dc=testdomain,dc=com" -w 設定したパスワード -b "dc=testdomain,dc=com" -H ldaps:///
正常に結果が返ってきたらSSL化成功です。
- ログ確認
ログはログ出力指定ファイルに出力されるため、どのファイルを確認すべきかは適宜読み替えてください。
# less /var/log/ldap/ldap.log
~省略~
XXX X XX:XX:XX サーバ名 slapd[XXXX]: conn=1002 fd=11 TLS established tls_ssf=256 ssf=256
~省略~
- 証明書確認
# openssl s_client -connect rhel75-blog.test.domain:636 -quiet
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = rhel75-blog.test.domain
verify return:1
これでLDAPSポートが立ち上がり、LDAPS接続可能なことが分かりました。
失敗した場合
もしここで「ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)」と表示されてしまったら失敗です。
一旦、「/etc/openldap/ldap.conf」のTLS_REQCERTをallowやneverにしてサービスを再起動し、同じコマンドで確認してみましょう。
もし結果が返ってきた場合は、証明書がおかしい可能性が高いです。よくご確認ください。
技術情報
関連サービス
お気軽にお問い合わせください。応対時間 9:30-17:30 [ 土・日・祝日除く ]
お問い合わせ