CentOS7でOpenldap構築 - 4.LDAPディレクトリ構成とACLの設定

　OpenldapでLDAP環境を構築した際のディレクトリ構成とACLの設定について記載します。
　今までの記事でひとまずLDAP環境を構築することができました。
　[1.Openldapの仕組み](https://qiita.com/y-araki-qiita/items/0c954c3ae25d4ed9dbb8)
　[2.LDAPサーバ構築手順](https://qiita.com/y-araki-qiita/items/6b2dcbf1a39a969d8024)
　[3.LDAPクライアント設定手順](https://qiita.com/y-araki-qiita/items/b0f3b291011d1e55d95f)

　しかし各自の環境に合ったディレクトリを構成し、ACL(アクセス制御)の設定をすることが運用面で大事になります。
　ディレクトリ構成とACL設定の例を紹介します。

## LDAPディレクトリの構成例
※[1.Openldapの仕組み ](https://qiita.com/y-araki-qiita/items/0c954c3ae25d4ed9dbb8)で紹介したものです。
<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  |ポリシーを定めたエントリ  |

そして[CentOS7でOpenldap構築 - 2.LDAPサーバ構築手順](https://qiita.com/y-araki-qiita/items/6b2dcbf1a39a969d8024)でインストールしたLAM(Ldap Account Manager)で、上図の構成になるよう変更していきます。
※LAMログイン後画面上にある"ツリービュー"から同じ構成にしました。
<img width="268" alt="キャプチャ7.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/a37900b8-2ef4-f420-378f-ac1a8e497dde.png">
　ユーザを追加するときはuidNumberやホームディレクトリが他のユーザと被らないよう修正します。被ってしまうとログイン時に不具合が起きます。またユーザにパスワードを設定したい場合は、userPasswordという属性を追加します。

　そしてLDAPサーバ内で、以下まるまる記載したldifファイルを作成し、
ldapmodify -x -W -D cn=admin,cn=config -f [ファイルパス] でACLの設定変更をします。
ACLの内容は上記表のouごとの役割を反映させたものです。

```
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to dn.children="ou=tool,dc=test,dc=org" attrs=userPassword,shadowLastChange
  by self write
  by anonymous auth
  by dn.children="ou=infra,dc=test,dc=org" write
  by dn.children="ou=tool-admin,dc=test,dc=org" write
  by dn.children="ou=system,dc=test,dc=org" read
  by users none
olcAccess: {1}to dn.children="ou=tool,dc=test,dc=org"
  by self read
  by anonymous read
  by dn.children="ou=infra,dc=test,dc=org" write
  by dn.children="ou=tool-admin,dc=test,dc=org" read
  by dn.children="ou=system,dc=test,dc=org" read
  by users none
olcAccess: {2}to dn.children="ou=tool-admin,dc=test,dc=org" attrs=userPassword,shadowLastChange
  by self write
  by anonymous auth
  by dn.children="ou=infra,dc=test,dc=org" write
  by dn.children="ou=system,dc=test,dc=org" read
  by users none
olcAccess: {3}to dn.children="ou=user,dc=test,dc=org" attrs=userPassword,shadowLastChange
  by self write
  by anonymous auth
  by dn.children="ou=infra,dc=test,dc=org" write
  by dn.children="ou=system,dc=test,dc=org" read
  by users none
olcAccess: {4}to dn.children="ou=user,dc=test,dc=org"
  by self read
  by anonymous read
  by dn.children="ou=infra,dc=test,dc=org" write
  by dn.children="ou=system,dc=test,dc=org" read
  by users none
olcAccess: {5}to dn.children="ou=system,dc=test,dc=org"
  by self read
  by anonymous read
  by dn.children="ou=infra,dc=test,dc=org" write
  by dn.children="ou=system,dc=test,dc=org" read
  by users none
olcAccess: {6}to dn.children="ou=infra,dc=test,dc=org"
  by self write
  by anonymous read
  by dn.children="ou=infra,dc=test,dc=org" write
  by dn.children="ou=system,dc=test,dc=org" read
  by users none
olcAccess: {7}to dn.sub="ou=group,dc=test,dc=org"
  by anonymous read
  by dn.children="ou=infra,dc=test,dc=org" write
  by users read
olcAccess: {8}to dn.sub="ou=policies,dc=test,dc=org"
  by dn.children="ou=infra,dc=test,dc=org" write
  by users read
olcAccess: {9}to *
  by dn.children="ou=infra,dc=test,dc=org" write
  by * read
```
　olcAccessという属性でアクセス制御の設定をします。
上記はolcAccess: {0}から{9}まで10個の設定があります。

例えば先頭の↓の場合、

```
olcAccess: {0}to dn.children="ou=tool,dc=test,dc=org" attrs=userPassword,shadowLastChange
  by self write
  by anonymous auth
  by dn.children="ou=infra,dc=test,dc=org" write
  by dn.children="ou=tool-admin,dc=test,dc=org" write
  by dn.children="ou=system,dc=test,dc=org" read
  by users none
```
これを簡単に翻訳すると、、、

```
0番目のアクセス制御: dnがou=tool,dc=test,dc=org配下のパスワードに関する属性について、
自身は編集可能
匿名ユーザからの参照許可
dnがou=infra,dc=test,dc=org配下の人はは編集可能
dnがou=tool-admin,dc=test,dc=org配下の人は編集可能
dnがou=system,dc=test,dc=org配下の人は読み取り可能
users はアクセスなし
```
という制御になります。

↓は英語ですが詳しく記載しています。
https://www.openldap.org/doc/admin24/access-control.html
　
こちらの設定ひとつひとつを説明するのは、正直しんどいのですが他にも参考になる記事があると思います。

## 最後に
　ディレクトリやACLが少し複雑に見えるかもしれないですが、ここまでの構成にしてれば後々困らないのではという例でした。
次回はバックアップ、リストアテストをします。
[・CentOS7でOpenldap構築 - 5.バックアップリストアテスト](https://qiita.com/y-araki-qiita/items/ad000141c3fccaef7167)

## 関連記事
[・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)