**1. LDAPとは正確には何ですか? ****
LDAPは軽量ディレクトリアクセスプロトコルであり、英語のフルネームはLightweight Directory Access Protocolであり、一般にLDAPと呼ばれます。 X.500標準に基づいていますが、はるかに単純で、必要に応じてカスタマイズできます。 X.500とは異なり、LDAPはインターネットにアクセスするために必要なTCP / IPをサポートします。 LDAPのコア仕様はRFCで定義されており、LDAP関連のすべてのRFCはLDAPman RFCWebページにあります。簡単に言えば、LDAPは、人やリソースに関する一元化された静的データを取得するための高速な方法です。 LDAPは、ディレクトリ情報をさまざまなリソースに公開するために使用されるプロトコルです。通常は一元化されたアドレス帳として使用されますが、主催者のニーズに応じてより強力にすることができます。
市場には多くのLDAP関連製品があり、主要なソフトウェア会社はLDAPサービスを製品に統合しています。たとえば、MicrosoftのActive Directory、LotusのDomino Directory、IBMのWebSphereもLDAPサービスを統合しています。 ** LDAPのオープンソース実装はOpenLDAP **であり、これは商用製品よりも悪くはなく、ソースコードはオープンです。
OpenLDAPは、最も一般的に使用されているディレクトリサービスの1つであり、オープンソースコミュニティとボランティアによって開発および管理されているオープンソースプロジェクトです。ディレクトリ検索、ID認証、セキュアチャネル、フィルタなど、ディレクトリサービスのすべての機能を提供します。ほとんどのLinuxディストリビューションには、OpenLDAPインストールパッケージが付属しています。 OpenLDAPサービスは、デフォルトで暗号化されていないTCP / IPプロトコルを使用して、サービスリクエストを受信し、クエリ結果をクライアントに送り返します。ほとんどのディレクトリサービスは、ユーザーログインやID検証など、システムのセキュリティ認証部分に使用されるため、SSL / TLSベースの暗号化プロトコルの使用もサポートして、データ送信の機密性と整合性を確保します。 OpenLDAPは、OpenSSLを使用してSSL / TLS暗号化通信を実装します。
1.1 LDAPプロトコルの簡単な紹介
ディレクトリは、特定のロジックと階層を組み合わせた、同様の属性を持つ情報のグループです。一般的な例は、名前、住所、電話番号をアルファベット順に並べたアドレス帳です。
ディレクトリサービスは、分散環境でターゲットを検出する方法です。カタログには2つの主要なコンポーネントがあります。
最初の部分はデータベースです。データベースは分散されており、データを説明する計画があります。
2番目の部分は、データにアクセスして処理するためのさまざまなプロトコルです。
ロギングサービスは実際には一種のデータベースシステムですが、この種のデータベースは、一般的に使用されるリレーショナルデータベースではなく、一種のツリー構造です。ディレクトリサービスとリレーショナルデータベースの主な違いは、どちらも保存されたデータへのアクセスを許可することですが、ディレクトリは主に読み取りに使用され、クエリ効率が高く、リレーショナルデータベースは読み取りと書き込み用に設計されています。
**ウォームリマインダー:ディレクトリサービスは頻繁な更新には適しておらず、一般的な分散構造に属しています。 ****
LDAPはディレクトリサービスプロトコルです。LDAPには多くのバージョンがあり、最も一般的なものはV2とV3で、それぞれ1995年と1997年に最初にリリースされました。
1.2 LDAPの基本モデル
LDAPの基本モデルは「エントリー」に基づいています。エントリは、1つ以上の属性のコレクションであり、グローバルに一意の「識別名」(dnで示される)を持ちます。リレーショナルデータ(以下、データベースと呼びます)と同様に、エントリはデータベース内のレコードに相当し、dnはデータベース内のレコードのキーに相当し、属性はデータベース内のフィールドに相当します。
**注意:dnはグローバルに一意である必要があります。 ****
LDAPでは、データはツリー構造に編成されます。これは、多くの変更が必要な[リレーショナルデータベース](https://cloud.tencent.com/product/cdb-overview?from=10680)テーブルの設計とは異なり、実際の多くのデータ構造に対応できます。次の図は、ツリー構造のデータを示しています。
上の図に示すツリー構造では、ツリーのルートノードは組織(dlw.com)のドメイン名であり、マネージャー、人、グループの3つの部分に分かれています。これらの3つのグループを表示できます。組織には3つの部門があります。マネージャーはすべてのマネージャーを管理するために使用され、人はシステムにログインするユーザーを管理するために使用され、グループはシステム内のユーザーグループを管理するために使用されます。もちろん、この図に他のブランチを追加することもできます。
図に示すツリー構造の場合、リレーショナルデータベースを使用してデータを保存する場合は、複数のテーブルを設定してレイヤーごとに保存する必要があります。情報を見つける必要がある場合は、レイヤーごとにクエリを実行して最終結果を取得できます。
ディレクトリを使用して図のデータを保存すると、より直感的になります。図の各ノードはエントリとともに保存されます。異なるタイプのノードは異なるデータを保存する必要があります。LDAPでは、objectClassと呼ばれるタイプを使用して、異なるノードに必要なデータ(属性と呼ばれる)を制御します。
カタログのデータを引用するにはどうすればよいですか?前述のように、dnは一意であるため、各エントリにはdnがあり、ノードを必要とするデータを見つけることができます。 dnは次のように構成されます。
最初にエントリ自体の名前(rdn、相対dnと呼ばれる)を取得し、次にルートアイテムまでレベルごとに親ノードの検索を開始します。たとえば、図1-1の右下にあるノードの場合、そのdnは次のとおりです。
dn: cn=ldap, ou=group, o=dlw.com
このようにして、各ノードを一意に識別できます。実生活では、コンピュータファイルシステムのディレクトリ構造、インターネットのドメイン名など、この種のツリー構造を持つデータがたくさんあります。これらのタイプのデータは、頻繁な更新を必要としない限り、ディレクトリへの保存に適しています。
LDAPの主な略語の意味:** o **->組織(組織-会社)
**ou **->組織単位(組織単位-部門)
**c **-> countryName(国)
**dc **-> domainComponent(ドメイン名)
**sn **-> suer name(本名)
**cn **->共通名(共通名)
1.3 LDAP機能
LDAPプロトコルを使用する一連の操作は、LDAP機能モデルで定義されています。これには主に次の4つの部分が含まれます。
クエリ操作:ディレクトリのクエリとデータの取得が可能で、クエリのパフォーマンスはリレーショナルデータベースよりも優れています。
更新操作:カタログの更新操作はデータベースの利便性とは関係がなく、更新性能は劣りますが、追加、削除、変更などの操作も可能です。
レプリケーション操作:前述のように、LDAPは、マスターサーバーのデータの更新を設定されたスレーブサーバーにレプリケートできるレプリケーション操作を提供する一般的な分散構造です。
認証および管理操作:クライアントがディレクトリ内で自分自身を識別し、セッションの性質を制御できるようにします。
1.4 LDAPプロトコルの機能
LDAPは、特別なデータベースに格納されるディレクトリサービスであり、データの読み取り速度は書き込み速度よりもはるかに高速です。
LDAPはクエリを最適化し、読み取り速度は通常のリレーショナルデータベースよりも優れています。
LDAPはトランザクションをサポートしておらず、ロールバックできません。これらの操作を実行する必要がある唯一のアプリケーションは、リレーショナルデータベースを選択することです。
LDAPはサーバー/クライアントモデルを採用し、分散構造をサポートします。
LDAPのエントリは、ツリー構造で編成および保存されます。
LDAPはインターネットプロトコルに基づいており、シンプルでユニバーサルなTCP / IPまたはその他の信頼性の高いトランスポートプロトコルレイヤーで直接実行されるため、接続の確立とパケット処理がシンプルかつ高速になり、インターネットや企業のネットワークアプリケーションに非常に便利です。
LDAPプロトコルはシンプルで、検索操作を使用してリスト操作と読み取り操作を実現します。
LDAPは、参照メカニズムを介して分散アクセスを実現し、クライアントAPI(アプリケーションに対して透過的)を介して分散操作を実現し、負荷を分散します。
LDAPの実装には、低コスト、簡単な構成、簡単な管理という特徴があり、ディレクトリサービスのアプリケーションプログラムのニーズを満たす特徴があります。
2.LDAPを管理する
OpenLDAPサーバープログラムを起動した後、次の操作は、データの追加、変更、削除、検索などの操作を含む、クライアントプログラムを介してディレクトリを操作することです。
2.1 スキーマを理解する
LDAPディレクトリに保存されている情報は、LDIF(LDAP交換フォーマット)形式で保存できます。これは標準のテキストファイル形式です。この形式で保存されたLDAPサーバーデータベースのデータは、簡単に読み取って変更できます。これは、他のほとんどのサービス構成ファイルで採用されている形式でもあります。
LDIFファイルは、レコード情報をディレクトリにインポートまたは変更するためによく使用されます。この情報は、LDAPのスキーマ形式に従って整理する必要があり、スキーマによってチェックされます。形式が要件を満たしていない場合は、エラーメッセージが表示されます。 LDIFファイルの形式と作成については、第4章で紹介します。ここでは、LDAPデータ形式を編成するスキーマファイルについて簡単に紹介します。
LDAPでは、スキーマを使用して、ディレクトリに含まれるオブジェクト(objects)のタイプ(objectClass)と、各タイプ(objectClass)で提供する必要のある属性(Atrribute)およびオプションの属性を指定します。スキーマはオブジェクト指向プログラミングのクラスとして理解でき、特定のオブジェクトはクラスによって定義されます。 LDIFのデータ入力は、スキーマを通じて計画および作成される特定のオブジェクトとして理解できます。したがって、スキーマは、データの保存方法を決定し、異なるエントリ(エントリ)に保存されたデータ間の関係を定義するために使用されるデータモデルです。ディレクトリで使用できるobjectClassを決定するには、メイン構成ファイルslapd.confでスキーマを指定する必要があります。
多くのスキーマファイルが/ etc / openldap / schema /ディレクトリに用意されています。使用する必要のあるスキーマを含めるには、構成ファイルslapd.confでincludeコマンドを使用するだけで済みます。たとえば、構成ファイルには、デフォルトで次のスキーマファイルが含まれています。
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
**注意:通常、ほとんどのアプリケーションは、システムが提供するスキーマを使用して解決できます。管理者は、スキーマを自分で設計および作成することもできます。これには通常、AttributeDefinition、ClassDefinition、およびSyntaxDefinitionが含まれます。具体的な設計方法はここでは紹介しません。 ****
2.2 カタログデータベースにデータを追加
初期状態では、LDAPは空のディレクトリです。つまり、データはありません。プログラムコードを使用してディレクトリデータベースにデータを追加するか、OpenLDAPクライアントツールのldapaddコマンドを使用して、LDIFファイルのエントリをディレクトリに追加できるデータの追加操作を完了することができます。したがって、最初にLDIFファイルを作成してから、それを追加する必要があります。
1 )LDIFテキスト入力形式
LDIFは、テキスト形式を使用してディレクトリデータベースの情報を表し、ユーザーが作成、読み取り、および変更できるようにします。 LDIFファイルでは、エントリの基本的な形式は次のとおりです。
# コメント
dn:エントリー名
プロパティの説明:値
プロパティの説明:値
プロパティの説明:値
......
dn行は、リレーショナルデータベースのレコードのキーワードに類似しており、他のdnで繰り返すことはできません。 LDIFファイルには複数のエントリを含めることができ、各エントリは空白行で区切られます。
たとえば、次のコンテンツはエントリを構成します。
1: dn: dc=dlw, dc=com
2: objectclass: top
3: objectclass: dcobject
4: objectclass: organization
5: dc: dlw
6: o: dlw,Inc.
上記のテキストでは、各行の意味は次のとおりです。
1行目のdnは、エントリのIDを定義します。
2行目から4行目は、このエントリのobjectcCassを定義しています。これにより、上記のコードで定義された3つのobjectClassesなど、複数の属性を定義できます。エントリの属性はobjectClassによって異なり、一部のobjectClassには設定が必要な属性があります。 2行目から4行目の3つのobjectClassのうち、topには必須の属性がなく、dcobjectはドメイン名の一部を表すために使用される属性dcを定義する必要があり、組織は組織の名前を表すために使用される属性oを定義する必要があります。
objectClassの要件に従って、5行目と6行目はそれぞれ属性dcと属性oの値を定義しています。
2.3 objectClassを理解する
LDAPでは、エントリにobjectClass属性が含まれている必要があり、少なくとも1つの値が割り当てられている必要があります。各値は、LDAPエントリのデータストレージのテンプレートとして使用されます。テンプレートには、エントリに割り当てる必要のある属性とオプションの属性が含まれています。
objectClassには厳密な階層があり、トップレベルはトップとエイリアスです。たとえば、objectClassorganizationalPersonはpersonに属し、personはtopに属します。
objectClassは、次の3つのカテゴリに分類できます。
構造的(構造的):人や組織ユニットなど。
補助:extensibeObjectなど。
Abstract:topなど、abstractobjectClassを直接使用することはできません。
多くのobjectClassesがOpenLDAPスキーマで定義されています。一般的に使用されるいくつかのobjectClassesの名前を以下に示します。
● account
● alias
● dcobject
● domain
● ipHost
● organization
● organizationalRole
● organizationalUnit
● person
● organizationalPerson
● inetOrgPerson
● residentialPerson
● posixAccount
● posixGroup
2.4 属性を理解する
属性はプログラミングの変数に似ており、値を割り当てることができます。一般的に使用される属性の多くはOpenLDAPで宣言されています(ユーザーは自分で属性を定義することもできます)。一般的な属性の意味は次のとおりです。
●c:国。
●cn:共通名。オブジェクトの名前を指します。人を指す場合は、フルネームを使用してください。
●dc:ドメインコンポーネント。ドメイン名の一部を参照するためによく使用されます。
●givenName:人の名を参照し、姓を参照するために使用することはできません。
●l:都市やその他の地理的領域の名前などの場所の名前を指します。
●メール:メールアドレス。
●o:organizationNameは、組織の名前を指します。
●ou:organizationalUnitNameは、組織単位の名前を指します。
●sn:姓。人の姓を指します。
●telephoneNumber:電話番号。国コードを含める必要があります。
●uid:userid。通常、ユーザーのログイン名を参照します。これは、Linuxシステムのユーザーのuidとは異なります。
**注意:objectClassは特別な属性であり、他の使用済み属性とそれ自体が含まれています。 ****
さまざまなobjectClassesには、通常、いくつかの必須の属性値といくつかのオプションの属性値があります。たとえば、personのobjectClassを使用して、システム内のユーザーのエントリを表すことができます。システム内のユーザーは通常、名前、電話番号、パスワード、説明などの情報を必要とします。次の図に示すように、personの場合、ユーザーの名と姓をcnとsnで設定します。これらは設定する必要がありますが、他の属性はオプションです。
以下に、一般的に使用されるobjectClassの必須属性の一部を示します。
● account:userid。
● organization:o。
●人:cnおよびsn。
●organizationalPerson:人と同じです。
● organizationalRole:cn。
● organizationUnit:ou。
● posixGroup:cn、gidNumber。
● posixAccount:cn、gidNumber、homeDirectory、uid、uidNumber。
2.5 LDIFファイルを作成
上記の内容をある程度理解したら、入力LDIFファイルを記述して、ディレクトリデータベースに追加する必要のあるエントリを編集できます。
次に、次の図に示す構造に従って、LDIFファイルdlw.com.ldifを作成します。
上の図を分析すると、ディレクトリ構造は4つのノードを持つ3つの層に分割されています。上の図によると、LDIFファイルは次のように作成できます。
**注意:各ノードはdnで表すことができ、ノードごとに、引き続き新しいノードを追加できます。ルートノードに他の部門ouを追加できる場合は、ou = managersノードに他のマネージャーの情報を引き続き追加できます。 ****
1: dn:dc=dlw,dc=com
2: objectclass:top
3: objectclass:dcobject
4: objectclass:organization
5: dc:dlw
6: o:dlw,Inc.7:8: dn:ou=managers, dc=dlw, dc=com
9: ou:managers
10: objectclass:organizationalUnit
11:12: dn:cn=dlw,ou=managers,dc=dlw,dc=com
13: cn:dlw
14: sn:dongliwei
15: objectclass:person
16:17: dn:cn=test,ou=managers,dc=dlw,dc=com
18: cn:test
19: sn:Test User
20: objectclass:person
上記のファイルの各行の意味は次のとおりです。
1行目から6行目はルートノードを作成します。この部分は前のセクションでも紹介されているので、繰り返しません。
行7、11、および16は、4つのdnエントリ(4ノード)を区切る空白行です。
8行目から10行目は、cn = managersノードのエントリを定義しています。このエントリのobjectClassはorganizationalUnitであるため、組織名はou属性で定義する必要があります。
12行目から15行目は、cn = dlwノードのエントリを定義しています。このエントリで使用されるobjectClassはpersonであるため、cnとsnの2つの属性値を設定する必要があります。
17〜20行目は、12〜15行目と同じ意味です。
上記のLDIFファイルでは、1、8、12、および17行目はdnで始まります。コンテンツのこの部分は一意である必要があり、これらのデータをディレクトリデータベースに追加するときは、データがディレクトリデータベースの既存のデータと同じにならないようにしてください。そうしないと、追加操作が中断されます。
2.6 LDIFファイルからカタログデータベースに追加
OpenLDAPクライアントツールのldapaddコマンドを使用して、LDIFファイルのエントリをディレクトリデータベースに追加します。コマンドの形式は次のとおりです。
ldappaddコマンドで一般的に使用されるオプションは次のとおりです。
**- x **:単純な認証を実行します。
**- D **:サーバーのバインドに使用されるdn。
**- h **:ディレクトリサービスのアドレス。
**- w **:dnをバインドするためのパスワード。
**- f **:LDIFファイルを使用してエントリを追加します。
以前に書き込んだLDIFファイルのエントリデータをディレクトリデータベースに追加します。
具体的な手順は次のとおりです。
1 )dlw.com.ldifファイルの内容を確認します。各コロンの後にスペースが必要であり、各行の終わりにスペース文字を残すことはできないことに注意してください。
2 )次のコマンドを使用して、dlw.com.ldifファイルのエントリをディレクトリに追加します。
# ldapadd -x -D "cn=root,dc=dlw,dc=com"-w secret -f dlw.com.ldif
**注意:上記のコマンドが正常に実行されない場合は、スペースの問題に特に注意して、dlw.com.ldifファイルの内容を1文字ずつ確認する必要があります。 ****
2.7 お問い合わせ
ディレクトリに追加されたエントリは、ディレクトリデータベースに保存されます。Linuxコマンドインターフェイスでは、OpenLDAPクライアントツールのldapsearchコマンドを使用してクエリを実行できます。コマンドの形式は次のとおりです。
一般的に使用されるオプションは次のとおりです。
**- x **:単純な認証を実行します。
**- D **:サーバーのバインドに使用されるdn。
**- w **:dnをバインドするためのパスワード。
**- b **:照会するルートノードを指定します。
**- H **:照会するサーバーを指定します。
ldapsearchコマンドを使用して、「dc = dlw、dc = com」の下のすべてのエントリを照会します。次のコマンドを使用できます:
# ldapsearch -x -b "dc=dlw,dc=com"
また、次のコマンドを使用すると、snの文字wuで始まるエントリをクエリして表示すると、次の図に示すようなクエリ結果が得られ、エントリは1つだけ見つかります。
# ldapsearch -x -b 'dc=dlw,dc=com''sn=wu*'
2.8 エントリの変更
OpenLDAPクライアントツールのldapmodifyコマンドを使用して、ディレクトリデータベースのエントリを変更します。コマンドの形式は次のとおりです。
このコマンドには多くのオプションがあります。一般的に使用されるオプションはldapaddに似ており、ここにはリストされていません。
**注意:ldapmodifyコマンドを使用してエントリのdnを変更しますが、他の属性値を変更することもできます。 ****
ldapmodifyコマンドを使用してエントリ情報を変更する方法は2つあります。1つはインタラクティブに変更する方法、もう1つはファイルを介して変更する方法です。
# ldapmodify -x -D "cn=root,dc=dlw,dc=com"-W secret
上記のコマンドを実行した後、端末はユーザーが変更するエントリのdnを入力するのを待ち、次のように入力します。
dn: cn=test, ou=managers, dc=dlw, dc=com
changetype: modify
replace: sn
sn: Test User Modify
上記の入力コンテンツでは、1行目で変更が必要なエントリを見つけ、2行目で変更モードを設定し、3行目で置換する属性snを設定し、4行目で属性snをリセットして属性の元の値を置き換えます。
上記の内容を入力した後、Enterキーを押すと、プログラムは上記の設定に従ってデータを更新し、Ctrl + Cを押して変更コマンドを終了します。
上記のコマンドを使用してエントリのデータを変更した後、次のコマンドを使用して、変更が成功したかどうかを確認できます。
# ldapsearch -x -b 'dc=dlw,dc=com''cn=test'
**【例】modifyコマンドで以前のLDAPデータベースの情報を復元します。つまり、sn属性を「TestUserModify」から「TestUser」**に変更します。
具体的な手順は次のとおりです。
[1] viエディターを使用してファイル変更を作成し、それに以下を入力します。
dn: cn=test,ou=managers,dc=dlw,dc=com
changetype: modify
replace: sn
sn: Test User
上記の入力内容から、インタラクティブ時の入力内容と全く同じであることがわかります。
ヒント:fileメソッドを使用してエントリを変更すると、変更や検査に便利です。場所に入力エラーがある場合は、ldapmodifyを呼び出して変更後に変更し、入力量を減らすことができます。
[2] 次のコマンドを使用してmodifyを呼び出し、コンテンツを変更します。
# ldapmodify -x -D "cn=root,dc=dlw,dc=com"-w secret -f modify
2.9 記入を消す
ディレクトリデータベース内の未使用のエントリについては、ldapdeleteコマンドを使用してそれらを削除することもできます。コマンドの形式は次のとおりです。
このコマンドで使用されるオプションはldapaddに似ているため、リストされなくなりました。
ディレクトリデータベースの「cn = test、ou = managers、dc = dlw、dc = com」エントリを削除します。具体的なコマンドは次のとおりです。
# ldapdelete -x -D "cn=root,dc=dlw,dc=com"-w secret "cn=test,ou=managers,dc=dlw,dc=com"
上記のコマンドが正常に実行された後、端末に情報が出力されなくなり、削除操作が完了したことが示されます。
ldapdeleteコマンドは、ツリー構造内のリーフノードエントリのみを削除できます。リーフノード以外のエントリを削除すると、エラーメッセージが表示されます。たとえば、次のコマンドを実行して、ルートノード「dc = dlw、dc = com」を削除します。ルートノードの下にノードがあるため、次の図に示すようなエラーメッセージが表示されます。
次のコマンドを使用する必要があります。
# ldapdelete -x -D "cn=root,dc=dlw,dc=com"-w secret "dc=dlw,dc=com"
2.10 データ出力
ldapaddコマンドを使用して、ディレクトリデータベースにデータを追加できます。場合によっては、逆の操作を実行する必要があります。つまり、ディレクトリデータベースにデータをエクスポートします。
ldapsearchコマンドを使用してディレクトリデータベースを検索し、リダイレクトによって検索結果をファイルに保存して、データをエクスポートする目的を達成します。さらに、データのエクスポートによく使用されるのはslapcatコマンドです。コマンドの形式は次のとおりです。
最も一般的に使用されるオプションは-lです。これは、LDIFファイル形式にエクスポートすることを意味します。
前の例で作成したカタログデータベースをexport.ldifファイルにエクスポートする場合は、次のコマンドを使用できます。
# slapcat -l export.ldif
**注意:エクスポート結果から、ldapaddコマンドを使用してディレクトリデータベースに追加されたエントリデータに加えて、ディレクトリUUID、タイムスタンプ、その他の情報など、他の多くの情報もエクスポートされていることがわかります。 ****
2.11 マスタースレーブLDAPサーバーをセットアップする
LDAPサーバーで[ロードバランシング](https://cloud.tencent.com/product/clb?from=10680)を実行するために、複数のLDAPサーバーをセットアップしたい場合があります。複数のLDAPサーバーを設定する際の重要な問題は、データの同期です。slurpdプロセスを使用して、マスターLDAPサーバーからスレーブLDAPサーバーにデータをコピーできます。以下に、マスタースレーブLDAPサーバーをセットアップするプロセスを紹介します。
2.12 複数のLDAPサーバーの作業プロセス
複数のLDAPサーバーの場合、1つをマスターサーバーとして設定し、他をスレーブサーバーとして設定できます。このセクションでは、1つのスレーブサーバーの構成を紹介します。複数のスレーブサーバーがある場合は、この手順に従うこともできます。
注:構成する前に、まず各LDAPサーバーにOpenLDAPサーバープログラムがインストールされており、正しく機能することを確認する必要があります。
マスタースレーブLDAPサーバーを構成した後、マスターサーバーでslurpdプロセスを実行します。このプロセスは、LDAPプロトコルを使用して、マスターサーバーのデータベースからスレーブサーバーのデータを更新します。具体的な操作プロセスは次のとおりです。
1 )LDAPクライアントは、LDAP変更要求をスレーブサーバーに送信します。
2 )スレーブサーバーは、マスターサーバーへの参照をLDAPクライアントに返します。
3 )LDAPクライアントは、LDAP変更要求をメインサーバーに送信します。
4 )メインサーバーはデータベース内のデータを変更し、その変更をマシンのログファイルに書き込みます。
5 )マスターサーバーで実行されているslurpdプロセスは、ログ内の新しいコンテンツを検出し、ログ情報を介して変更をスレーブサーバーに送信します。
6 )slurpdから送信された情報をサーバーから受信し、ローカルデータを変更します。
上記のプロセスは、slurpdプロセスを使用したデータ複製のプロセスです。上記のプロセスから、レプリケーション情報を送信するスレーブサーバーをマスターサーバーの構成ファイルに設定する必要があり、マスターサーバーはデータの変更を記録するログファイルも設定する必要があり、スレーブサーバーはマスターサーバーへのリンクを設定する必要があることがわかります。
2.13 データベースをコピー
まず、マスターサーバーとスレーブサーバーをシャットダウンします。次に、次の3つの手順を使用して、マスターサーバーとスレーブサーバーのデータを静的に同期します。
マスターサーバーの/ var / lib / ldapディレクトリにあるすべてのデータベースファイルをスレーブサーバーの同じディレクトリにコピーし、元のファイルを上書きします。
マスターサーバーの/ etc / ldap / schemaディレクトリにあるすべてのスキーマファイルをスレーブサーバーの同じディレクトリにコピーして、元のファイルを上書きします。
マスターサーバーの/etc/ldap/slapd.confファイルをスレーブサーバーの同じディレクトリにコピーし、元のファイルを上書きします。
**3. Centos7 **でのLDAPの完全な展開の運用記録
3.1 サーバー環境の紹介
Centos7.2システム、64ビット、次の操作はルートアカウントで実行されます(以下のOpenLDAPデプロイメントマシンtest-vm002のIPアドレスは172.16.220.133です)
3.2 OpenLDAPサービスの展開プロセス
[ root@test-vm002 ~]# vim /root/ldap_install.sh
#! /bin/bash
echo "install ldap rpm"
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
yum install -y openldap openldap-clients openldap-servers migrationtools openldap-devel compat-openldap
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap./var/lib/ldap/DB_CONFIG
systemctl start slapd
systemctl enable slapd
[ root@test-vm002 ~]# sh -x ldap_install.sh
デフォルトでは、slapdサービスはポート389でリッスンします
[ root@test-vm002 ~]# lsof -i:389
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
slapd 2940 ldap 8u IPv4 23618 0t0 TCP *:ldap(LISTEN)
slapd 2940 ldap 9u IPv6 23619 0t0 TCP *:ldap(LISTEN)
まず、ldapの管理者パスワードを設定します。処理されたプレーンテキストパスワードを生成します(ここではプレーンテキストパスワードadmin @ 123を入力します)
ここで、{SSHA} xxxxxxxxxxxxxxxxxxxxxxxxは暗号化されたプレーンテキストのパスワードであり、後で使用されます。
[ root@test-vm002 ~]# slappasswd
New password:
Re-enter newpassword:{SSHA}wfYgDRZdRyxTuwVg1bzpXjjgAWGNYeN3
chrootpw.ldifファイルをインポートします
[ root@test-vm002 ~]# cd /etc/openldap/[root@test-vm002 openldap]# vim chrootpw.ldif
# specify the password generated above for"olcRootPW" section
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW:{SSHA}wfYgDRZdRyxTuwVg1bzpXjjgAWGNYeN3
[ root@test-vm002 openldap]# ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF:0
modifying entry "olcDatabase={0}config,cn=config"
基本スキーマモードのインポート
[ root@test-vm002 openldap]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF:0
adding newentry"cn=cosine,cn=schema,cn=config"[root@test-vm002 openldap]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF:0
adding newentry"cn=nis,cn=schema,cn=config"[root@test-vm002 openldap]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF:0
adding newentry"cn=inetorgperson,cn=schema,cn=config"
注意:次のスキーマモードを選択的にインポートできます。ここでは、上記の3つのモードのみをインポートすることを選択します。
-----------------------------------------------------------------------------------------------
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/collective.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/corba.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/core.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/duaconf.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/dyngroup.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/inetorgperson.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/java.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/misc.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/openldap.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/pmi.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/ppolicy.ldif-----------------------------------------------------------------------------------------------
ldapDBにドメイン名を設定します
以下に入力されたプレーンテキストのパスワードは、引き続きadmin @ 123です。
[ root@test-vm002 openldap]# slappasswd
New password:
Re-enter newpassword:{SSHA}cm/LXtPjAlGzPWta+Yn3mKiDH53rVfMD
chdomain.ldifファイルをインポートします。ここではドメイン名huanqiu.comを使用しています
[ root@test-vm002 openldap]# vim chdomain.ldif
# replace to your own domain name for"dc=***,dc=***" section
# specify the password generated above for"olcRootPW" section
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess:{0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
read by dn.base="cn=Manager,dc=huanqiu,dc=com" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=huanqiu,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=huanqiu,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW:{SSHA}cm/LXtPjAlGzPWta+Yn3mKiDH53rVfMD
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess:{0}to attrs=userPassword,shadowLastChange by
dn="cn=Manager,dc=huanqiu,dc=com" write by anonymous auth by self write by * none
olcAccess:{1}to dn.base="" by * read
olcAccess:{2}to * by dn="cn=Manager,dc=huanqiu,dc=com" write by * read
[ root@test-vm002 openldap]# ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF:0
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
次に、basedomain.ldifファイルをインポートします
[ root@test-vm002 openldap]# vim basedomain.ldif
# replace to your own domain name for"dc=***,dc=***" section
dn: dc=srv,dc=world
objectClass: top
objectClass: dcObject
objectclass: organization
o: Server Com
dc: Huanqiu
dn: cn=Manager,dc=huanqiu,dc=com
objectClass: organizationalRole
cn: Manager
description: Directory Manager
dn: ou=People,dc=huanqiu,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=huanqiu,dc=com
objectClass: organizationalUnit
ou: Group
次のようにベースドメインをインポートします.ldifファイルがadminの場合に入力する必要のあるパスワード@123[root@test-vm002 openldap]# ldapadd -x -D cn=Manager,dc=huanqiu,dc=com -W -f basedomain.ldif
Enter LDAP Password:
adding newentry"dc=huanqiu,dc=com"
adding newentry"cn=Manager,dc=huanqiu,dc=com"
adding newentry"ou=People,dc=huanqiu,dc=com"
adding newentry"ou=Group,dc=huanqiu,dc=com"
3 )ファイアウォールをオフにします(またはファイアウォールをオンにして、アクセス用にポート389を開きます)
[ root@test-vm002 openldap]# systemctl stop firewalld
[ root@test-vm002 openldap]# systemctl disable firewalld
[ root@test-vm002 openldap]# setenforce 0
4 )ldapユーザーを追加します(次のように、ユーザーkevinを追加します)
それでもプレーンテキストのパスワードadminを入力してください@123[root@test-vm002 openldap]# slappasswd
New password:
Re-enter newpassword:{SSHA}NKGiugr+3ceSiv3tkgKYU5w5ywpDy/bP
[ root@test-vm002 openldap]# vim ldapuser.ldif
# create new
# replace to your own domain name for"dc=***,dc=***" section
dn: uid=kevin,ou=People,dc=huanqiu,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: Kevin
sn: Linux
userPassword:{SSHA}NKGiugr+3ceSiv3tkgKYU5w5ywpDy/bP
loginShell:/bin/bash
uidNumber:1000
gidNumber:1000
homeDirectory:/home/kevin
dn: cn=kevin,ou=Group,dc=huanqiu,dc=com
objectClass: posixGroup
cn: Kevin
gidNumber:1000
memberUid: kevin
次のようにldapuserをインポートします.ldifファイルに入力する必要のあるパスワードは上記の管理者です@123[root@test-vm002 openldap]# ldapadd -x -D cn=Manager,dc=huanqiu,dc=com -W -f ldapuser.ldif
Enter LDAP Password:
adding newentry"uid=kevin,ou=People,dc=huanqiu,dc=com"
adding newentry"cn=kevin,ou=Group,dc=huanqiu,dc=com"
ローカルシステムのユーザーとグループをldapディレクトリに追加します
[ root@test-vm002 openldap]# vim ldapuser.sh
# extract local users and groups who have 1000-9999 digit UID
# replace "SUFFIX=***" to your own domain name
# this is an example
#! /bin/bash
SUFFIX='dc=huanqiu,dc=com'
LDIF='ldapuser.ldif'
echo -n > $LDIF
GROUP_IDS=()
grep "x:[1-9][0-9][0-9][0-9]:"/etc/passwd |(while read TARGET_USER
do
USER_ID="$(echo "$TARGET_USER" | cut -d':' -f1)"
USER_NAME="$(echo "$TARGET_USER" | cut -d':' -f5 | cut -d' ' -f1,2)"[!"$USER_NAME"]&& USER_NAME="$USER_ID"
LDAP_SN="$(echo "$USER_NAME" | cut -d' ' -f2)"[!"$LDAP_SN"]&& LDAP_SN="$USER_NAME"
LASTCHANGE_FLAG="$(grep "${USER_ID}:" /etc/shadow | cut -d':' -f3)"[!"$LASTCHANGE_FLAG"]&& LASTCHANGE_FLAG="0"
SHADOW_FLAG="$(grep "${USER_ID}:" /etc/shadow | cut -d':' -f9)"[!"$SHADOW_FLAG"]&& SHADOW_FLAG="0"
GROUP_ID="$(echo "$TARGET_USER" | cut -d':' -f4)"[!"$(echo "${GROUP_IDS[@]}" | grep "$GROUP_ID")"]&& GROUP_IDS=("${GROUP_IDS[@]}""$GROUP_ID")
echo "dn: uid=$USER_ID,ou=People,$SUFFIX">> $LDIF
echo "objectClass: inetOrgPerson">> $LDIF
echo "objectClass: posixAccount">> $LDIF
echo "objectClass: shadowAccount">> $LDIF
echo "sn: $LDAP_SN">> $LDIF
echo "givenName: $(echo "$USER_NAME" | awk '{print $1}')">> $LDIF
echo "cn: $USER_NAME">> $LDIF
echo "displayName: $USER_NAME">> $LDIF
echo "uidNumber: $(echo "$TARGET_USER" | cut -d':' -f3)">> $LDIF
echo "gidNumber: $(echo "$TARGET_USER" | cut -d':' -f4)">> $LDIF
echo "userPassword: {crypt}$(grep "${USER_ID}:" /etc/shadow | cut -d':' -f2)">> $LDIF
echo "gecos: $USER_NAME">> $LDIF
echo "loginShell: $(echo "$TARGET_USER" | cut -d':' -f7)">> $LDIF
echo "homeDirectory: $(echo "$TARGET_USER" | cut -d':' -f6)">> $LDIF
echo "shadowExpire: $(passwd -S "$USER_ID" | awk '{print $7}')">> $LDIF
echo "shadowFlag: $SHADOW_FLAG">> $LDIF
echo "shadowWarning: $(passwd -S "$USER_ID" | awk '{print $6}')">> $LDIF
echo "shadowMin: $(passwd -S "$USER_ID" | awk '{print $4}')">> $LDIF
echo "shadowMax: $(passwd -S "$USER_ID" | awk '{print $5}')">> $LDIF
echo "shadowLastChange: $LASTCHANGE_FLAG">> $LDIF
echo >> $LDIF
done
for TARGET_GROUP_ID in"${GROUP_IDS[@]}"do
LDAP_CN="$(grep ":${TARGET_GROUP_ID}:" /etc/group | cut -d':' -f1)"
echo "dn: cn=$LDAP_CN,ou=Group,$SUFFIX">> $LDIF
echo "objectClass: posixGroup">> $LDIF
echo "cn: $LDAP_CN">> $LDIF
echo "gidNumber: $TARGET_GROUP_ID">> $LDIF
for MEMBER_UID in$(grep ":${TARGET_GROUP_ID}:"/etc/passwd | cut -d':'-f1,3)do
UID_NUM=$(echo "$MEMBER_UID"| cut -d':'-f2)[ $UID_NUM -ge 1000-a $UID_NUM -le 9999]&& echo "memberUid: $(echo "$MEMBER_UID" | cut -d':' -f1)">> $LDIF
done
echo >> $LDIF
done
)[ root@test-vm002 openldap]# chmod 755 ldapuser.sh
[ root@test-vm002 openldap]# sh ldapuser.sh
以下に入力したパスワードは引き続き管理者です@123[root@test-vm002 openldap]# ldapadd -x -D cn=Manager,dc=huanqiu,dc=com -W -f ldapuser.ldif
Enter LDAP Password:
adding newentry"uid=admin,ou=People,dc=huanqiu,dc=com"
adding newentry"uid=wangshibo,ou=People,dc=huanqiu,dc=com"
adding newentry"uid=devs,ou=People,dc=huanqiu,dc=com"
adding newentry"uid=huihui,ou=People,dc=huanqiu,dc=com"
adding newentry"cn=admin,ou=Group,dc=huanqiu,dc=com"
adding newentry"cn=wangshibo,ou=Group,dc=huanqiu,dc=com"
adding newentry"cn=devs,ou=Group,dc=huanqiu,dc=com"
adding newentry"cn=huihui,ou=Group,dc=huanqiu,dc=com"
5 )phpLDAPadminをインストールして、Web上でLDAPを構成します
httpdをインストールして構成します
[ root@test-vm002 ~]# yum -y install httpd
[ root@test-vm002 ~]# rm -f /etc/httpd/conf.d/welcome.conf
[ root@test-vm002 ~]# vim /etc/httpd/conf/httpd.conf //次の行を変更します
ServerName www.example.com:80//96行目
AllowOverride All //151行目
DirectoryIndex index.html index.cgi index.php //164行目
# add follows to the end //これらの行を追加します
# server's response header
ServerTokens Prod
# keepalive is ON
KeepAlive On
[ root@test-vm002 ~]# systemctl start httpd
[ root@test-vm002 ~]# systemctl enable httpd
Created symlink from/etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.[root@test-vm002 ~]# vim /var/www/html/index.html
this is test page for httpd!!!
アクセス[http://172.16.220.133/](http://172.16.220.133/)
phpをインストールします
[ root@test-vm002 ~]# yum -y install php php-mbstring php-pear
[ root@test-vm002 ~]# vim /etc/php.ini
date.timezone ="Asia/Shanghai"//878行目[root@test-vm002 ~]# systemctl restart httpd
[ root@test-vm002 ~]# vim /var/www/html/index.php
<? php
phpinfo();?>
アクセス[http://172.16.220.133/index.php](http://172.16.220.133/index.php)
phpLDAPadminをインストールします
[ root@test-vm002 ~]# wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
[ root@test-vm002 ~]# rpm -ivh epel-release-latest-7.noarch.rpm
[ root@test-vm002 ~]# yum repolist #ソースリストに追加されているか確認してください
[ root@test-vm002 ~]# yum --enablerepo=epel -y install phpldapadmin
ログイン設定
[ root@test-vm002 ~]# vim /etc/phpldapadmin/config.php
$servers->setValue('login','attr','dn');//387行目、この行のコメントを開きます.ユーザー名でログイン// $servers->setValue('login','attr','uid'); //この行をコメントアウトします。 uidでのログインを禁止する[root@test-vm002 ~]# cat /etc/httpd/conf.d/phpldapadmin.conf
#
# Web-based tool for managing LDAP servers
#
Alias /phpldapadmin /usr/share/phpldapadmin/htdocs
Alias /ldapadmin /usr/share/phpldapadmin/htdocs
< Directory /usr/share/phpldapadmin/htdocs><IfModule mod_authz_core.c>
# Apache 2.4
Require local
Require ip 172.16.220.0/8//ローカルIPが172であるため、アクセス許可を追加します.16.220.19なので、ここでこのネットワークセグメントのアクセス許可を設定します</IfModule><IfModule !mod_authz_core.c>
# Apache 2.2
Order Deny,Allow
Deny from all
Allow from127.0.0.1
Allow from::1</IfModule></Directory>[root@test-vm002 ~]# systemctl restart httpd
[ root@test-vm002 share]# ps -ef|grep httpd
root 41501001:13?00:00:00/usr/sbin/httpd -DFOREGROUND
apache 41514150001:13?00:00:00/usr/sbin/httpd -DFOREGROUND
apache 41524150001:13?00:00:00/usr/sbin/httpd -DFOREGROUND
apache 41534150001:13?00:00:00/usr/sbin/httpd -DFOREGROUND
apache 41544150001:13?00:00:00/usr/sbin/httpd -DFOREGROUND
apache 41554150001:13?00:00:00/usr/sbin/httpd -DFOREGROUND
apache 41774150001:13?00:00:00/usr/sbin/httpd -DFOREGROUND
apache 41844150001:13?00:00:00/usr/sbin/httpd -DFOREGROUND
root 41883000001:14 pts/100:00:00 grep --color=auto httpd
[ root@test-vm002 share]# chown -R apache.apache /usr/share/phpldapadmin
[http://172.16.220.133/ldapadmin](http://172.16.220.133/ldapadmin)にアクセスしてください
ログインユーザー名:cn = Manager、dc = huanqiu、dc = com
パスワードは上記のadmin @ 123です
Recommended Posts