パスワードが「丸見え」の状態で運用していませんか?
こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回は、ACL(アクセス制御リスト)を使って、「誰がどのデータを見れるか」という認可の制御を行いました。
これでデータベース内部の守りは固まりました。
しかし、どんなに完璧なACLを設定しても、防げない脅威があります。
それは「通信経路の盗聴」です。
LDAP (Port 389) は、歴史的な経緯からデフォルトでは平文(クリアテキスト)で通信を行います。
もし、悪意のあるユーザーが同じネットワーク内で tcpdump や Wireshark を使っていたら、ユーザーがログイン時に入力したパスワードは、そのままの文字で抜き取られてしまいます。
先生、それは怖すぎます!
ACLで「他人のパスワードは見れない」ように設定したのに、通信を盗み見られたら意味ないじゃないですか。
Webサイトはもう常時SSL(HTTPS)が当たり前ですけど、LDAPもSSL化できるんですか?
証明書とか鍵とか、設定が難しそうで避けてたんですが……。
コウ君、その通りよ。
現代のインフラにおいて、認証に関わる通信を平文で行うのは「自殺行為」に等しいわ。
OpenLDAPのTLS設定は、ApacheやNginxと少し作法が違うけれど、仕組みさえ分かれば難しくないわ。
今回は、自己署名証明書の作り方から、LDAPS (Port 636) の有効化、そしてクライアント側での検証方法まで、セキュリティの「最後の砦」を構築しましょう!
本記事では、OpenLDAPにおける暗号化方式の違い(StartTLS vs LDAPS)、OpenSSLによる証明書の作成手順、cn=config への適用方法、そして「証明書エラーで繋がらない」時のトラブルシューティングまでを徹底解説します。
🐬 OpenLDAP 基本講座 カリキュラム
- 【第1回】LDAPの基礎理論。DIT、スキーマ、オブジェクトクラスとは?
- 【第2回】インストールと初期設定。slapdの起動と動作確認
- 【第3回】cn=configの正体。slapd.conf世代からの脱却
- 【第4回】データ管理の作法。LDIFファイルとldapコマンド群
- 【第5回】アクセス制御 (ACL)。olcAcessの読み方・書き方
- 【第6回】セキュリティ強化。TLS/SSL化と証明書管理
- 【第7回】レプリケーション。Syncreplによる冗長化構成
- 【第8回】クライアント連携と運用。SSSD設定とバックアップ
目次
第1章:StartTLSとLDAPS。2つの暗号化方式の違い
作業を始める前に、LDAPにおける2種類の暗号化アプローチを理解しておきましょう。
現場ではこれらが混同されやすく、トラブルの元になります。
1. LDAPS (LDAP over SSL)
- ポート: TCP 636
- 仕組み: 接続確立時(ハンドシェイク)から即座にSSL/TLSで暗号化します。WebのHTTPS (443) と同じ方式です。
- メリット: シンプルで分かりやすい。レガシーなクライアントやアプリケーションでも対応していることが多い。
- デメリット: 専用のポート (636) をファイアウォールで開ける必要がある。現在は公式には「非推奨(Deprecated)」扱いですが、実質的な標準として広く使われています。
2. StartTLS
- ポート: TCP 389 (標準ポートと同じ)
- 仕組み: 最初は平文で接続し、途中でクライアントが「これから暗号化しましょう」というコマンド(StartTLS拡張操作)を送って、通信を暗号化に切り替えます(昇格)。
- メリット: 標準ポートだけで完結する。
- デメリット: クライアント側がStartTLSに対応している必要がある。設定ミスにより「平文のまま通信し続ける」リスクがある。
💡 プロの推奨:LDAPS (636) を使え
規格上はStartTLSが推奨されていますが、現場では LDAPS (636) の利用を強くお勧めします。
理由は「強制力」です。
StartTLSは「暗号化を要求する」コマンドを投げ忘れると平文のまま通信できてしまいます(サーバー側で強制設定しない限り)。
対してLDAPSは、暗号化できなければ接続自体が成立しないため、「うっかり平文通信」のリスクを物理的に排除できます。
第2章:証明書の準備。OpenSSLによる自己署名証明書の作成
暗号化通信を行うには、「サーバー証明書」と「秘密鍵」が必要です。
本番環境(インターネット公開)では Let’s Encrypt などの公的CAを使うべきですが、社内LAN(イントラネット)内のLDAPサーバーでは、運用の容易さから「自己署名証明書(オレオレ証明書)」や、社内プライベートCAの発行する証明書を使うことが一般的です。
ここでは、OpenSSLを使って自己署名証明書を作成する手順を紹介します。
1. ディレクトリの準備
証明書を格納するディレクトリを作成します。
mkdir -p /etc/pki/tls/private mkdir -p /etc/pki/tls/certs
2. 秘密鍵の作成
パスワードなしのRSA秘密鍵 (2048bit) を作成します。
openssl genrsa -out /etc/pki/tls/private/ldap-server.key 2048
3. 証明書署名要求 (CSR) の作成
証明書の発行依頼書を作ります。
ここで最も重要なのは Common Name (CN) です。ここにはLDAPサーバーの FQDN (完全修飾ドメイン名) を正確に入力してください。
ここがズレていると、クライアント接続時にエラーになります。
openssl req -new -key /etc/pki/tls/private/ldap-server.key \ -out /etc/pki/tls/certs/ldap-server.csr \ -subj "/C=JP/ST=Tokyo/L=Chiyoda/O=LinuxKoubou/CN=ldap01.linuxkoubou.com"
4. 証明書の発行(自己署名)
CSRに自分の秘密鍵で署名し、有効期限10年(3650日)の証明書を作成します。
openssl x509 -req -days 3650 \ -in /etc/pki/tls/certs/ldap-server.csr \ -signkey /etc/pki/tls/private/ldap-server.key \ -out /etc/pki/tls/certs/ldap-server.crt
5. 権限の設定(最重要!)
初心者が必ずハマるのがここです。
OpenLDAPの実行ユーザー(通常は ldap)が、秘密鍵ファイルを読み取れずに起動に失敗するケースです。
chown ldap:ldap /etc/pki/tls/private/ldap-server.key chown ldap:ldap /etc/pki/tls/certs/ldap-server.crt chmod 600 /etc/pki/tls/private/ldap-server.key
これで証明書の準備は完了です。
第3章:サーバー側の設定。cn=configへの証明書登録
作成した証明書と秘密鍵の場所を、OpenLDAP (slapd) に教えます。
これもおなじみ、LDIFファイルと ldapmodify コマンドで行います。
1. 設定変更用LDIFの作成
tls_config.ldif を作成します。cn=config エントリ(グローバル設定)を修正します。
dn: cn=config changetype: modify replace: olcTLSCertificateFile olcTLSCertificateFile: /etc/pki/tls/certs/ldap-server.crt - replace: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/pki/tls/private/ldap-server.key
CA証明書について:
自己署名証明書の場合、サーバー証明書自体がCA証明書を兼ねるため、olcTLSCACertificateFile の設定は必須ではありませんが、クライアント配布用に明示的に設定することもあります。
2. 設定の適用
ldapmodify -Y EXTERNAL -H ldapi:/// -f tls_config.ldif
エラーが出なければ、設定は即座に反映されます。
3. 設定の確認
ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config" "(objectClass=olcGlobal)" olcTLS*
設定したパスが正しく表示されているか確認してください。
💡 プロのトラブルシューティング:起動しない!
この設定を適用した後、slapdを再起動すると起動しなくなることがあります。
原因の99%は「秘密鍵のパーミッション」または「SELinux」です。ls -l で権限を確認し、SELinuxが有効な場合は証明書ファイルを正しいコンテキスト(cert_t)に配置するか、restorecon を実行してください。
第4章:ポート636 (LDAPS) の有効化
証明書を設定しただけでは、まだLDAPS (636) はリッスンしていません。
起動オプションを変更する必要があります。
RHEL / AlmaLinux / Rocky Linux の場合
設定ファイル /etc/sysconfig/slapd (Symas版の場合は /etc/default/symas-openldap 等の場合あり) を編集します。
# SLAPD_URLS="ldapi:/// ldap:///" # ↓ 以下のように変更 SLAPD_URLS="ldapi:/// ldap:/// ldaps:///"
ldaps:/// を追加することで、SSLポート (636) でのリッスンが有効になります。
サービスの再起動と確認
systemctl restart slapd
ポートが開いているか確認します。
ss -ltn | grep 636
LISTEN と表示されれば、LDAPSサーバーの立ち上げ成功です!
![]() |
入門 モダンLinux ―オンプレミスからクラウドまで、幅広い知識を会得する 新品価格 |
Firewallの設定
外部から接続できるようにポートを開放します。
firewall-cmd --add-service=ldaps --permanent firewall-cmd --reload
第5章:クライアント側の設定。ldap.confと接続テスト
サーバー側の準備ができたら、クライアント側(ldapsearch コマンドなど)の設定です。
SSL/TLS通信では、クライアントが「このサーバーは信頼できるか?」を検証します。
自己署名証明書の場合、クライアントに「この証明書は信頼していいよ」と教える必要があります。
1. 証明書の配布
サーバーで作った ldap-server.crt を、クライアントマシンの /etc/pki/tls/certs/ などにコピーします。
2. ldap.conf の編集
OpenLDAPクライアントの設定ファイル /etc/openldap/ldap.conf を編集します。
# サーバーのURI(LDAPSを指定) URI ldaps://ldap01.linuxkoubou.com # 信頼するCA証明書(自己署名の場合はサーバー証明書そのもの) TLS_CACERT /etc/pki/tls/certs/ldap-server.crt # 証明書検証のレベル TLS_REQCERT demand
TLS_REQCERT の設定値
- demand (hard): 検証に失敗したら接続しない。最もセキュア(推奨)。
- allow (soft): 検証に失敗しても接続する。セキュリティの意味がない(非推奨)。
- never: 検証しない。
最初は allow でテストし、最終的に demand にするのが移行のコツです。
3. 接続テスト
ldapsearch -x -b "dc=linuxkoubou,dc=com" "(uid=taro)"
-H オプションを指定しなくても、ldap.conf の URI 設定が効いていればLDAPSで接続されます。
デバッグモード -d 1 を付けると、TLSハンドシェイクの様子が詳細に表示されます。
第6章:セキュリティ強度の向上。暗号化スイートの設定
「とりあえず暗号化した」だけでは不十分です。
古いSSLプロトコル(SSLv3, TLS 1.0, TLS 1.1)は脆弱性があるため、無効化すべきです。
TLSプロトコルバージョンの制限
TLS 1.2 以上のみを許可する設定を入れます。
# tls_harden.ldif dn: cn=config changetype: modify replace: olcTLSProtocolMin olcTLSProtocolMin: 3.3
3.3 は TLS 1.2 を意味します(3.1=TLS1.0, 3.2=TLS1.1)。
StartTLSの強制(平文接続の拒否)
ポート389 (平文) への接続に対しても、StartTLSによる暗号化を強制します。
これを設定すると、平文のまま認証(Bind)しようとしたクライアントは拒否されます。
# security.ldif dn: cn=config changetype: modify add: olcSecurity olcSecurity: tls=1
これを適用すれば、うっかり平文でパスワードを送ってしまう事故をサーバー側で防ぐことができます。
第7章:トラブルシューティング。繋がらない時のチェックリスト
SSL/TLS化はハマりポイントが多いです。
うまくいかない時は、以下のチェックリストを確認してください。
Check 1: ホスト名は合っていますか?
証明書の CN (Common Name) と、接続時に指定しているホスト名が一致していないとエラーになります。
証明書のCNが ldap01.linuxkoubou.com なのに、ldaps://192.168.1.10 で接続しようとすると失敗します。/etc/hosts やDNSを確認しましょう。
Check 2: 証明書の期限は切れていませんか?
以下のコマンドで証明書の期限を確認できます。
openssl x509 -in /etc/pki/tls/certs/ldap-server.crt -noout -dates
Check 3: 中間CA証明書は必要ですか?
Let’s Encryptなどの公的証明書を使う場合、中間CA証明書(chain.pem)の設定が必要です。
OpenLDAPの設定では、olcTLSCACertificateFile に中間CA証明書(またはルート+中間の結合ファイル)を指定することが多いです。
Check 4: クライアント側のデバッグ
openssl s_client コマンドを使うと、LDAPクライアントを使わずにSSL接続の診断ができます。
openssl s_client -connect ldap01.linuxkoubou.com:636 -showcerts
ここで Verify return code: 0 (ok) が出れば、SSL層は正常です。
エラーが出る場合は証明書チェーンや信頼設定に問題があります。
まとめ:セキュリティは「設定」ではなく「運用」
お疲れ様でした!
第6回は、OpenLDAPのTLS/SSL化について、証明書の作成から設定、トラブルシュートまでを解説しました。
今回の重要ポイント:
- LDAPは平文通信がデフォルト。LDAPS (636) の利用を強く推奨。
- 証明書のパーミッション(ldapユーザーが読めること)は最大のハマりポイント。
/etc/sysconfig/slapdでldaps:///を有効化するのを忘れない。- クライアント側は
TLS_REQCERT demandで厳格に検証する。
「証明書の期限切れで全社認証停止」というのは、インフラエンジニアが最も恐れる悪夢の一つです。
構築して終わりではなく、証明書の更新フロー(Let’s Encryptならcron設定、自己署名ならカレンダー登録)まで含めて設計するのがプロの仕事ですよ。
さて、これで単一サーバーとしての機能は完成形に近づきました。
しかし、このサーバーがハードウェア障害で停止したらどうなりますか?
認証基盤の停止は、業務の完全停止を意味します。
次回、第7回は「レプリケーション。Syncreplによる冗長化構成」です。
OpenLDAP標準の同期機能 Syncrepl を使って、マスター・スレーブ構成を構築し、可用性を高める手順を解説します。お楽しみに!
▼ セキュアな環境を構築する ▼
証明書設定を試す
「おすすめVPS」
セキュリティのプロへ
「ITエンジニア転職」


コメント