OpenLDAPのSSL設定(Let's Encrypt編)

概要

OpenLDAPのLet's EncryptでのSSL設定について記載します。

環境

OSRHEL7.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を使った方法をご紹介します。

構築の流れ

  1. 証明書作成
  2. 設定変更
  3. 設定適用
  4. 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にしてサービスを再起動し、同じコマンドで確認してみましょう。
もし結果が返ってきた場合は、証明書がおかしい可能性が高いです。よくご確認ください。

技術情報

商標について

関連サービス

OSS導入支援
OSS保守サポート

お気軽にお問い合わせください。応対時間 9:30-17:30 [ 土・日・祝日除く ]

お問い合わせ