Akira's Tech Notes

Java/JVM | GNU/Linux | Emacs/Lisp | 知的好奇心駆動

header-icon
ネイティブでない日本語で思い付くことや気になることをダラダラ書く、体裁とかは気にしない。読みづらいと感じた時に随時更新する。

[レシピ]LDAPサーバの構築

夏休み中にOpenLDAPの構築復習を行いました。ここでメモしておきます。

1 知識のおさらい

1.1 用語

  • LDAP: Lightweight Directory Access Protocol、ディレクトリ・サービス ツリー構造、検索中心としたサービス
  • DIT: Directory information Tree、ディレクトリ情報ツリー
  • DN: Distinguished Name、ツリーの頂点に向かって全てのエントリを表す主キーのようなもの
  • エントリ: LDAPに保存されるデータのこと
  • ObjectClass: エントリの種類、エントリにどんな情報を持たせるかの定義、一つエントリに 複数ObjectClasの指定は可能です。また、ObjectClass自身は構造型(Structural)と補助型 (Auxiliary)の2種類があります、各エントリは少なくても1つの構造型ObjectClassに属する 必要があります

1.2 LDAPの役割

  • ユーザ情報参照機能
  • ユーザ認証機能

1.3 LDAPへ接続時(バインド)の認証方式

  • 簡易認証: 接続時のユーザDNに加えてパスワードが平文でLDAPサーバに送られる、そのため SSL/TLSで通信経路の暗号化しておく必要があります。
  • SASL認証: Simple Authentication and Security Layer、外部の認証システム(モジュール) に認証処理を委譲する。ただし、LDAP内のエントリのDNと外部認証システムのユーザ識別子 のマッピング定義が必要となります。

1.4 LDAPによるLinuxのログイン認証

  • ログイン認証をLDAPサーバに委譲するためにPAMモジュールにpam_ldapを利用します。また、 pam_ldapの仕様上LDAP認証バインド時に簡易認証しかできない。
  • LDAPで認証させるために、ログインユーザIDでLDAP認証バインドを行う

認証メカニズム、Linuxサーバでpam_ldapmoモジュールでSSHクライアントから入力されたユーザ IDとパスワードをLDAPサーバに認証バインドを実施する。

                   userid:akira               dn    : uid=akira,ou=User,dc=jizai-domain,dc=jp
                   passwd:xxxxxx              passwd: xxxxxx
+---------------+                +-------------+                    +------------+
|SSHクライアント+--------------->| Linuxサーバ +------------------->| LDAPサーバ |
+---------------+   ログイン     +-------------+  LDAP認証バインド  +------------+

1.5 LDAPによるSambaサーバのユーザ認証

認証メカニズム、Sambaサーバは管理者権限でWindows PCから入力されたユーザIDを検索条件で LDAPサーバから該当ユーザのパスワード情報を取得して、比較を行う。

                   userid:akira               rootdn: uid=Manager,dc=jizai-domain,dc=jp
                   passwd:xxxxxx              passwd: xxxxxx
+---------------+                +-------------+                    +------------+
|Windows PC     +--------------->| Sambaサーバ +<-------------------| LDAPサーバ |
+---------------+   ユーザID     +-------------+   管理者権限で     +------------+
                    パスワード     パスワード      LDAP認証バインドして、
                                   確認を行う      ユーザパスワード情報を取得する

簡易認証時のtcpdumpの結果


1.6 LDAPデータ構造サンプル

ルートエントリ直下の cn=Manager エントリはrootdnと呼ばれる、LDAPの特権ユーザです。 このユーザでLDAPとバインドすると任意のデータ操作が可能になります。rootdnエントリは /etc/openaldap/slapd.conf にて定義される、実際にDITになくてもよいです。

                            ┏━━━━━━━━━━━┓
                            ┃dc=jizai-domain,dc=jp ┃
                            ┗━━━━━┳━━━━━┛
                                        ┃
                    ┏━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━┓
                    ┃                  ┃                                            ┃
            ┏━━━┻━━┓    ┏━━━┻━━━┓                          ┏━━━━┻━━━┓
    rootdn→┃ cn=Manager ┃    ┃o=Linux Users ┃                          ┃ o=Samba Users  ┃ ← アプリケーション毎に分ける管理する
特権ユーザ  ┗━━━━━━┛    ┗━━━┳━━━┛                          ┗━━━━┯━━━┛
                                        ┃                                            │
                          ┏━━━━━━┻━━━━━━━┓                            │
                    ┏━━┻━━┓              ┏━━━┻━━┓            Sambaサーバユーザ情報
                    ┃ou=User   ┃              ┃ ou=Group   ┃
                    ┗━━┳━━┛              ┗━━━┳━━┛
                  ┏━━━┻━━┓              ┏━━━┻━━━┓
            ┏━━┻━━┓┏━━┻━━┓  ┏━━┻━━┓  ┏━━┻━━┓
            ┃uid=user01┃┃uid=user02┃  ┃cn=group01┃  ┃cn=group02┃
            ┗━━━━━┛┗━━━━━┛  ┗━━━━━┛  ┗━━━━━┛

※ユーザとグループの紐付けはユーザエントリやグループエントリの属性値に表現される。

ルートエントリの定義

dn: dc=jizai-domain,dc=jp
dc: jizai-domain             ★ dcObjectの属性
o: jizai-domain Corporation  ★ organizationの属性
objectClass: dcObject
objectClass: organization

rootdnの定義

dn: cn=Manager,dc=jizai-domain,dc=jp
cn: Manager
objectClass: organizationalRole

Linux系ユーザとSamba系ユーザの親エントリの定義

dn: o=Linux Users,dc=jizai-domain,dc=jp
o: Linux Users
objectClass: organization

dn: o=Smaba Users,dc=jizai-domain,dc=jp
o: Smaba Users
objectClass: organization

Linuxユーザとグループの親エントリの定義

dn: ou=User,o=Linux Users,dc=jizai-domain,dc=jp
ou: User
objectClass: organizationalUnit

dn: ou=Group,o=Linux Users,dc=jizai-domain,dc=jp
ou: Group
objectClass: organizationalUnit

Linuxユーザのエントリ定義

# --- user01 ---
dn: uid=user01,ou=User,o=Linux Users,dc=jizai-domain,dc=jp
uid: user01                 ★accountオブジェクトの属性
cn: Test User01
uidNumber: 5001
gidNumber: 3001
homeDirectory: /home/user01
loginShell: /bin/bash
userPassword: P@ssw0rd      ★パスワードが平文で登録される
gecos: Test User No01       ★ユーザのフルネーム
shadowLastChange: 0         ★パスワードの最終更新日
shadowMin: 0                ★パスワード変更可能になるまでの日数
shadowMax: 99999            ★パスワードの有効期限日数
shadowWarning: 7            ★パスワード期限切れ警告表示開始日数
objectClass: account        ★構造型ObjectClass
objectClass: posixAccount   ★補助型ObjectClass
objectClass: shadowAccount  ★補助型ObjectClass

# --- user02 ---
dn: uid=user02,ou=User,o=Linux Users,dc=jizai-domain,dc=jp
uid: user02
cn: Test User02
uidNumber: 5002
gidNumber: 3002
homeDirectory: /home/user02
loginShell: /bin/bash
userPassword: {SSHA}KpJwwA2Sbt29GGNZxdasq5XRml6J5q2Z   ★Salted SHA-1方式で暗号化された
gecos: Test User No02  ★ユーザのフルネーム
shadowLastChange: 0    ★パスワードの最終更新日、0で指定すると初回ログイン時にパスワードの変更を求めます
shadowMin: 0           ★パスワード変更可能になるまでの日数
shadowMax: 99999       ★パスワードの有効期限日数
shadowWarning: 7       ★パスワード期限切れ警告表示開始日数
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount

userPasswordの暗号化文字列は次のコマンドで得ることができる。

$ slappasswd -h {SSHA} -s P@ssw0rd
{SSHA}KpJwwA2Sbt29GGNZxdasq5XRml6J5q2Z

$ slappasswd -h {SMD5} -s P@ssw0rd
{SMD5}AIZvIadIpJbgKPQ7DtjZ4U6xBVY=

-h の後ろに暗号化方式を指定する。j

Linuxグループのエントリ定義

#--- group01 ---
dn: cn=group01,ou=Group,o=Linux Users,dc=jizai-domain,dc=jp
cn: group01
gidNumber: 3001
objectClass: posixGroup

#--- group02 ---
dn: cn=group02,ou=Group,o=Linux Users,dc=jizai-domain,dc=jp
cn: group02
gidNumber: 3002
memberUid: 5001  ★group02をuser01のセカンドグループとして使う
objectClass: posixGroup

1.7 よく使用するObjectClass

スキーマ ObjectClass 用途
core dcObject ルートの定義
  organization アプリケーションの区分に使用
  organizationalRole rootdn定義に使用
  organizationalUnit ユーザ情報とグループ情報の区別に使用
consine account ユーザID定義に使用する
nis posixAccount POSIXユーザ定義に使用する
  shadowAccount パスワード定義に使用する
  posixGroup グループ定義に使用する

ユーザのプライマリグループはposixAccountのgidNumber属性にて指定する、セカンドグ ループはposixGroupのmemberUidにて指定する。posixGroupのmemberUidは複数指定可能。

そのなか汎用的な属性

属性名 説明
dc Domain Component/ ドメイン名の要素
o Organization/ 組織名
ou OrganizationUnit/ 部署名
cn Common Name/ 氏名

1.8 ldapsearchの使い方

アクセスコントロール設定でユーザ毎に検索結果の絞り込みが可能です。 以下は簡易認証を用いた検索のコマンド書式です。

$ ldapsearch -x -D <バインドDN> -b <サーチベース> -s <スコープ> -w <パスワード> <検索フィルタ> <取得する属性>
  • -x 簡易認証でバインドする
  • -D 認証バインドで使用するDNの指定
  • -b サーチベース、検索の起点とするエントリの指定
  • -s 検索スコープの指定
  • -w 簡易認証のパスワード指定、 -W (大文字)で指定した場合、対話式でパスワードの が求められる

指定可能な検索スコープ

スコープ 説明
base サーチベース自身に対して検索する
one サーチベース直下のエントリを検索する
sub サーチベースを含むその下の全てのエントリを検索する
children subの範囲からサーチベースを除く

検索フィルタの組み合わせ方法

記法 意味
(&(A)(B)) A and B
(|(A)(B)) A or B
(!(A)) not A

user01 の定義を検索する例

$ ldapsearch -x -D "cn=Manager,dc=jizai-domain,dc=jp" -b "dc=jizai-domain,dc=jp" "uid=user01" -W -LLL
Enter LDAP Password: 
dn: uid=user01,ou=User,dc=jizai-domain,dc=jp
uid: user01
cn: Test User 01
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword:: dXNlcjAx  ★Base64形式で表示される
loginShell: /bin/bash
uidNumber: 5001
gidNumber: 3001
homeDirectory: /home/user01

-LLL オプションは検索結果以外の余計な除法を落とすオプションです。

匿名で検索する例

$ ldapsearch -x -b "dc=jizai-domain,dc=jp" "(cn=group01)" -LLL
dn: cn=group01,ou=Group,dc=jizai-domain,dc=jp
objectClass: posixGroup
cn: group01
gidNumber: 3001

1.9 ldapaddの使い方

ldapadd エントリ登録するためのコマンドです。以下はLDAPに新規登録するエントリの定義ファ イル 01.base.ldif-f オプションで指定して登録する例です。

$  ldapadd -x -D "cn=Manager,dc=jizai-domain,dc=jp" -W -f 01.base.ldif
Enter LDAP Password: 
adding new entry "o=Linux Users,dc=jizai-domain,dc=jp"

adding new entry "o=Smaba Users,dc=jizai-domain,dc=jp"

adding new entry "ou=User,o=Linux Users,dc=jizai-domain,dc=jp"

adding new entry "ou=Group,o=Linux Users,dc=jizai-domain,dc=jp"

ldapadd コマンド実行時のログ

2014-08-13T14:43:35+09:00 pipi local4 debug slapd[172]:  conn=1044 fd=10 ACCEPT from IP=[::1]:58644 (IP=[::]:389)
2014-08-13T14:43:35+09:00 pipi local4 debug slapd[172]:  conn=1044 op=0 BIND dn="cn=Manager,dc=jizai-domain,dc=jp" method=128
2014-08-13T14:43:35+09:00 pipi local4 debug slapd[172]:  conn=1044 op=0 BIND dn="cn=Manager,dc=jizai-domain,dc=jp" mech=SIMPLE ssf=0
2014-08-13T14:43:35+09:00 pipi local4 debug slapd[172]:  conn=1044 op=0 RESULT tag=97 err=0 text=
2014-08-13T14:43:35+09:00 pipi local4 debug slapd[172]:  conn=1044 op=1 ADD dn="o=Linux Users,dc=jizai-domain,dc=jp"
2014-08-13T14:43:35+09:00 pipi local4 debug slapd[172]:  conn=1044 op=2 ADD dn="o=Smaba Users,dc=jizai-domain,dc=jp"
2014-08-13T14:43:35+09:00 pipi local4 debug slapd[172]:  conn=1044 op=1 RESULT tag=105 err=0 text=
2014-08-13T14:43:35+09:00 pipi local4 debug slapd[172]:  conn=1044 op=3 ADD dn="ou=User,o=Linux Users,dc=jizai-domain,dc=jp"
2014-08-13T14:43:35+09:00 pipi local4 debug slapd[172]:  conn=1044 op=2 RESULT tag=105 err=0 text=
2014-08-13T14:43:35+09:00 pipi local4 debug slapd[172]:  conn=1044 op=4 ADD dn="ou=Group,o=Linux Users,dc=jizai-domain,dc=jp"
2014-08-13T14:43:35+09:00 pipi local4 debug slapd[172]:  conn=1044 op=3 RESULT tag=105 err=0 text=
2014-08-13T14:43:35+09:00 pipi local4 debug slapd[172]:  conn=1044 op=5 UNBIND
2014-08-13T14:43:35+09:00 pipi local4 debug slapd[172]:  conn=1044 op=4 RESULT tag=105 err=0 text=
2014-08-13T14:43:35+09:00 pipi local4 debug slapd[172]:  conn=1044 fd=10 closed

1.10 ldapdeleteの使い方

ldapdelete コマンドでLDAPに登録されたエントリの削除することができる。 -r オプショ ンでサブツリーを含めて削除することも可能です。

$ ldapdelete -x -W -D "cn=Manager,dc=jizai-domain,dc=jp" "ou=User,dc=jizai-domain,dc=jp" -r

以下は実行時のログです。

2014-08-13T00:05:27+09:00 pipi local4 debug slapd[172]:  conn=1027 fd=10 ACCEPT from IP=[::1]:58548 (IP=[::]:389)
2014-08-13T00:05:27+09:00 pipi local4 debug slapd[172]:  conn=1027 op=0 BIND dn="cn=Manager,dc=jizai-domain,dc=jp" method=128
2014-08-13T00:05:27+09:00 pipi local4 debug slapd[172]:  conn=1027 op=0 BIND dn="cn=Manager,dc=jizai-domain,dc=jp" mech=SIMPLE ssf=0
2014-08-13T00:05:27+09:00 pipi local4 debug slapd[172]:  conn=1027 op=0 RESULT tag=97 err=0 text=
2014-08-13T00:05:27+09:00 pipi local4 debug slapd[172]:  conn=1027 op=1 SRCH base="ou=User,dc=jizai-domain,dc=jp" scope=1 deref=0 filter="(objectClass=*)"
2014-08-13T00:05:27+09:00 pipi local4 debug slapd[172]:  conn=1027 op=1 SRCH attr=1.1
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=2 SRCH base="uid=user01,ou=User,dc=jizai-domain,dc=jp" scope=1 deref=0 filter="(objectClass=*)"
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=2 SRCH attr=1.1
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=2 SEARCH RESULT tag=101 err=0 nentries=0 text=
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=1 SEARCH RESULT tag=101 err=0 nentries=5 text=
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=3 DEL dn="uid=user01,ou=User,dc=jizai-domain,dc=jp"    ★削除さエントリ
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=3 RESULT tag=107 err=0 text=
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=4 SRCH base="uid=user02,ou=User,dc=jizai-domain,dc=jp" scope=1 deref=0 filter="(objectClass=*)"
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=4 SRCH attr=1.1
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=4 SEARCH RESULT tag=101 err=0 nentries=0 text=
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=5 DEL dn="uid=user02,ou=User,dc=jizai-domain,dc=jp"
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=5 RESULT tag=107 err=0 text=
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=6 SRCH base="uid=user03,ou=User,dc=jizai-domain,dc=jp" scope=1 deref=0 filter="(objectClass=*)"
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=6 SRCH attr=1.1
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=7 DEL dn="uid=user03,ou=User,dc=jizai-domain,dc=jp"
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=6 SEARCH RESULT tag=101 err=0 nentries=0 text=
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=8 SRCH base="uid=hoge01,ou=User,dc=jizai-domain,dc=jp" scope=1 deref=0 filter="(objectClass=*)"
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=8 SRCH attr=1.1
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=7 RESULT tag=107 err=0 text=
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=9 DEL dn="uid=hoge01,ou=User,dc=jizai-domain,dc=jp"
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=8 SEARCH RESULT tag=101 err=0 nentries=0 text=
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=10 SRCH base="uid=hoge02,ou=User,dc=jizai-domain,dc=jp" scope=1 deref=0 filter="(objectClass=*)"
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=10 SRCH attr=1.1
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=10 SEARCH RESULT tag=101 err=0 nentries=0 text=
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=9 RESULT tag=107 err=0 text=
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=11 DEL dn="uid=hoge02,ou=User,dc=jizai-domain,dc=jp"
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=11 RESULT tag=107 err=0 text=
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=12 DEL dn="ou=User,dc=jizai-domain,dc=jp"
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=13 UNBIND
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 op=12 RESULT tag=107 err=0 text=
2014-08-13T00:05:28+09:00 pipi local4 debug slapd[172]:  conn=1027 fd=10 closed

1.11 ldapmodifyの使い方

modify_top.ldif に変更内容を記述する

$ cat modify_top.ldif
dn: dc=jizai-domain,dc=jp
changetype: modify
replace: o                    ★変更対象属性
o: jizai-domain Corporation   ★変更内容
-                             ★複数変更対象間のセパレーター
add: description
description: this is my first test suffix

ldapmodify コマンドで変更を実施する

$ ldapmodify -x -W -D "cn=Manager,dc=jizai-domain,dc=jp" -f modify_top.ldif
Enter LDAP Password: 
modifying entry "dc=jizai-domain,dc=jp"

以下は変更時の動作ログです。

2014-08-13T00:20:58+09:00 pipi local4 debug slapd[172]:  conn=1036 fd=10 ACCEPT from IP=[::1]:58557 (IP=[::]:389)
2014-08-13T00:20:58+09:00 pipi local4 debug slapd[172]:  conn=1036 op=0 BIND dn="cn=Manager,dc=jizai-domain,dc=jp" method=128
2014-08-13T00:20:58+09:00 pipi local4 debug slapd[172]:  conn=1036 op=0 BIND dn="cn=Manager,dc=jizai-domain,dc=jp" mech=SIMPLE ssf=0
2014-08-13T00:20:58+09:00 pipi local4 debug slapd[172]:  conn=1036 op=0 RESULT tag=97 err=0 text=
2014-08-13T00:20:58+09:00 pipi local4 debug slapd[172]:  conn=1036 op=1 MOD dn="dc=jizai-domain,dc=jp"
2014-08-13T00:20:58+09:00 pipi local4 debug slapd[172]:  conn=1036 op=1 MOD attr=o description   ★変更や追加された属性
2014-08-13T00:20:58+09:00 pipi local4 debug slapd[172]:  conn=1036 op=1 RESULT tag=103 err=0 text=
2014-08-13T00:20:58+09:00 pipi local4 debug slapd[172]:  conn=1036 op=2 UNBIND
2014-08-13T00:20:58+09:00 pipi local4 debug slapd[172]:  conn=1036 fd=10 closed

1.12 slapindexの使い方

slapindexslapd.conf 設定ファイルに定義されたインデックスメタ情報を元にインデッ クスの作成/再作成をするコマンドです。このコマンドを実行時に slapd デーモンプロセス を停止しておく必要があります。

akira@pipi ~]$ sudo systemctl stop slapd
[sudo] password for akira: 
[akira@pipi ~]$ sudo -u ldap slapindex -b dc=jizai-domain,dc=jp -v
53ef16ba bdb_monitor_db_open: monitoring disabled; configure monitor database to enable
indexing id=00000001
indexing id=00000002
indexing id=00000003
indexing id=00000004
indexing id=00000005
indexing id=00000006
indexing id=00000007
indexing id=00000008
indexing id=00000009
indexing id=0000000a
indexing id=0000000b
indexing id=0000000c
[akira@pipi ~]$ sudo systemctl start slapd
[akira@pipi ~]$

2 環境構成

3 OpenLDAPのインストール

sudo pacman -S openldap でインストールを行うと、openldapパッケージが以下の形でシス テムに展開される。

$ pacman -Ql openldap
openldap /etc/
openldap /etc/openldap/
openldap /etc/openldap/DB_CONFIG.example
openldap /etc/openldap/schema/              ★ 予め用意されたスキーマ
openldap /etc/openldap/schema/README
openldap /etc/openldap/schema/collective.ldif
openldap /etc/openldap/schema/collective.schema
openldap /etc/openldap/schema/corba.ldif
openldap /etc/openldap/schema/corba.schema
openldap /etc/openldap/schema/core.ldif
openldap /etc/openldap/schema/core.schema
openldap /etc/openldap/schema/cosine.ldif
openldap /etc/openldap/schema/cosine.schema
openldap /etc/openldap/schema/duaconf.ldif
openldap /etc/openldap/schema/duaconf.schema
openldap /etc/openldap/schema/dyngroup.ldif
openldap /etc/openldap/schema/dyngroup.schema
openldap /etc/openldap/schema/inetorgperson.ldif
openldap /etc/openldap/schema/inetorgperson.schema
openldap /etc/openldap/schema/java.ldif
openldap /etc/openldap/schema/java.schema
openldap /etc/openldap/schema/ldapns.schema
openldap /etc/openldap/schema/misc.ldif
openldap /etc/openldap/schema/misc.schema
openldap /etc/openldap/schema/nis.ldif
openldap /etc/openldap/schema/nis.schema
openldap /etc/openldap/schema/openldap.ldif
openldap /etc/openldap/schema/openldap.schema
openldap /etc/openldap/schema/pmi.ldif
openldap /etc/openldap/schema/pmi.schema
openldap /etc/openldap/schema/ppolicy.ldif
openldap /etc/openldap/schema/ppolicy.schema
openldap /etc/openldap/slapd.conf   ★LDAP設定ファイル
openldap /etc/openldap/slapd.d/
openldap /etc/openldap/slapd.ldif
openldap /usr/
openldap /usr/bin/
openldap /usr/bin/ldapadd         ★エントリの登録に使う
openldap /usr/bin/ldapcompare
openldap /usr/bin/ldapdelete      ★エントリの削除に使う
openldap /usr/bin/ldapexop
openldap /usr/bin/ldapmodify      ★エントリ属性の変更使う
openldap /usr/bin/ldapmodrdn
openldap /usr/bin/ldappasswd
openldap /usr/bin/ldapsearch      ★エントリの検索に使う
openldap /usr/bin/ldapurl
openldap /usr/bin/ldapwhoami
openldap /usr/bin/slapacl
openldap /usr/bin/slapadd
openldap /usr/bin/slapauth
openldap /usr/bin/slapcat
openldap /usr/bin/slapd            ★デーモンプロセスのバイナリ →  stand-alone LDAP daemon (server)
openldap /usr/bin/slapdn
openldap /usr/bin/slapindex        ★インデックス作成/再作成
openldap /usr/bin/slappasswd
openldap /usr/bin/slapschema
openldap /usr/bin/slaptest         ★設定ファイルの検証に使う
openldap /usr/lib/
openldap /usr/lib/openldap/
openldap /usr/lib/openldap/accesslog-2.4.so.2
openldap /usr/lib/openldap/accesslog-2.4.so.2.10.2
openldap /usr/lib/openldap/accesslog.so
openldap /usr/lib/openldap/auditlog-2.4.so.2
openldap /usr/lib/openldap/auditlog-2.4.so.2.10.2
openldap /usr/lib/openldap/auditlog.so
openldap /usr/lib/openldap/collect-2.4.so.2
openldap /usr/lib/openldap/collect-2.4.so.2.10.2
openldap /usr/lib/openldap/collect.so
openldap /usr/lib/openldap/constraint-2.4.so.2
openldap /usr/lib/openldap/constraint-2.4.so.2.10.2
openldap /usr/lib/openldap/constraint.so
openldap /usr/lib/openldap/dds-2.4.so.2
openldap /usr/lib/openldap/dds-2.4.so.2.10.2
openldap /usr/lib/openldap/dds.so
openldap /usr/lib/openldap/deref-2.4.so.2
openldap /usr/lib/openldap/deref-2.4.so.2.10.2
openldap /usr/lib/openldap/deref.so
openldap /usr/lib/openldap/dyngroup-2.4.so.2
openldap /usr/lib/openldap/dyngroup-2.4.so.2.10.2
openldap /usr/lib/openldap/dyngroup.so
openldap /usr/lib/openldap/dynlist-2.4.so.2
openldap /usr/lib/openldap/dynlist-2.4.so.2.10.2
openldap /usr/lib/openldap/dynlist.so
openldap /usr/lib/openldap/memberof-2.4.so.2
openldap /usr/lib/openldap/memberof-2.4.so.2.10.2
openldap /usr/lib/openldap/memberof.so
openldap /usr/lib/openldap/nssov.so
openldap /usr/lib/openldap/nssov.so.0
openldap /usr/lib/openldap/nssov.so.0.0.0
openldap /usr/lib/openldap/pcache-2.4.so.2
openldap /usr/lib/openldap/pcache-2.4.so.2.10.2
openldap /usr/lib/openldap/pcache.so
openldap /usr/lib/openldap/ppolicy-2.4.so.2
openldap /usr/lib/openldap/ppolicy-2.4.so.2.10.2
openldap /usr/lib/openldap/ppolicy.so
openldap /usr/lib/openldap/refint-2.4.so.2
openldap /usr/lib/openldap/refint-2.4.so.2.10.2
openldap /usr/lib/openldap/refint.so
openldap /usr/lib/openldap/retcode-2.4.so.2
openldap /usr/lib/openldap/retcode-2.4.so.2.10.2
openldap /usr/lib/openldap/retcode.so
openldap /usr/lib/openldap/rwm-2.4.so.2
openldap /usr/lib/openldap/rwm-2.4.so.2.10.2
openldap /usr/lib/openldap/rwm.so
openldap /usr/lib/openldap/seqmod-2.4.so.2
openldap /usr/lib/openldap/seqmod-2.4.so.2.10.2
openldap /usr/lib/openldap/seqmod.so
openldap /usr/lib/openldap/sssvlv-2.4.so.2
openldap /usr/lib/openldap/sssvlv-2.4.so.2.10.2
openldap /usr/lib/openldap/sssvlv.so
openldap /usr/lib/openldap/syncprov-2.4.so.2
openldap /usr/lib/openldap/syncprov-2.4.so.2.10.2
openldap /usr/lib/openldap/syncprov.so
openldap /usr/lib/openldap/translucent-2.4.so.2
openldap /usr/lib/openldap/translucent-2.4.so.2.10.2
openldap /usr/lib/openldap/translucent.so
openldap /usr/lib/openldap/unique-2.4.so.2
openldap /usr/lib/openldap/unique-2.4.so.2.10.2
openldap /usr/lib/openldap/unique.so
openldap /usr/lib/openldap/valsort-2.4.so.2
openldap /usr/lib/openldap/valsort-2.4.so.2.10.2
openldap /usr/lib/openldap/valsort.so
openldap /usr/lib/slapd
openldap /usr/lib/systemd/
openldap /usr/lib/systemd/system/
openldap /usr/lib/systemd/system/slapd.service ★サービス定義ファイル
openldap /usr/lib/tmpfiles.d/
openldap /usr/lib/tmpfiles.d/slapd.conf
openldap /usr/share/
openldap /usr/share/licenses/
openldap /usr/share/licenses/openldap/
openldap /usr/share/licenses/openldap/LICENSE  ★ライセンスファイル
openldap /usr/share/man/
openldap /usr/share/man/man1/
openldap /usr/share/man/man1/ldapadd.1.gz
openldap /usr/share/man/man1/ldapcompare.1.gz
openldap /usr/share/man/man1/ldapdelete.1.gz
openldap /usr/share/man/man1/ldapexop.1.gz
openldap /usr/share/man/man1/ldapmodify.1.gz
openldap /usr/share/man/man1/ldapmodrdn.1.gz
openldap /usr/share/man/man1/ldappasswd.1.gz
openldap /usr/share/man/man1/ldapsearch.1.gz
openldap /usr/share/man/man1/ldapurl.1.gz
openldap /usr/share/man/man1/ldapwhoami.1.gz
openldap /usr/share/man/man5/
openldap /usr/share/man/man5/ldif.5.gz
openldap /usr/share/man/man5/slapd-bdb.5.gz
openldap /usr/share/man/man5/slapd-config.5.gz
openldap /usr/share/man/man5/slapd-dnssrv.5.gz
openldap /usr/share/man/man5/slapd-hdb.5.gz
openldap /usr/share/man/man5/slapd-ldap.5.gz
openldap /usr/share/man/man5/slapd-ldbm.5.gz
openldap /usr/share/man/man5/slapd-ldif.5.gz
openldap /usr/share/man/man5/slapd-mdb.5.gz
openldap /usr/share/man/man5/slapd-meta.5.gz
openldap /usr/share/man/man5/slapd-monitor.5.gz
openldap /usr/share/man/man5/slapd-ndb.5.gz
openldap /usr/share/man/man5/slapd-null.5.gz
openldap /usr/share/man/man5/slapd-passwd.5.gz
openldap /usr/share/man/man5/slapd-perl.5.gz
openldap /usr/share/man/man5/slapd-relay.5.gz
openldap /usr/share/man/man5/slapd-shell.5.gz
openldap /usr/share/man/man5/slapd-sock.5.gz
openldap /usr/share/man/man5/slapd-sql.5.gz
openldap /usr/share/man/man5/slapd.access.5.gz
openldap /usr/share/man/man5/slapd.backends.5.gz
openldap /usr/share/man/man5/slapd.conf.5.gz
openldap /usr/share/man/man5/slapd.overlays.5.gz
openldap /usr/share/man/man5/slapd.plugin.5.gz
openldap /usr/share/man/man5/slapo-accesslog.5.gz
openldap /usr/share/man/man5/slapo-auditlog.5.gz
openldap /usr/share/man/man5/slapo-chain.5.gz
openldap /usr/share/man/man5/slapo-collect.5.gz
openldap /usr/share/man/man5/slapo-constraint.5.gz
openldap /usr/share/man/man5/slapo-dds.5.gz
openldap /usr/share/man/man5/slapo-dyngroup.5.gz
openldap /usr/share/man/man5/slapo-dynlist.5.gz
openldap /usr/share/man/man5/slapo-memberof.5.gz
openldap /usr/share/man/man5/slapo-pbind.5.gz
openldap /usr/share/man/man5/slapo-pcache.5.gz
openldap /usr/share/man/man5/slapo-ppolicy.5.gz
openldap /usr/share/man/man5/slapo-refint.5.gz
openldap /usr/share/man/man5/slapo-retcode.5.gz
openldap /usr/share/man/man5/slapo-rwm.5.gz
openldap /usr/share/man/man5/slapo-sock.5.gz
openldap /usr/share/man/man5/slapo-sssvlv.5.gz
openldap /usr/share/man/man5/slapo-syncprov.5.gz
openldap /usr/share/man/man5/slapo-translucent.5.gz
openldap /usr/share/man/man5/slapo-unique.5.gz
openldap /usr/share/man/man5/slapo-valsort.5.gz
openldap /usr/share/man/man8/
openldap /usr/share/man/man8/slapacl.8.gz
openldap /usr/share/man/man8/slapadd.8.gz
openldap /usr/share/man/man8/slapauth.8.gz
openldap /usr/share/man/man8/slapcat.8.gz
openldap /usr/share/man/man8/slapd.8.gz
openldap /usr/share/man/man8/slapdn.8.gz
openldap /usr/share/man/man8/slapindex.8.gz
openldap /usr/share/man/man8/slappasswd.8.gz
openldap /usr/share/man/man8/slapschema.8.gz
openldap /usr/share/man/man8/slaptest.8.gz
openldap /var/
openldap /var/lib/
openldap /var/lib/openldap/
openldap /var/lib/openldap/openldap-data/                  ★LDAPに保存するデータがBerkeley DB形式でここで管理される
openldap /var/lib/openldap/openldap-data/DB_CONFIG.example ★データ保管バックエンドBerkeley DBの設定ファイルテンプレート

また、 slapd デーモンプロセスを動かすユーザとグループ ldap が自動的に /etc/passwd/etc/group に登録される。

★ldapユーザ
$ cat /etc/passwd | grep ldap
ldap:x:439:439::/var/lib/openldap:/bin/false

★ldapグループ
$ cat /etc/group | grep ldap
ldap:x:439:

4 OpenLDAPサーバ設定と起動

OpenLDAPのサーバ設定情報は基本的 /etc/openldap/slapd.conf に記載される。 この設定ファイルは主に以下の情報を定義します。

  • OpenLDAPに使用するスキーマファイルの指定
  • ルートエントリとrootdnの定義
  • インデックスの定義(検索を向上するための設定)
  • アクセスコントロール
  • SSL/TLS通信暗号化時の設定情報
  • パスワード暗号化方式の指定

以下は /etc/openldap/slapd.conf 設定例です.

#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
#######################################################################
# 使用するスキーマファイルのインクルード
#######################################################################
include	    /etc/openldap/schema/core.schema
include     /etc/openldap/schema/cosine.schema
include     /etc/openldap/schema/nis.schema
include     /etc/openldap/schema/inetorgperson.schema
include     /etc/openldap/schema/postfix.schema

# Define global ACLs to disable default read access.

# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral	ldap://root.openldap.org

pidfile		/run/openldap/slapd.pid
argsfile	/run/openldap/slapd.args

# Load dynamic backend modules:
# modulepath	/usr/lib/openldap
# moduleload	back_bdb.la
# moduleload	back_hdb.la
# moduleload	back_ldap.la

# Sample security restrictions
#	Require integrity protection (prevent hijacking)
#	Require 112-bit (3DES or better) encryption for updates
#	Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64

#######################################################################
# アクセスコントロール
#######################################################################
# Sample access control policy:
#	Root DSE: allow anyone to read it
#	Subschema (sub)entry DSE: allow anyone to read it
#	Other DSEs:
#		Allow self write access
#		Allow authenticated users read access
#		Allow anonymous users to authenticate
#	Directives needed to implement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read
# access to *
#	by self write
#	by users read
#	by anonymous auth
#
# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn.  (e.g., "access to * by * read")
#
# rootdn can always read and write EVERYTHING!

#ユーザが自分のパスワード変更できるようにアクセス権を設定
access to attrs=userPassword
  by dn="cn=Manager,dc=jizai-domain,dc=jp" write
  by self write
  by anonymous auth              ★簡易認証では一度匿名でバンドしてuserPassword属性による認証を行うため
  by * none

#管理者は書き込み可能、その他のユーザは読み取り専用
access to *
  by dn="cn=Manager,dc=jizai-domain,dc=jp" write
  by self write
  by * read

#######################################################################
# BDB database definitions (ルートエントリとrootdnの定義)
#######################################################################
database	bdb
suffix		"dc=jizai-domain,dc=jp"                    ★ルートエントリの定義
rootdn		"cn=Manager,dc=jizai-domain,dc=jp"         ★rootdnの定義
# Cleartext passwords, especially for the rootdn, should
# be avoid.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw		{SSHA}mMRwA4mPL7hIet11pVaXdK1AaV49J7Iy
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory	/var/lib/openldap/jizai-domain             ★BDBファイル格納先の指定、ディレクトリを予め作成してお必要があります

#######################################################################
# インデックスの定義
#######################################################################
# Indices to maintain
index	objectClass	                     eq,pres        ★eq:   属性値が一致する
index   uidNumber,gidNumber,loginShell   eq,pres        ★pres: 属性が存在する
index	uid,memberUid            	     eq,pres,sub    ★sub:  属性値の一部が一致する
index	ou,cn,mail,surname,givenname     eq,pres,sub
index	nisMapName,nisMapEntry    	     eq,pres,sub

#######################################################################
# SSL/TLS通信暗号化
#######################################################################

#######################################################################
# パスワード暗号化方式
#######################################################################
password-hash {SSHA}          ★パスワード属性値の暗号化方式

設定ファイル編集完了後、director項目で指定したディレクトリを ldap ユーザ権限で作成しましょう。

$ sudo -u ldap mkdir /var/lib/openldap/jizai-domain

またこのディレクトリの直下にDBDのパラメータファイル DB_CONFIG を予め定義しましょう。

$ sudo -u ldap touch /var/lib/openldap/jizai-domain/DB_CONFIG
$ sudo -u ldap cat /var/lib/openldap/jizai-domain/DB_CONFIG
# $OpenLDAP$
# Example DB_CONFIG file for use with slapd(8) BDB/HDB databases.
#
# See the Oracle Berkeley DB documentation
#   <http://www.oracle.com/technology/documentation/berkeley-db/db/ref/env/db_config.html>
# for detail description of DB_CONFIG syntax and semantics.
#
# Hints can also be found in the OpenLDAP Software FAQ
#	<http://www.openldap.org/faq/index.cgi?file=2>
# in particular:
#   <http://www.openldap.org/faq/index.cgi?file=1075>

# Note: most DB_CONFIG settings will take effect only upon rebuilding
# the DB environment.

# one 0.25 GB cache
set_cachesize 0 268435456 1

# Data Directory
#set_data_dir db

# Transaction Log settings
set_lg_regionmax 262144
set_lg_bsize 2097152
#set_lg_dir logs

set_flags DB_LOG_AUTOREMOVE

# Note: special DB_CONFIG flags are no longer needed for "quick"
# slapadd(8) or slapindex(8) access (see their -q option).

サービスを起動する前に、=slaptest= コマンドで設定ファイルの文法検証を行いましょう。

$ sudo -u ldap slaptest
/etc/openldap/slapd.conf: line 94: index attribute "givename" undefined
slaptest: bad configuration file!  ★文法検証NGの場合、このメッセージが表示される。

初回起動前に id2entry.bdb ファイルがないため、検証時に以下のようなメッセージが表示される。 これは設定ファイルの問題ではありません。気にせずに前に進みましょう。

$ sudo -u ldap slaptest
53eb0121 bdb_db_open: database "dc=jizai-domain,dc=jp": db_open(/var/lib/openldap/jizai-domain/id2entry.bdb) failed: No such file or directory (2).
53eb0121 backend_startup_one (type=bdb, suffix="dc=jizai-domain,dc=jp"): bi_db_open failed! (2)
slap_startup failed (test would succeed using the -u switch)

★-uオプションでdry-runモードで実行すると警告がなくなる
$ sudo -u ldap slaptest -u
config file testing succeeded
$

いよいよ、サービスを起動します。

★systemctlでサービスを起動します
$ sudo systemctl start slapd.service

★ログを確認する
$ sudo tail -f /var/log/everything.log
2014-08-13T15:10:24+09:00 pipi daemon info systemd[1]:  Starting OpenLDAP server daemon...
2014-08-13T15:10:25+09:00 pipi local4 debug slapd[9780]:  @(#) $OpenLDAP: slapd 2.4.39 (Feb  2 2014 15:15:20) $
	nobody@root-armv6-copy:/build/openldap/src/openldap-2.4.39/servers/slapd
2014-08-13T15:10:25+09:00 pipi local4 debug slapd[9781]:  bdb_monitor_db_open: monitoring disabled; configure monitor database to enable
2014-08-13T15:10:25+09:00 pipi local4 debug slapd[9781]:  slapd starting
2014-08-13T15:10:25+09:00 pipi daemon info systemd[1]:  Started OpenLDAP server daemon.

正常に起動された感じですね。 monitoring disabled 部分が気にされるかも知れないが、こ れはOpenLDAPのモニタ機能が無効化の状態で起動されたのことです。今度機会があれば、モニ タ機能に関して取り上げたいと思います。

試しにrootdnでバインドしてldapsearchを実行してみましょう。

$ ldapsearch -x -W -D "cn=Manager,dc=jizai-domain,dc=jp" -b "dc=jizai-domain,dc=jp"
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <dc=jizai-domain,dc=jp> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1
$

エントリが登録されていないため空の検索結果が表示されましたね。 また、director項目で指定したディレクトリに自動的にDBDファイルが作成される。

$ sudo -u ldap ls -al /var/lib/openldap/jizai-domain
total 14264
drwx------ 2 ldap ldap     4096 Aug 13 15:10 .
drwx------ 4 ldap ldap     4096 Aug 13 14:51 ..
-rwx------ 1 ldap ldap      874 Aug 13 14:59 DB_CONFIG
-rw------- 1 ldap ldap  2310144 Aug 13 15:29 __db.001
-rw------- 1 ldap ldap 12861440 Aug 13 15:29 __db.002
-rw------- 1 ldap ldap  1490944 Aug 13 15:29 __db.003
-rw-r--r-- 1 ldap ldap     4096 Aug 13 15:10 alock
-rw------- 1 ldap ldap     8192 Aug 13 15:10 dn2id.bdb
-rw------- 1 ldap ldap    32768 Aug 13 15:10 id2entry.bdb
-rw------- 1 ldap ldap 10485760 Aug 13 15:10 log.0000000001

続いて、 1.6 で説明したデータを登録してましょう。

$ ldapadd -x -D "cn=Manager,dc=jizai-domain,dc=jp" -W -f 01.base.ldif 
Enter LDAP Password: 
adding new entry "dc=jizai-domain,dc=jp"

adding new entry "cn=Manager,dc=jizai-domain,dc=jp"

adding new entry "o=Linux Users,dc=jizai-domain,dc=jp"

adding new entry "o=Smaba Users,dc=jizai-domain,dc=jp"

adding new entry "ou=User,o=Linux Users,dc=jizai-domain,dc=jp"

adding new entry "ou=Group,o=Linux Users,dc=jizai-domain,dc=jp"

★ユーザエントリの登録
$ ldapadd -x -D "cn=Manager,dc=jizai-domain,dc=jp" -W -f 02.users.ldif 
Enter LDAP Password: 
adding new entry "uid=user01,ou=User,o=Linux Users,dc=jizai-domain,dc=jp"

adding new entry "uid=user02,ou=User,o=Linux Users,dc=jizai-domain,dc=jp"

★グループエントリの登録
$ ldapadd -x -D "cn=Manager,dc=jizai-domain,dc=jp" -W -f 03.groups.ldif 
Enter LDAP Password: 
adding new entry "cn=group01,ou=Group,o=Linux Users,dc=jizai-domain,dc=jp"

adding new entry "cn=group02,ou=Group,o=Linux Users,dc=jizai-domain,dc=jp"

$

無地に登録出来ました!匿名ユーザで検索してましょう。

$ ldapsearch -x -b "dc=jizai-domain,dc=jp" -LLL
dn: dc=jizai-domain,dc=jp
dc: jizai-domain
o: jizai-domain Corporation
objectClass: dcObject
objectClass: organization

dn: cn=Manager,dc=jizai-domain,dc=jp
cn: Manager
objectClass: organizationalRole

dn: o=Linux Users,dc=jizai-domain,dc=jp
o: Linux Users
objectClass: organization

dn: o=Smaba Users,dc=jizai-domain,dc=jp
o: Smaba Users
objectClass: organization

dn: ou=User,o=Linux Users,dc=jizai-domain,dc=jp
ou: User
objectClass: organizationalUnit

dn: ou=Group,o=Linux Users,dc=jizai-domain,dc=jp
ou: Group
objectClass: organizationalUnit

dn: uid=user01,ou=User,o=Linux Users,dc=jizai-domain,dc=jp
uid: user01
cn: Test User01
uidNumber: 5001
gidNumber: 3001
homeDirectory: /home/user01
loginShell: /bin/bash
gecos: Test User No01
shadowLastChange: 0
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount

dn: uid=user02,ou=User,o=Linux Users,dc=jizai-domain,dc=jp
uid: user02
cn: Test User02
uidNumber: 5002
gidNumber: 3002
homeDirectory: /home/user02
loginShell: /bin/bash
gecos: Test User No02
shadowLastChange: 0
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount

dn: cn=group01,ou=Group,o=Linux Users,dc=jizai-domain,dc=jp
cn: group01
gidNumber: 3001
objectClass: posixGroup

dn: cn=group02,ou=Group,o=Linux Users,dc=jizai-domain,dc=jp
cn: group02
gidNumber: 3002
memberUid: 5001
objectClass: posixGroup

匿名でアクセスする場合 userPassword 属性が表示されないことを確認しました。 次は曖昧検索ウィ練習してみたいと思います。

★uidで前方一致検索する、検索結果にgecosのみを表示する
$ ldapsearch -x -b "dc=jizai-domain,dc=jp" "uid=user*" "uid" -LLL
dn: uid=user01,ou=User,o=Linux Users,dc=jizai-domain,dc=jp
gecos: Test User No01

dn: uid=user02,ou=User,o=Linux Users,dc=jizai-domain,dc=jp
gecos: Test User No02

5 OpenLDAPログ出力設定

デフォルトではサービスのログが journal ログシステムでバイナリ形式でログ収集される。 次はコマンドで /usr/bin/slapd プロセスのログ出力を確認することができます。

$ journalctl /usr/bin/slapd
-- Logs begin at Tue 2014-01-28 15:40:27 JST, end at Tue 2014-08-12 22:05:05 JST. --
Jan 28 22:08:32 pipi slapd[175]: conn=1000 fd=9 ACCEPT from IP=192.168.100.7:35520 (IP=0.0.0.0:389)
Jan 28 22:08:32 pipi slapd[175]: conn=1000 op=0 BIND dn="" method=128
Jan 28 22:08:32 pipi slapd[175]: conn=1000 op=0 RESULT tag=97 err=0 text=
Jan 28 22:08:32 pipi slapd[175]: conn=1000 op=1 SRCH base="dc=jizai-domain,dc=jp" scope=2 deref=0 filter="(&(objectClass=posixAccount)(u
........

journald と syslog のを結合して運用している場合以下手順でsyslogの設定を行うでopenldap のログを別ファイルに出力させることができる。

/etc/syslog-ng/syslog-ng.conf に以下の定義の追加して、 syslog-ng サービスを再起動 する。

template t_1 {
        template("$ISODATE $FULLHOST $FACILITY $PRIORITY $MSGHDR $MSG\n"); templat$
};

destination d_ldap { file("/var/log/ldap.log" template(t_1)); };

filter f_ldap { facility(local4); };   ★ここが肝です、openldapのログはlocal4ファシリティを用いて出力する仕様となっている

log { source(src); filter(f_ldap); destination(d_ldap); };

/etc/logrotate.d/syslog-ng にローテーション対象に追加する。

                            ★最後に追加する
/var/log/messages.log ..... /var/log/ldap.log  {
	missingok
	sharedscripts
	postrotate
		/bin/kill -HUP $(cat /run/syslog-ng.pid 2>/dev/null) 2>/dev/null || true
	endscript
}

### TODO loglevel

6 LDAPクライアントの設定

LDAPクライアントはいろいろありますが、ここでは ldapsearch などOpenLDAPに付属したツー ルから参照されるクライアント設定ファイルについて紹介します。

OpenLDAPサーバを参照するためにLDAPクライアントに libldap をインストールしましょう。 OpenLDAP インストール時もすでにインストールされていると思いますが、ここでは再イン ストールことになります。

$ sudo pacman -S libldap
[sudo] password for akira: 
警告: libldap-2.4.39-1 は最新です -- 再インストール
依存関係を解決しています...
相互衝突をチェックしています...

パッケージ (1): libldap-2.4.39-1

Total Installed Size:   0.94 MiB
Net Upgrade Size:       0.00 MiB

:: インストールを行いますか? [Y/n]
(1/1) キーリングのキーを確認                                                                   [########################################################] 100%
(1/1) パッケージの整合性をチェック                                                             [########################################################] 100%
(1/1) パッケージファイルのロード                                                               [########################################################] 100%
(1/1) ファイルの衝突をチェック                                                                 [########################################################] 100%
(1/1) 空き容量を確認                                                                           [########################################################] 100%
(1/1) 再インストール libldap                                                                   [########################################################] 100%
$ pacman -Ql libldap
libldap /etc/
libldap /etc/openldap/
libldap /etc/openldap/ldap.conf  ★LDAPクライアント設定ファイル
......省略......

/etc/openldap/ldap.conf はLDAPクライアントの設定ファイルとなります。このファイルう に最低限に以下のLDAPサーバ接続する情報を記述しましょう。

BASE   dc=jizai-domain,dc=jp
URI    ldap://pipi.home/

これで ldapsearch コマンド実行時にデフォルトの接続先として付与されることになります。

7 LDAPクライアントとサーバ間の通信内容

LDAPクライアントとサーバ間通経路が暗号化されていない時のパケット内容を確認しましょう。 以下は ldapsearch コマンドでユーザエントリの userPassword 属性の検索結果となりま す。 userPassword の値がBase64エンコード形式で出力されていることが分かりました。

$ ldapsearch -x -W  -D "cn=Manager,dc=jizai-domain,dc=jp" -b "ou=User,o=Linux Users,dc=jizai-domain,dc=jp" "userPassword" -LLL
Enter LDAP Password: 
dn: ou=User,o=Linux Users,dc=jizai-domain,dc=jp

dn: uid=user01,ou=User,o=Linux Users,dc=jizai-domain,dc=jp
userPassword:: UEBzc3cwcmQ=

dn: uid=user02,ou=User,o=Linux Users,dc=jizai-domain,dc=jp
userPassword:: e1NTSEF9S3BKd3dBMlNidDI5R0dOWnhkYXNxNVhSbWw2SjVxMlo=

wireshark の監視結果

2014-08-12-openldap-01.png

tcpdump の監視結果(一部情報を落としている)

$ sudo tcpdump -n -i wlp2s0 port 389 -X
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlp2s0, link-type EN10MB (Ethernet), capture size 65535 bytes
16:38:54.494320 IP 192.168.100.10.37832 > 192.168.100.4.389: Flags [S], seq 1466415103, win 29200, options [mss 1460,sackOK,TS val 23258407 ecr 0,nop,wscale 7], length 0
...省略...
16:38:54.495465 IP 192.168.100.4.389 > 192.168.100.10.37832: Flags [S.], seq 206831997, ack 1466415104, win 28960, options [mss 1460,sackOK,TS val 10688865 ecr 23258407,nop,wscale 5], length 0
...省略...
16:38:54.495515 IP 192.168.100.10.37832 > 192.168.100.4.389: Flags [.], ack 1, win 229, options [nop,nop,TS val 23258407 ecr 10688865], length 0
...省略...
16:38:54.495602 IP 192.168.100.10.37832 > 192.168.100.4.389: Flags [P.], seq 1:55, ack 1, win 229, options [nop,nop,TS val 23258407 ecr 10688865], length 54
	0x0000:  4500 006a 52da 4000 4006 9e54 c0a8 640a  E..jR.@.@..T..d.
	0x0010:  c0a8 6404 93c8 0185 5767 b800 0c54 017e  ..d.....Wg...T.~
	0x0020:  8018 00e5 082b 0000 0101 080a 0162 e527  .....+.......b.'
	0x0030:  00a3 1961 3034 0201 0160 2f02 0103 0420  ...a04...`/.....
	0x0040:  636e 3d4d 616e 6167 6572 2c64 633d 6a69  cn=Manager,dc=ji
	0x0050:  7a61 692d 646f 6d61 696e 2c64 633d 6a70  zai-domain,dc=jp
	0x0060:  8008 5040 7373 7730 7264                 ..P@ssw0rd                 ★rootdnバインド時のパスワード

16:38:54.497192 IP 192.168.100.4.389 > 192.168.100.10.37832: Flags [.], ack 55, win 905, options [nop,nop,TS val 10688865 ecr 23258407], length 0
...省略...
16:38:54.505926 IP 192.168.100.4.389 > 192.168.100.10.37832: Flags [P.], seq 1:15, ack 55, win 905, options [nop,nop,TS val 10688866 ecr 23258407], length 14
...省略...
16:38:54.505948 IP 192.168.100.10.37832 > 192.168.100.4.389: Flags [.], ack 15, win 229, options [nop,nop,TS val 23258410 ecr 10688866], length 0
...省略...
16:38:54.506029 IP 192.168.100.10.37832 > 192.168.100.4.389: Flags [P.], seq 55:151, ack 15, win 229, options [nop,nop,TS val 23258410 ecr 10688866], length 96
16:38:54.511339 IP 192.168.100.4.389 > 192.168.100.10.37832: Flags [P.], seq 15:69, ack 151, win 905, options [nop,nop,TS val 10688866 ecr 23258410], length 54
16:38:54.517492 IP 192.168.100.4.389 > 192.168.100.10.37832: Flags [P.], seq 69:162, ack 151, win 905, options [nop,nop,TS val 10688867 ecr 23258410], length 93
	0x0000:  4500 0091 1822 4000 4006 d8e5 c0a8 6404  E...."@.@.....d.
	0x0010:  c0a8 640a 0185 93c8 0c54 01c2 5767 b896  ..d......T..Wg..
	0x0020:  8018 0389 7d44 0000 0101 080a 00a3 1963  ....}D.........c
	0x0030:  0162 e52a 305b 0201 0264 5604 3675 6964  .b.*0[...dV.6uid
	0x0040:  3d75 7365 7230 312c 6f75 3d55 7365 722c  =user01,ou=User,
	0x0050:  6f3d 4c69 6e75 7820 5573 6572 732c 6463  o=Linux.Users,dc
	0x0060:  3d6a 697a 6169 2d64 6f6d 6169 6e2c 6463  =jizai-domain,dc
	0x0070:  3d6a 7030 1c30 1a04 0c75 7365 7250 6173  =jp0.0...userPas
	0x0080:  7377 6f72 6431 0a04 0850 4073 7377 3072  sword1...P@ssw0r          ★検索結果にuser01のパスワード
	0x0090:  64                                       d
16:38:54.517536 IP 192.168.100.10.37832 > 192.168.100.4.389: Flags [.], ack 162, win 229, options [nop,nop,TS val 23258414 ecr 10688866], length 0
16:38:54.518197 IP 192.168.100.4.389 > 192.168.100.10.37832: Flags [P.], seq 162:285, ack 151, win 905, options [nop,nop,TS val 10688867 ecr 23258410], length 123
	0x0000:  4500 00af 1823 4000 4006 d8c6 c0a8 6404  E....#@.@.....d.
	0x0010:  c0a8 640a 0185 93c8 0c54 021f 5767 b896  ..d......T..Wg..
	0x0020:  8018 0389 682f 0000 0101 080a 00a3 1963  ....h/.........c
	0x0030:  0162 e52a 3079 0201 0264 7404 3675 6964  .b.*0y...dt.6uid
	0x0040:  3d75 7365 7230 322c 6f75 3d55 7365 722c  =user02,ou=User,
	0x0050:  6f3d 4c69 6e75 7820 5573 6572 732c 6463  o=Linux.Users,dc
	0x0060:  3d6a 697a 6169 2d64 6f6d 6169 6e2c 6463  =jizai-domain,dc
	0x0070:  3d6a 7030 3a30 3804 0c75 7365 7250 6173  =jp0:08..userPas
	0x0080:  7377 6f72 6431 2804 267b 5353 4841 7d4b  sword1(.&{SSHA}K          ★検索結果にuser02のパスワード
	0x0090:  704a 7777 4132 5362 7432 3947 474e 5a78  pJwwA2Sbt29GGNZx
	0x00a0:  6461 7371 3558 526d 6c36 4a35 7132 5a    dasq5XRml6J5q2Z
16:38:54.518549 IP 192.168.100.4.389 > 192.168.100.10.37832: Flags [P.], seq 285:299, ack 151, win 905, options [nop,nop,TS val 10688867 ecr 23258414], length 14

検証結果の通り、バインド時のパスワードや検索結果中のパスワード情報がバレバレですね。 本番運用ではこの状態だと好ましくないでしょうか。ちゃんとSSL/TLSで暗号化しましょう。

8 LDAPによるLinuxのログイン認証設定

8.1 LDAP連携用ライブラリの導入

LDAPサーバと連携してログイン認証するために libnss_ldappam_ldap ライブラリが必 要とします。2つライブラリの役割は

  • libnss_ldap: Name Service Switch によるLDAPユーザ情報を引けるようにする
  • pam_ldap: 簡易パスワード認証や passwd によるパスワード変更のLDAP対応

この2つライブラリは別々プロジェクトで開発されているため、設定ファイルも別々 となっている。

pam_ldap http://www.padl.com/OSS/pam_ldap.html nss_ldap.conf
nss_ldap http://www.padl.com/OSS/nss_ldap.html pam_ldap.conf

実際にこの2つ設定ファイルに記述する内容はほどんどん変わらない、設定情報が二重管理と なってしまいます。 この問題を解決してくれるのは nss-pam-ldapd です。以下は nss-pam-ldapd プロジェクトサイトからの説明引用です。

This is implemented using thin NSS and PAM modules which delegate to a dedicated
service (nslcd) that queries the LDAP server with persistent connections,
authentication, attribute translation, etc.

つまり、2モジュールを仲良くする代理人的なものですね。

$ sudo pacman -S nss-pam-ldapd
依存関係を解決しています...
相互衝突をチェックしています...
:: nss-pam-ldapd と pam_ldap が衝突しています。pam_ldap を削除しますか? [y/N] y

パッケージ (2): pam_ldap-186-5 [削除]  nss-pam-ldapd-0.8.14-1

Total Installed Size:   0.23 MiB
Net Upgrade Size:       0.14 MiB

:: インストールを行いますか? [Y/n]
(1/1) キーリングのキーを確認                                                                   [########################################################] 100%
(1/1) パッケージの整合性をチェック                                                             [########################################################] 100%
(1/1) パッケージファイルのロード                                                               [########################################################] 100%
(1/1) ファイルの衝突をチェック                                                                 [########################################################] 100%
(2/2) 空き容量を確認                                                                           [########################################################] 100%
(1/1) 削除 pam_ldap                                                                            [########################################################] 100%
警告: /etc/pam_ldap.conf は /etc/pam_ldap.conf.pacsave として保存されました
(1/1) インストール nss-pam-ldapd                                                               [########################################################] 100%

★インストールされたファイル一覧
$ sudo pacman -Ql nss-pam-ldapd 
nss-pam-ldapd /etc/
nss-pam-ldapd /etc/nslcd.conf                        ★LDAPサーバ接続情報はここに載せる
nss-pam-ldapd /usr/
nss-pam-ldapd /usr/bin/
nss-pam-ldapd /usr/bin/nslcd                         ★[local LDAP name service daemon]、LDAP連携時の代理デーモンプロセス
nss-pam-ldapd /usr/lib/
nss-pam-ldapd /usr/lib/libnss_ldap.so.2              ★NSSのLDAP対応
nss-pam-ldapd /usr/lib/security/
nss-pam-ldapd /usr/lib/security/pam_ldap.so          ★LDAP認証PAMモジュール
nss-pam-ldapd /usr/lib/systemd/
nss-pam-ldapd /usr/lib/systemd/system/
nss-pam-ldapd /usr/lib/systemd/system/nslcd.service  ★nslcdサービスファイル
nss-pam-ldapd /usr/lib/tmpfiles.d/
nss-pam-ldapd /usr/lib/tmpfiles.d/nslcd.conf
nss-pam-ldapd /usr/share/
nss-pam-ldapd /usr/share/man/
nss-pam-ldapd /usr/share/man/man5/
nss-pam-ldapd /usr/share/man/man5/nslcd.conf.5.gz
nss-pam-ldapd /usr/share/man/man8/
nss-pam-ldapd /usr/share/man/man8/nslcd.8.gz
nss-pam-ldapd /usr/share/man/man8/pam_ldap.8.gz
$

nslcdlibnss_ldappam_ldap からLDAPと連携時の中継代理デーモンプロセス となります。LDAPサーバへの接続情報は /etc/nslcd.conf にて記述します。

$ cat /etc/nslcd.conf
uri ldap://pipi.home/
base dc=jizai-domain,dc=jp                    ★ユーザエントリ検索の起点
rootpwmoddn cn=Manager,dc=jizai-domain,dc=jp  ★rootユーザでLDAPユーザのパスワード変更時の認証バインドに使われる

/etc/nslcd.conf とは別に /etc/nscd.conf が存在します、このファイルは glibc が提供してい るものです、混乱しないように注意しましょう。

/etc/nsswitch.conf に以下のように情報源にldapを追加する。

$ cat /etc/nsswitch.conf
passwd:    files ldap
group:     files ldap
shadow:    files ldap
netgroup:  files ldap

★以上以外の内容、ここでは省略します。

nslcd.service サービスを起動して、 getent passwd でLDAPのユーザ情報ちゃんと参照で きることを確認しましょう。ちなみに、getentはNSSライブラリからエントリーを取得するコマ ンドです。

$ sudo systemctl start nslcd.service
$ getent passwd
root:x:0:0:root:/root:/bin/bash
.....省略.....
nslcd:x:997:996::/var/run/nslcd:/bin/false

★LDAPのユーザエントリ情報が表示されている
user01:x:5001:3001:Test User No01:/home/user01:/bin/bash
user02:x:5002:3002:Test User No02:/home/user02:/bin/bash
★サービス起動時のログ
Aug 14 00:14:31 mimi-air systemd[1]: Starting Naming services LDAP client daemon....
Aug 14 00:14:31 mimi-air nslcd[8554]: version 0.8.14 starting
Aug 14 00:14:31 mimi-air nslcd[8554]: accepting connections
Aug 14 00:14:31 mimi-air systemd[1]: Started Naming services LDAP client daemon..

★getent passwd実行時のログ
Aug 14 00:14:35 mimi-air nslcd[8554]: [8b4567] <passwd(all)> (re)loading /etc/nsswitch.conf

8.2 LDAP認証PAMモジュールの設定

次はLDAP認証するためのPAMモジュール設定を行います。対象となる設定ファイルは次の表にま とめます。

ファイル 用途
/etc/pam.d/system-auth 通常のログインで利用する
/etc/pam.d/su su user01 でユーザ切り替え時に使われる
/etc/pam.d/su-l su - user01 でユーザ切り替え時に使われる
/etc/pam.d/passwd passwdコマンドでパスワード変更時に使う
/etc/pam.d/other PAMデフォルト設定ファイル

/etc/pam.d/system-auth 設定例

#%PAM-1.0

auth      sufficient pam_ldap.so     ★LDAP連携用
auth      required  pam_env.so
auth      required  pam_unix.so     try_first_pass nullok
auth      optional  pam_permit.so


account   sufficient pam_ldap.so    ★LDAP連携用
account   required  pam_unix.so
account   optional  pam_permit.so
account   required  pam_time.so

password  sufficient pam_ldap.so    ★LDAP連携用
password  required  pam_unix.so     try_first_pass nullok sha512 shadow
password  optional  pam_permit.so

#ユーザ、グループ単位にリソース制限を行う
session   required  pam_limits.so
session   required  pam_env.so

#ログイン時にホームディレクトリが存在していなければ自動で生成する指定
session   required  pam_mkhomedir.so skel=/etc/skel umask=0077

#ログイン、ログアウト情報をauthログに出力する
session   required  pam_unix.so

session   optional  pam_ldap.so   ★LDAP連携用
session   optional  pam_permit.so

/etc/pam.d/su/etc/pam.d/su-l 設定例

#%PAM-1.0
auth        sufficient  pam_ldap.so   ★LDAP連携
auth		sufficient	pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth		sufficient	pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth		required	pam_wheel.so use_uid
auth		required	pam_unix.so use_first_pass   ★use_first_pass→ユーザーから取得済みのパスワードを再利用する

account     sufficient  pam_ldap.so  ★LDAP連携
account		required	pam_unix.so

session     required    pam_mkhomedir.so skel=/etc/skel umask=0022  ★ホームディレクトリを自動作成する
session     sufficient  pam_ldap.so                                 ★LDAP連携
session		required	pam_unix.so

/etc/pam.d/passwd 設定例

#%PAM-1.0
password        sufficient      pam_ldap.so          ★LDAPパスワード変更連携
password        required        pam_cracklib.so retry=3 difok=1 minlen=8 dcredit=-1
password        required        pam_unix.so sha512 shadow nullok use_authtok

/etc/pam.d/other 設定例

#%PAM-1.0
auth            sufficient      pam_ldap.so    ★LDAP連携
auth            required        pam_unix.so

account         sufficient      pam_ldap.so    ★LDAP連携
account         required        pam_unix.so

password        sufficient      pam_ldap.so    ★LDAP連携
password        required        pam_unix.so

session         required        pam_unix.so

初回ログイン時にパスワード変更を求める場合、 other の設定は必須です。 つまり、LDAPユーザエントリの shadowLastChange: 0 を運用する時に要注意です。

設定しない時の挙動

$ su - user02
パスワード:
need a new password
su: 基礎となる認証モジュールを知らないユーザー         ★新パスワードを求める事ができない、ログインできない
$

8.3 パスワード変更時の挙動

LDAPユーザのパスワード変更は次のような方法があります。

LDAPユーザ権限でpasswd LDAPユーザ自身のパスワードを変更する
root権限でpasswd 任意のユーザのパスワードを変更する
ldappasswd バインドユーザによる変更できる範囲が変わる
ldapmodify バインドユーザによる変更できる範囲が変わる

8.4 ログイン時の挙動

  1. 匿名でユーザエントリ情報を取得する
  2. ユーザエントリを用いてLDAP認証バインドを行う
  3. 何度もユーザエントリの情報を取得する

ログイン時LDAPサーバ側のログ

★ユーザID入力後、パスワード入力前
2014-08-16T17:34:16+09:00 pipi local4 debug slapd[21557]:  conn=1001 fd=18 ACCEPT from IP=192.168.100.10:53485 (IP=0.0.0.0:389)
2014-08-16T17:34:16+09:00 pipi local4 debug slapd[21557]:  conn=1001 op=0 BIND dn="" method=128
2014-08-16T17:34:16+09:00 pipi local4 debug slapd[21557]:  conn=1001 op=0 RESULT tag=97 err=0 text=
★★1: LDAP検索条件 objectClassとuidが付与された
2014-08-16T17:34:16+09:00 pipi local4 debug slapd[21557]:  conn=1001 op=1 SRCH base="dc=jizai-domain,dc=jp" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uid=user01))"
2014-08-16T17:34:16+09:00 pipi local4 debug slapd[21557]:  conn=1001 op=1 SRCH attr=loginShell cn gidNumber uidNumber objectClass homeDirectory gecos uid
2014-08-16T17:34:16+09:00 pipi local4 debug slapd[21557]:  conn=1001 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=

★パスワード入力後
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1001 op=2 SRCH base="dc=jizai-domain,dc=jp" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uid=user01))"
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1001 op=2 SRCH attr=uid uidNumber
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1001 op=2 SEARCH RESULT tag=101 err=0 nentries=1 text=
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1002 fd=19 ACCEPT from IP=192.168.100.10:53487 (IP=0.0.0.0:389)
★★2: ユーザエントリでバインドが行われた
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1002 op=0 BIND dn="uid=user01,ou=User,o=Linux Users,dc=jizai-domain,dc=jp" method=128
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1002 op=0 BIND dn="uid=user01,ou=User,o=Linux Users,dc=jizai-domain,dc=jp" mech=SIMPLE ssf=0
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1002 op=0 RESULT tag=97 err=0 text=
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1002 op=1 SRCH base="uid=user01,ou=User,o=Linux Users,dc=jizai-domain,dc=jp" scope=0 deref=0 filter="(objectClass=*)"
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1002 op=1 SRCH attr=dn
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1002 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1002 op=2 ABANDON msg=2
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1002 op=3 UNBIND

★★3:パスワード期限などの問い合わせる
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1001 op=3 SRCH base="dc=jizai-domain,dc=jp" scope=2 deref=0 filter="(&(objectClass=shadowAccount)(uid=user01))"
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1001 op=3 SRCH attr=shadowExpire shadowInactive shadowFlag shadowWarning shadowLastChange uid shadowMin shadowMax
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1001 op=3 SEARCH RESULT tag=101 err=0 nentries=1 text=
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1002 fd=19 closed
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1001 op=4 ABANDON msg=4
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1000 op=2 SRCH base="dc=jizai-domain,dc=jp" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uid=user01))"
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1000 op=2 SRCH attr=uid uidNumber
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1000 op=2 SEARCH RESULT tag=101 err=0 nentries=1 text=
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1000 op=3 SRCH base="dc=jizai-domain,dc=jp" scope=2 deref=0 filter="(&(objectClass=shadowAccount)(uid=user01))"
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1000 op=3 SRCH attr=shadowExpire shadowInactive shadowFlag shadowWarning shadowLastChange uid shadowMin shadowMax
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1000 op=3 SEARCH RESULT tag=101 err=0 nentries=1 text=
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1000 op=4 ABANDON msg=4
2014-08-16T17:34:28+09:00 pipi local4 debug slapd[21557]:  conn=1000 op=5 SRCH base="dc=jizai-domain,dc=jp" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uid=user01))"
2014-08-16T17:34:29+09:00 pipi local4 debug slapd[21557]:  conn=1000 op=5 SRCH attr=uid uidNumber
2014-08-16T17:34:29+09:00 pipi local4 debug slapd[21557]:  conn=1000 op=5 SEARCH RESULT tag=101 err=0 nentries=1 text=
2014-08-16T17:34:29+09:00 pipi local4 debug slapd[21557]:  conn=1000 op=6 SRCH base="dc=jizai-domain,dc=jp" scope=2 deref=0 filter="(&(objectClass=posixGroup)(|(memberUid=user01)(member=uid=user01,ou=user,o=linux users,dc=jizai-domain,dc=jp)))"
2014-08-16T17:34:29+09:00 pipi local4 debug slapd[21557]:  conn=1000 op=6 SRCH attr=memberUid cn gidNumber member
2014-08-16T17:34:29+09:00 pipi local4 debug slapd[21557]:  <= bdb_equality_candidates: (member) not indexed
2014-08-16T17:34:29+09:00 pipi local4 debug slapd[21557]:  conn=1000 op=6 SEARCH RESULT tag=101 err=0 nentries=0 text=

LDAPからユーザエントリの検索範囲を限定する方法

  • DITベースで検索範囲を限定する
  • pam_filterで検索結果を絞り込む

9 宿題

  • shadowLastChange変更ポリシー
  • 通信暗号化

10 参考情報

  • プロのためのLinuxシステムネットワーク管理技術

Comments