LinuC 202「LDAPクライアントの利用方法」を調べたり、検証したり

「2.07.3 LDAPクライアントの利用方法」の出題内容については以下をご参照ください。
Version 10.0になって少々内容が変更されているようです。

LinuCレベル2 202試験（Version 10.0）出題範囲 | LPI-Japan
https://linuc.org/linuc2/range/202.html

LinuC レベル 1、レベル 2 の出題範囲改定について
https://linuc.org/docs/linuc_ver10.pdf

## この記事のアジェンダ
+ ldapadd, ldapmodify, ldapdeleteの基本的な使い方の流れを紹介
+ ldapsearchの検索フィルタを調べる

## ldapaddの使い方
+ 用途
  - エントリを追加する

+ エントリを追加する流れ
  - slappasswdでパスワード生成
  - ユーザ追加用のLDIFファイルを用意
  - ldapaddでエントリを追加

以下、詳細です。

+ slappasswdでパスワード生成
  - パスワードを2回入力すると、ハッシュ化された値が出力される。
  - この値をLDIFファイルの*userPassword*に設定する。

```
# slappasswd
New password:
Re-enter new password:
{SSHA}QjbCwSeJK5oPFWutzmAuLtFmU6XHJG1I
```

+ ユーザ追加用のLDIFファイルを用意する
  - LDAPディレクトリの情報はLDIF (LDAP Data Interchange Format)という形式で扱うことができる。
  - ↓のようなLDIFファイルを用意する。woodyというユーザを追加することを想定。

*ちなめにこれは「inetOrgPerson」というアドレス帳を扱うオブジェクトクラスの雛形で、
 ホームディレクトリとか割り当てない。

```add_woody.ldif
dn: cn=woody,ou=People,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp
givenName: woody
sn: woody
uid: woody
mail: woody@xxxx.vs.sakura.ne.jp
userPassword:: QjbCwSeJK5oPFWutzmAuLtFmU6XHJG1I
objectClass: inetOrgPerson
objectClass: top
cn: woody
```

<注意点>
- userPasswordはslappasswdで生成した値を設定する。
- {SSHA}は除くのと、userPassword:: にするのを忘れずに。

<LDIFファイルの形式>
- dnは一意の識別名を記載する。
- 後は<属性タイプ>: <属性値>をつらつらと記載する。

*オブジェクトクラスとかスキーマとかの話は別の記事で書く予定

```
dn: <識別名>
<属性タイプ>: <属性値>
<属性タイプ>: <属性値>
~
~
<属性タイプ>: <属性値>
```

+ ldapaddでエントリを追加
LDIFファイルを指定し、ldapaddコマンドでエントリを登録する。

```
# ldapadd -H ldap://127.0.0.1:389 -x -D "cn=Manager,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp" -W -f add_woody.ldif
Enter LDAP Password:
adding new entry "cn=woody,ou=People,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp"
```

- ldapaddオプション
-H: LDAPサーバのURI (ldap://127.0.0.1:389/)
-h: LDAPサーバのホスト -Hオプションの利用が推奨されているらしい
-p: LDAPサーバのポート番号　-Hオプションの利用が推奨されているらしい
-x: SASLを使わない簡易認証
-D: 認証に使うDN(バインドDN)を指定
　　指定がない場合は匿名接続になる
-w: バインドDNのパスワードを指定
-W: 対話的にバインドDNのパスワードを指定
-f: LDIFファイルを指定
-Z: STARTTLSを発行して暗号セッションを開設
-ZZ: STARTTLSを発行して暗号セッションを開設
　　　STARTTLSが効かない場合は処理を行わない

+ ldapsearchで動作確認
ldapsearchコマンドで追加したエントリの情報が取得できればok.

```
# ldapsearch -H ldap://127.0.0.1:389 -x -LLL -D "cn=Manager,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp" -b "ou=People,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp" -W "(uid=woody)"
Enter LDAP Password:
dn: cn=woody,ou=People,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp
givenName: woody
sn: woody
uid: woody
mail: woody@xxxx.vs.sakura.ne.jp
userPassword:: QjbCwSeJK5oPFWutzmAuLtFmU6XHJG1I
objectClass: inetOrgPerson
objectClass: top
cn: woody
```


## ldapmodifyの使い方
+ 用途
  - エントリを変更する

+ エントリを変更する流れ
  - 修正用のLDIFファイルを用意
  - ldapmodifyでエントリを変更

以下、詳細です。

+ 修正用のLDIFファイルを用意
  - ↓のようなLDIFファイルを用意する。woodyユーザにdescription属性の情報を追加する想定。

```modify_woody.ldif
dn: cn=woody,ou=People,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp
changetype: modify
add: description
description: Sheriff Woody is a 1950s pullstring cowboy doll, and Andy's favorite toy.
```

+ エントリ変更の内容は次の3パターンがある
  - 属性追加
 
```
dn: cn=woody,ou=People,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp
changetype: modify
add: description
description: Sheriff Woody is a 1950s pullstring cowboy doll, and Andy's favorite toy.
```

  - 属性修正

```
dn: cn=woody,ou=People,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp
changetype: modify
replace: description
description: Sheriff Woody is a 1950s pullstring cowboy doll, and Andy's favorite toy. Appearing in all four Toy Story films, he usually acts as the leader of Andy's toy group.
```

  - 属性削除
 
```
dn: cn=woody,ou=People,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp
changetype: modify
delete: description
```

+ ldapmodifyでエントリを変更
  - woodyユーザにdescription属性の情報を追加する。
  - ldapmodifyのオプションはldapaddのオプションと同じものが使える。

```
# ldapmodify -H ldap://127.0.0.1:389 -D "cn=Manager,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp" -W -f /root/ldap_work/modify_woody.ldif
Enter LDAP Password:
modifying entry "cn=woody,ou=People,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp"
```

+ ldapsearchで動作確認
ldapsearchコマンドで変更したエントリの情報が取得できればok.
*description属性が追加されている

```
# ldapsearch -H ldap://127.0.0.1:389 -x -LLL -D "cn=Manager,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp" -b "ou=People,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp" -W "(uid=woody)"
Enter LDAP Password:
dn: ou=People,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp,ou=People,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp
givenName: woody
sn: woody
uid: woody
mail: woody@xxxx.vs.sakura.ne.jp
userPassword:: QjbCwSeJK5oPFWutzmAuLtFmU6XHJG1I
objectClass: inetOrgPerson
objectClass: top
cn: woody
description: Sheriff Woody is a 1950s pullstring cowboy doll, and Andy's favor
 ite toy.
```


## ldapdeleteの使い方
+ 用途
  - エントリを削除する

+ ldapdeleteでエントリを削除
  - woodyユーザを削除する。
  - ldapdeleteのオプションはldapadd, ldapmodifyのオプションと同じものが使える。

```
# ldapdelete -H ldap://127.0.0.1:389 -D "cn=Manager,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp" -W "cn=woody,ou=People,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp"
  Enter LDAP Password:
```

+ ldapsearchで動作確認
ldapsearchコマンドでエントリの情報が取得できないことを確認できればok.

```
# ldapsearch -H ldap://127.0.0.1:389 -x -LLL -D "cn=Manager,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp" -b "ou=People,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp" -W "(uid=woody)"
  Enter LDAP Password:
```


## ldapsearchの検索フィルタ
+ 用途
  - エントリを検索する

+ ldapsearchオプション
-L: LDIFv1のフォーマットで表示
-LL: コメントなしで表示
-LLL: コメントなし、LDIFバージョンなしで表示
-b: ベースDNを指定
-Z: STARTTLSを発行して暗号セッションを開設
-ZZ: STARTTLSを発行して暗号セッションを開設
　　　STARTTLSが効かない場合は処理を行わない

*ldapadd, ldapmodify, ldapdeleteと少しオプションが違う

+ ldapsearch検索フィルタ
  - 通常: (<属性タイプ>=<属性値>)
  - AND条件: (&(<属性タイプ>=<属性値>)(<属性タイプ>=<属性値>))
  - OR条件: (|(<属性タイプ>=<属性値>)(<属性タイプ>=<属性値>))