LDAPの使われ方
OpenLDAPを中心とした、大学におけるシステム管理・運用

2007年12月8日
県立長崎シーボルト大学
情報センター 堀田 倫英
1

本日のレジュメ• LDAPとは• Name Service／PAM／authconfig• LDAPとDBMSとの対比• LDAPの見え方• OpenLDAPの構成• 本学の運用例• 構築・運用環境• まとめ2LDAPとは？
Lightweight Directory Access Protocol• ディレクトリ→住所録、電話帳例）メーラのアドレス帳• /etc/passwdの代わり• /etc/groupの代わり• …
• /etc/hogehogeの代わり
3Name Service¾ ls –l a.txt¾ -rw-r--r-- 1 hotta hotta 0 10月20日 10:11 a.txt¾ ls –ln a.txt¾ -rw-r--r-- 1 500 500 0 10月20日 10:11 a.txt
getpwuid(3)/etc/passwd

getgrgid(3)/etc/group4

Name Service$ whoamihotta$ id hotta
uid=500(hotta) gid=500(hotta) 所属グループ=500(hotta)$ strace id hotta 2>&1 | grep '^open("/etc' | uniq
open("/etc/ld.so.cache", O_RDONLY)=3
open("/etc/nsswitch.conf", O_RDONLY) = 3
open("/etc/passwd", O_RDONLY)=3
open("/etc/group", O_RDONLY)=35

Name Service
ユーザ作成部分
nsswitch.conf/etc/passwd/etc/group

glibc
Name Service/lib/libnss*/lib/libnss*/lib/libnss*

キャッシュgetpwXXX(3)getgrXXX(3)gethostbyname(3)NSCD(Name ServiceCache Daemon)

libnss_ldap
LDAPServer

LDAP DB6

nsswitch.conf
NSS=Name Service Switch$ grep ^[a-z] /etc/nsswitch.conf
passwd: files ldap
shadow: files ldap
group:
files ldap
hosts:
files dns
services: files
aliases: files ldap
（その他いろいろ)7

authconfig

NSPAM

8

authconfig

9authconfig
 /etc/sysconfig/authconfig
 /etc/yp.conf
 /etc/sysconfig/network
 /etc/ldap.conf
 /etc/krb5.conf
 /etc/krb.conf /etc/hesiod.conf
 /etc/pam_smb.conf
 /etc/samba/smb.conf
 /etc/nsswitch.conf
 /etc/pam.d/system-auth

これだけのファイルを一挙に設定

10

PAM
PAM(Pluggable Authentication Module)
認証部分を自由に入れ替え可能に認証を要求するプログラム
pam_ldap.so
PAMライブラリ群/etc/pam.conf/etc/pam.d/*/lib/libpam.so.*/lib/security/*.so

LDAP
ServerLDAP DB11

LDAPの位置づけ
アプリケーション

NS（名前解決）
files
NIS
DNS
winbind

PAM（認証）
有効期限
権限
認証
グループ
セッション

LDAP
12

DBMSの構成
データベースエンジン
インターフェース（ODBC, JDBC,各言語bindings)＋
SQL

データベース（インスタンス）テーブル

DDL（データ定義）
DML（データ操作）

項目１

値

項目２

値 …

：

…

：

クライアントzデータベース（インスタンス）は複数存在できる
z１データベース内に、複数のテーブルが定義できる
z動的にデータベースやテーブルの追加、削除が可能
z１テーブル内の構造は、全レコード同じ（表形式）13

LDAPの構成
LDAP
エンジン【インターフェース】
各言語bindings／ldapXX コマンドLDAPツリー（唯一）各エントリ（レコード）
項目１（任意）値

項目２ （任意）値

項目２（重複可能）

値

：

：

…

クライアント【object class】
create table SQL文のようなもの

z単独のLDAPツリーを全ノードが参照
zテーブルという概念はない
z各エントリの構造は、異なっていてもよい
z項目はobject classまたは属性のいずれか
zそのエントリに「属性a」が存在するためには、そのエントリ内に「属性a」を含むobject classが必要
14

LDAP Browser
管理者ユーザ名（みたいなもの）

DB名（みたいなもの）15

ツリーの最上位

16

グループエントリの例

17ユーザエントリの例

18ユーザエントリの例（続き）

19

ldapsearch$ ldapsearch -h localhost -x -LLL ¥-b ou=Users,dc=npu,dc=ac,dc=jp ‘(uid=hotta)' uid npujname
dn: uid=hotta,ou=Nagasaki,ou=Users,dc=npu,dc=ac,dc=jp
uid: hotta
DN: ユニークキー（必ず存在する）
npuJname:: 5aCA55Sw44CA5YCr6Iux$ psql -h localhost:: エンコードされ# select uid,npujnameていることを表す# from‘ou=Users,dc=npu,dc=ac,dc=jp' where uid=‘hotta';uid | hotta
npuJname | 5aCA55Sw44CA5YCr6Iux$ php -r 'print base64_decode("5aCA55Sw44CA5YCr6Iux");'
堀田 倫英20

スキーマ（データ定義）
ファイル名

object class(o)/attribute type(a) の例

ビルトイン(schema_init.c)uid(a), userPassword(a)core.schemaou(a), organization(o)cosine.schema（主にintetorgperson用としてincludeされる）

inetorgperson.schema

inetOrgPerson(o), displayName(a)misc.schema

mailHost(a)nis.schema

posixAccount(o), memberUid(a)samba.schema

sambaLMPassword(a), sambaBadPasswordTime(a)dhcp.schema

dhcpHWAddress(a)（openldap-2.3.27より抜粋）
21

object classとattribute type$ grep m-hotta /etc/passwd
m-hotta:x:601:601::/home/m-hotta:/bin/bash$ sed -n '/posixAccount/,/^$/p' /etc/openldap/schema/nis.schema
objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount'
DESC 'Abstraction of an account with POSIX attributes'
SUP top AUXILIARYMUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )MAY ( userPassword $ loginShell $ gecos $ description ) )$ sed -n "/loginShell'/,/^$/p" /etc/openldap/schema/nis.schema
attributetype ( 1.3.6.1.1.1.1.4 NAME 'loginShell'
ASCII文字列の英大小文字DESC 'The path to the login shell'
区別あり、スペース無視
EQUALITY caseExactIA5MatchSYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )22

OpenLDAPの構成
slapd.conf

slapd
（常駐）

ldap.conf

LDAP
ライブラリ

slapaddslapcatslap* ...

スキーマファイル
スキーマファイル
スキーマファイル

BerkeleyDB(DB4)
LDAP
プロトコル

ldapsearchldapaddldapmodify
ldap* ...
z各種デーモンzカスタムアプリLDAP DB
23

OpenLDAPの実際各デーモンやアプリケーションで、OpenLDAPがどう連携して使われているのかを見てみましょう。

24

vsftpd（ログイン認証）• vsftpd = FTP Server– /etc/vsftpd/vsftpd.confの設定変更箇所• 一切変更なし– authconfigで「LDAP認証を使用する」にするだけ$ rpm -q vsftpd
vsftpd-2.0.1-5.EL4.5
25

dovecot（ログイン認証）• dovecot = IMAP Server– /etc/dovecot.confの設定変更箇所• 一切変更なし– authconfigで「LDAP認証を使用する」にするだけ• TIPS– pam_mkhomedir.soを使うと、ホームディレクトリがない時に自動で作ってくれる（らしい）$ rpm -q dovecot
dovecot-1.0-0.1.rc7.npuc26

postfix（user/group mapping）• authconfigで「LDAP認証を使用する」にする• /etc/postfix/main.cf$ rpm -q postfix mailman
postfix-2.3.3-2.npuc
ldapalias_server_host = 127.0.0.1
mailman-2.1.8-0.FC5.1.npuc
ldapalias_server_port = 389
ldapalias_search_base = ou=Users,dc=npu,dc=ac,dc=jp
ldapalias_scope = subldapalias_timeout = 15
ldapalias_query_filter = (|(uid=%u)(gecos=%u))ldapalias_result_attribute = mailalias_maps = hash:/etc/postfix/aliases
hash:/etc/postfix/mailman_aliases ldap:ldapalias

27apache（BASIC認証）
AuthType
AuthName
AuthzLDAPMethod
AuthzLDAPServer
AuthzLDAPUserBase
AuthzLDAPGroupBase
AuthzLDAPUserScope
AuthzLDAPGroupScope
AuthzLDAPUserKey
AuthzLDAPGroupKey
AuthzLDAPMemberKey
AuthzLDAPMapUserToAttrAuthzLDAPSetGroupAuth
Require group グループ名

basic“LDAP Working Group"
ldap
localhost
ou=Users,dc=npu,dc=ac,dc=jp
ou=Groups,dc=npu,dc=ac,dc=jp
subtreesubtreeuidcnmemberUiduid$ rpm -q httpdmap
httpd-2.2.3-5.npuc28

apache（グループ定義の例）

グループ番号

グループに所属するメンバー

グループ名
29

Samba（PDC/BDC,ファイルサーバ）• smbldap_tools相当の機能をPHPで内製して運用中– perlスクリプトに手を入れるスキルと気力がなかった• /etc/samba/smb.confのあちこちで設定• 参考文献– 徹底解説 Samba LDAPサーバ構築(武田 保真 (著) )– Sambaのすべて（高橋 基信 (著))– http://www.samba.gr.jp/$ rpm -q sambasamba-3.0.21b-2.npuc• 詳細内容の掲載は割愛– 現時点ではSambaのバージョンごとに微妙な差異– 将来的にはSambaにLDAPサーバ機能が統合される？
– 今後のSambaとOpenLDAPとの関係はどうなるの？
30

DHCP（全データをLDAPで）$ rpm -q dhcp
dhcp-3.0.1-58.EL4.npuc$ cat rpm/SPECS dhcp.spec（中略）Patch155: dhcp-3.0pl2-npuc.ldap.patch
Patch156: dhcp-3.0.1ldap_dynamicoption.patch
Patch157: dhcp-3.0.1-npuc-verbose.patch
31

DHCP設定ファイル$ cat /etc/dhcpd.conf
ldap-server "127.0.0.1";
ldap-port 389;
ldap-username"cn=Manager,dc=npu,dc=ac,dc=jp";
ldap-password “ないしょ";ldap-base-dn"ou=Sasebo,ou=DHCP,dc=npu,dc=ac,dc=jp";
ldap-method dynamic;（これだけ）
32

DHCP（グローバル設定）

33

DHCP（セグメント設定）

34

DHCP（個別エントリ）

35

36

DHCP
LDAP
プロバイダ
LDAP
コンシューマ

登録作業
LDAP
Replication

DHCP
サーバ
L3 SW
(Cat4500)

VLAN1
VLAN1
VLAN1
VLAN1
VLANx

LDAP
コンシューマ
DHCP
サーバ

DHCP Relay

37

Radius認証
LDAP
コンシューマ
DHCP
サーバ

LDAP
コンシューマLDAP
プロバイダ

FreeRadius
PEAPユーザ認証(PEAP-MS-CHAPv2)
freeradius-1.1.4でサポート
無線AP

LDAP
コンシューマ
DHCP
サーバ

L3 SW
(Cat4500)
Windows Vista38

アプライアンスによるVPN認証
インターネット

ユーザ認証Cisco F/W(ASA5520)

LDAP
コンシューマIP付与

39

VPN認証（設定部分）

40

内製部分
$ rpm -qa|grep php|sortphp-5.2.5-1.npuc
動作環境
PHP-5.2.x
php-cli-5.2.5-1.npuc
PEAR（クラスライブラリ）
php-common-5.2.5-1.npuc
Smarty（テンプレートエンジン）
php-ldap-5.2.5-1.npuc
Creole(DB抽象レイヤー）
PostgreSQL-8.2.x
php-mbstring-5.2.5-1.npuc
Oracle10g
php-oci8-5.2.5-1.npuc
mysql-5.0.22
php-pdo-5.2.5-1.npuc
php-pear-1.4.9-4
php-pear-Auth-SASL-1.0.2-4.el5.centos
php-pgsql-5.2.5-1.npuc
41構築・運用環境
1. OSインストール
2. 環境構築スクリプト（引数：ホスト名のみ）
1. ネットワーク設定（IPアドレス等）
2. yumリポジトリを内部にも向ける
3. yumにより最新環境へ追随
4. 自動起動サービス設定
5. 管理者アカウント設定／ssh公開鍵設置
6. 管理者グループ／sudoers設定
7. LDAP コンシューマ設定スクリプト起動
42

LDAP コンシューマ設定スクリプト
1.
2.
3.
4.
5.
6.
7.
8.
9.

LDAPパッケージ群の取得・インストール
設定ファイルの設置
LDAP-DB用データディレクトリの準備
ルートノードの作成
コンシューマ特有の設定(slapd.confの無効化)
sysylog設定
logrotate設定
olcReferral 設定の投入
syncrepl 設定の投入
43

RPMパッケージ構築・運用環境
公式パッケージ群
公式サイト
ミラーサイト
yum
学内yum
リポジトリ
(createrepo)Cent
OS 4.xCent
CentOS
OS4.x
4.x
CentOS
5.0
Cent
CentOSOS5.0
5.0(約40台)
独自パッケージ群

RPMパッケージ
登録作業
44

まとめ• LDAPは、とっつきにくい• RDBMSとの住み分けが難しい
それでも• /etc/passwordを配るよりはまし• パスワードを付箋に書いて貼られるよりはまし• アラユル一元管理が可能（かも？）あなたもおひとついかがですか？
45

ご静聴ありがとうございました

46