前書き

OpenLDAPは、柔軟で十分にサポートされているLDAPディレクトリサービスを提供します。 ただし、デフォルトでは、サーバー自体は暗号化されていないWeb接続を介して通信します。 このガイドでは、STARTTLSを使用してOpenLDAPへの接続を暗号化し、従来の接続をTLSにアップグレードする方法を示します。 LDAPサーバーとしてUbuntu 14.04を使用します。

前提条件

このガイドを始める前に、サーバーに `+ sudo +`が設定された非rootユーザーが必要です。 このタイプのユーザーをセットアップするには、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04 [Ubuntu 14.04初期セットアップガイド]に従ってください。

このガイドでは、Ubuntu 14.04サーバーにOpenLDAPをインストールする方法について説明します。 サーバーにOpenLDAPが既にインストールされている場合は、関連するインストールおよび構成手順をスキップできます。

LDAP over SSLとSTARTTLSを使用したLDAP

SSL / TLSを使用してLDAP接続を暗号化する方法は2つあります。

従来、暗号化が必要なLDAP接続は別のポート、通常は「636」で処理されていました。 接続全体がSSL / TLSでラップされます。 SSLを介したLDAPと呼ばれるこのプロセスは、 `+ ldaps:// +`プロトコルを使用します。 この暗号化方式は廃止されました。

STARTTLSは、LDAP接続を暗号化するための好ましい方法である代替アプローチです。 STARTTLSは、接続プロセスの後/実行中にSSL / TLSでラップすることにより、暗号化されていない接続を「アップグレード」します。 これにより、暗号化されていない接続と暗号化された接続を同じポートで処理できます。 このガイドでは、STARTTLSを使用して接続を暗号化します。

ホスト名とFQDNの設定

始める前に、ホスト名と完全修飾ドメイン名(FQDN)を正しく解決するようにサーバーをセットアップする必要があります。 これは、クライアントが証明書を検証するために必要になります。 LDAPサーバーは、FQDNが「+ ldap.example.com +」のマシンでホストされると想定します。

サーバー上の関連するすべての場所でホスト名を設定するには、 `+ hostnamectl `コマンドと ` set-hostname +`オプションを使用します。 ホスト名を短いホスト名に設定します(ドメイン名コンポーネントを含めないでください):

sudo hostnamectl set-hostname

次に、 `+ / etc / hosts +`ファイルに正しい情報があることを確認して、サーバーのFQDNを設定する必要があります。

sudo nano /etc/hosts

+ 127.0.1.1 + IPアドレスをマップする行を見つけます。 IPアドレスの後の最初のフィールドをサーバーのFQDNに変更し、2番目のフィールドを短いホスト名に変更します。 この例では、次のようになります。

/ etc / hosts

. . .

127.0.1.1
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サーバーの構成を省略しますか? いいえ(初期データベースと設定が必要です)

  • DNSドメイン名:* ++ *(サーバーのドメイン名からホスト名を除いたものを使用します。 これは、情報ツリーのベースエントリを作成するために使用されます)

  • 組織名:* Example Inc *(これは単に組織の名前としてベースエントリに追加されます)

  • 管理者パスワード:[お好きなもの]

  • パスワードの確認:[上記と一致する必要があります]

  • 使用するデータベースバックエンド:* HDB *(2つの選択肢のうち、これが最も機能的です)

  • slapdがパージされたときにデータベースを削除しますか? (あなたの選択。 「はい」を選択して完全にクリーンな削除を許可し、「いいえ」を選択してソフトウェアを削除してもデータを保存します)

  • 古いデータベースを移動しますか? はい

  • 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 +`オプションを設定して、証明書に必要な基本機能を設定します。

このテンプレートの「+ cn +」は、LDAPサーバーのFQDNと一致する必要があります。 この値が一致しない場合、クライアントはサーバーの証明書を拒否します。 証明書の有効期限も設定します。 頻繁な更新を管理しなくても済むように、10年間の証明書を作成します。

ldapserver.conf

organization = ""
cn =
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 @
CA証明書のコピー

OpenLDAPクライアントに接続したら、次を入力してCA証明書をコピーできます。

scp @:/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:// -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 +`エントリによって処理されます。 暗号化を強制するDITのDNをメモします。

LDIFファイルを使用して変更を加えます。 ホームディレクトリにLDIFファイルを作成します。 `+ forcetls.ldif +`と呼びます:

nano ~/forcetls.ldif

内部で、TLSを強制するDNをターゲットにします。 私たちの場合、これは `+ dn:olcDatabase = {1} hdb、cn = config`になります。 `+ changetype `を“ modify”に設定し、 ` 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サーバーへの接続を暗号化すると、接続しているサーバーの身元を確認できます。 また、中間者からのトラフィックを保護します。 オープンネットワーク経由で接続する場合、トラフィックを暗号化することが不可欠です。