ディレクトリーデータベースの設定
Red Hat Directory Server データベースの設定および管理
概要
Red Hat ドキュメントへのフィードバック (英語のみ)
弊社ドキュメントに対するご意見をお聞かせください。ドキュメントの改善点はございませんか。改善点を報告する場合は、以下のように行います。
特定の文章に簡単なコメントを記入する場合は、以下の手順を行います。
- ドキュメントの表示が Multi-page HTML 形式になっていていることを確認してください。ドキュメントの右上隅に Feedback ボタンがあることを確認してください。
- マウスカーソルを使用して、コメントを追加するテキストの部分を強調表示します。
- 強調表示されたテキストの下に表示される Add Feedback ポップアップをクリックします。
- 表示される指示に従ってください。
より詳細なフィードバックをお寄せいただく場合は、Bugzilla のチケットを作成してください。
- Bugzilla の Web サイトに移動します。
- Component (コンポーネント) として Documentation を使用します。
- Description フィールドに、ドキュメントの改善に向けたご提案を記入してください。ドキュメントの該当部分へのリンクも追加してください。
- Submit Bug をクリックします。
第1章 接尾語を別のデータベースに格納する
Directory Server では、インスタンス内のデータを複数のデータベースに分割して、データの分散保存ロジックを設計することができます。データ分割の方法として、ディレクトリーツリーの接尾辞を利用することができます。
複数のディレクトリーツリーを作成し、ルートの接尾辞で別々のデータベースに格納することができます。また、1 つのディレクトリーツリーをブランチに分割し、サブ接尾辞によってブランチを別々のデータベースに格納することもできます。
1.1. データ構造における接尾語のロール
ディレクトリーサーバーは、データをディレクトリーツリー (DIT) と呼ばれる階層構造で表示します。以下は、簡単なディレクトリーツリーです。
図1.1 単一のルート接尾辞を持つシンプルなディレクトリーツリー

各ディレクトリーツリーには、dc=example,dc=com
などのディレクトリーツリーの命名コンテキストを定義する単一の root エントリーがあります。
さまざまなディレクトリーツリーを異なるデータベースに保存し、これらのデータベースを複数のサーバーに分散できます。
接尾辞を使用して、データストレージの分散ロジックを定義できます。接尾辞は、ディレクトリーツリーのブランチ (サブツリー) と特定のデータベースを関連付けます。
これにより、サーバーの 1 つのインスタンス内に複数のデータベースを指定できます。一つのデータベースに縛られることはありません。
1.2. ルート接尾辞とサブ接尾辞の比較
ルート接尾辞は、ディレクトリーツリー (DIT) 全体とデータベースを関連付けます。ルート接尾辞には、親の接尾辞がありません。
ディレクトリーツリーのブランチを別のデータベースに保存する場合、サブ接尾辞を作成します。これは、ツリーのブランチをブランチの祖先とは別のデータベースに関連付けるものです。サブ接尾辞は、親接尾辞に付けなければなりません。親接尾辞はルート接尾辞でもサブ接尾辞でも構いません。つまり、任意のサブツリーのブランチを別のデータベースに保存することができます。
図1.2 別のデータベースにサブ接尾辞を持つディレクトリーツリー

この例では、ou=people,dc=example,dc=com
のサブ接尾辞が 1 つのデータベースに格納され、ルート接尾辞の下にある残りのディレクトリーツリーが別のデータベースに格納されています。
sub-suffixes を使用する利点:
- データベースのメンテナーンス (インポート/エクスポート/インデックス作成) が容易になりました。
- サブ接尾辞を別のディスクに格納することができるので、ディスクスペースの確保に役立ちます。
サブ接尾辞を使うことのデメリット
- クライアントがルート接尾辞を問い合わせて、サブ接尾辞のエントリーが返されることはありません。クライアントは、サブ接尾辞からエントリーを検索するために、サブ接尾辞レベルで検索を開始する必要があります。
- レプリケーションでは、サブ接尾辞ごとに個別の設定とレプリケーション契約が必要です。
1.3. いくつかのルート接尾辞
また、1 つのインスタンスに異なるルート接尾辞を持つ複数のディレクトリーツリー (DIT) を持つことができます。例えば、ある部分のデータをユーザールートから分離したい場合などです。
図1.3 ルート接尾辞で定義された複数のディレクトリーツリー

クライアントが dc=example,dc=com
のツリーを検索すると、他のツリーからのエントリーは検索アルゴリズムでは制限されているため、検索では返されません。
次に、インスタンスのデフォルトとなるディレクトリーツリーとネーミングコンテキストを選択できます。
1.4. コマンドラインを使用したルート接尾辞の作成
この手順では、コマンドラインでディレクトリーツリーのルート接尾辞を作成する方法を説明します。
手順
オプションとして、すでに使用されている接尾辞とバックエンドデータベースをリストアップします。
#
dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
dc=example,dc=com (userroot)括弧内の名前は、対応する接尾辞のデータを保存するバックエンドデータベースです。次のステップでルート接尾辞を作成する際に、既存のデータベース名を使用することはできません。
ルート接尾辞の DN を
--suffix
引数で指定し、--be-name
引数で新しいデータベースと関連付ける。#
dsconf -D "cn=Directory Manager" ldap://server.example.com backend create --suffix="dc=example,dc=net" --be-name="example"
検証
- この手順の最初のステップにあるコマンドを使用して、接尾辞とデータベースを一覧表示します。
1.5. Web コンソールによるルート接尾辞の作成
この手順では、ブラウザー上でディレクトリーツリーのルート接尾辞を作成する方法を説明します。
前提条件
- Web コンソールでインスタンスにログインしている。
手順
-
Database
で、設定ツリーの下にあるCreate Suffixボタンをクリックします。 -
Suffix DN
とDatabase Name
を記入する。 -
Create The Top Suffix Entry
を選択し、Create Suffix をクリックします。
検証
- 新しい接尾辞は、接尾辞のツリーに表示されるはずです。
1.6. デフォルトのネーミングコンテキストの変更
ネーミングコンテキストは、その DIT のエントリーに対するルート名前空間を定義するディレクトリーツリー (DIT) の属性です。複数のルート接尾辞を持つインスタンスにデータを生成する場合、インスタンスには複数の DIT があり、それぞれ命名コンテキストは異なります。
この手順では、インスタンスで複数のルート接尾辞を使用する際に、コマンドラインでデフォルトのネーミングコンテキストを変更する方法を説明します。
インスタンスにアクセスするクライアントでは、使用する必要のあるネーミングコンテキストがわからない可能性があります。Directory Server は、デフォルトのネーミングコンテキストが既知の他の設定がない場合に、クライアントに対して通知します。
cn=config
の nsslapd-defaultnamingcontext
属性でデフォルトのネーミングコンテキストを設定します。Directory Server はこの値を Directory Server Agent Service Entry(root DSE) に伝播し、クライアントは匿名にクエリーできます。
前提条件
- インスタンスのデフォルトのネーミングコンテキストを定義する root 接尾辞を作成している。
手順
オプション: 現在のデフォルトネーミングコンテキストを表示します。
#
dsconf -D "cn=Directory Manager" ldap://server.example.com config get nsslapd-defaultnamingcontext
nsslapd-defaultnamingcontext: dc=example,dc=comnsslapd-defaultnamingcontext
パラメーターの値を、必要なネーミングコンテキストに置き換えます。#
dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-defaultnamingcontext=dc=example,dc=net
検証
- 現在のデフォルトネーミングコンテキストを表示します。値を更新する必要があります。
1.7. コマンドラインによるサブ接尾辞の作成
この手順では、コマンドラインでディレクトリーツリーのサブ接尾辞を作成する方法を説明します。
前提条件
- サブ接尾辞の親接尾辞が作成されている。
手順
オプションとして、すでに使用されている接尾辞とバックエンドデータベースをリストアップします。
#
dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
dc=example,dc=com (userroot)括弧内の名前は、対応する接尾辞のデータを保存するバックエンドデータベースです。次のステップでサブ接尾辞を作成する際に、既存のデータベース名を使用することはできません。
--suffix
引数にサブ接尾辞のフル DN を指定し、--be-name
引数で新規データベースと、--parent-suffix
引数で既存の親接尾辞と関連付けることができます。#
dsconf -D "cn=Directory Manager" ldap://server.example.com backend create --suffix="ou=People,dc=example,dc=com" --be-name="example" --parent-suffix="dc=example,dc=com"
検証
- この手順の最初のステップにあるコマンドを使用して、接尾辞とデータベースを一覧表示します。
1.8. Web コンソールによるサブ接尾辞の作成
この手順では、ブラウザーでディレクトリーツリーのサブ接尾辞を作成する方法を説明します。
前提条件
- Web コンソールでインスタンスにログインしている。
- サブ接尾辞の親接尾辞が作成されている。
手順
-
Database
で、サブ接尾辞の親である設定ツリーから接尾辞を選択します。 - Suffix Tasks をクリックし、Create Sub-Suffix を選択します。
-
ou=People
およびDatabase Name
などのSub-Suffix DN
を入力します。 -
Create the Top Suffix Entry
を選択し、Create Sub-Suffix をクリックします。
検証
- 新しいサブ接尾辞は、設定ツリーの接尾辞の間に表示されるはずです。
第2章 ビューを使用した仮想ディレクトリー階層の作成
仮想ディレクトリーツリー (DIT) ビューを作成することで、エントリーを独自のグループや階層で整理し、様々な視点から標準の DIT を操作することができます。これにより、ディレクトリー管理のコストを節約し、エントリーによる移動をより直感的にサービスのユーザーに直感的に行うことができます。
2.1. ビューについて
仮想ディレクトリーツリービュー、または ビュー とは、DIT でエントリーをカテゴリー分け、検索するための標準ディレクトリーツリー (DIT) に加えて構造の任意のレイヤーです。
ビューを使用すると、仮想ディレクトリー階層を作成できます。そのため、標準の DIT に配置しても、エントリーの移動が簡単になります。ビューは、フィルターされたロールまたは動的グループのメンバーと同様に、エントリーの属性を使用して仮想階層に追加します。クライアントアプリケーションにとって、ビューは通常のコンテナー階層として表示されます。
この方法では、最初はフラットな DIT にエントリーを配置し、ビューを使って複雑な階層でエントリーを分類することができ、エントリーを移動させる必要がありません。また、標準的な DIT では実現できない、複数のビューでエントリーを表示することができます。
ビューは、名前付きのフィルターと考えることができます。各ビューは nsView
オブジェクトクラスのエントリーであり、どのエントリーをそのビューで表示するかを示す nsViewFilter
属性を持つことができます。フィルターにオブジェクトクラスを指定して、返されるエントリーのタイプを制限することが望ましい場合があります。
ビューを他のビューのコンテナーとして使用し、仮想階層を作成できます。入れ子になったビューは、その祖先からフィルターを継承し、そのフィルターと祖先のフィルターを (&(container filter)(view filter))
のように AND
で結合してビューを制限します。
ビューをベースとして検索が実行されると、フィルターに一致するエントリーがこの仮想検索スペースから返されます。エントリーは、ほぼビュー下でネスト化されるように見えますが、実際には DIT の任意の場所に保存できます。
テストインスタンスを作成し、/usr/share/dirsrv/data/Example-views.ldif
にあるサンプルファイルからインポートされたデータでビューがどのように機能するかを確認することができます。
2.2. ディレクトリーの設計に関する考慮事項
ディレクトリーツリー (DIT) を設計する場合は、階層でエントリーを組織内の階層を反映するために、自然にお気づけられます。DIT のエントリーの位置をエントリーの識別名 (DN) に表示しない標準 DIT は、固定階層で使用するのに適しています。
図2.1 機能的な単位に基づく標準階層 DIT

ただし、組織内の階層の性質は動的なものです。標準的な DIT のエントリーの移動は、エントリーの位置を変更するたびに、エントリーとその子すべての子の名前を変更する必要があるためです。これにより、サービスの中断や追加費用 (特に最上位サブツリーの変更) が発生します。
リソースタイプ (people、等価性など) など、変更しない特性によってリソースの分類が含まれるフラット階層を設計し、標準のフラット DIT でこの階層を取得することが推奨されます。
図2.2 リソースタイプに基づく標準フラット DIT

ただし、リソースを移動するのにフラット DIT は便利ではありません。異なるユーザーは、機能性ユニットや地理的なロケーションとの関連付けなど、異なるパースペクティブからリソースをナビゲートする必要があります。これには、フラット DIT の場合は追加のツールや複雑な検索クエリーが必要になる場合があります。
フラット DIT の制限を解消する解決策は、ビューの仮想階層で提供されます。ビューを使用すると、階層内のエントリーの位置からエントリーの名前を分離して、柔軟な階層を作成できます。仮想階層は、代わりに属性に基づいています。
図2.3 仮想階層のビューを持つ DIT

2.3. ビューを使用する利点
仮想ディレクトリーツリービューを使用すると、ユーザーが直感的に操作でき、管理者にとっては深く入れ子になった標準ディレクトリーツリー (DIT) よりも効率的にメンテナーンスできる、柔軟なカスタム階層を構築できるというメリットがあります。
- フラットで柔軟な命名
仮想 DIT ビューは、従来の階層構造が提供するのと同様のナビゲーションと管理のサポートを提供するため、ビューではエントリーにフラットな名前空間を使用することができます。
DIT に変更がある場合は、エントリーを移動する必要はありません。DIT ビュー階層の変更のみが変更されます。これらの階層には実際のエントリーが含まれていないため、簡単に変更できます。
- 設計エラーの削減
- 導入計画中の見落としは、仮想 DIT ビューを使用することで、壊滅的ではなくなります。最初の段階で階層が正しく開発されていなくても、サービスに支障をきたすことなく、簡単かつ迅速に変更することができます。
- 迅速かつ cheap maintenance
ビュー階層を数分で完全に修正し、その結果を即座に実現できるため、ディレクトリーのメンテナーンスコストを大幅に削減できます。
仮想 DIT 階層の変更は瞬時に実現されます。組織変更があっても、新しい仮想 DIT ビューを迅速に作成することができます。新しい仮想 DIT ビューは古いビューと同時に存在できるので、エントリー自体およびそれらを使用するアプリケーション向けに、より段階的な変更が可能です。ディレクトリーの組織の変更は、1 か 0 かの操作ではないため、一定期間サービスを中断せずに実行できます。
- 全体的な柔軟性の強化
ナビゲーションと管理に複数の仮想 DIT ビューを使用すると、ディレクトリーサービスをより柔軟に利用することができます。
仮想 DIT ビューが提供する機能を使用すると、組織は古いメソッドと新しいメソッドの両方を使用して、エントリーを DIT の特定の位置に配置する必要なしにディレクトリーデータを編成できます。
- 直感的なユーザーナビゲーション
ビューは、作業の柔軟性を高め、ディレクトリーユーザーが通常は知る必要のない属性名や値を使用して複雑な検索フィルターを作成する必要性を軽減します。
ディレクトリー情報を表示およびクエリーする手段が複数ある柔軟性により、エンドユーザーとアプリケーションは階層ナビゲーションを通じて必要とされるものを直感的に把握できます。
- 検索クエリーを頻繁に行うためのショートカット
- 仮想 DIT ビュー階層は、頻繁に必要とされる情報の検索を容易にするための、一種の既製のクエリーとして作成することができます。
2.4. 他の機能とのビューの互換性
ビューを使用する場合、検索領域は単一の接尾辞のエントリーに制限されます。ユーザーは、仮想階層からの結果を取得するために、ビューで検索クエリーに基づく必要があります。アクセス制御には若干異なる方法を使用する必要があります。ビューでは、ロールとサービスのクラスと共にエントリーグループを使用できます。
- 複数のバックエンド
バーチャル DIT ビューは、複数のバックエンドと完全に互換性があるわけではありません。
検索は単一のバックエンドに制限されています。つまり、ビューによって返されるエントリーは同じ接尾辞内になければなりません。
- 探索空間
仮想検索領域は、標準の検索スペースとは異なります。仮想検索領域は、検索がフィルターを持つビューノードにある場合にのみアクセスできます。それ以外の場合は、仮想 DIT 階層に含まれるエントリーが返されない標準のディレクトリーツリー (DIT) に対する規則的な検索です。
たとえば、
dcn=example,dc=com
がベースの検索を実行すると、仮想探索空間からのエントリーが返されません。実際、virtual-search-space の検索は実行されません。Views の処理は、検索ベースがou=Cupertino,ou=Location Views,dc=example,dc=com
のような場合に発生します。このようにして、Directory Server では、検索が両方の場所からエントリーが発生しないようにします。
- アクセス制御
- ビューを使用するには、アクセス制御に若干異なるアプローチが必要です。現在、ビューにはアクセス制御リスト (ACL) の明示的なサポートがないため、親のビューにロールベースの ACL を作成し、ロールをビュー階層の適切な部分に追加します。これにより、階層の組織プロパティーを利用できます。
- エントリーのグループ化
- Directory Server のサービスクラスとロールは、どちらもビューをサポートしています。ビュー階層の下に サービスまたは ロールの クラス を追加すると、論理的にかつ実際に含まれるエントリーはスコープ内に考慮されます。つまり、仮想 DIT ビューを使用してロールやサービスクラスを適用することができますが、フラットな名前空間を照会しても、その適用の効果を見ることができます。
2.5. クライアントアプリケーションとのビューの互換性
仮想ディレクトリーツリー (DIT) ビューは、標準の DIT を高レベルにするように設計されています。ビューの存在は、ほとんどのアプリケーションに対して透過的にする必要があります。ビューを使用していることを示すものがあってはいけません。いくつかの特殊なケースを除き、Directory Server インスタンスでビューが使用されていることを、ディレクトリーユーザーが知る必要はありません。ビューは従来の DIT のように表示され、動作します。
特定のタイプのアプリケーションでは、ビュー対応ディレクトリーサービスを使用すると問題が発生する可能性があります。以下に例を示します。
ターゲットエントリーの DN を使用して DIT をナビゲートするアプリケーション。
このタイプのアプリケーションは、エントリーが見つかったビュー階層ではなく、エントリーが物理的に存在する階層をナビゲートしていることを把握します。その理由は、ビューは、ビューの階層に合わせてエントリーの DN を変更することで、エントリーの本当の位置を隠そうとはしないからです。
これは意図的なものです。エントリーの真の位置が偽装されていると、多くのアプリケーションが機能しなくなります。例えば、一意のエントリーを識別するために DN に依存するアプリケーションなどです。このように DN を分解して上方向にナビゲートするのは、クライアントアプリケーションとしては珍しい手法ですが、それにもかかわらず、これを行うクライアントは意図した通りに機能しない可能性があります。
numSubordinates
運用属性を使って、ノードの下に何個のエントリーが存在するかを判断するアプリケーション。ビュー内のノードについては、現在、仮想検索空間を無視して、実際の検索空間に存在するエントリーのみをカウントしています。そのため、アプリケーションでは検索を使用してビューを評価できない場合があります。
2.6. ビューの作成
この手順では、コマンドラインで仮想ディレクトリーツリービューを作成する方法を説明します。
手順
ldapadd
ユーティリティーを使用してビューエントリーを追加します。nsView
オブジェクトクラスを指定し、nsViewFilter
属性でビューフィルターを定義します。#
ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=PeopleInRoom0466,dc=example,dc=com objectClass: top objectClass: organizationalUnit objectClass: nsView ou: PeopleInRoom0466 description: People in the room 0466 nsViewFilter: (&(objectClass=inetOrgPerson)(roomNumber=0466))
検証
ビューで検索ベースとして実行します。
#
ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -x -b ou=PeopleInRoom0466,dc=example,dc=com
2.7. コマンドラインを使用してビューのパフォーマンスを改善するためのインデックスの作成
ビューは指定のフィルターに基づいて検索結果から派生します。フィルターの一部は nsViewFilter
で明示的に指定される属性です。フィルターの残りの部分はエントリー階層に基づいており、ビューに含まれる実際のエントリーの entryid
および parentid
操作属性を検索します。
(|(parentid=search_base_id)(entryid=search_base_id)
検索された属性 (entryid
、parentid
、または nsViewFilter
の属性) のいずれかにインデックスが付けられていない場合、検索は部分的にインデックスが解除され、Directory Server はディレクトリーツリー全体で一致するエントリーを検索します。
ビューのパフォーマンスを改善するには、以下のようにインデックスを作成します。
-
entryid
の等式インデックス (eq
) を作成します。parentid
属性は、デフォルトでシステムインデックスでインデックス化されます。 -
nsViewFilter
テストにフィルターがある場合 (attribute=*
) は、テスト中の属性について、存在インデックス(pres
) を作成します。このインデックスタイプは、少数のディレクトリーエントリーに表示される属性でのみ使用する必要があります。 -
nsViewFilter
テスト等価 (attribute=value
) のフィルターの場合、テストする属性に対して 等価インデックス (eq
) を作成します。 -
nsViewFilter
のフィルターがサブ文字列をテストする場合 (attribute=value*
) は、テストする属性の substring index (sub
) を作成します。 -
nsViewFilter
でフィルターが近似値をテストする場合 (attribute~=value
)、テストされている属性のapproximate index (approximate
) を作成します。
たとえば、以下の view フィルターを使用する場合は、以下を実行します。
nsViewFilter: (&(objectClass=inetOrgPerson)(roomNumber=*66))
デフォルトで行われる等価インデックスで objectClass
にインデックスを付け、部分文字列インデックスで roomNumber
にインデックスを付ける必要があります。
前提条件
- ビューフィルターで使用する属性に注意してください。
手順
オプション: バックエンドを一覧表示し、データベースをインデックス化します。
#
dsconf -D "cn=Directory Manager" instance_name backend suffix list
dc=example,dc=com (userroot)(括弧で) 選択したデータベース名を書き留めておきます。
選択したバックエンドのデータベースの
dsconfig
ユーティリティーを使用してインデックス設定を作成します。特に国際化されたインスタンスの場合、属性名、インデックスタイプと、任意で照合順序 (OID) を設定するためのマッチングルールを指定します。
#
dsconf -D "cn=Directory Manager" instance_name backend index add --attr roomNumber --index-type sub userroot
view フィルターで使用される属性ごとに、このステップを繰り返します。
新規インデックスを適用するためにデータベースを再インデックスします。
#
dsconf -D "cn=Directory Manager" instance_name backend index reindex userroot
検証
ビューで使用するフィルターが同じ標準ディレクトリーツリーに基づく検索を実行します。
#
ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -x -b dc=example,dc=com (&(objectClass=inetOrgPerson)(roomNumber=*66))
#ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -x -b dc=example,dc=com "(&(objectClass=inetOrgPerson)(roomNumber=*66))"
/var/log/dirsrv/slapd-instance_name/access
.のアクセスログを見る。検索の
RESULT
にはnote=U
またはPartially Unindexed Filter
が詳細に含まれていないはずです。
関連情報
2.8. Web コンソールを使用してビューのパフォーマンスを改善するためのインデックスの作成
ビューは指定のフィルターに基づいて検索結果から派生します。フィルターの一部は nsViewFilter
で明示的に指定される属性です。フィルターの残りの部分はエントリー階層に基づいており、ビューに含まれる実際のエントリーの entryid
および parentid
操作属性を検索します。
(|(parentid=search_base_id)(entryid=search_base_id)
検索された属性 (entryid
、parentid
、または nsViewFilter
の属性) のいずれかにインデックスが付けられていない場合、検索は部分的にインデックスが解除され、Directory Server はディレクトリーツリー全体で一致するエントリーを検索します。
ビューのパフォーマンスを改善するには、以下のようにインデックスを作成します。
-
entryid
の等式インデックス (eq
) を作成します。parentid
属性は、デフォルトでシステムインデックスでインデックス化されます。 -
nsViewFilter
テストにフィルターがある場合 (attribute=*
) は、テスト中の属性について、存在インデックス(pres
) を作成します。このインデックスタイプは、少数のディレクトリーエントリーに表示される属性でのみ使用する必要があります。 -
nsViewFilter
テスト等価 (attribute=value
) のフィルターの場合、テストする属性に対して 等価インデックス (eq
) を作成します。 -
nsViewFilter
のフィルターがサブ文字列をテストする場合 (attribute=value*
) は、テストする属性の substring index (sub
) を作成します。 -
nsViewFilter
でフィルターが近似値をテストする場合 (attribute~=value
)、テストされている属性のapproximate index (approximate
) を作成します。
たとえば、以下の view フィルターを使用する場合は、以下を実行します。
nsViewFilter: (&(objectClass=inetOrgPerson)(roomNumber=*66))
デフォルトで行われる等価インデックスで objectClass
にインデックスを付け、部分文字列インデックスで roomNumber
にインデックスを付ける必要があります。
前提条件
- Web コンソールでインスタンスにログインしている。
- ビューフィルターで使用する属性に注意してください。
手順
-
Database
で、インデックスを作成する設定ツリーから接尾辞を選択します。 -
Indexes
およびDatabase Indexes
に移動します。 - Add Index ボタンをクリックします。
- 属性の名前を入力し、属性を選択します。
-
この属性に対して作成する必要のある
Index Types
を選択します。 -
必要に応じて、特に国際化されたインスタンスの場合に、照合順序 (OID) を指定するための
Matching Rules
を追加します。 -
Index attribute after creation
を選択し、後でインデックスを再ビルドします。 - Create Index をクリックします。
- インデックス化される各属性に対して手順を繰り返します。
検証
-
追加された属性の名前を入力して、
Filter Indexes
します。 - 新たにインデックス化された属性が結果に表示されるはずです。
関連情報
第3章 読み取り専用モードへのデータベースの切り替え
デフォルトでは、Directory Server のデータベースは、読み取り/書き込みモードで稼働します。このモードでは、ユーザーはデータの取得と保存の両方が可能です。
たとえば、バックアップの前やコンシューマーの手動初期化の前にデータベースの 5 倍のイメージが必要な場合に、ユーザーがエントリーの作成、変更、または削除を禁止する、データベースを読み取り専用モードに切り替える場合があります。
3.1. 前提条件
- データベースは読み書きモードです。
- 読み取り専用モードを有効にするとレプリケーションが無効になるため、データベースはレプリケーションに使用されません。
3.2. コマンドラインを使用した読み取り専用モードでのデータベースの設定
この手順では、Directory Server データベースをコマンドラインで読み取り専用モードに切り替える方法を説明します。
手順
接尾辞とそれに対応するデータベースを一覧表示します。
#
dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
dc=example,dc=com (userroot) o=test (test_database)切り替えるデータベースの名前または接尾辞を書き留めておきます。
--enable-readonly
パラメーターで読み取り専用モードを有効にし、名前または接尾辞でデータベースを指定します。#
dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix set --enable-readonly "test_database"
検証
ディレクトリーへの書き込み操作を試行します。以下に例を示します。
#
ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: dc=example,dc=com changetype: modify add: description description: fooサーバーは、実行を拒否するはずです。
modifying entry "dc=example,dc=com" ldap_modify: Server is unwilling to perform (53) additional info: Server is read-only
3.3. Web コンソールを使用したデータベースの読み取り専用モードへの切り替え
この手順では、Directory Server データベースをブラウザーで読み取り専用モードに切り替える方法を説明します。
前提条件
- Web コンソールでインスタンスにログインしている。
手順
-
Database
で、設定ツリーの接尾辞を選択します。 -
Database Read-Only Mode
オプションを確認します。 - Save Configuration をクリックします。
検証
ディレクトリーへの書き込み操作を試行します。以下に例を示します。
#
ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: dc=example,dc=com changetype: modify add: description description: fooサーバーは、実行を拒否するはずです。
modifying entry "dc=example,dc=com" ldap_modify: Server is unwilling to perform (53) additional info: Server is read-only
3.4. 関連情報
第4章 インスタンスの読み取り専用モードへの切り替え
デフォルトでは、インスタンスは、ユーザーがデータの取得と保存の両方を行うことができる読み書きモードで動作します。レプリケーションを禁止したり、インデックス作成時にデータの修正を無効にしたいが、ディレクトリーは利用可能な状態にしておきたいなどの緊急時には、一時的にインスタンスを読み取り専用モードに切り替えることができます。
Directory Server が複数のデータベースを管理していて、すべてのデータベースを読み取り専用に切り替える必要がある場合、コマンドラインまたはウェブコンソールで、1 回の操作でこれを行うことができます。
read-only モードでは、インスタンスを再起動できませんが、設定を変更できます。
読み取り専用モードでインスタンスを停止すると、手動で読み取り専用モードを無効にするまで起動することはできません。
読み取り専用モードを手動で無効にするには、/etc/dirsrv/slapd-instance_name/dse.ldif
ファイルを開き、cn=config
セクションに移動して、nsslapd-readonly
パラメーターを off
に設定します。
4.1. 前提条件
- インスタンスは読み取り/書き込みモードです。
- 読み取り専用モードを有効にするとレプリケーションが無効になるため、インスタンスはレプリケーションに使用されません。
4.2. コマンドラインを使用したインスタンスの読み取り専用モードへの切り替え
この手順では、Directory Server インスタンスをコマンドラインで読み取り専用モードに切り替える方法を説明します。
手順
nsslapd-readonly
パラメーターをon
に設定します。#
dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-readonly=on
検証
ディレクトリーへの書き込み操作を試行します。以下に例を示します。
#
ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: dc=example,dc=com changetype: modify add: description description: fooサーバーは、実行を拒否するはずです。
modifying entry "dc=example,dc=com" ldap_modify: Server is unwilling to perform (53) additional info: Server is read-only
4.3. Web コンソールを使用したインスタンスの読み取り専用モードへの切り替え
この手順では、Directory Server インスタンスをブラウザーで読み取り専用モードに切り替える方法を説明します。
前提条件
- Web コンソールでインスタンスにログインしている。
手順
-
Server
で、Advanced Settings
タブを選択します。 -
Server Read-Only
オプションを確認します。 - Save をクリックします。
検証
ディレクトリーへの書き込み操作を試行します。以下に例を示します。
#
ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: dc=example,dc=com changetype: modify add: description description: fooサーバーは、実行を拒否するはずです。
modifying entry "dc=example,dc=com" ldap_modify: Server is unwilling to perform (53) additional info: Server is read-only
第5章 不要になった接尾辞のデータベースの削除
Directory Server ホストでディスク領域を回収する必要がある場合は、使用していない接尾辞のデータベースを削除できます。
5.1. コマンドラインを使用したデータベースの削除
この手順では、コマンドラインで Directory Server データベースを削除する方法を説明します。
手順
接尾辞とそれに対応するデータベースを一覧表示します。
#
dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
dc=example,dc=com (userroot) o=test (test_database)削除するデータベースの名前を書き留めます。
dsconf backend delete
コマンドを入力し、データベースの名前を指定します。#
dsconf -D "cn=Directory Manager" ldap://server.example.com backend delete "test_database"
プロンプトで Yes I am sure を入力して、削除を確認します。
Deleting Backend cn=test_database,cn=ldbm database,cn=plugins,cn=config : Type 'Yes I am sure' to continue:
Yes I am sure
検証
接尾辞/データベースを一覧表示します。
#
dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
dc=example,dc=com (userroot)
5.2. Web コンソールを使用したデータベースの削除
この手順では、ブラウザーで Directory Server データベースを削除する方法を説明します。
前提条件
- Web コンソールでインスタンスにログインしている。
手順
-
Database
で、削除する接尾辞を選択します。 - Suffix Tasks → Delete Suffix に移動します。
-
Yes, I am sure
.を選択します。 - Delete Suffixをクリックします。
検証
-
Database
で、設定ツリーの接尾辞の一覧を確認します。
第6章 バックエンドデータベースの整合性の確認
Directory Server データベースの整合性チェックは、破損したメタデータページや重複キーのソートなどの問題を検出できます。問題が検出される場合は、問題によっては、データベースのインデックスを再作成したり、バックアップを復元したりすることができます。
6.1. データベース整合性チェックの実行
dsctl dbverify
コマンドを使用すると、管理者はバックエンドデータベースの整合性を検証できます。
手順
必要に応じて、インスタンスのバックエンドデータベースを一覧表示します。
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list dc=example,dc=com (userRoot)
インスタンスを停止します。
# dsctl instance_name stop
データベースを確認します。たとえば、
userroot
データベースを確認するには、以下のコマンドを実行します。# dsctl instance_name dbverify userRoot [04/Feb/2022:13:11:02.453624171 +0100] - INFO - ldbm_instance_config_cachememsize_set - force a minimal value 512000 [04/Feb/2022:13:11:02.465339507 +0100] - WARN - ldbm_instance_add_instance_entry_callback - ldbm instance userroot already exists [04/Feb/2022:13:11:02.468060144 +0100] - ERR - ldbm_config_read_instance_entries - Failed to add instance entry cn=userroot,cn=ldbm database,cn=plugins,cn=config [04/Feb/2022:13:11:02.471079045 +0100] - ERR - bdb_config_load_dse_info - failed to read instance entries [04/Feb/2022:13:11:02.476173304 +0100] - ERR - libdb - BDB0522 Page 0: metadata page corrupted [04/Feb/2022:13:11:02.481684604 +0100] - ERR - libdb - BDB0523 Page 0: could not check metadata page [04/Feb/2022:13:11:02.484113053 +0100] - ERR - libdb - /var/lib/dirsrv/slapd-instance_name/db/userroot/entryrdn.db: BDB0090 DB_VERIFY_BAD: Database verification failed [04/Feb/2022:13:11:02.486449603 +0100] - ERR - dbverify_ext - verify failed(-30970): /var/lib/dirsrv/slapd-instance_name/db/userroot/entryrdn.db dbverify failed
- 検証プロセスで問題が報告された場合は、手動で修正するか、またはバックアップを復元します。
インスタンスを起動します。
# dsctl instance_name start
関連情報
第7章 属性暗号化の管理
Directory Server は、ディレクトリー内の機密データへのアクセスを保護するための多数のメカニズムを提供します。ただし、デフォルトでは、サーバーは暗号化されていないデータをデータベースに格納します。機密性の高い情報の場合、攻撃者がデータベースにアクセスできるという潜在的なリスクは、重大なリスクになる可能性があります。
属性の暗号化機能により、管理者は特定の属性を機密データ (政府識別番号など) と共に暗号化してデータベースに保存できます。接尾辞を有効にすると、これらの属性のすべてのインスタンス (インデックスデータも含む) が、データベース内のこの属性に格納されているすべてのエントリーに対して暗号化されます。接尾辞の属性暗号化を有効にできることに注意してください。サーバー全体でこの機能を有効にするには、サーバー上の各接尾辞の属性暗号化を有効にする必要があります。属性の暗号化は、eq
および pres
インデックス作成と完全に互換性があります。
エントリーの識別名 (DN) 内で使用する属性は、効率的に暗号化できません。たとえば、uid
属性を暗号化するように設定した場合、値はエントリーでは暗号化されますが、DN では暗号化されません。
dn: uid=demo_user,ou=People,dc=example,dc=com ... uid::Sf04P9nJWGU1qiW9JJCGRg==
7.1. Directory Server が属性の暗号化に使用するキー
属性の暗号化を使用するには、TLS を使用して暗号化された接続を設定する必要があります。Directory Server は、サーバーの TLS 暗号化キーと、属性の暗号化に同じ PIN 入力方法を使用します。
サーバーは、ランダムに生成された対称暗号鍵を使用して、属性データを暗号化および復号化します。サーバーは、サーバーの TLS 証明書の公開鍵を使用してこれらの鍵をラップします。結果として、属性暗号化の有効な強度は、サーバーの TLS キーの強度より高くすることはできません。
サーバーの秘密鍵にアクセスできないと、ラップ済みのコピーから対称キーを復旧することができません。そのため、サーバーの証明書データベースを定期的にバックアップしてください。キーを紛失すると、データベースに保存されているデータを復号化および暗号化できなくなります。
7.2. コマンドラインを使用して属性暗号化を有効にする
この手順では、コマンドラインを使用して userRoot
データベースの telephoneNumber
属性の属性暗号化を有効にする方法を示します。この手順を実行すると、サーバーはこの属性の既存の値と新しい値を AES 暗号化して格納します。
前提条件
- Directory Server で TLS 暗号化を有効にした。
手順
userRoot
データベースをエクスポートします。# dsconf -D "cn=Directory Manager" ldap://server.example.com backend export -E userRoot
サーバーは、エクスポートを
/var/lib/dirsrv/slapd-instance_name/ldif/
ディレクトリーの LDIF ファイルに保存します。-E
オプションは、エクスポート中にすでに暗号化されている属性を復号化します。telephoneNumber
属性の AES 暗号化を有効にします。# dsconf -D "cn=Directory Manager" ldap://server.example.com backend attr-encrypt --add-attr telephoneNumber dc=example,dc=com
インスタンスを停止します。
# dsctl instance_name stop
LDIF ファイルをインポートします。
# dsctl instance_name ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif
--encrypted
パラメーターを使用すると、スクリプトで属性を暗号化して、インポート中に暗号化を設定できます。インスタンスを起動します。
# dsctl instance_name start
7.3. Web コンソールを使用して属性暗号化を有効にする
この手順では、Web コンソールを使用して userRoot
データベースの telephoneNumber
属性の属性暗号化を有効にする方法を示します。この手順を実行すると、サーバーはこの属性の既存の値と新しい値を AES 暗号化して格納します。
Web コンソールのエクスポートおよびインポート機能は、暗号化された属性をサポートしていないことに注意してください。したがって、これらの手順はコマンドラインで実行する必要があります。
前提条件
- Directory Server で TLS 暗号化を有効にした。
- Web コンソールでインスタンスにログインしている。
手順
userRoot
データベースをエクスポートします。# dsconf -D "cn=Directory Manager" ldap://server.example.com backend export -E userRoot
サーバーは、エクスポートを
/var/lib/dirsrv/slapd-instance_name/ldif/
ディレクトリーの LDIF ファイルに保存します。-E
オプションは、エクスポート中にすでに暗号化されている属性を復号化します。- Web コンソールで、Database → Suffixes → suffix_entry → Encrypted Attributes に移動します。
- 暗号化する属性を入力し、Add Attribute をクリックします。
-
Actions メニューで、
Stop Instance
を選択します。 コマンドラインで、LDIF ファイルをインポートします。
# dsctl instance_name ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif
--encrypted
パラメーターを使用すると、スクリプトで属性を暗号化して、インポート中に暗号化を設定できます。-
Web コンソールで Actions メニューを開き、
Start Instance
を選択します。
7.4. 属性暗号化の有効化後の一般的な考慮事項
データベースにすでに存在するデータの暗号化を有効にした後、次の点を考慮してください。
暗号化されていないデータは、サーバーのデータベースページプールのバッキングファイルで保持できます。このデータを削除するには、以下を実行します。
インスタンスを停止します。
# dsctl instance_name stop
/var/lib/dirsrv/slapd-instance_name/db/guardian
ファイルを削除します。# **rm /var/lib/dirsrv/slapd-instance_name/db/guardian``
インスタンスを起動します。
# dsctl instance_name start
- 暗号化を有効にし、データが正常にインポートされた後に、暗号化されていないデータで LDIF ファイルを削除します。
- Directory Server はレプリケーションログファイルを暗号化しません。このデータを保護するには、レプリケーションログを暗号化されたディスクに保存します。
- サーバーのメモリー (RAM) のデータは暗号化されず、swap パーティションに一時的に保存できます。このデータを保護するには、暗号化されたスワップ領域を設定します。
暗号化されていないデータを含むファイルを削除すると、このデータは特定の状況で復元できます。
7.5. 属性暗号化に使用される TLS 証明書の更新
属性の暗号化は、サーバーの TLS 証明書に基づいています。TLS 証明書を更新または置き換えた後に属性の暗号化が失敗しないようにするには、次の手順に従います。
前提条件
- 属性の暗号化を設定しました。
- TLS 証明書の有効期限がまもなく切れる。
手順
userRoot
データベースをエクスポートします。# dsconf -D "cn=Directory Manager" ldap://server.example.com backend export -E userRoot
サーバーは、エクスポートを
/var/lib/dirsrv/slapd-instance_name/ldif/
ディレクトリーの LDIF ファイルに保存します。-E
オプションは、エクスポート中にすでに暗号化されている属性を復号化します。プライベートキーおよび証明書署名要求 (CSR) を作成します。外部ユーティリティーを使用して作成する場合は、この手順を省略します。
ホストが 1 つの名前のみで到達可能である場合は、以下を実行します。
# dsctl instance_name tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization"
複数の名前でホストにアクセスできる場合は、以下を行います。
# dsctl instance_name tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization" server.example.com server.example.net
最後のパラメーターとしてホスト名を指定した場合、このコマンドは
DNS:server.example.com, DNS:server.example.net
エントリーで SAN (Subject Alternative Name) 拡張を CSR に追加します。
-s subject
パラメーターで指定した文字列は、RFC 1485 に従って有効なサブジェクト名である必要があります。サブジェクトのCN
フィールドが必要で、サーバーの完全修飾ドメイン名 (FQDN) の 1 つに設定する必要があります。このコマンドは、/etc/dirsrv/slapd-instance_name/Server-Cert.csr
ファイルに CSR を保存します。- 認証局 (CA) に CSR を送信し、発行した証明書を取得します。詳細は、CA のドキュメントを参照してください。
CA が発行するサーバー証明書を NSS データベースにインポートします。
dsctl tls generate-server-cert-csr
コマンドを使用して秘密鍵を作成した場合は、以下を入力します。# dsconf -D "cn=Directory Manager" ldap://server.example.com security certificate add --file /root/instance_name.crt --name "server-cert" --primary-cert
--name _certificate_nickname
パラメーターで設定した証明書の名前を書き留めておきます。これは後のステップで必要になります。外部ユーティリティーを使用して秘密鍵を作成した場合は、サーバー証明書および秘密鍵をインポートします。
# dsctl instance_name tls import-server-key-cert /root/server.crt /root/server.key
このコマンドでは、最初にサーバー証明書へのパスを指定してから、秘密鍵へのパスを指定する必要があります。このメソッドは、証明書のニックネームを
Server-Cert
に設定します。
CA 証明書を NSS データベースにインポートします。
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate add --file /root/ca.crt --name "Example CA"
CA 証明書の信頼フラグを設定します。
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate set-trust-flags "Example CA" --flags "CT,,"
これにより、Directory Server が、TLS による暗号化および証明書ベースの認証に対して CA を信頼するように設定します。
インスタンスを停止します。
# dsctl instance_name stop
/etc/dirsrv/slapd-instance_name/dse.ldif
ファイルを編集し、属性を含む以下のエントリーを削除します。-
cn=AES,cn=encrypted attribute keys,cn=database_name,cn=ldbm database,cn=plugins,cn=config
-
cn=3DES,cn=encrypted attribute keys,cn=database_name,cn=ldbm database,cn=plugins,cn=config
重要全データベースのエントリーを削除します。
nsSymmetricKey
属性を含むエントリーが `/etc/dirsrv/slapd-instance_name/dse.ldi ファイルに残されると、Directory Server は起動に失敗します。-
LDIF ファイルをインポートします。
# dsctl instance_name ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif
--encrypted
パラメーターを使用すると、スクリプトで属性を暗号化して、インポート中に暗号化を設定できます。インスタンスを起動します。
# dsctl instance_name start