Directory Service はネットワーク上にあるホスト、プリンタやユーザー名といった、種々の情報を検索する仕組みである。
近年では SSO: Single Sign On (1回の認証で複数のサービスが利用できる)の普及から、ユーザ情報を扱う事が多い。
BIND/Hesiod は MIT Athena Project 成果物であり、BINDの分散データベースに
ディレクトリ情報を実装する試みであったが、複雑さやパフォーマンス・セキュリティの問題から現在では殆ど用いられていない。
| Service name | Vendor |
|---|---|
| OpenLDAP | OSS (The University of Michigan) |
| NIS:Network Information Service(Yellow Pages) | Oracle (Sun Microsystems) |
| NDS:Novell Diretory Service | Novell |
| Active Directory | Microsoft |
| Open Directory | Apple |
| BIND/Hesiod | OSS, MIT Athena Project |
LDAP スキーマは、オブジェクトの構造と属性をまとめた「ひな形」。
標準的なものはテキストの通りで、分かりやすい nis.schema を解説。
LDAP も SNMP 同様オブジェクトを X.500 で以下のように体系化している。
詳細
iso(1)
+--- org(3)
+--- dod(6)
+--- internet(1)
+--- directory(1)
+--- nisSchema(1)
+--- attribute types(1)
+--- uidNumber(0) An integer uniquely identifying a user in an administrative domain
+--- uidNumber(1) An integer uniquely identifying a group in an administrative domain
+--- gecos(2) The GECOS field; the common name
:
+--- object classes(2)
+--- posixAccount(0)
LDAP では X.500 のうち、Diretory Service で必要な物を取り込み、
RFC で再定義している。(join ISO CCITT)
/etc/openldap/schema/nis.schema は上記を拡張するように定義している。
RFC Title 2252/2256 LDAPv3 1274 uid/dc 2079 URI 2247 dc/dcObject 2587 PKI 2589 Dynamic Directory Services 2377 uidObject
attributetype ( 1.3.6.1.1.1.1.2 NAME 'gecos'
DESC 'The GECOS field; the common name'
EQUALITY caseIgnoreIA5Match
SUBSTR caseIgnoreIA5SubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
:
クラスの定義
objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount'
DESC 'Abstraction of an account with POSIX attributes'
SUP top AUXILIARY
MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
MAY ( userPassword $ loginShell $ gecos $ description ) )
:
定義パラメータ概要
クラス型 := STRUCTURAL | AUXILIARY | ABSTRACT
Client Server openldap-clients
(openLDAP クライアント機能)openldap-servers
(openLDAP サーバー機能)nss_ldap
(PAM/NSS用 LDAP 拡張機能)openldap
(openLDAP 共通機能)
LDIF : LDAP Data Interchange Format
LDIF の書式は以下の通り
# コメント version: 1 LDIF のバージョン、省略時は 1 dn: 識別名(キーに相当、Distinguished Name) (継続行) 行頭が空白またはタブの場合、上の行の継続とみなす objectClass: クラス名 属性: 値 属性:: 値(Base64) (空行) データ区切り
属性 名称 意味(OID) description description エントリの解説 (2.5.4.13) dn domainComponent ドメイン名 (0.9.2342.19200300.100.1.25) cn commonName 氏名、一般名称 (2.5.4.3) o organizationName 組織名 (2.5.4.10) ou organizationalUnitName 部署名 (2.5.4.11) uid userid ユーザID (0.9.2342.19200300.100.1.1) sn surname 苗字 (2.5.4.4) gn givenName 名前 (2.5.4.42)
# ldapdelete -x -W -D cn=Manager,dc=example,dc=co,dc=jp uid=student,ou=person,dc=example,dc=co,dc=jp'Thunderbird の電話帳
Thunderbird をインターネットからインストールし、アドレス帳を開く。
メニュー:新規作成(N)>LDAPディレクトリ(D)...

sample3.ldif - エントリの修正
Thunderbird による電話帳検索の結果。
変更前

変更後


dn: uid=penguin,ou=person,dc=example,dc=co,dc=jp changetype: modify replace: mail mail: penguin-mail@example.co.jp - add: o o: Example Corp. - replace: givenName givenName: Sasaki -
| Option | Description |
|---|---|
| -h LDAP(host) | サーバの指定 |
| -H LDAP(URI) | 同上 (URI形式) |
| -p port | ポート番号の指定 |
| -x | 簡易認証(エントリ名、パスワードとも平文) |
| -D DN | バインドするエントリを指定 |
| -W | パスワードを対話形式で入力 |
| -w pass | パスワードを指定 |
| -b DN | 検索 DN |
| -s SCOPE | 検索スコープ(sub/base/one)の指定 |
| -L | 件数表示(search result)なし LDIF形式で出力 |
| -LL | コメントなし LDIF形式で出力 |
| -LLL | LLに加えバージョンなし LDIF形式で出力 |
| -v | 詳しい情報を stderrに出力 |
# アクセス制限前 # 全ての情報にアクセスできている。 $ ldapsearch -x -w himitu -D uid=penguin,ou=person,dc=example,dc=co,dc=jp -b dc=example,dc=co,dc=jp # extended LDIF # # LDAPv3 # base <dc=example,dc=co,dc=jp> with scope subtree # filter: (objectclass=*) # requesting: ALL # # example.co.jp dn: dc=example,dc=co,dc=jp objectClass: dcObject objectClass: organization o: Exmaple Corp. dc: example # person, example.co.jp dn: ou=person,dc=example,dc=co,dc=jp objectClass: organizationalUnit ou: person # penguin, person, example.co.jp dn: uid=penguin,ou=person,dc=example,dc=co,dc=jp objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson ou: Penguin Div. telephoneNumber: 03-1111-2222 uid: penguin mail: penguin-mail@example.co.jp o: Example Corp. cn: Penguin sn: Penguin givenName: Taro userPassword:: e01ENX1uNnRheE5DeDhMWWVhQVNMWHgxaFZRPT0= # sato, person, example.co.jp dn: uid=sato,ou=person,dc=example,dc=co,dc=jp objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson cn: Sato Jiro sn: Sato givenName: Jiro ou: Penguin Div. telephoneNumber: 03-1234-5678 mail: sato@example.co.jp uid: sato userPassword:: e01ENX1YcjRpbE96UTRQQ09xM2FRMHFidWFRPT0= # search result search: 2 result: 0 Success # numResponses: 6 # numEntries: 5 $ ldapsearch -x -b dc=example,dc=co,dc=jp # extended LDIF # # LDAPv3 # base <dc=example,dc=co,dc=jp> with scope subtree # filter: (objectclass=*) # requesting: ALL # # example.co.jp dn: dc=example,dc=co,dc=jp objectClass: dcObject objectClass: organization o: Exmaple Corp. dc: example # person, example.co.jp dn: ou=person,dc=example,dc=co,dc=jp objectClass: organizationalUnit ou: person # penguin, person, example.co.jp dn: uid=penguin,ou=person,dc=example,dc=co,dc=jp objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson ou: Penguin Div. telephoneNumber: 03-1111-2222 uid: penguin mail: penguin-mail@example.co.jp o: Example Corp. cn: Penguin sn: Penguin givenName: Taro userPassword:: e01ENX1uNnRheE5DeDhMWWVhQVNMWHgxaFZRPT0= # sato, person, example.co.jp dn: uid=sato,ou=person,dc=example,dc=co,dc=jp objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson cn: Sato Jiro sn: Sato givenName: Jiro ou: Penguin Div. telephoneNumber: 03-1234-5678 mail: sato@example.co.jp uid: sato userPassword:: e01ENX1YcjRpbE96UTRQQ09xM2FRMHFidWFRPT0= # search result search: 2 result: 0 Success # numResponses: 6 # numEntries: 5
# アクセス制限後 # 認証したユーザは、自分のパスワードにアクセスできる。 $ ldapsearch -x -w secret -D uid=sato,ou=person,dc=example,dc=co,dc=jp -b dc=example,dc=co,dc=jp # extended LDIF # # LDAPv3 # base <dc=example,dc=co,dc=jp> with scope subtree # filter: (objectclass=*) # requesting: ALL # # example.co.jp dn: dc=example,dc=co,dc=jp objectClass: dcObject objectClass: organization o: Exmaple Corp. dc: example # person, example.co.jp dn: ou=person,dc=example,dc=co,dc=jp objectClass: organizationalUnit ou: person # penguin, person, example.co.jp dn: uid=penguin,ou=person,dc=example,dc=co,dc=jp objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson ou: Penguin Div. telephoneNumber: 03-1111-2222 uid: penguin mail: penguin-mail@example.co.jp o: Example Corp. cn: Penguin sn: Penguin givenName: Taro # sato, person, example.co.jp dn: uid=sato,ou=person,dc=example,dc=co,dc=jp objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson cn: Sato Jiro sn: Sato givenName: Jiro ou: Penguin Div. telephoneNumber: 03-1234-5678 mail: sato@example.co.jp uid: sato userPassword:: e01ENX1YcjRpbE96UTRQQ09xM2FRMHFidWFRPT0= # 匿名ユーザ(anonymous) はパスワードにアクセスできない。 $ ldapsearch -x -b dc=example,dc=co,dc=jp # extended LDIF # # LDAPv3 # base <dc=example,dc=co,dc=jp> with scope subtree # filter: (objectclass=*) # requesting: ALL # # example.co.jp dn: dc=example,dc=co,dc=jp objectClass: dcObject objectClass: organization o: Exmaple Corp. dc: example # person, example.co.jp dn: ou=person,dc=example,dc=co,dc=jp objectClass: organizationalUnit ou: person # penguin, person, example.co.jp dn: uid=penguin,ou=person,dc=example,dc=co,dc=jp objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson ou: Penguin Div. telephoneNumber: 03-1111-2222 uid: penguin mail: penguin-mail@example.co.jp o: Example Corp. cn: Penguin sn: Penguin givenName: Taro # sato, person, example.co.jp dn: uid=sato,ou=person,dc=example,dc=co,dc=jp objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson cn: Sato Jiro sn: Sato givenName: Jiro ou: Penguin Div. telephoneNumber: 03-1234-5678 mail: sato@example.co.jp uid: sato # search result search: 2 result: 0 Success # numResponses: 6 # numEntries: 5 # search result search: 2 result: 0 Success # numResponses: 6 # numEntries: 5