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