前書き
OpenLDAPは、柔軟で十分にサポートされているLDAPディレクトリサービスを提供します。 ただし、デフォルトでは、サーバー自体は暗号化されていないWeb接続を介して通信します。 このガイドでは、STARTTLSを使用してOpenLDAPへの接続を暗号化し、従来の接続をTLSにアップグレードする方法を示します。 LDAPサーバーとしてUbuntu 14.04を使用します。
前提条件
このガイドを開始する前に、サーバーにsudo
を設定したroot以外のユーザーが必要です。 このタイプのユーザーを設定するには、Ubuntu 14.04 initial setup guideに従います。
このガイドでは、Ubuntu 14.04サーバーにOpenLDAPをインストールする方法について説明します。 サーバーにOpenLDAPが既にインストールされている場合は、関連するインストールおよび構成手順をスキップできます。
LDAP over SSLとSTARTTLSを使用したLDAP
SSL / TLSを使用してLDAP接続を暗号化する方法は2つあります。
従来、暗号化が必要なLDAP接続は、別のポート(通常は636
)で処理されていました。 接続全体がSSL / TLSでラップされます。 LDAP over SSLと呼ばれるこのプロセスは、ldaps://
プロトコルを使用します。 この暗号化方式は廃止されました。
STARTTLSは、LDAP接続を暗号化するための好ましい方法である代替アプローチです。 STARTTLSは、接続プロセスの後/実行中にSSL / TLSでラップすることにより、暗号化されていない接続を「アップグレード」します。 これにより、暗号化されていない接続と暗号化された接続を同じポートで処理できます。 このガイドでは、STARTTLSを使用して接続を暗号化します。
ホスト名とFQDNの設定
始める前に、ホスト名と完全修飾ドメイン名(FQDN)を正しく解決するようにサーバーをセットアップする必要があります。 これは、クライアントが証明書を検証するために必要になります。 LDAPサーバーはFQDNがldap.example.com
のマシンでホストされると想定します。
サーバー上の関連するすべての場所にホスト名を設定するには、set-hostname
オプションを指定してhostnamectl
コマンドを使用します。 ホスト名を短いホスト名に設定します(ドメイン名コンポーネントを含めないでください):
sudo hostnamectl set-hostname ldap
次に、/etc/hosts
ファイルに正しい情報が含まれていることを確認して、サーバーのFQDNを設定する必要があります。
sudo nano /etc/hosts
127.0.1.1
のIPアドレスをマップする行を見つけます。 IPアドレスの後の最初のフィールドをサーバーのFQDNに変更し、2番目のフィールドを短いホスト名に変更します。 この例では、次のようになります。
/etc/hosts
. . .
127.0.1.1 ldap.example.com ldap
127.0.0.1 localhost
. . .
完了したら、ファイルを保存して閉じます。
次のように入力して、これらの値が正しく構成されていることを確認できます。
hostname
これにより、短いホスト名が返されます。
短いホスト名
ldap
次を入力してFQDNを確認します。
hostname -f
これにより、FQDNが返されます。
FQDN設定
ldap.example.com
LDAPサーバーとGnuTLSソフトウェアのインストール
ホスト名が適切に設定されていることを確認したら、必要なソフトウェアをインストールできます。 OpenLDAPがすでにインストールおよび設定されている場合は、最初のサブセクションをスキップできます。
OpenLDAPサーバーをインストールする
OpenLDAPがまだインストールされていない場合、今がそれを修正する時です。 次のように入力して、サーバーのローカルパッケージインデックスを更新し、ソフトウェアをインストールします。
sudo apt-get update
sudo apt-get install slapd ldap-utils
LDAP管理パスワードの入力を求められます。 すぐに再構成するため、プロンプトをスキップしてください。
必要な追加のプロンプトにアクセスするために、インストール後にパッケージを再構成します。 これを行うには、次を入力します。
sudo dpkg-reconfigure slapd
以下の情報を出発点として使用して、プロンプトに適切に回答します。
-
OpenLDAPサーバーの構成を省略しますか? No(初期データベースと構成が必要です)
-
DNSドメイン名:
example.com
(サーバーのドメイン名からホスト名を引いたものを使用します。 これは、情報ツリーのベースエントリを作成するために使用されます) -
組織名:Example Inc(これは単に組織の名前としてベースエントリに追加されます)
-
管理者パスワード:[お好きなもの]
-
パスワードの確認:[上記と一致する必要があります]
-
使用するデータベースバックエンド:HDB(2つの選択肢のうち、これが最も機能的です)
-
slapdがパージされたときにデータベースを削除しますか? (あなたの選択。 「はい」を選択して完全にクリーンな削除を許可し、「いいえ」を選択してソフトウェアを削除してもデータを保存します)
-
古いデータベースを移動しますか? Yes
-
LDAPv2プロトコルを許可しますか? No
SSLコンポーネントをインストールする
OpenLDAPサーバーを設定したら、接続を暗号化するために使用するパッケージをインストールします。 Ubuntu OpenLDAPパッケージはGnuTLS SSLライブラリに対してコンパイルされるため、GnuTLSを使用してSSL資格情報を生成します。
sudo apt-get install gnutls-bin ssl-cert
すべてのツールをインストールしたら、接続の暗号化に必要な証明書とキーの作成を開始できます。
証明書テンプレートを作成する
接続を暗号化するには、認証局を設定し、それを使用してインフラストラクチャのLDAPサーバーのキーに署名する必要があります。 したがって、単一サーバーのセットアップには、2組のキー/証明書ペアが必要です。1つは認証局自体用で、もう1つはLDAPサービスに関連付けられています。
これらのエンティティを表すために必要な証明書を作成するために、いくつかのテンプレートファイルを作成します。 これらには、適切なプロパティを持つ証明書を作成するためにcerttool
ユーティリティが必要とする情報が含まれます。
テンプレートファイルを保存するディレクトリを作成することから始めます。
sudo mkdir /etc/ssl/templates
CAテンプレートを作成する
最初に認証局のテンプレートを作成します。 ファイルをca_server.conf
と呼びます。 テキストエディターでファイルを作成して開きます。
sudo nano /etc/ssl/templates/ca_server.conf
認証局を正常に作成するために、いくつかの情報を提供するだけです。 ca
オプションを追加して、証明書がCA(認証局)用であることを指定する必要があります。 生成された証明書に追加の証明書に署名する機能を与えるには、cert_signing_key
オプションも必要です。 cn
を、認証局に付けたい説明的な名前に設定できます。
caserver.conf
cn = LDAP Server CA
ca
cert_signing_key
ファイルを保存して閉じます。
LDAPサービステンプレートを作成する
次に、ldap_server.conf
というLDAPサーバー証明書のテンプレートを作成できます。 sudo
権限でテキストエディタでファイルを作成して開きます。
sudo nano /etc/ssl/templates/ldap_server.conf
ここでは、いくつかの異なる情報を提供します。 組織の名前を指定し、tls_www_server
、encryption_key
、およびsigning_key
オプションを設定して、証明書に必要な基本機能が含まれるようにします。
このテンプレートmustのcn
は、LDAPサーバーのFQDNと一致します。 この値が一致しない場合、クライアントはサーバーの証明書を拒否します。 また、証明書の有効期限も設定します。 頻繁な更新を管理しなくても済むように、10年間の証明書を作成します。
ldapserver.conf
organization = "Example Inc"
cn = ldap.example.com
tls_www_server
encryption_key
signing_key
expiration_days = 3652
完了したら、ファイルを保存して閉じます。
CAキーと証明書を作成する
テンプレートができたので、2つのキー/証明書のペアを作成できます。 最初に認証局のセットを作成する必要があります。
certtool
ユーティリティを使用して、秘密鍵を生成します。 /etc/ssl/private
ディレクトリは、root以外のユーザーから保護されており、生成する秘密鍵を配置するのに適切な場所です。 次のように入力して、秘密鍵を生成し、このディレクトリ内のca_server.key
というファイルに書き込むことができます。
sudo certtool -p --outfile /etc/ssl/private/ca_server.key
これで、生成した秘密キーと前のセクションで作成したテンプレートファイルを使用して、認証局の証明書を作成できます。 これをca_server.pem
という名前の/etc/ssl/certs
ディレクトリ内のファイルに書き込みます。
sudo certtool -s --load-privkey /etc/ssl/private/ca_server.key --template /etc/ssl/templates/ca_server.conf --outfile /etc/ssl/certs/ca_server.pem
これで、認証局の秘密鍵と証明書のペアができました。 これを使用して、LDAPセッションを実際に暗号化するために使用されるキーに署名できます。
LDAPサービスキーと証明書を作成する
次に、LDAPサーバーの秘密キーを生成する必要があります。 セキュリティ上の理由から、生成されたキーを再び/etc/ssl/private
ディレクトリに配置し、わかりやすくするためにファイルをldap_server.key
と呼びます。
次のように入力して、適切なキーを生成できます。
sudo certtool -p --sec-param high --outfile /etc/ssl/private/ldap_server.key
LDAPサーバーの秘密鍵を取得したら、サーバーの証明書を生成するために必要なすべてのものを入手できます。 これまでに作成したほぼすべてのコンポーネント(CA証明書とキー、LDAPサーバーキー、LDAPサーバーテンプレート)を取り込む必要があります。
証明書を/etc/ssl/certs
ディレクトリに置き、ldap_server.pem
という名前を付けます。 必要なコマンドは次のとおりです。
sudo certtool -c --load-privkey /etc/ssl/private/ldap_server.key --load-ca-certificate /etc/ssl/certs/ca_server.pem --load-ca-privkey /etc/ssl/private/ca_server.key --template /etc/ssl/templates/ldap_server.conf --outfile /etc/ssl/certs/ldap_server.pem
LDAPサーバーキーへのOpenLDAPアクセスを許可する
これで、必要な証明書とキーがすべて揃いました。 ただし、現在、OpenLDAPプロセスは独自のキーにアクセスできません。
ssl-cert
というグループは、/etc/ssl/private
ディレクトリのグループ所有者としてすでに存在しています。 OpenLDAPプロセスが(openldap
)で実行されるユーザーをこのグループに追加できます。
sudo usermod -aG ssl-cert openldap
これで、OpenLDAPユーザーがディレクトリにアクセスできるようになりました。 ただし、読み取りアクセスを許可できるように、そのグループにldap_server.key
ファイルの所有権を与える必要があります。 次のように入力して、そのファイルに対するssl-cert
グループの所有権を付与します。
sudo chown :ssl-cert /etc/ssl/private/ldap_server.key
ここで、ssl-cert
グループにファイルへの読み取りアクセス権を付与します。
sudo chmod 640 /etc/ssl/private/ldap_server.key
OpenSSLプロセスがキーファイルに適切にアクセスできるようになりました。
証明書とキーを使用するためのOpenLDAPの構成
ファイルがあり、コンポーネントへのアクセスを正しく構成しました。 次に、作成したファイルを使用するようにOpenLDAP設定を変更する必要があります。 これを行うには、構成の変更を含むLDIFファイルを作成し、それをLDAPインスタンスにロードします。
ホームディレクトリに移動し、addcerts.ldif
というファイルを開きます。 このファイルに構成の変更を追加します。
cd ~
nano addcerts.ldif
構成を変更するには、構成DITのcn=config
エントリをターゲットにする必要があります。 エントリの属性を変更することを指定する必要があります。 その後、olcTLSCACertificateFile
、olcCertificateFile
、およびolcCertificateKeyFile
属性を追加し、それらを正しいファイルの場所に設定する必要があります。
最終結果は次のようになります。
addcerts.ldif
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/ca_server.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap_server.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap_server.key
完了したら、ファイルを保存して閉じます。 ldapmodify
コマンドを使用して、OpenLDAPシステムに変更を適用します。
sudo ldapmodify -H ldapi:// -Y EXTERNAL -f addcerts.ldif
OpenLDAPをリロードして、変更を適用できます。
sudo service slapd force-reload
クライアントは、STARTTLSを使用して、従来のldap://
ポートを介したサーバーへの接続を暗号化できるようになりました。
クライアントマシンのセットアップ
LDAPサーバーに接続してSTARTTLSアップグレードを開始するには、クライアントは認証局証明書にアクセスでき、アップグレードを要求する必要があります。
OpenLDAPサーバー上
サーバー自体からOpenLDAPサーバーと対話する場合は、CA証明書をコピーしてクライアント構成ファイルを調整することにより、クライアントユーティリティをセットアップできます。
まず、CA証明書を/etc/ssl/certs
ディレクトリから/etc/ldap
ディレクトリ内のファイルにコピーします。 このファイルをca_certs.pem
と呼びます。 このファイルを使用して、このマシン上のクライアントがアクセスしたいすべてのCA証明書を保存できます。 目的のために、これには単一の証明書のみが含まれます。
sudo cp /etc/ssl/certs/ca_server.pem /etc/ldap/ca_certs.pem
これで、OpenLDAPユーティリティのシステム全体の構成ファイルを調整できます。 sudo
権限でテキストエディタで設定ファイルを開きます。
sudo nano /etc/ldap/ldap.conf
作成したファイルを指すようにTLS_CACERT
オプションの値を調整します。
/etc/ldap/ldap.conf
. . .
TLS_CACERT /etc/ldap/ca_certs.pem
. . .
ファイルを保存して閉じます。
これで、OpenLDAPユーティリティを使用するときに-Z
オプションを渡すことにより、STARTTLSを使用するように接続をアップグレードできるようになります。 STARTTLSのアップグレードは、2回渡すことで強制できます。 次を入力してテストします。
ldapwhoami -H ldap:// -x -ZZ
これにより、STARTTLSのアップグレードが強制されます。 これが成功した場合、以下が表示されます。
STARTTLSの成功
anonymous
何かを誤って設定した場合、次のようなエラーが表示される可能性があります。
STARTTLSの失敗
ldap_start_tls: Connect error (-11)
additional info: (unknown error code)
リモートクライアントの構成
リモートサーバーからOpenLDAPサーバーに接続する場合は、同様のプロセスを完了する必要があります。 最初に、CA証明書をクライアントマシンにコピーする必要があります。 これは、scp
ユーティリティを使用して簡単に行うことができます。
クライアントへのSSHキーの転送
SSHキーを使用してOpenLDAPサーバーに接続し、クライアントマシンもリモートの場合、クライアントマシンに接続するときにそれらをエージェントに追加して転送する必要があります。
これを行うには、ローカルマシンで次のように入力してSSHエージェントを起動します。
eval $(ssh-agent)
次のように入力して、SSHキーをエージェントに追加します。
ssh-add
これで、-A
フラグを追加することにより、LDAPクライアントマシンに接続するときにSSHキーを転送できます。
ssh -A user@ldap_client
CA証明書のコピー
OpenLDAPクライアントに接続したら、次を入力してCA証明書をコピーできます。
scp [email protected]:/etc/ssl/certs/ca_server.pem ~/
次に、コピーした証明書を、クライアントが知っているCA証明書のリストに追加します。 これにより、証明書が既に存在する場合はファイルに追加され、存在しない場合はファイルが作成されます。
cat ~/ca_server.pem | sudo tee -a /etc/ldap/ca_certs.pem
クライアント構成を調整する
次に、LDAPユーティリティのグローバル構成ファイルを調整して、ca_certs.pem
ファイルを指すようにします。 sudo
権限でファイルを開きます。
sudo nano /etc/ldap/ldap.conf
TLS_CACERT
オプションを見つけて、ca_certs.pem
ファイルに設定します。
/etc/ldap/ldap.conf
. . .
TLS_CACERT /etc/ldap/ca_certs.pem
. . .
完了したら、ファイルを保存して閉じます。
次を入力して、STARTTLSアップグレードをテストします。
ldapwhoami -H ldap://ldap.example.com -x -ZZ
STARTTLSのアップグレードが成功すると、以下が表示されます。
STARTTLSの成功
anonymous
TLSを使用する接続の強制(オプション)
STARTTLSプロセスを通じて通常のLDAP接続をTLSにシームレスにアップグレードできるように、OpenLDAPサーバーを正常に構成しました。 ただし、これにより、暗号化されていないセッションが許可されます。
接続ごとにSTARTTLSアップグレードを強制する場合は、サーバーの設定を調整できます。 この要件は通常のDITにのみ適用され、cn=config
エントリの下でアクセス可能な構成DITには適用されません。
まず、変更する適切なエントリを見つける必要があります。 OpenLDAPサーバーが情報を保持しているすべてのDIT(ディレクトリ情報ツリー:LDAPサーバーが処理するエントリの階層)のリストと、各DITを構成するエントリを出力します。
OpenLDAPサーバーで、次のように入力します。
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=config" -LLL -Q "(olcSuffix=*)" dn olcSuffix
応答は次のようになります。
OpenLDAPが提供するDIT
dn: olcDatabase={1}hdb,cn=config
olcSuffix: dc=example,dc=com
サーバーが複数のDITを処理するように構成されている場合、DITとデータベースのペアが増える可能性があります。 ここでは、dc=example,dc=com
のベースエントリを持つ単一のDITがあります。これは、example.com
のドメイン用に作成されたエントリです。 このDITの構成は、olcDatabase={1}hdb,cn=config
エントリによって処理されます。 暗号化を強制するDOTのDNをメモします。
LDIFファイルを使用して変更を加えます。 ホームディレクトリにLDIFファイルを作成します。 これをforcetls.ldif
と呼びます。
nano ~/forcetls.ldif
内部で、TLSを強制するDNをターゲットにします。 この場合、これはdn: olcDatabase={1}hdb,cn=config
になります。 changetype
を「変更」に設定し、olcSecurity
属性を追加します。 このDITにTLSを強制するには、属性の値を「tls = 1」に設定します。
forcetls.ldif
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcSecurity
olcSecurity: tls=1
完了したら、ファイルを保存して閉じます。
変更を適用するには、次を入力します。
sudo ldapmodify -H ldapi:// -Y EXTERNAL -f forcetls.ldif
次のように入力して、OpenLDAPサービスをリロードします。
sudo service slapd force-reload
ここで、dc=example,dc=com
DITを検索する場合、-Z
オプションを使用してSTARTTLSアップグレードを開始しないと、拒否されます。
ldapsearch -H ldap:// -x -b "dc=example,dc=com" -LLL dn
TLSが必要な失敗
Confidentiality required (13)
Additional information: TLS confidentiality required
STARTTLS接続が引き続き正しく機能することを示すことができます。
ldapsearch -H ldap:// -x -b "dc=example,dc=com" -LLL -Z dn
TLSには成功が必要
dn: dc=example,dc=com
dn: cn=admin,dc=example,dc=com
結論
これで、STARTTLS暗号化を使用してOpenLDAPサーバーが構成されました。 TLSを使用してOpenLDAPサーバーへの接続を暗号化すると、接続しているサーバーの身元を確認できます。 また、中間者からのトラフィックを保護します。 オープンネットワーク経由で接続する場合、トラフィックを暗号化することが不可欠です。