CentOS7でOpenldap構築 - 1.Openldapの仕組み

　アカウント管理の集約、サーバログイン・サイトログイン制御を目的に、Openldapを用いてLDAP環境を構築していきます。
　以下、連載記事にしていきます。

　1.Openldapの仕組み ※本記事
　[2.LDAPサーバ構築手順](https://qiita.com/y-araki-qiita/items/6b2dcbf1a39a969d8024)
　[3.LDAPクライアント設定手順](https://qiita.com/y-araki-qiita/items/b0f3b291011d1e55d95f)
　[4.LDAPディレクトリ構成例とACLの設定](https://qiita.com/y-araki-qiita/items/bc874aeb40ede9c5368c)
　[5.バックアップリストアテスト](https://qiita.com/y-araki-qiita/items/ad000141c3fccaef7167)
　[6.パスワード有効期限切れ通知スクリプト(おまけ)](https://qiita.com/y-araki-qiita/items/65103497c2ce0ad63d24#_reference-3c21f4d326c268b2b90d)

　本記事は1番目の仕組みを説明するだけの記事なので、なんとなく見ていただけるとありがたいです。

## 要件
今回、以下の要件を想定した環境を構築します。
・Openldapを用いてLDAPサーバを構築し、システム利用者のアクセス管理とパスワードポリシーを一元化し人的負荷を低減させる。
・アカウント管理ツールとしてLDAP Account Managerを使用する。接続の際には443(HTTPS)ポートを使用する。
・DB、ファイルのバックアップ環境を構築・運用する。
・一旦シングル構成とする。後程、耐障害性を考慮し冗長化も可能とする。
・踏み台、中継サーバーはSSH公開鍵認証によるLDAPログインとし、踏み台サーバーから他サーバーのログインは共通ユーザとする。
・情報の管理はou=infraのメンバーで行うものとする。

## LDAPログインの仕組み
　LDAPログインの仕組みのイメージ図です。以下はユーザ名+秘密鍵でLDAPクライアントにログインする場合です。
　LDAPサーバにはslapdというデーモンが、LDAPクライアントにはnslcdというデーモンが動いていて、それが相互に働きLDAPログインを可能にしています。
<img width="746" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/c376d6a7-a103-0c9b-397a-3404f6eebcc1.png">

## 用語定義
　Openldapはマスター/スレーブをプロバイダ/コンシューマと呼んだり、他のサーバに比べ少し変わっていて、用語もわかりにくいです。簡単にメモしておきます。
いろいろ書いてありますが、LDAPはディレクトリ構造(ツリー型)でデータを管理しているという点が重要です。

|用語  |説明  |
|---|---|
|LDAP| Lightweight Directory Access Protocolの略。ディレクトリ構造でデータを管理している。通常、389番ポートを使用。|
|バックエンドデータベース| アプリに組み込まれたデータベース。OpenLDAPではhdbというバックエンドデータベースがディレクトリツリーの階層構造についての情報を持つ。|
|ベースDN (サフィックス)|ディレクトリサービスの基点となるディレクトリを、ベースDN(サフィックス)という。|
|エントリ|ベース DN を基点としたディレクトリツリー内の、それぞれのデータのこと。|
|属性|エントリに含まれる情報の種類のこと(氏名、所属、メールアドレス等々)。|
|オブジェクトクラス|属性の種類ごとの集まり。エントリに何の属性を含めるか定義するために、オブジェクトクラスをエントリに指定する。|
|LDIFファイル|エントリの情報を記述するファイル。LDAPサーバでデータをやり取りするために使用する。|
|プロバイダ|サーバを冗長構成にしたときの、マスターサーバのこと。|
|コンシューマ|サーバを冗長構成にしたときの、スレーブサーバのこと。|


## 管理者権限について
　構築手順にも登場しますが、管理者権限を持つユーザとして、「設定管理者」と「ディレクトリマネージャー」というユーザが存在します。これらはディレクトリツリーの中に存在します。

・設定管理者(cn=admin,cn=config)はスキーマの追加、モジュールの追加等、LDAP自体の設定管理をする。
・ディレクトリマネージャー(cn=admin,dc=test,dc=org)は全エントリ、ディレクトリ構成の参照・変更権限を持つ。
※ベースDNがdc=test,dc=orgの場合。

## LDAPディレクトリの構成、ACLについて
ディレクトリツリーのイメージを持つために構成例を記載します(ツリーっぽくなくてごめんなさい)。
<img width="913" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/f156aece-3f00-ab04-f620-dd6a53b3c06f.png">

　例えば「"サーバにログインさせたいけどsudo権は与えたくない"というユーザはuserというou名の中に登録しよう。」といった形で管理します。ouとは組織単位のことです(グループみたいなもので、そのouの中にユーザを登録していくイメージ)。
また上のツリーを例にした場合、各ouに対し以下のように役割を決めてディレクトリツリーを作成し、アクセス制限を設定していくのが一般的です。

|OU名  |説明  |
|---|---|
|system  |サーバにログインできるシステムユーザのエントリ  |
|infra  |全環境でsudo権が付与された管理者用ユーザ(LDAP管理、サーバ管理者用)  |
|user  |サーバ内でsudoできない、または環境を制限してsudoが付与されるユーザ  |
|group  |グループのエントリを追加  |
|tool  |Gitや監視ツールなど他のツールもLDAP連携したい場合に備えたツール用ユーザ  |
|tool-admin  |OU=toolのエントリを追加・削除・編集できるツールユーザの管理者  |
|policies  |ポリシーを定めたエントリ  |

また各ディレクトリのACL(アクセス制御)についてもこちらの記事で紹介します。
[・CentOS7でOpenldap構築 - 4.LDAPディレクトリ構成とACLの設定](https://qiita.com/y-araki-qiita/items/bc874aeb40ede9c5368c)

## ldapコマンドについて
Openldapは以下のようなldapコマンドで操作を行います。
### ldapadd,ldapdelete,ldapmodify
ldapadd ： LDAPにエントリを登録する
ldapdelete ： LDAPエントリを削除する
ldapmodify ： LDAPエントリを修正する
　オプションは次の通りです。

|オプション |説明|
|---|---|
|-H <uri> |LDAPサーバを参照するURIを指定する。プロトコル、ホスト、ポートのみ指定できる。 指定しない場合、ldap|//localhost|389となる。 |
|-h <host> |LDAPサーバを指定する。指定しない場合、ローカルホストになる ( 非奨励オプション。-Hの使用を奨励 ) |
|-p <port> |LDAPサーバのポート番号を指定する。指定しない場合、389となる ( 非奨励オプション。-Hの使用を奨励 ) |
|-x |簡易認証設定 |
|-D <binddn> |LDAPサーバの認証に使うDN ( バインドDN ) を指定する。指定しない場合は匿名接続となる。 |
|-w <passwd> |LDAPサーバの認証に使うDNのパスワードを指定する。 |
|-W |LDAPサーバの認証に使うDNのパスワードをプロンプトから入力することを指定する。 |
|-f <file> |LDIFテキストフォーマットファイルを標準入力ではなく、指定したファイルから読み込む。  ※ldapdeleteは利用不可|

### ldapsearch
ldapsearch ： LDAPエントリを検索する
　オプションは次の通りです。

|オプション |説明|
|---|---|
|-H <uri> |LDAPサーバを参照するURIを指定する。プロトコル、ホスト、ポートのみ指定できる。指定しない場合、ldap|//localhost|389となる。 |
|-h <host> |LDAPサーバを指定する。指定しない場合、ローカルホストになる ( 非奨励オプション。-Hの使用を奨励 ) |
|-p <port> |LDAPサーバのポート番号を指定する。指定しない場合、389となる ( 非奨励オプション。-Hの使用を奨励 ) |
|-x |簡易認証設定 |
|-D <binddn> |LDAPサーバの認証に使うDN ( バインドDN ) を指定する。指定しない場合は匿名接続となる。 |
|-w <passwd> |LDAPサーバの認証に使うDNのパスワードを指定する。|
|-W |LDAPサーバの認証に使うDNのパスワードをプロンプトから入力することを指定する。 |
|-s [Scope] |検索範囲を指定します。[Scope]の値は「base」「one」「sub」の３種類です。「base」はBaseDNエントリのみです。「one」はBaseDNエントリ自身と直下のエントリ、「sub」はBaseDN以下全てのエントリを指します。-sに何も指定しなければ「sub」が適用されます。|
|[Filter] |検索フィ ルタを指定します。例えば全てのエントリを抽出するには「(objectclass=)」を指定します。また、cn属性が「tanaka」で終わるエントリを抽出するには「(cn=*tanaka)」とワイルドカードを指定できます。その他、複数のフィルタを組み合わせたAND検索やOR検索も実行できます。例えばcn属性が「tanaka」で終わり、かつcn属性が「taro」で始 まるエントリを抽出するには「(&(cn=*tanaka)(cn=taro))」とAND検索を表す&を使って複数指定できます。OR検索には「」、否定記号には「!」記号を使います。|
|[Attr] |表示対象 とする属性を指定します。例えばあるエントリのtelephonenumber属性値を表示対象にする場合はAttrにtelnephoneNumberを指定します。何も指定しなければ全ての属性値が表示されます。|
|-L |検索結果をLDIFv1フォーマットで表示する |
|-LL  |検索結果をコメントのないフォーマットで表示する |
|-LLL |検索結果をコメント無し、LDIFバージョン表示なしで表示する。|
## バックアップ、リストアについて
以下手順を参照します。
[・CentOS7でOpenldap構築 - 5.バックアップリストアテスト](https://qiita.com/y-araki-qiita/items/ad000141c3fccaef7167)

## 最後に
　Openldapの仕組みについて簡単に記載しました。他にもLDAPアカウントの命名規則や、どのようにログイン管理、sudo管理するかなど、簡単な設計も決めてから環境構築にとりかかるとよいと思います。
次はLDAPサーバ構築手順となります。
[・CentOS7でOpenldap構築 - 2.LDAPサーバ構築手順](https://qiita.com/y-araki-qiita/items/6b2dcbf1a39a969d8024)

## 関連記事
[・CentOS7でOpenldap構築 - 1.Openldapの仕組み](https://qiita.com/y-araki-qiita/items/0c954c3ae25d4ed9dbb8)
[・CentOS7でOpenldap構築 - 2.LDAPサーバ構築手順](https://qiita.com/y-araki-qiita/items/6b2dcbf1a39a969d8024)
[・CentOS7でOpenldap構築 - 3.LDAPクライアント設定手順](https://qiita.com/y-araki-qiita/items/b0f3b291011d1e55d95f)
[・CentOS7でOpenldap構築 - 4.LDAPディレクトリ構成例とACLの設定](https://qiita.com/y-araki-qiita/items/bc874aeb40ede9c5368c)
[・CentOS7でOpenldap構築 - 5.バックアップリストアテスト](https://qiita.com/y-araki-qiita/items/ad000141c3fccaef7167)
[・CentOS7でOpenldap構築 - 6.パスワード有効期限切れ通知スクリプト](https://qiita.com/y-araki-qiita/items/65103497c2ce0ad63d24)