序章

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

前提条件

このガイドを開始する前に、root以外のユーザーが sudo サーバーに設定します。 このタイプのユーザーをセットアップするには、Ubuntu14.04初期セットアップガイドに従ってください。

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

LDAPOverSSLとSTARTTLSを使用したLDAP

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

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

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

ホスト名とFQDNの設定

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

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

  1. sudo hostnamectl set-hostname ldap

次に、サーバーのFQDNを設定する必要があります。 /etc/hosts ファイルには正しい情報があります:

  1. 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

. . .

終了したら、ファイルを保存して閉じます。

次のように入力すると、これらの値が正しく構成されていることを確認できます。

  1. hostname

これにより、短いホスト名が返されます。

短いホスト名
ldap

次のように入力してFQDNを確認します。

  1. hostname -f

これにより、FQDNが返されます。

FQDN設定
ldap.example.com

LDAPサーバーとGnuTLSソフトウェアのインストール

ホスト名が正しく設定されていることを確認したら、必要なソフトウェアをインストールできます。 すでにOpenLDAPをインストールして設定している場合は、最初のサブセクションをスキップできます。

OpenLDAPサーバーをインストールします

OpenLDAPをまだインストールしていない場合は、今がそれを修正するときです。 サーバーのローカルパッケージインデックスを更新し、次のように入力してソフトウェアをインストールします。

  1. sudo apt-get update
  2. sudo apt-get install slapd ldap-utils

LDAP管理者パスワードを入力するように求められます。 すぐに再構成するため、プロンプトをスキップしてください。

必要な追加のプロンプトにアクセスするために、インストール後にパッケージを再構成します。 これを行うには、次のように入力します。

  1. sudo dpkg-reconfigure slapd

以下の情報を出発点として、プロンプトに適切に答えてください。

  • OpenLDAPサーバー構成を省略しますか? いいえ(初期データベースと構成が必要です)
  • DNSドメイン名: example.com (サーバーのドメイン名からホスト名を引いたものを使用します。 これは、情報ツリーのベースエントリを作成するために使用されます)
  • 組織名: Example Inc (これは単に組織の名前としてベースエントリに追加されます)
  • 管理者パスワード:[好きなもの]
  • パスワードの確認:[上記と一致する必要があります]
  • 使用するデータベースバックエンド: HDB (2つの選択肢のうち、これが最も機能的です)
  • slapdがパージされたときにデータベースを削除しますか? (あなたの選択。 完全にクリーンな削除を許可するには「はい」を選択し、ソフトウェアが削除されてもデータを保存するには「いいえ」を選択します)
  • 古いデータベースを移動しますか? はい
  • LDAPv2プロトコルを許可しますか? いいえ

SSLコンポーネントをインストールします

OpenLDAPサーバーが構成されたら、接続の暗号化に使用するパッケージをインストールできます。 UbuntuOpenLDAPパッケージはGnuTLSSSLライブラリに対してコンパイルされるため、GnuTLSを使用してSSLクレデンシャルを生成します。

  1. sudo apt-get install gnutls-bin ssl-cert

すべてのツールをインストールしたら、接続の暗号化に必要な証明書とキーの作成を開始できます。

証明書テンプレートを作成する

接続を暗号化するには、認証局を構成し、それを使用してインフラストラクチャ内のLDAPサーバーのキーに署名する必要があります。 したがって、単一サーバーのセットアップでは、2セットのキー/証明書のペアが必要になります。1つは認証局自体用で、もう1つはLDAPサービスに関連付けられています。

これらのエンティティを表すために必要な証明書を作成するために、いくつかのテンプレートファイルを作成します。 これらには、 certtool 適切なプロパティを持つ証明書を作成するには、ユーティリティが必要です。

テンプレートファイルを保存するディレクトリを作成することから始めます。

  1. sudo mkdir /etc/ssl/templates

CAテンプレートを作成する

最初に認証局のテンプレートを作成します。 ファイルを呼び出します ca_server.conf. ファイルを作成してテキストエディタで開きます。

  1. 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サーバー証明書のテンプレートを作成できます。 ldap_server.conf. 次のコマンドを使用して、テキストエディタでファイルを作成して開きます。 sudo 特権:

  1. sudo nano /etc/ssl/templates/ldap_server.conf

ここでは、いくつかの異なる情報を提供します。 組織の名前を入力し、 tls_www_server, encryption_key、 と signing_key 証明書に必要な基本機能が含まれるようにするためのオプション。

The 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 秘密鍵を生成するユーティリティ。 The /etc/ssl/private ディレクトリはroot以外のユーザーから保護されており、生成する秘密鍵を配置するのに適切な場所です。 秘密鍵を生成して、というファイルに書き込むことができます ca_server.key このディレクトリ内で次のように入力します。

  1. sudo certtool -p --outfile /etc/ssl/private/ca_server.key

これで、生成した秘密鍵と前のセクションで作成したテンプレートファイルを使用して、認証局の証明書を作成できます。 これをファイルに書き込みます /etc/ssl/certs と呼ばれるディレクトリ ca_server.pem:

  1. 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 明確にするために。

次のように入力して、適切なキーを生成できます。

  1. sudo certtool -p --sec-param high --outfile /etc/ssl/private/ldap_server.key

LDAPサーバーの秘密鍵を取得すると、サーバーの証明書を生成するために必要なものがすべて揃います。 これまでに作成したほとんどすべてのコンポーネント(CA証明書とキー、LDAPサーバーキー、およびLDAPサーバーテンプレート)を取り込む必要があります。

証明書を /etc/ssl/certs ディレクトリと名前を付けます ldap_server.pem. 必要なコマンドは次のとおりです。

  1. 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)このグループへ:

  1. sudo usermod -aG ssl-cert openldap

これで、OpenLDAPユーザーがディレクトリにアクセスできるようになりました。 そのグループに所有権を与える必要があります ldap_server.key ただし、読み取りアクセスを許可できるようにファイルします。 与える ssl-cert 次のように入力して、そのファイルの所有権をグループ化します。

  1. sudo chown :ssl-cert /etc/ssl/private/ldap_server.key

さて、 ssl-cert ファイルへのグループ読み取りアクセス:

  1. sudo chmod 640 /etc/ssl/private/ldap_server.key

これで、OpenSSLプロセスがキーファイルに正しくアクセスできるようになりました。

証明書とキーを使用するようにOpenLDAPを設定する

ファイルがあり、コンポーネントへのアクセスが正しく構成されています。 次に、作成したファイルを使用するようにOpenLDAP構成を変更する必要があります。 これを行うには、構成を変更したLDIFファイルを作成し、それをLDAPインスタンスにロードします。

ホームディレクトリに移動し、というファイルを開きます addcerts.ldif. 構成の変更を次のファイルに入れます。

  1. cd ~
  2. nano addcerts.ldif

構成を変更するには、 cn=config 構成DITのエントリ。 エントリの属性を変更することを指定する必要があります。 その後、追加する必要があります 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

終了したら、ファイルを保存して閉じます。 を使用してOpenLDAPシステムに変更を適用します ldapmodify 指図:

  1. sudo ldapmodify -H ldapi:// -Y EXTERNAL -f addcerts.ldif

OpenLDAPをリロードして、変更を適用できます。

  1. sudo service slapd force-reload

クライアントは、従来の方法でサーバーへの接続を暗号化できるようになりました ldap:// STARTTLSを使用してポートします。

クライアントマシンのセットアップ

LDAPサーバーに接続してSTARTTLSアップグレードを開始するには、クライアントは認証局の証明書にアクセスでき、アップグレードを要求する必要があります。

OpenLDAPサーバー上

サーバー自体からOpenLDAPサーバーと対話している場合は、CA証明書をコピーし、クライアント構成ファイルを調整することにより、クライアントユーティリティを設定できます。

まず、CA証明書を /etc/ssl/certs 内のファイルへのディレクトリ /etc/ldap ディレクトリ。 このファイルを呼び出します ca_certs.pem. このファイルを使用して、このマシン上のクライアントがアクセスする可能性のあるすべてのCA証明書を保存できます。 私たちの目的のために、これには単一の証明書のみが含まれます。

  1. sudo cp /etc/ssl/certs/ca_server.pem /etc/ldap/ca_certs.pem

これで、OpenLDAPユーティリティのシステム全体の設定ファイルを調整できます。 テキストエディタで設定ファイルを開きます。 sudo 特権:

  1. sudo nano /etc/ldap/ldap.conf

の値を調整します TLS_CACERT 作成したファイルを指すオプション:

/etc/ldap/ldap.conf
. . .

TLS_CACERT /etc/ldap/ca_certs.pem

. . .

ファイルを保存して閉じます。

これで、STARTTLSを使用するように接続をアップグレードできるようになります。 -Z OpenLDAPユーティリティを使用する場合のオプション。 STARTTLSのアップグレードを2回渡すことで、強制的にアップグレードできます。 次のように入力して、これをテストします。

  1. 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キーをエージェントに追加し、クライアントマシンに接続するときに転送する必要があります。

これを行うには、ローカルマシンで、次のように入力してSSHエージェントを起動します。

  1. eval $(ssh-agent)

次のように入力して、SSHキーをエージェントに追加します。

  1. ssh-add

これで、LDAPクライアントマシンに接続するときにSSHキーを転送できるようになりました。 -A 国旗:

  1. ssh -A user@ldap_client

CA証明書のコピー

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

  1. scp user@ldap.example.com:/etc/ssl/certs/ca_server.pem ~/

次に、コピーした証明書を、クライアントが認識しているCA証明書のリストに追加します。 これにより、証明書がすでに存在する場合はファイルに追加され、存在しない場合はファイルが作成されます。

  1. cat ~/ca_server.pem | sudo tee -a /etc/ldap/ca_certs.pem

クライアント構成を調整する

次に、LDAPユーティリティのグローバル構成ファイルを調整して、 ca_certs.pem ファイル。 でファイルを開く sudo 特権:

  1. sudo nano /etc/ldap/ldap.conf

を見つける TLS_CACERT オプションを選択し、 ca_certs.pem ファイル:

/etc/ldap/ldap.conf
. . .

TLS_CACERT /etc/ldap/ca_certs.pem

. . .

終了したら、ファイルを保存して閉じます。

次のように入力して、STARTTLSアップグレードをテストします。

  1. ldapwhoami -H ldap://ldap.example.com -x -ZZ

STARTTLSのアップグレードが成功すると、次のように表示されます。

STARTTLSの成功
anonymous

接続でTLSを使用するように強制する(オプション)

STARTTLSプロセスを介して通常のLDAP接続をTLSにシームレスにアップグレードできるように、OpenLDAPサーバーを正常に構成しました。 ただし、これでも暗号化されていないセッションが許可されるため、希望どおりにならない場合があります。

すべての接続に対してSTARTTLSアップグレードを強制する場合は、サーバーの設定を調整できます。 この要件は通常のDITにのみ適用され、その下でアクセス可能な構成DITには適用されません。 cn=config エントリ。

まず、変更する適切なエントリを見つける必要があります。 OpenLDAPサーバーが情報を持っているすべてのDIT(ディレクトリ情報ツリー:LDAPサーバーが処理するエントリの階層)と各DITを構成するエントリのリストを印刷します。

OpenLDAPサーバーで、次のように入力します。

  1. 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、のドメイン用に作成されたエントリになります example.com. このDITの構成は、 olcDatabase={1}hdb,cn=config エントリ。 暗号化を強制するDITのDNをメモします。

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

  1. 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

終了したら、ファイルを保存して閉じます。

変更を適用するには、次のように入力します。

  1. sudo ldapmodify -H ldapi:// -Y EXTERNAL -f forcetls.ldif

次のように入力して、OpenLDAPサービスをリロードします。

  1. sudo service slapd force-reload

さて、あなたが検索すると dc=example,dc=com DIT、使用しない場合は拒否されます -Z STARTTLSアップグレードを開始するオプション:

  1. ldapsearch -H ldap:// -x -b "dc=example,dc=com" -LLL dn
TLSに必要な失敗
Confidentiality required (13)
Additional information: TLS confidentiality required

STARTTLS接続がまだ正しく機能していることを示すことができます。

  1. 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

結論

これで、OpenLDAPサーバーがSTARTTLS暗号化で構成されているはずです。 TLSを使用してOpenLDAPサーバーへの接続を暗号化すると、接続しているサーバーのIDを確認できます。 また、中間パーティからトラフィックを保護します。 オープンネットワークを介して接続する場合、トラフィックを暗号化することが不可欠です。