2021年7月24日土曜日

オレオレ証明書を使ってActive DirectoryのLDAPS認証を有効化する

Active Directory (以下、AD) は、デフォルトでLDAP及びLDAPS (LDAP over SSL) による通信を行うことができる。以下は実際にADのサーバにて開放しているポートを確認した結果となり、LDAPの389番ポートとLDAPSの636番ポートが開放されていることがわかる。

PS C:\> Get-NetTCPConnection -State Listen | Where-Object { $_.LocalPort -match "^389|^636" }

LocalAddress                        LocalPort RemoteAddress                       RemotePort State       AppliedSetting
------------                        --------- -------------                       ---------- -----       --------------
::                                  636       ::                                  0          Listen
::                                  389       ::                                  0          Listen
0.0.0.0                             636       0.0.0.0                             0          Listen
0.0.0.0                             389       0.0.0.0                             0          Listen

ただし、デフォルトの状態ではADではLDAPSは利用することができない。LDAPは利用できるが、セキュリティの観点からは通信が暗号化されるLDAPSの利用が強く推奨される。

今回は、Active Directoryに対してオレオレ証明書による証明書登録を行い、LDAPSの通信を利用できるよう構成するための手順を記載する。

環境

オレオレ証明書を作成するため、Linuxサーバのopensslコマンドを利用する。

  • 証明書作成用Linux : CentOS 8.1
  • AD : Windows Server 2016 Standard

証明書作成手順

1. Linuxサーバにて作業用ディレクトリの作成

Linuxサーバにログインし、以下の通り作業用ディレクトリを作成する。

# cd /etc/pki/tls/misc/
# mkdir ad_ldaps
# cd ad_ldaps/

上記作業用ディレクトリには、最終的に以下ファイルが配置される。登録対象に「●」を付けたファイルをADとLDAPクライアントにそれぞれ登録する。

ファイル名 登録対象 説明
private_ad.key - 署名用の秘密鍵
server.csr - サーバ証明書作成用のCSR
san.txt - サーバ証明書に登録するSAN (サブジェクト代替名)
public_ad.crt LDAPクライアントへ登録するためのサーバ証明書
private_ad.pfx ADへ登録するための秘密鍵を含むサーバ証明書 (pkcs12形式)

2. Linuxサーバにて秘密鍵の作成

opensslコマンドで、証明書作成に使用する秘密鍵を作成する。

# openssl genrsa 2048 > private_ad.key
Generating RSA private key, 2048 bit long modulus (2 primes)
........................................................+++++
.............................................+++++
e is 65537 (0x010001)

3. LinuxサーバにてCSRの作成

引き続きopensslコマンドを使用する。サーバ証明書作成をするため、CSR (証明書署名要求) を作成する。CSR作成には各種情報の入力を求められるため、以下のように設定を行う。

設定項目 設定値
Country Name (2 letter code) [JP] JPを設定
State or Province Name (full name) [Tokyo] 適当に設定
Locality Name (eg, city) [Default City] 適当に設定
Organization Name (eg, company) [Default Company Ltd] 適当に設定
Organizational Unit Name (eg, section) [] そのままエンター
Common Name (eg, your name or your server’s hostname) ADのFQDNを設定
Email Address [] そのままエンター
A challenge password [] そのままエンター
An optional company name [] そのままエンター

実際にCSR作成のコマンド実行結果を以下に記載する。

# openssl req -new -key private_ad.key > server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:JP
State or Province Name (full name) [Tokyo]:Tokyo
Locality Name (eg, city) [Default City]:Default City
Organization Name (eg, company) [Default Company Ltd]:Default Company Ltd
Organizational Unit Name (eg, section) []: ←★そのままエンター
Common Name (eg, your name or your server's hostname) []:hoge1.example.com ←★ADのFQDN
Email Address []: ←★そのままエンター

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ←★そのままエンター
An optional company name []: ←★そのままエンター

4. Linuxサーバにてサーバ証明書の作成

CSRに秘密鍵で署名を行い、サーバ証明書を作成する。サーバ証明書にSAN (サブジェクト代替名) の情報が必須となるため、以下のようにADのFQDN情報を記載したテキストファイルを作成しておく。ADが複数ある場合は、カンマ区切りで複数のサーバのFQDNを設定することができ、1つの証明書で複数台のADに登録できる証明書を作成できる
※Common Nameは複数のFQDNの記載はできないが、SANに記載があれば、きちんとLDAPSの認証は成功するようだ。

# cat san.txt
subjectAltName = DNS:hoge1.example.com, DNS:hoge2.example.com

opensslコマンド実行時に-extfile san.txtのオプションを付与して、SAN情報を含めた形でサーバ証明書を作成する。

# openssl x509 -days 3650 -req -signkey private_ad.key -in server.csr -out public_ad.crt -extfile san.txt

5. LinuxサーバにてAD登録用のpkcs12形式の証明書を作成

ADに登録するサーバ証明書は、証明書と秘密鍵をセットにしたpkcs12形式の証明書とする必要がある。秘密鍵情報を含むことから、作成時にパスワード設定を設定する。

# openssl pkcs12 -export -inkey private_ad.key -in public_ad.crt -out private_ad.pfx
Enter Export Password: ←★パスワードを入力
Verifying - Enter Export Password: ←★パスワードを再入力

最後に以下の証明書ファイルをダウンロードする。private_ad.pfxには秘密鍵が含まれるため、取り扱いには注意すること。

ファイル名 登録対象 説明
public_ad.crt LDAPクライアントへ登録するためのサーバ証明書
private_ad.pfx ADへ登録するための秘密鍵を含むサーバ証明書 (pkcs12形式)

証明書のインポート

1. ADに秘密鍵をインポート

ADのドメインコントローラとなっているサーバにて、「ファイル名を指定して実行」→「certlm.msc」を実行し、証明書の管理画面を表示させる。

「個人」を右クリックし、「すべてのタスク」→「インポート」を選択する。

「証明書のインポートウィザード」が表示されるため、以下の通り設定する。

設定項目 設定値
証明書のインポートウィザードの開始 そのまま次へ
インストールする証明書ファイル private_ad.pfxを選択。ファイル選択時に拡張子で*.pfxを選択しないとファイルが表示されないため注意
秘密キーの保護 private_ad.pfx作成時に設定したパスワードを入力
証明書ストア 「個人」を選択

問題なくインポートに成功すると、「正しくインポートされました」と表示される。

2. LDAPクライアント側のサーバに公開鍵をインポート

LDAPクライアントとするサーバにて、「ファイル名を指定して実行」→「certlm.msc」を実行し、証明書の管理画面を表示させる。

「信頼されたルート証明機関」を右クリックし、「すべてのタスク」→「インポート」を選択する。

「証明書のインポートウィザード」が表示されるため、以下の通り設定する。

設定項目 設定値
証明書のインポートウィザードの開始 そのまま次へ
インストールする証明書ファイル public_ad.crtを選択
証明書ストア 「信頼されたルート証明機関」を選択

なお、今回は割愛するが、ドメイン環境であれば、グループポリシーによる証明書登録を行うこともできる。グループポリシーの設定方法の詳細は、以下記事も参照いただきたい。

詳細は割愛するが、グループポリシーの場合は、以下にて設定を行うことができる。

「コンピューターの管理」
 →「ポリシー」
  →「Windowsの設定」
   →「セキュリティの設定」
    →「公開キーのポリシー」
     →「信頼されたルート証明機関」

3. 接続確認 (ldp.exeによる確認)

LDAPSの接続確認は、ldp.exeを使用する。なお、「リモートサーバー管理ツール」の「AD DSおよびAD LDSツール」がインストールされていない場合は使えない可能性があるため、その場合は任意のフリーソフトなどを使って確認すること。

「ファイル名を指定して実行」→「ldp」にてldp.exeを起動させ、「接続」→「接続」を選択し、以下の通り接続確認を行う。

  • サーバー : ADのFQDN
  • ポート : 636
  • SSL : チェック

問題なく接続されると、以下の通り「Established connection to [ADのFQDN]」と表示される。

ld = ldap_sslinit("hoge1.example.com", 636, 1);
Error 0 = ldap_set_option(hLdap, LDAP_OPT_PROTOCOL_VERSION, 3);
Error 0 = ldap_connect(hLdap, NULL);
Error 0 = ldap_get_option(hLdap,LDAP_OPT_SSL,(void*)&lv);
Host supports SSL, SSL cipher strength = 256 bits
Established connection to hoge1.example.com.

次に「接続」→「バインド」を選択し、ADを参照可能なユーザを選択する。ドメイン参加済み環境の場合は「現在のログオンユーザーとしてバインド」を選択しても問題ない。

ADのユーザ情報を表示させるため、「表示」→「ツリー」を選択する。ベースDNにADに登録されているOUなどを選択することで、登録されているユーザ情報の一覧を表示させることができる。

以上で、オレオレ証明書を使ってActive DirectoryでLDAPSによる認証を有効化する手順は完了となる。

参考

0 件のコメント:

コメントを投稿

人気の投稿