第1章 Red Hat Directory Server のセキュリティー保護
Red Hat Directory Server を使用して LDAP サービスのセキュリティーを向上させます。たとえば、クライアントと Directory Server 間の接続を暗号化し、暗号化された属性を Directory Server データベースに保存できます。レプリケーション changelog の暗号化、認証の設定、その他のセキュリティータスクの実行も可能です。
1.1. Directory Server への TLS 暗号化接続の有効化 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、Red Hat Directory Server は暗号化なしで LDAP サービスを提供します。セキュリティーを改善するには、Directory Server で TLS を設定して、レプリケーション環境内のクライアントや他のホストを有効にして、暗号化された接続を使用できます。これらのユーザーは、ポート 389 で STARTTLS
コマンドを使用し、またはセキュアな接続にポート 636 で LDAPS プロトコルを使用できます。
バインド識別名 (DN) およびパスワード、または証明書ベースの認証を使用して、簡易認証で TLS を使用できます。
Directory Server の暗号化サービスは、Mozilla Network Security Services (NSS) (TLS およびベース暗号化機能のライブラリー) によって提供されます。NSS には、連邦情報処理標準 (FIPS) 140-2 認定であるソフトウェアベースの暗号化トークンが含まれています。
1.1.1. Directory Server への暗号化接続のさまざまなオプション リンクのコピーリンクがクリップボードにコピーされました!
暗号化された接続を使用して Directory Server に接続するには、以下のプロトコルとフレームワークを使用できます。
- LDAPS
-
LDAPS プロトコルを使用すると、接続は暗号化を使用して開始し、成功または失敗します。ただし、暗号化されていないデータはネットワーク経由で送信されません。このため、暗号化されていない LDAP で
STARTTLS
を使用する代わりに、LDAPS の使用が推奨されます。 - LDAP 上の STARTTLS
クライアントは LDAP プロトコルで暗号化されていない接続を確立し、
STARTTLS
コマンドを送信します。コマンドに成功すると、それ以降の通信はすべて暗号化されます。警告STARTTLS
コマンドが失敗し、クライアントが接続をキャンセルしないと、認証情報を含むすべてのデータが暗号化されずにネットワーク上に送信されます。- SASL
- Simple Authentication and Security Layer (SASL) フレームワークを使用すると、Kerberos などの外部認証方法を使用してユーザーを認証できます。
1.1.2. Directory Server で NSS データベースをアンロックする方法 リンクのコピーリンクがクリップボードにコピーされました!
Directory Server は、証明書署名要求 (CSR)、秘密鍵、および証明書をネットワークセキュリティーサービス (NSS) データベースに保存します。新規インスタンスをインストールすると、インストーラーは NSS データベースを自動的に作成し、無作為にパスワードで保護します。インストーラーは、このパスワードを以下のファイルに保存します。
-
/etc/dirsrv/slapd-<instance_name>/pwdfile.txt
:dsconf tls
コマンドは、このファイルを使用して NSS データベースにアクセスします。 /etc/dirsrv/slapd-<instance_name>/pin.txt
: このファイルには、Directory Server の起動時に NSS データベースを自動的にアンロックするトークンとパスワードが含まれます。- インスタンスを起動するたびに、Directory Server が NSS データベースのパスワードを要求するようにするには、このファイルを削除します。
- パスワードを要求せずにインスタンスを自動的に起動するようにするには、NSS データベースパスワードを変更する場合にこのファイルを保存して更新します。
/etc/dirsrv/slapd-<instance_name>/pin.txt
ファイルが存在しない場合は、暗号化を有効にして Directory Server を起動し、NSS データベースにパスワードを設定すると、動作は以下のようになります。
systemctl
ユーティリティーまたはdsctl
ユーティリティーがns-slapd
Directory Server プロセスを開始すると、systemd
サービスはパスワードを要求して、自動的にsystemd-tty-ask-password-agent
ユーティリティーに入力を渡します。dsctl <instance_name> start
# dsctl <instance_name> start Enter PIN for Internal (Software) Token: (press TAB for no echo)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow まれに、
ns-slapd
Directory Server プロセスがsystemctl
ユーティリティーまたはdsctl
ユーティリティーで開始されず、プロセスがターミナルから切り離されると、ns-slapd
は、wall
コマンドを使用してすべてのターミナルにメッセージを送信します。Broadcast message from root@server (Fri 2021-01-01 06:00:00 CET): Password entry required for 'Enter PIN for Internal (Software) Token:' (PID 1234). Please enter password with the systemd-tty-ask-password-agent tool!
Broadcast message from root@server (Fri 2021-01-01 06:00:00 CET): Password entry required for 'Enter PIN for Internal (Software) Token:' (PID 1234). Please enter password with the systemd-tty-ask-password-agent tool!
Copy to Clipboard Copied! Toggle word wrap Toggle overflow パスワードを入力するには、次のコマンドを実行します。
systemd-tty-ask-password-agent
# systemd-tty-ask-password-agent Enter PIN for Internal (Software) Token:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.1.3. コマンドラインで Directory Server への TLS 暗号化接続の有効化 リンクのコピーリンクがクリップボードにコピーされました!
TLS による暗号化または証明書ベースの認証を使用するには、Network Security Services (NSS) データベースで証明書を管理する必要があります。インスタンスを作成した際に、dscreate
ユーティリティーは /etc/dirsrv/slapd-<instance_name>/
ディレクトリーにこのデータベースを自動的に作成し、強力なパスワードで保護しました。
手順
プライベートキーおよび証明書署名要求 (CSR) を作成します。外部ユーティリティーを使用して作成する場合は、この手順を省略します。
ホストが 1 つの名前のみで到達可能である場合は、以下を実行します。
dsctl <instance_name> tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization"
# dsctl <instance_name> tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 複数の名前でホストにアクセスできる場合は、以下を行います。
dsctl <instance_name> tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization" server.example.com server.example.net
# dsctl <instance_name> tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization" server.example.com server.example.net
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 最後のパラメーターとしてホスト名を指定した場合、このコマンドは
DNS:server.example.com, DNS:server.example.net
エントリーで SAN (Subject Alternative Name) 拡張を CSR に追加します。
-s subject
パラメーターで指定した文字列は、RFC 1485 に従って有効なサブジェクト名である必要があります。サブジェクトのCN
フィールドが必要で、サーバーの完全修飾ドメイン名 (FQDN) の 1 つに設定する必要があります。このコマンドは、/etc/dirsrv/slapd-<instance_name>/Server-Cert.csr
ファイルに CSR を保存します。- 認証局 (CA) に CSR を送信し、発行した証明書を取得します。詳細は、CA のドキュメントを参照してください。
CA が発行するサーバー証明書を NSS データベースにインポートします。
dsctl tls generate-server-cert-csr
コマンドを使用して秘密鍵を作成した場合は、以下を入力します。dsconf <instance_name> security certificate add --file /root/instance_name.crt --name "server-cert" --primary-cert
# dsconf <instance_name> security certificate add --file /root/instance_name.crt --name "server-cert" --primary-cert
Copy to Clipboard Copied! Toggle word wrap Toggle overflow --name _certificate_nickname
パラメーターで設定した証明書の名前を書き留めておきます。これは後のステップで必要になります。外部ユーティリティーを使用して秘密鍵を作成した場合は、サーバー証明書および秘密鍵をインポートします。
dsctl <instance_name> tls import-server-key-cert /root/server.crt /root/server.key
# dsctl <instance_name> tls import-server-key-cert /root/server.crt /root/server.key
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドでは、最初にサーバー証明書へのパスを指定してから、秘密鍵へのパスを指定する必要があります。このメソッドは、証明書のニックネームを常に
Server-Cert
に設定します。
CA 証明書を NSS データベースにインポートします。
dsconf <instance_name> security ca-certificate add --file /root/ca.crt --name "Example CA"
# dsconf <instance_name> security ca-certificate add --file /root/ca.crt --name "Example CA"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow CA 証明書の信頼フラグを設定します。
dsconf <instance_name> security ca-certificate set-trust-flags "Example CA" --flags "CT,,"
# dsconf <instance_name> security ca-certificate set-trust-flags "Example CA" --flags "CT,,"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、Directory Server が、TLS による暗号化および証明書ベースの認証に対して CA を信頼するように設定します。
TLS を有効にし、LDAPS ポートを設定します。
dsconf <instance_name> config replace nsslapd-securePort=636 nsslapd-security=on
# dsconf <instance_name> config replace nsslapd-securePort=636 nsslapd-security=on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow firewalld
サービスで LDAPS ポートを開きます。firewall-cmd --permanent --add-port=636/tcp firewall-cmd --reload
# firewall-cmd --permanent --add-port=636/tcp # firewall-cmd --reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow RSA 暗号ファミリーを有効にし、NSS データベースセキュリティーデバイスおよびサーバー証明書名を設定します。
dsconf <instance_name> security rsa set --tls-allow-rsa-certificates on --nss-token "internal (software)" --nss-cert-name Server-Cert
# dsconf <instance_name> security rsa set --tls-allow-rsa-certificates on --nss-token "internal (software)" --nss-cert-name Server-Cert
Copy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトでは、NSS データベースのセキュリティーデバイスの名前は
internal (software)
です。オプション: プレーンテキストの LDAP ポートを無効にします。
dsconf <instance_name> security disable_plain_port
# dsconf <instance_name> security disable_plain_port
Copy to Clipboard Copied! Toggle word wrap Toggle overflow インスタンスの再起動
dsctl <instance_name> restart
# dsctl <instance_name> restart
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
LDAPS プロトコルを使用して Directory Server への接続を確立します。たとえば、クエリーを実行します。
ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x -s base
# ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x -s base
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ldap_sasl_bind(SIMPLE): Can’t contact LDAP server (-1)
エラーによりコマンドが失敗した場合は、デバッグレベル 1 でコマンドを再実行します。ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x -s base -d 1
# ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x -s base -d 1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.1.4. Web コンソールを使用した Directory Server への TLS 暗号化接続の有効化 リンクのコピーリンクがクリップボードにコピーされました!
Web コンソールを使用して TLS 暗号化を設定できます。
前提条件
- Web コンソールでインスタンスにログインしている。
手順
-
に移動し、 をクリックします。 証明書署名要求 (CSR)、共通名 (CN)、および組織 (O) の名前を設定します。
ホストに複数の名前でアクセスできる場合は、Subject Alternative Names フィールドに代替名を設定します。
- をクリックします。
CSR テキストを表示し、これをコピーします。
- 表示する CSR の Node options アイコンをクリックして、View CSR を選択します。
- CSR コンテンツをコピーします。
- 認証局 (CA) に CSR ファイルを送信し、発行した証明書を取得します。詳細は、CA のドキュメントを参照してください。
-
CA から証明書を取得したら、
に移動し、 をクリックします。 サーバー証明書に一意のニックネームを設定し、発行された証明書をアップロードし、
をクリックします。後のステップには証明書のニックネームが必要であるため、証明書のニックネームを覚えておいてください。
-
に移動し、 をクリックします。 - CA 証明書に一意のニックネームを設定し、CA 証明書ファイルをアップロードし、 をクリックします。
オプション: Directory Server インスタンスのインストール時に TLS 暗号化を有効にしなかった場合は、有効にします。
-
に移動し、セキュリティースイッチを有効にします。 - ポップアップウィンドウで、 をクリックします。
- Security Setting ページで をクリックします。
-
Security Configuration ページで Server Certificate Name を設定します。
-
の順に移動します。 - Server Certificate Name ドロップダウンリストでサーバー証明書のニックネームを選択し、 をクリックします。
- オプション: ドロップダウンリストに証明書のニックネームが表示されない場合は、Security Settings ページを更新して、前の手順を再度実行します。
-
-
オプション:
636
以外の LDAPS ポートを使用する場合は、に移動し、LDAPS ポートを設定して、 をクリックします。 firewalld
サービスで LDAPS ポートを開きます。firewall-cmd --permanent --add-port=636/tcp firewall-cmd --reload
# firewall-cmd --permanent --add-port=636/tcp # firewall-cmd --reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション:
に移動し、Require Secure Connections チェックボックスを選択し、 をクリックします。 Directory Server は、プレーンテキストの LDAP ポートを無効にします。
- 右上隅の Restart Instance を選択します。 をクリックし、
1.1.5. 証明書の有効期限が切れた場合に Directory Server の挙動の管理 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、暗号化が有効で、証明書の有効期限が切れると、Directory Server は警告をログに記録し、サービスを起動します。この動作を変更するには、nsslapd-validate-cert
パラメーターを設定します。以下の値を設定できます。
-
warn
: Directory Server が起動し、期限切れの証明書に関する警告を/var/log/dirsrv/slapd-<instance_name>/error
ログファイルに記録します。これはデフォルト設定です。 -
on
: Directory Server は証明書を検証します。証明書の有効期限が切れると、インスタンスは起動できません。 -
off
: Directory Server は証明書の有効期限を検証しません。インスタンスが起動し、警告は記録されません。
前提条件
- TLS 暗号化を設定している。
手順
以下のコマンドを使用して、
nsslapd-validate-cert
パラメーターを変更します。dsconf <instance_name> config replace nsslapd-validate-cert=<value>
# dsconf <instance_name> config replace nsslapd-validate-cert=<value>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.1.6. NSS データベースのパスワードの変更 リンクのコピーリンクがクリップボードにコピーされました!
ネットワークセキュリティーサービス (NSS) データベースのパスワードを変更できます。たとえば、権限のない人にパスワードが知られるようになったときに変更します。
前提条件
現在の NSS データベースのパスワードを知っている必要がある。
Directory Server の起動時に自動的にデータベースのロックを解除するためのパスワードファイルを使用している場合は、
/etc/dirsrv/slapd-<instance_name>/pin.txt
ファイルに、パスワードがプレーンテキストで暗号化されずに保存されている。
手順
以下のコマンドを使用して NSS データベースのパスワードを変更します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NSS データベースのパスワードを要求せずに、パスワードファイルを使用して Directory Server を自動的に起動する場合は、以前のパスワードを
/etc/dirsrv/slapd-<instance_name>/pin.txt
内の新しいパスワードに置き換えます。NSS ソフトウェア暗号モジュールを使用する場合は、以下になります。
Internal (Software) Token:password
Internal (Software) Token:password
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Hardware Security Module (HSM) を使用する場合:
name_of_the_token:password
name_of_the_token:password
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
パスワードの入力が必要な NSS データベースで操作を実行します。たとえば、インスタンスの秘密鍵をリスト表示します。
certutil -d /etc/dirsrv/slapd-<instance_name>/ -K
# certutil -d /etc/dirsrv/slapd-<instance_name>/ -K certutil: Checking token "NSS Certificate DB" in slot "NSS User Private Key and Certificate Services" Enter Password or Pin for "NSS Certificate DB": < 0> rsa 72cb03f87381abfbb6b9e78234e2e4502ad1bfc0 NSS Certificate DB:Server-Cert
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 新しいパスワードの入力後にコマンドにより想定される出力が表示される場合には、パスワードの変更に成功しました。
1.1.7. NSS データベースのパスワードを要求せずにインスタンスを起動するパスワードファイルの作成 リンクのコピーリンクがクリップボードにコピーされました!
新しいインスタンスの作成すると、インストーラーは /etc/dirsrv/slapd-instance_name/pin.txt
ファイルを自動的に作成し、ネットワークセキュリティーサービス (NSS) パスワードを要求せずに Directory Server を起動できるようになります。ただし、このファイルを削除すると再作成できます。
このパスワードはプレーンテキストで保存されます。サーバーがセキュアでない環境で実行している場合は、パスワードファイルを使用しないでください。
前提条件
- NSS データベースのパスワードを知っている必要がある。
手順
以下の内容で
/etc/dirsrv/slapd-<instance_name>/pin.txt
ファイルを作成します。NSS ソフトウェア暗号モジュールを使用する場合は、以下になります。
Internal (Software) Token:password
Internal (Software) Token:password
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Hardware Security Module (HSM) を使用する場合:
name_of_the_token:password
name_of_the_token:password
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ファイルの権限を設定します。
chown dirsrv:root /etc/dirsrv/slapd-<instance_name>/pin.txt chmod 400 /etc/dirsrv/slapd-<instance_name>/pin.txt
# chown dirsrv:root /etc/dirsrv/slapd-<instance_name>/pin.txt # chmod 400 /etc/dirsrv/slapd-<instance_name>/pin.txt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
インスタンスを再起動します。
dsctl <instance_name> restart
# dsctl <instance_name> restart
Copy to Clipboard Copied! Toggle word wrap Toggle overflow システムが NSS データベースのパスワードを要求しない場合、Directory Server はパスワードファイルを使用します。
1.1.8. Directory Server が使用する CA 証明書の Red Hat Enterprise Linux のトラストストアへの追加 リンクのコピーリンクがクリップボードにコピーされました!
Directory Server で TLS 暗号化を有効にすると、CA が発行した証明書を使用するようにインスタンスを設定します。クライアントが、LDAPS プロトコルまたは LDAP 上の STARTTLS
コマンドを使用してサーバーへの接続を確立する場合、Directory Server はこの証明書を使用して接続を暗号化します。クライアントユーティリティーは CA 証明書を使用して、サーバーの証明書が有効であるかどうかを確認します。デフォルトでは、これらのユーティリティーは、サーバーの証明書を信頼していない場合に接続を取り消します。
例1.1 クライアントユーティリティーが CA 証明書を使用しない場合の接続エラーの可能性
dsconf
dsconf -D "cn=Directory Manager" ldaps://server.example.com:636 config get
# dsconf -D "cn=Directory Manager" ldaps://server.example.com:636 config get Error: {'desc': "Can't contact LDAP server", 'info': 'error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed (self signed certificate in certificate chain)'}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ldapsearch
ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x
# ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x Enter LDAP Password: ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Red Hat Enterprise Linux でクライアントユーティリティーを有効にして Directory Server が使用する証明書を検証するには、オペレーティングシステムのトラストストアに CA 証明書を追加します。
前提条件
ネットワークセキュリティーサービス (NSS) データベースのパスワードを知っている。
Directory Server インスタンスのインストール時に生成されたパスワードを使用する場合は、
/etc/dirsrv/slapd-instance_name/pwdfile.txt
ファイルでこのパスワードをプレーンテキストで特定する。
手順
Directory Server が使用する CA 証明書のローカルコピーがない場合は、以下を実行します。
サーバーのネットワークセキュリティーサービス (NSS) データベースで証明書をリスト表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NSS データベースの CA 証明書のニックネームを使用して、CA 証明書をエクスポートします。
certutil -d /etc/dirsrv/slapd-<instance_name>/ -L -n "Example CA" -a > /tmp/ds-ca.crt
# certutil -d /etc/dirsrv/slapd-<instance_name>/ -L -n "Example CA" -a > /tmp/ds-ca.crt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
CA 証明書を
/etc/pki/ca-trust/source/anchors/
ディレクトリーにコピーします。cp /tmp/ds-ca.crt /etc/pki/ca-trust/source/anchors/
# cp /tmp/ds-ca.crt /etc/pki/ca-trust/source/anchors/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow CA 信頼データベースを再構築します。
update-ca-trust
# update-ca-trust
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
LDAPS プロトコルを使用して Directory Server への接続を確立します。たとえば、クエリーを実行します。
ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x -s base
# ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x -s base
Copy to Clipboard Copied! Toggle word wrap Toggle overflow