第8章 - 認証統合

| Index

Directory Service

Directory Service はネットワーク上にあるホスト、プリンタやユーザー名といった、種々の情報を検索する仕組みである。 近年では SSO: Single Sign On (1回の認証で複数のサービスが利用できる)の普及から、ユーザ情報を扱う事が多い。
BIND/Hesiod は MIT Athena Project 成果物であり、BINDの分散データベースに ディレクトリ情報を実装する試みであったが、複雑さやパフォーマンス・セキュリティの問題から現在では殆ど用いられていない。

主なディレクトリサービス

Service nameVendor
OpenLDAPOSS (The University of Michigan)
NIS:Network Information Service(Yellow Pages)Oracle (Sun Microsystems)
NDS:Novell Diretory ServiceNovell
Active DirectoryMicrosoft
Open DirectoryApple
BIND/HesiodOSS, MIT Athena Project

LDAP Schema (8-8)

LDAP スキーマは、オブジェクトの構造と属性をまとめた「ひな形」。
標準的なものはテキストの通りで、分かりやすい nis.schema を解説。
LDAP も SNMP 同様オブジェクトを X.500 で以下のように体系化している。

詳細

NIS の OID
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)
RFCTitle
2252/2256LDAPv3
1274uid/dc
2079URI
2247dc/dcObject
2587PKI
2589Dynamic Directory Services
2377uidObject
/etc/openldap/schema/nis.schema は上記を拡張するように定義している。
属性の定義
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 ) )
			:
定義パラメータ概要


OpenLDAP の実装 (8-18)

テキストでは tarball だが、パッケージでは openldap-servers がある。
CentOS 5.8 の設定ファイル例 CentOS では、パッケージと用途は以下の関係になっています。
ClientServer
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)
descriptiondescriptionエントリの解説 (2.5.4.13)
dndomainComponentドメイン名 (0.9.2342.19200300.100.1.25)
cncommonName氏名、一般名称 (2.5.4.3)
oorganizationName組織名 (2.5.4.10)
ouorganizationalUnitName部署名 (2.5.4.11)
uiduseridユーザID (0.9.2342.19200300.100.1.1)
snsurname苗字 (2.5.4.4)
gngivenName名前 (2.5.4.42)

演習2の LDIFサンプル なお上記で追加したエントリを削除したい場合は、ldapdelete で行う
# 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)...

アドレス帳の名前欄に、例題で登録した名称を入力すると、それらが表示される。


ldapmodify 補足(8-31)

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

変更後

ldapmodify の LDIF は、ハイフン(-)で区切り複数の変更を記述できる。
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
-
OptionDescription
-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形式で出力
-LLLLLに加えバージョンなし LDIF形式で出力
-v詳しい情報を stderrに出力
クライアントとLDAPサーバの接続をバインドと呼ぶ。
バインドには以下の認証方法がある。

ホワイトページ作成

ホワイトページはネットワーク上でユーザ情報(氏名、メールアドレス、パスワード)などを提供するサービス。
演習4
実行例
# アクセス制限前
# 全ての情報にアクセスできている。
$ 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

NSS/PAM と LDAP の統合

参照