知られざるActive Directory技術の「舞台裏」

第4回LDAPを使ってActive Directoryを制御しよう[その2:ldifde]

本編について、少し時間が空いてしまいました。申し訳ありません。今までは、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証明書サービス]にチェック
図1 [Active Directory証明書サービス]にチェック
図2 ⁠必要な役割とサービスを追加]に進む
図2 [必要な役割とサービスを追加]に進む
図3 ⁠役割サービスの選択][証明機関]⁠証明機関Web登録]をチェック
図3 [役割サービスの選択]で[証明機関][証明機関Web登録]をチェック
図4 ⁠セットアップの種類][スタンドアロンCA]をチェック
図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 ⁠ローカルイントラネット][レベルのカスタマイズ]をクリック
    図5 [ローカルイントラネット]の[レベルのカスタマイズ]をクリック
  • [セキュリティ設定-ローカルイントラネットゾーン]画面の[Active Xコントロールとプラグイン⁠⁠→⁠スクリプトを実行しても安全だとマークされていないActive Xコントロールの初期化とスクリプトの実行][有効]に設定します。

    図6 ⁠スクリプトを実行しても安全だとマークされていないActive Xコントロールの初期化とスクリプトの実行][有効]
    図6 [スクリプトを実行しても安全だとマークされていないActive Xコントロールの初期化とスクリプトの実行]を[有効]に
      • ③次に、Active Directory証明書サービスWebページ(http://localhost/certsrv/ :図7にアクセスし、リンクにある[証明書を要求する⁠⁠→⁠証明書の要求の詳細設定を送信する。⁠⁠→⁠このCAへの要求を作成し送信する。]各リンクをクリックして[証明書の要求の詳細設定]ページを表示します。

        図7 証明書サービスのページ
        図7 証明書サービスのページ
        図8 証明書の要求画面
        図8 証明書の要求画面
        図9 ⁠このCAへの要求を作成し送信する。]を選択
        図9 [このCAへの要求を作成し送信する。]を選択
      • ④このページが表示されるとき"このWebサイトはユーザーの代わりにデジタル証明書の操作を実行します。"というアラートが表示されます図10が、問題はありません。⁠はい]をクリックします。

        図10 確認アラート
        図10 確認アラート
      • ⑤このページでは、画面ショットにあるような内容で入力を行います。デフォルトの設定はそのままで、すべての項目への入力は必要ではありませんが、次の要件は満たす必要があります。

        • [名前]欄には、サーバのFQDN(完全修飾ドメイン名)を入力します。
        • [証明書の種類を入力してください]欄には、⁠サーバー認証証明書]を指定します。
        • [キーのオプション]欄にある、⁠エクスポート可能なキーとしてマークする]をチェックします。
        図11 ⁠証明書の要求の詳細設定」のページ
        図11 「証明書の要求の詳細設定」のページ
      • ⑥Webページに必要な入力を行ったら、⁠送信]ボタンをクリックすると要求が送信されます。次にActive Directory証明書サービスの証明機関にアクセスし、要求された証明書を発行します。これは、スタートメニューの管理ツールにある[証明機関]コンソールの[保留中の要求]にある証明書を右クリックし、⁠すべてのタスク⁠⁠→⁠発行]をクリックします図12⁠。

        図12 証明書発行の手順
        図12 証明書発行の手順
      • ⑦最後に、発行された証明書をインストールするため、Active Directory証明書サービスWebサイトの[保留中の証明書の要求の状態⁠⁠→⁠サーバー認証証明書(<日時>⁠⁠→⁠この証明書のインストール]リンクをクリックします。

        図13 保留中の証明書の要求の状態
        図13 保留中の証明書の要求の状態
        図14 ⁠証明書のインストール]をクリック
        図14 [証明書のインストール]をクリック

      サーバ証明書をローカルコンピュータの証明書ストアにインポートする

      Active Directory証明書サービスWebサイトから取得したサーバ証明書は、操作したユーザの証明書ストア(証明書がインストールされる領域)にインストールされますが、このままでは利用できないため、いったんエクスポートしたうえ、ローカルコンピュータの証明書ストアにインストールする必要があります。サーバ証明書のエクスポートの手順は次のとおりです。

      • ①[ファイルを指定して実行]でmmcを入力実行し、コンソールスナップインを起動します。
      • ②メニューバーの[ファイル⁠⁠→⁠スナップインの追加と削除]から、⁠証明書-現在のユーザー]および[証明書(ローカルコンピューター⁠⁠]を追加します図15⁠。
      • ③[証明書-現在のユーザー⁠⁠→⁠個人⁠⁠→⁠証明書]をクリックし、サーバ証明を右クリック→⁠すべてのタスク⁠⁠→⁠エクスポート]をクリックします図16⁠。
      • ④[証明書のエクスポートウィザード]図17が起動しますので、証明書のエクスポート作業を実行します。
      図15 ⁠スナップインの追加と削除][証明書-現在のユーザー]⁠証明書(ローカルコンピューター⁠⁠]を追加
      図15 [スナップインの追加と削除]で[証明書-現在のユーザー][証明書(ローカルコンピューター)]を追加
      図16 サーバ証明を右クリック、⁠すべてのタスク⁠⁠→⁠エクスポート]を選択
      図16 サーバ証明を右クリック、[すべてのタスク]→[エクスポート]を選択

      [証明書のエクスポートウィザード]では、次の手順でエクスポートします。

      • ①[秘密キーのエクスポート]画面で、⁠はい、秘密キーをエクスポートします]を選択します図17⁠。
      • ②[エクスポートファイルの形式]画面で、⁠証明のパスにある証明書を可能であればすべて含む]および[すべての拡張プロパティをエクスポートする]をチェックします図18⁠。
      • ③[パスワード]で秘密キーに対するパスワードを設定します(アカウントのパスワードとは関係ありません・図19⁠。
      • ④[エクスポートするファイル]画面で、エクスポートするファイルのフルパスを入力します(拡張子は.pfxです・図20⁠。
      図17 証明書のエクスポートウィザード
      図17 証明書のエクスポートウィザード
      図18 エクスポートファイルの形式
      図18 エクスポートファイルの形式
      図19 ⁠パスワード]で秘密キーに対するパスワードを設定
      図19 [パスワード]で秘密キーに対するパスワードを設定
      図20 エクスポートするファイル
      図20 エクスポートするファイル

      エクスポートされたサーバ証明書をインポートする手順は、次のとおりです。

      • ①コンソールスナップインの[証明書(ローカルコンピューター⁠⁠→⁠個人⁠⁠→⁠証明書]をクリックし、真ん中のウインドウのなにもないところを右クリック→⁠すべてのタスク⁠⁠→⁠インポート]をクリックします図21⁠。
      • ②[証明書のインポートウィザード]図22が起動しますので、証明書のインポート作業を実行します。
      図21 ウィンドウのなにもないところを右クリック→⁠すべてのタスク⁠⁠→⁠インポート]を選択
      図21 ウィンドウのなにもないところを右クリック→[すべてのタスク]→[インポート]を選択

      [証明書のインポートウィザード]では、次の手順でインポートします。

      • ①[インポートする証明書ファイル]画面で、インポートするファイルのフルパスを入力します図22⁠。
      • ②[パスワード]画面で、エクスポート時図19に指定したパスワードを入力します図23⁠。
      • ③[証明書ストア]画面で[証明書を次のストアに配置する]に設定されていることを確認します図24⁠。
      図22 インポートするファイルのフルパスを入力
      図22 インポートするファイルのフルパスを入力
      図23 エクスポート時に指定したパスワードを入力
      図23 エクスポート時に指定したパスワードを入力
      図24 ⁠証明書を次のストアに配置する]に設定されていることを確認
      図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 上記の実行表示
      図25 上記の実行表示

      このコマンドはLDAP over SSLによる暗号化を行う場合に実行します。-tオプションは通信ポートを指定するもので、636/tcpを指定すると、LDAPSによる通信が可能となります。

      ldifde -i -u -h -f %USERPROFILE%\Desktop\import.ldf
      図26 上記の実行表示
      図26 上記の実行表示

      このコマンドはLDAP over TLSによる暗号化を行う場合、実行します。-hオプションはSASL(LDAPにおける汎用的な認証レイヤ)で暗号化を行うためのオプションです。389/tcpがそのまま利用されます。

      どちらのコマンドでも、結果としては同じようにパスワードを含め、インポートが可能です。直接パスワードのインポートができたので、アカウントは有効な状態ですぐに利用することができます。

      図27 インポートしたアカウントを確認
      図27 インポートしたアカウントを確認

      なお、ldifdeコマンドでもcsvdeコマンドと同じように、あるドメインコントローラからエクスポートした内容を、別のドメインコントローラにインポートすることが可能ですが(ほぼ同じ方法で行います⁠⁠、Windows Server 2008以降では注意が必要です。

      Windows Server 2008以降のldifdeでは、-uオプションを含めてエクスポートした場合、DN以外のすべての属性がBASE64でエンコードされた形式で出力されます。逆に-uオプションを含めずにエクスポートした場合、Unicode文字列を含む属性(DNも含まれます)についてはやはりBASE64でエンコードされて出力されます。

      図28 ldifdeの-uオプションでエクスポートしたため、属性がBASE64エンコードされてしまった
      図28 ldifdeの-uオプションでエクスポートしたため、属性がBASE64エンコードされてしまった

      そのため、-cオプションでドメインDNを書き替えてインポートしたい、といった場合、インポートに失敗したり、一部の属性の書き換えができない、といった問題が発生することがあります。これを防ぐ方法は残念ながらありませんので、この方法ではcsvdeコマンドを使った方がいいのかもしれません。

おすすめ記事

記事・ニュース一覧