LPIC 300 ①LDAPの基礎

LPIC2の有効期限が来るのでLPIC3を取得することにした。
300を選んだのは最近セキュリティ対応でLDAPに触れたので、古い技術だけどちょうどよいかなと…

# LDAPとは
ディレクトリサービス。情報を階層構造で格納する仕組み。
もとはITU-T勧告のDAP（Directory Access Protocol）だが、複雑で重いのでLightweightなDAPがつくられた（LDAP）  
LDAPのOSS実装がOpen LDAP

# LDAPの概念
- エントリ  構成要素を指す
- attribute 属性  各エントリがもつ値 属性名=値 で持つ
- オブジェクトクラス  
    - 各エントリがどのオブジェクトクラスに属するかによって保持するattributeが変わってくる。エントリの種別を表すもの  
    - オブジェクトクラスも階層化されており抽象クラスのtopを頂点とした階層構造になっている
### オブジェクトクラスの種類
- 抽象クラス テンプレート的なもの。top配下に予め定義された構造型クラスと、その補助クラスがある。
### スキーマ
- オブジェクトクラスとattributeはスキーマで定義され、一意のOIDを持つ。新しいクラスを定義したらOIDを取得する必要がある。


# LDIF（LDAP Data Interchange Format）
エントリを記述する様式。  
attribute ：値 の形式で記載するテキストファイル

- ldapaddコマンドで読み込むとディレクトリにデータ格納できる
- ldapsearch -b検索位置 検索条件 -s 検索スコープ  
ディレクトリを検索する  
  検索スコープ
  - base（自分の階層）
  - one ひとつ下まで
  - sub 配下すべて
  - children ひとつ下からすべて
- ldapmodify  更新
- ldapmodrdn  RDN(relative distinguished name）属性を変更するためのコマンド    
 ldapmodifyでは識別名に使われている属性は変更できず、専用のコマンドとなる
- ldapdelete 削除
 

# LDAPの設定
slapd を使う 
tcp 389番/636（ssl）がデフォルト

## slapd.conf

  - database bdbまたはhdb データベースはファイル化されてdirectoryの下に置かれる
  - suffix このサーバが管理するDNの最上位階層を記述
  - rootdn 何でもできる管理者のdn
  - rootpw LDAPサーバにroot dnで接続するためのパスワードをここに記載する。ハッシュ値か平文 slappasswd でハッシュつくれる
  - index 
  
### slaptest
slapd.conf の適合性チェックを行う。

- -f ファイルを指定
- -v verboseモード

## アクセスコントロール ACL
LDAPの各エントリへのアクセス権を設定するための機能。  
slapd.conf の access ディレクティブで設定する。

`access to hoge by fuga 権限`  

- defaultaccess も設定できる。設定しない場合は  * by * read 権限

- ssf security strength factor  
LDAPへの接続の保護状況を数値化するもの ssfの値が大きければ、アクセス許可を広くする、などの使い方ができる。
desよりも3desやaesの方が値が大きい。


## レプリケーション
一つのLDAPサーバでは捌けないときにスレーブサーバを作って複製を置く  
古い slurpd を使う方式と 同期レプリケーションの2つの方法がある

### slurpd（Standalone LDAP Update Replication Daemon）
 - マスタの更新をスレーブにコピーするだけどのだけのシンプルなレプリカ
 - マスタ側で起動する
 - マスタとスレーブの初期状態が同一である必要があるので、最初にrsyncとかでdatabaseをスレーブにコピーしておく
 - 整合性が取れずにレプリカに失敗すると .rej（reject）ファイルができる。このファイルをワンショットで更新させることも可能（-m -r ファイル名 オプション）  

### syncrepl
 - スレーブ側がマスタ側に接続に行って同期する方式。差分管理がなされるのでスレーブの初期状態が空っぽでもOK
 - マスタ側をプロバイダ、スレーブ側をコンシューマと呼ぶ



## 暗号化とセキュリティ
openldapの簡易認証（-x オプション）は平文のため、下記いずれかの方法で暗号化が可能。

## SASL（Simple Authentication and Security Layer ）
認証のみ暗号化するための機能。  
コンパイル時にsaslを有効にしておく必要がある  
saslを利用する場合はsasldbにアカウントを登録する。
- saslpasswdを用いて登録する

saslのユーザをすでにディレクトリに存在するユーザとマッピングするにはslapd.confでsasl-regexp を書く  
- 双方のユーザを正規表現で複数連続してマッピングさせることが可能


## SSL/TLS
LDAP通信そのものをSSL化する  
利用するポート番号は `TCP636`  

コマンドでLDAPサーバを起動する際 `-h ldaps:///` をつける   
制御時は `-H ldaps://ホスト名`  とする


## startTLS
LDAPサーバがSSLで待ち受けていない場合でも、クライアント側からSSL通信を要求できる方式  
クライアントで制御コマンド利用時に `-Z` とする

## クライアント認証
SSLの際にLDAPサーバがLDAPクライアントを認証する仕組み  

    TLSVerifyClient demand/true/hard

# インデックス
- 検索を早めるための設定

```
index <属性名> <インデックスの種類>
 
- 存在インデックス ある値があるかどうかの検索用 pres（ent）
- 透過インデックス 特定の条件に当てはまるエントリの検索用 eq（ual）
- 近似インデックス 似ている値の検索用、似ているとは英語のスペル・発音的に。approx
- 部分文字列インデックス sub 1バイト文字選定であることに注意  
```

- 作成するインデックスの種類をslapd.confに記載の後、`slapindex`コマンドで作成する  
- どんなインデックスを作成したら良いのかは、slapdのsyslogから学べる。

# キャッシュ
検索性能向上のための設定

```
cachesize キャッシュするエントリ数  
idlcachesize キャッシュするインデックス数
```
    
# バックエンドデータベース
LDAPのバックエンドデータベースとしてはBarkley DB（BDB）が用いられる
## DB_CONFIG
- BDBの設定ファイル  
- slapd.confの`database`で指定したフォルダにファイルとして置く  
- 更新性能向上のためにチューニングできる

```
set_cachesize    : DBキャッシュサイズ
set_lg_bsize     : ログの書き込みバッファサイズ
set_lg_max       : ログファイルサイズ
set_lg_regionmax : ログを管理するために使用する領域サイズ
```

## BDB関連コマンド
- slapd_db_stat
- slapd_db_verify  等がある