LDAPの用語や概念について纏める。

#用語と概念#

・**識別名**

ディレクトリツリー内のエントリを識別するには、識別名を使う。
ツリー構造の*末尾から*「,」でつないだものです。

`uid=linucuser,ou=education,dc=linuc,dc=jp`

・**LDIF**

ディレクトリ内の情報は、LDIFというテキストファイルで表現する。1行目は識別名です。

```
dn: uid=linucuser,ou=education,dc=linuc,dc=jp
uid: linucuser
objectclass: posixAccount
cn: linucuser
uidNumber: 700
gidNumber: 700
homeDirectory: /home/linucuser
loginShell: /bin/bash
```

・**オブジェクトクラス**

エントリが表す具体的ものの種類や、エントリで利用できる属性を定義したもので、何らかのオブジェクトクラスに属する。
（例）
組織：organization
ユーザーアカウント：account
国：country

・**スキーマ**

オブジェクトクラスや属性の定義。
LDAPでは様々なスキーマが予め用意されているので、一般的な用途では個別に定義しなくても良い。
`/etc/openldap/schema`に格納される。

|スキーマファイル|説明|
|---|---|
|core.schema|OpenLDAPで必須のスキーマ|
|cosine.schema|ディレクトリサービスのX.500規格で規定された属性が定義されたスキーマ|
|inetorgperson.schema|アドレス帳など個人情報を扱うためのスキーマ|
|nis.schema|UNIX/Linuxのユーザーやグループ情報を扱うためのスキーマ|

・**オブジェクト識別子**

オブジェクトラスや属性には、オブジェクト識別子が割り当てられる。
OIDは重複しないようにIANAで管理されている。

・**ホワイトページ**

個人別電話帳のことです。
作成するには、inetorgperson.schema で定義されている inetOrgPerson を利用するのが一般的です。

|属性|説明|
|---|---|
|cn|一般名(common name)|
|sn|苗字|
|mail|メールアドレス|
|o|組織名|
|ou|組織単位名|
|streetAddress|住所|
|postalCode|郵便番号|
|telephoneNumber|電話番号|
|description|説明|

#OpenLDAPの設定#

- デーモンは、**slapd** です。
- かつては、**/etc/openldap/ldap.conf** を利用、現在は、**/etc/openldap/slapd.d/.ldif** 以下に設定が格納され、OpenLDAPサーバーユーティリティコマンドを使って、動的に変更できるようになっている。

|OpenLDAPサーバーユーティリティコマンド|説明|
|---|---|
|slapadd|エントリを追加する|
|slapcat|内容をLDIF形式で出力する|
|slapindex|インデックスを再構築する|
|slappasswd|暗号化されたパスワードを生成する|
|slaptest|LDAPサーバーの設定をチェックする|

**slappasswd** でOpenLDAPサーバー管理者パスワードを生成してLDAPデータベースに登録します。

```
# slappasswd
```

生成されたパスワードを含むLDIFエントリを作成します。

```setrootpass.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: ************
```

このLDIFエントリを **ldapadd** でLDAPデータベースに登録します。

```
# ldapadd -Y EXTERNAL -H ldapi:/// -f setrootpass.ldif
```

ベースDNを設定します。管理するLDAPエントリの最上位となるのが、ベースDNです。
ここでもLDIFファイルを作成します。設定を変更することになるので、**ldapmodify** を使います。

```modify_basedn.ldif
dn: cn=ToModify,dc=example,dc=com
changetype: Modify
........
```

```
# ldapmodify -x -D cn=config -W -f modify_basedn.ldif
```

上記のLDAPデータベース管理者パスワードを設定します。（先のサーバー管理者とは別です。）
**slappasswd** を実行し、そのパスワードを記載したLDIFファイルを作成します。

```setMangerpass.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: ************
```

管理者パスワードを登録します。

```
# ldapadd -Y EXTERNAL -H ldapi:/// -f setMangerpass.ldif
```

LDAPデータベースのスキーマを拡張します。後にユーザーを登録するのに必要になります。

```
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
```

テストとして、Linuxユーザーアカウントを登録してみます。次のようなLDIFファイルを作成します。

```test.ldif
dn: dc=thinkit,dc=co,dc=jp
objectClass: dcObject
dc: linuc
............
```

LDAPデータに登録します。

```
# ldapadd -x -D "cn=MAnger,d =linuc,dc=jp" -W -f test.ldif
```

**slapcat** でLDAPデータベースの内容がLDIF形式で出力されます。

```
# slapcat
```

**slapadd** で、LDIFデータをLDAPデータベースに登録できます。
つまり、slapcatを使って、LDAPデータベースのバックアップをとり、slapaddでリストアできます。

```
# slapcat > ldapdb.ldif
# slapadd -l ldapdb.ldif
```

データベースをリストアした後は、**slapindex** を実行してデータベースのインデックスを再構築できます。

```
# slapindex
```


#LDAPのアクセス制御#

`olcAccess: to アクセス制御対象 by アクセス許可対象 アクセスレベル`

|アクセス制御対象|説明|
|---|---|
|*|すべてのエントリ|
|attrs=属性|指定した属性のみ|
|dn=DN|指定したdnのみ|

|アクセス許可対象|説明|
|---|---|
|*|すべてのユーザー|
|anonymous|認証前のユーザー|
|users|認証されたユーザー|
|self|接続中の認証済みユーザー自身|
|dn[.範囲]=DN|指定したDNのユーザー|

|アクセス許可対象の範囲|説明|
|---|---|
|exact|完全一致|
|base|ベースDNで指定されたエントリのみ|
|one|ベースDNで指定されたエントリとその直下|
|sub|ベースDNで指定されたエントリとその下にある全エントリ|

|アクセスレベル|説明|
|---|---|
|manage|すべて可能|
|write|属性値を変更できる|
|read|検索結果を参照できる|
|search|検索できる|
|compare|比較できる|
|auth|認証を受けることができる|
|disclose|エラー情報が出る|
|none|アクセスできない|

アクセス制御がされていない場合は、すべてのユーザーがすべてのエントリを読み込むことができる。
ただし、エントリの更新はrootdnだけが可能。

##LDAPクライアント##

|LDAPクライアント|説明|
|---|---|
|ldapadd|エントリを追加する|
|ldapsearch|エントリを検索する|
|ldapdelete|エントリを削除する|
|ldapmodify|エントリを変更する|
|ldappasswd|パスワードを変更する|

|LDAPクライアントのオプション|説明|
|---|---|
|-h|LDAPサーバを指定する|
|-H|LDAPサーバをURIで指定する|
|-x|SASLを使わずに簡易認証を用いる|
|-p|LDAPのポートを指定する。389|
|-D|LDAPサーバでの認証に使用するバインドDNを指定する|
|-W|認証時のパスワードを対話的に入力する|
|-w|認証に使用するパスワード指定する|
|-f|データファイル指定する|
|-b|LDAPサーバの検索をするベースDNを指定する|

|ldapsearchのオプション|説明|
|---|---|
|-b|検索を開始するベースDNを指定する|
|-L|検索結果をLDIFv1形式で表示する|
|-LL|検索結果をコメントなしの形式で表示する|
|-LLL|検索結果をコメントとLDAPバージョン表示なしで表示する|

|ldapmodifyの属性|説明|
|---|---|
|add|追加|
|replace|修正|
|delete|削除|

|ldappasswdのオプション|説明|
|---|---|
|-b|検索を開始するベースDNを指定する|
|-s|新しいパスワードを指定する|
|-S|新しいパスワードを対話的に入力する|