本編について、少し時間が空いてしまいました。申し訳ありません。今までは、Active Directory にはLDAPが使われていること、LDAPの基本的な構造、LDAPを制御するツール(Ldpツール、csvdeツール)をご紹介しました。今回は、LDAPを使ってActive Directoryを制御するコマンドとして、ldifdeコマンドを紹介しましょう。
ldifdeコマンド
ldifdeコマンドはcsvdeコマンドと同じく、Active Directoryの情報をエクスポートしたり、インポートすることができるツールです。csvdeコマンドと同じような使い方ができますが、次の点でcsvdeコマンドとは異なります。
まず、ldifdeコマンドは"LDIF形式"と呼ばれる業界標準のフォーマットでデータを扱います。LDIFとは"LDAP Data Interchange Format(LDAPデータ交換形式)"と呼ばれ、RFC2849で勧告された標準形式となります。このフォーマットを使うことで、オブジェクトの追加や削除のほか、個々の属性についても、追加・変更・削除を自由に行うことができます。
また、csvdeコマンドではパスワードのインポートを行うことはできませんが、ldifdeコマンドは可能です。ただし、パスワードをインポートする場合、SSLまたはTLSによる暗号化セッションで行う必要があること、またフォーマットについて、ダブルクォーテーションでくくられた「リトルエンディアン形式(文字コードの一形式)のパスワード文字列」をBase64でエンコードしたものを利用する、といった条件が必要です。
ldifdeコマンドはcsvdeコマンドに比べて柔軟性が高いため、さまざまなシチュエーションで威力を発揮してくれます。しかし、フォーマットが特殊なため、表管理ソフトなどでは管理しづらい、というデメリットがないわけでもありません。
ldifdeコマンドでパスワードを含むアカウントをインポートする
ldifdeコマンドでは、インポートファイルにLDIF形式のフォーマットを利用します。LDIF形式の例として、次のような内容を紹介します。
dn: CN=田所 明,OU=第二課,OU=営業部,DC=marubatsucorp,DC=local
changeType: add
objectClass: user
description: 営業部第二課ユーザー
saMaccountName: atadokoro
displayName: 田所 明
sn: 田所
givenName: 明
company: ○×株式会社
department: 営業部第二課
title: 課長
mail: atadokoro@marubatsucorp.local
telephoneNumber: 03-1234-6789
userPrincipalName: atadokoro@marubatsucorp.local
unicodePwd:: IgBwAGEAcwBzAHcAbwByAGQAJAAwADEAIgA=
userAccountControl: 512
LDIF形式では、1行目に追加・変更を行うDNを記載し、2行目に追加・変更・削除のどれを行うかchangeTypeで指定します。ここではadd(追加)を指定しますが、modify(変更)やdelete(削除)を指定することで、属性の変更やオブジェクトの削除を行うことも可能です。
3行目以降に追加するオブジェクトの属性を指定していきます。属性の詳細は前回の記事を参考にしていただきのですが、いくつか新しい属性があります。まず、"unicodePwd"属性はActive Directoryのアカウント(ユーザアカウントやコンピュータアカウント)のパスワードを指定する属性となります。LDIF形式で"unicodePwd"属性を指定するには、ダブルクォーテーションでくくられた「リトルエンディアン形式の文字列」をBase64でエンコードした文字列が必要です。ここでは"password$01"文字列をリトルエンディアン形式に変換し、さらにbase64形式に変換しています(「 ::」はBase64形式であることを示しています) 。なお、リトルエンディアンに変換するツールには、川俣晶さんのtconv などが利用できます。
また、"userAccountControl"属性はアカウントオブジェクトの状態を示すもので、"512"はオブジェクトが有効で通常利用が可能な状態に指定することを意味します(なにも指定しない場合アカウントは無効で設定されます) 。
ここでは、次のようなLDIFファイルを用意します。このファイルは、OU、ユーザアカウントおよびグループアカウントを追加するものとなります(内容はcsvdeコマンドと同じものです) 。この内容のファイルを"Unicode"形式でimport.ldfファイルとして保存します。Windowsのメモ帳でファイルを保存する場合、通常は"ANSI"形式で保存されますので、[ ファイル] →[ 名前を付けて保存]から文字コードを"Unicode"に設定して保存するようにします。
dn: OU=第二課,OU=営業部,DC=marubatsucorp,DC=local
changeType: add
objectClass: organizationalUnit
description: 営業部第二課OU
dn: CN=田所 明,OU=第二課,OU=営業部,DC=marubatsucorp,DC=local
changeType: add
objectClass: user
description: 営業部第二課ユーザー
saMaccountName: atadokoro
displayName: 田所 明
sn: 田所
givenName: 明
company: ○×株式会社
department: 営業部第二課
title: 課長
mail: atadokoro@marubatsucorp.local
telephoneNumber: 03-1234-6789
userPrincipalName: atadokoro@marubatsucorp.local
unicodePwd:: IgBwAGEAcwBzAHcAbwByAGQAJAAwADEAIgA=
userAccountControl: 512
dn:CN=松谷 一郎,OU=第二課,OU=営業部,DC=marubatsucorp,DC=local
changeType: add
objectClass: user
description: 営業部第二課ユーザー
saMaccountName: imatsutani
displayName: 松谷 一郎
sn: 松谷
givenName: 一郎
company:○×株式会社
department:営業部第二課
title: 主任
mail: imatsutani@marubatsucorp.local
telephoneNumber: 03-1234-6789
userPrincipalName: imatsutani@marubatsucorp.local
unicodePwd:: IgBwAGEAcwBzAHcAbwByAGQAJAAwADEAIgA=
userAccountControl: 512
dn: CN=来島 たえ,OU=第二課,OU=営業部,DC=marubatsucorp,DC=local
changeType: add
objectClass: user
description: 営業部第二課ユーザー
saMaccountName: tkurushima
displayName: 来島 たえ
sn: 来島
givenName: たえ
company: ○×株式会社
department: 営業部第二課
title: 課長代理
mail: tkurushima@marubatsucorp.local
telephoneNumber: 03-1234-6789
userPrincipalName: tkurushima@marubatsucorp.local
unicodePwd:: IgBwAGEAcwBzAHcAbwByAGQAJAAwADEAIgA=
userAccountControl: 512
dn: CN=営業部第二課,OU=第二課,OU=営業部,DC=marubatsucorp,DC=local
changeType: add
objectClass: group
description: 営業部第二課グループ
saMaccountName: 営業部第二課
member: CN=田所 明,OU=第二課,OU=営業部,DC=marubatsucorp,DC=local
member: CN=松谷 一郎,OU=第二課,OU=営業部,DC=marubatsucorp,DC=local
member: CN=来島 たえ,OU=第二課,OU=営業部,DC=marubatsucorp,DC=local
LDIFファイルを保存したら(ここではデスクトップ上に保存します) 、次にドメインコントローラ上で"暗号化によるLDAPの通信"を行えるよう、サーバ証明書を設定します。( LDIFファイルに記載された)unicodePwd属性は、暗号化されたLDAPによる通信で、書き込みを行うことができます。通常のLDAPの通信は平文でやり取りされるため、unicodePwd属性に書き込みを行うために、LDAP over SSLまたはLDAP over TLSによる通信の暗号化が必要になります。
LDAP over SSLは、SSLセッションをトンネリングさせることでLDAPの通信を暗号化するもので、セキュアLDAP(LDAPS)とも呼ばれます。非暗号化のLDAP(389/tcp)とは異なる636/tcpポートが利用されます。LDAP over TLSは、Transport Layer Securityと呼ばれる汎用的な暗号化セッションを構成するセキュリティ機能(RFC2246で勧告されています)でLDAPの通信を暗号化します。TLSはSSL3.0を改良したもので、利用しているポートを変更する必要がない(LDAPなら389/tcp) 、クライアント側からの要求で必要時に暗号化を開始できるなどの特長があります。これらの暗号化にはSSL証明書(サーバ証明書)とクライアント側にCAルート証明書が必要となります。
Active Directory証明書サービスを使って、サーバ証明書を取得する
サーバ証明書は一般に第三者の認証機関(たとえばベリサイン社など)から有料で取得しますが、高価であること、また法人組織でない個人が取得するのは難しいといった側面があります。イントラネットのみといった閉じられた環境や、試験的に利用するような場合、Active Directory証明書サービスを使って、サーバ証明書を取得する方法があります。今回はこの方法を使って、LDAPの暗号化を行います。
まず、WindowsのドメインコントローラにActive Directory証明書サービスをインストールします。以下、Windows Server 2008 R2の設定となりますが、[ サーバーマネージャ]の[役割の追加]から[Active Directory証明書サービス]をインストールします。このとき、いくつかの注意点があります。
Active Directory証明書サービスは、"エンタープライズCA"または"スタンドアロンCA"のどちらか選択することができます。エンタープライズCAはイントラネット上で利用する証明書サービスで、Active Directoryを使って自動的に証明書を配布できるといった利点があります。一方スタンドアロンCAは外部で利用される証明機関と同じように、手動による証明書の要求と取得を行いますが、セキュリティ的に堅牢といった特長があります。ここでは、外部からサーバ証明書を取得するケースを考え、スタンドアロンCAを選択します。
また、この際、スタンドアロンCAから簡単に証明書の要求とインストールが行えるよう、[ 証明機関Web登録]役割サービスをあわせてインストールします。[ 証明機関Web登録]ではIIS7.5Webサーバに専用のWebサービスが実装され、証明書の要求やインストールをブラウザ経由で行うことができるため、簡単に証明書の要求やインストールが可能です。そのため、この役割サービスを選択するとIIS7.5がインストールされます。
[Active Directory証明書サービス]をインストールする場合、[ サーバーの役割の選択]画面で[Active Directory証明書サービス]を選択(図1 ) 、[ 役割サービスの選択]画面で[証明機関]および[証明機関Web登録]を選択し、[ セットアップの種類]画面で[スタンドアロンCA]を選択すれば(図4 ) 、残りの項目はデフォルトの設定のままで、特に問題はありません。
図1 [ Active Directory証明書サービス]にチェック
図2 [ 必要な役割とサービスを追加]に進む
図3 [ 役割サービスの選択]で[証明機関][ 証明機関Web登録]をチェック
図4 [ セットアップの種類]で[スタンドアロンCA]をチェック
Active Directory証明書サービスWebサイトからサーバ証明書を取得する
上記の要領で[Active Directory証明書サービス]のインストールが完了すると、Active Directory証明書サービスWebページ(http://localhost/certsrv/)からブラウザ経由で証明書の要求が可能になります。ブラウザ経由で証明書を要求する場合、Webサイトに用意されたActive Xコントロール(Internet Explorer用のアドオンプログラムの一種)がブラウザ側で実行可能な必要がありますが、Windows Server 2008 R2のブラウザ(IE8)ではこのActive Xコントロールが実行できない設定になっているため、ブラウザのセキュリティ設定を最初に変更します。手順は次のとおりです。
①ブラウザのメニューバーの[ツール] →[ インターネットオプション] →[ セキュリティ]タブにある、[ ローカルイントラネット]をクリックして、[ レベルのカスタマイズ]をクリックします。
図5 [ ローカルイントラネット]の[レベルのカスタマイズ]をクリック
②[セキュリティ設定-ローカルイントラネットゾーン]画面の[Active Xコントロールとプラグイン] →[ スクリプトを実行しても安全だとマークされていないActive Xコントロールの初期化とスクリプトの実行]を[有効]に設定します。
図6 [ スクリプトを実行しても安全だとマークされていないActive Xコントロールの初期化とスクリプトの実行]を[有効]に
サーバ証明書をローカルコンピュータの証明書ストアにインポートする
Active Directory証明書サービスWebサイトから取得したサーバ証明書は、操作したユーザの証明書ストア(証明書がインストールされる領域)にインストールされますが、このままでは利用できないため、いったんエクスポートしたうえ、ローカルコンピュータの証明書ストアにインストールする必要があります。サーバ証明書のエクスポートの手順は次のとおりです。
①[ファイルを指定して実行]でmmcを入力実行し、コンソールスナップインを起動します。
②メニューバーの[ファイル] →[ スナップインの追加と削除]から、[ 証明書-現在のユーザー]および[証明書(ローカルコンピューター) ]を追加します(図15 ) 。
③[証明書-現在のユーザー] →[ 個人] →[ 証明書]をクリックし、サーバ証明を右クリック→[ すべてのタスク] →[ エクスポート]をクリックします(図16 ) 。
④[証明書のエクスポートウィザード]( 図17 )が起動しますので、証明書のエクスポート作業を実行します。
図15 [ スナップインの追加と削除]で[証明書-現在のユーザー][ 証明書(ローカルコンピューター) ]を追加
図16 サーバ証明を右クリック、[ すべてのタスク] →[ エクスポート]を選択
[証明書のエクスポートウィザード]では、次の手順でエクスポートします。
①[秘密キーのエクスポート]画面で、[ はい、秘密キーをエクスポートします]を選択します(図17 ) 。
②[エクスポートファイルの形式]画面で、[ 証明のパスにある証明書を可能であればすべて含む]および[すべての拡張プロパティをエクスポートする]をチェックします(図18 ) 。
③[パスワード]で秘密キーに対するパスワードを設定します(アカウントのパスワードとは関係ありません・図19 ) 。
④[エクスポートするファイル]画面で、エクスポートするファイルのフルパスを入力します(拡張子は.pfxです・図20 ) 。
図17 証明書のエクスポートウィザード
図18 エクスポートファイルの形式
図19 [ パスワード]で秘密キーに対するパスワードを設定
図20 エクスポートするファイル
エクスポートされたサーバ証明書をインポートする手順は、次のとおりです。
①コンソールスナップインの[証明書(ローカルコンピューター) ] →[ 個人] →[ 証明書]をクリックし、真ん中のウインドウのなにもないところを右クリック→[ すべてのタスク] →[ インポート]をクリックします(図21 ) 。
②[証明書のインポートウィザード]( 図22 )が起動しますので、証明書のインポート作業を実行します。
図21 ウィンドウのなにもないところを右クリック→[ すべてのタスク] →[ インポート]を選択
[証明書のインポートウィザード]では、次の手順でインポートします。
①[インポートする証明書ファイル]画面で、インポートするファイルのフルパスを入力します(図22 ) 。
②[パスワード]画面で、エクスポート時(図19 )に指定したパスワードを入力します(図23 ) 。
③[証明書ストア]画面で[証明書を次のストアに配置する]に設定されていることを確認します(図24 ) 。
図22 インポートするファイルのフルパスを入力
図23 エクスポート時に指定したパスワードを入力
図24 [ 証明書を次のストアに配置する]に設定されていることを確認
なお、CAルート証明書については、Active Directory証明書サービスをインストールしたドメインコントローラには、最初からインストールされていますので、なにも行う必要はありません。
ldifdeコマンドで、LDAPの暗号化によるアカウントのインポートを行う
最後に、ldifdeコマンドを使って、先ほどのimport.ldfファイルの内容をインポートします。Windows Server 2008 R2の場合、2種類のコマンド表記で実行が可能です。
ldifde -i -u -t 636 -f %USERPROFILE%\Desktop\import.ldf
図25 上記の実行表示
このコマンドはLDAP over SSLによる暗号化を行う場合に実行します。-tオプションは通信ポートを指定するもので、636/tcpを指定すると、LDAPSによる通信が可能となります。
ldifde -i -u -h -f %USERPROFILE%\Desktop\import.ldf
図26 上記の実行表示
このコマンドはLDAP over TLSによる暗号化を行う場合、実行します。-hオプションはSASL(LDAPにおける汎用的な認証レイヤ)で暗号化を行うためのオプションです。389/tcpがそのまま利用されます。
どちらのコマンドでも、結果としては同じようにパスワードを含め、インポートが可能です。直接パスワードのインポートができたので、アカウントは有効な状態ですぐに利用することができます。
図27 インポートしたアカウントを確認
なお、ldifdeコマンドでもcsvdeコマンドと同じように、あるドメインコントローラからエクスポートした内容を、別のドメインコントローラにインポートすることが可能ですが(ほぼ同じ方法で行います) 、Windows Server 2008以降では注意が必要です。
Windows Server 2008以降のldifdeでは、-uオプションを含めてエクスポートした場合、DN以外のすべての属性がBASE64でエンコードされた形式で出力されます。逆に-uオプションを含めずにエクスポートした場合、Unicode文字列を含む属性(DNも含まれます)についてはやはりBASE64でエンコードされて出力されます。
図28 ldifdeの-uオプションでエクスポートしたため、属性がBASE64エンコードされてしまった
そのため、-cオプションでドメインDNを書き替えてインポートしたい、といった場合、インポートに失敗したり、一部の属性の書き換えができない、といった問題が発生することがあります。これを防ぐ方法は残念ながらありませんので、この方法ではcsvdeコマンドを使った方がいいのかもしれません。