OpenLDAPのインストール

OpenLDAP2.4から設定方法が随分と変わっているので忘備録です。

インストール

# yum -y install openldap-servers openldap-clients
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# chown ldap. /var/lib/ldap/DB_CONFIG

起動

# /etc/init.d/slapd start

管理者パスワード設定

管理者パスワード生成
# slappasswd 
New password:
Re-enter new password:
{SSHA}xxxxxxxxxxxxxxxxxxxxxxxx

# vi chrootpw.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx

# ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif

ディレクトリマネージャーのパスワード設定

# slappasswd
New password:
Re-enter new password:
{SSHA}nnnnnnnnnnnnnnnnnnnnnnn

# vi chdomain.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by  dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=hoge,dc=com" read by * none

dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=hoge,dc=com

dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=hoge,dc=com

dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}nnnnnnnnnnnnnnnnnnnnnnn

dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=Manager,dc=hoge,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=hoge,dc=com" write by * read

# ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif

随分とやり方が変更になっていますね、管理者とディレクトリマネージャーのパスワードが別にできるんですね。

管理者 == データベースの管理者

ディレクトリマネージャー == ディレクトリ毎の管理者
ってことかな??

schemaの追加はどうするんだろう??

slapd.confで設定していたのとは大分変わりました。

スキーマの追加

独自のスキーマを追加する方法です。
Unix Powerさんに習って進めます。

独自のスキーマファイル「origin.schema」を/etc/openldap/schemaに置きます。
■スキーマファイルの変換

# mkdir /tmp/work
# mkdir /tmp/work/slapd.d
# cd /tmp/work/

# vi origin.config
include /etc/openldap/schema/origin.schema

# slaptest -f origin.config -F slapd.d

# cp slapd.d/cn=config/cn=schema/cn={1}origin.ldif origin.ldif

# vi origin.ldif
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 xxxxxxxx
dn: cn={1}origin
objectClass: olcSchemaConfig
cn: {1}origin
↓
最初の2行を削除
dn: cn=origin,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: origin
~中略
structuralObjectClass:から最終行のmodifyTimestamp:までを削除

# ldapadd -x -W -D cn=config -f origin.ldif
Enter LDAP Password: ← 管理者のパスワード
adding new entry "cn=origin,cn=schema,cn=config"

登録されているか確認

# ldapsearch -x -LLL -W -D cn=config -b  cn=config "(objectClass=olcSchemaConfig)" dn
Enter LDAP Password: ← 管理者のパスワード

ディレクトリの初期登録

Topツリーを登録
# vi basedomain.ldif
#-----------------------------------------------------------
# Domain
#-----------------------------------------------------------
dn: dc=hoge,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: HogeHoge
dc: Hoge
#-----------------------------------------------------------
# Manager
#-----------------------------------------------------------
dn: cn=Manager,dc=hoge,dc=com
objectClass: organizationalRole
cn: Manager
description: Directory Manager
#-----------------------------------------------------------
# People
#-----------------------------------------------------------
dn: ou=People,dc=hoge,dc=com
objectClass: organizationalUnit
ou: People
#-----------------------------------------------------------
# Group
#-----------------------------------------------------------
dn: ou=Group,dc=hoge,dc=com
objectClass: organizationalUnit
ou: Group

# ldapadd -x -D cn=Manager,dc=hoge,dc=com -W -f basedomain.ldif 
Enter LDAP Password: ← ディレクトリマネージャーのパスワード 

データーの登録

先にグループを登録してから、ユーザーの登録をしていきます。
グループ登録

# vigroupprofile.ldif
dn: cn=test,ou=Group,dc=hoge,dc=com
description: Group of test
cn: test
objectClass: top
objectClass: posixgroup
gidNumber: 3000
# ldapadd -x -D "cn=Manager,dc=hoge,dc=com" -w passwd -f groupprofile.ldif

ユーザー登録

# viuserprofile.ldif
dn: uid=test,ou=People,dc=hoge,dc=com
CIFSGidNumber: 12000
CIFSUidNumber: 12000
cn: test
facsimileTelephoneNumber: 03-0000-0001
gidNumber: 3000
givenName: test
homeDirectory: /home/test
loginShell: /bin/tcsh
mail: test@hoge.com
serviceStatus: 1
sn: test
sshVersionFlag: 2
telephoneNumber: 555-555-555
uid: test
uidNumber: 3000
userPassword: test
objectClass: organizationalPerson
objectClass: person
objectClass: posixAccount
objectClass: shadowaccount
objectClass: top
# ldapadd -x -D "cn=Manager,dc=hoge,dc=com" -w passwd -f userprofile.ldif

冗長構成

データーベースの冗長化をレプリケーションとも呼ばれます。
レプリケーションの設定には プロバイダ側 と コンシューマ側 の設定を行います。
LDAP のマスターサーバーを「プロバイダー」、スレーブサーバーを「コンシューマー」と言います。

「コンシューマー」が2台以上あってもいいっい事かな??

Unix Power
Server World
さんに習って進めます。

プロバイダ 側の設定

# vi syncprov-module.ldif
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib/openldap
olcModuleLoad: syncprov.la
# ldapadd -x -W -D cn=config -f syncprov-module.ldif
Enter LDAP Password:   ← 管理者のパスワード
adding new entry "cn=module,cn=config"

# vi syncprov.ldif
dn: olcOverlay=syncprov,olcDatabase={2}bdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpSessionLog: 100

# ldapadd -x -W -D cn=config -f syncprov.ldif
Enter LDAP Password:   ← 管理者のパスワード
adding new entry "olcOverlay=syncprov,olcDatabase={2}bdb,cn=config"

コンシューマ側の設定

「OpenLDAPのインストール」 から「ディレクトリの初期登録」までを行います。

まだ誰も登録されていない事を確認します。

# ldapsearch -x -h localhost -b "ou=People,dc=hoge,dc=com"
# vi syncrepl.ldif
dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
provider=ldap://IPAddress:389/
bindmethod=simple
binddn="cn=Manager,dc=hoge,dc=com"

credentials={SSHA}nnnnnnnnnnnnnnnnnnnnnnn ← これが失敗のもと、後ほど解説
searchbase="dc=hoge,dc=com"

scope=sub
schemachecking=on
type=refreshAndPersist
retry="30 5 300 3"
interval=00:00:05:00
# ldapmodify -x -W -D cn=config -f syncrepl.ldif 
Enter LDAP Password:   ← 管理者のパスワード
modifying entry "olcDatabase={2}bdb,cn=config"

レプリケーション間隔を5分としたので、5分たったら登録されている事を確認します。

# ldapsearch -x -h localhost -b "ou=People,dc=hoge,dc=com"

おやおや??? レプリケーションってかsyncが始まらない

Logの出力設定

# vi loglevel.ldif
dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: stats sync
# ldapmodify -x -W -D cn=config -f loglevel.ldif
Enter LDAP Password:   ← 管理者のパスワード

確認してみます

# ldapsearch -x -LLL -b 'cn=config' -D cn=config -W "objectClass=olcGlobal"
Enter LDAP Password:   ← 管理者のパスワード

dn: cn=config
objectClass: olcGlobal
cn: config
olcConfigFile: /usr/share/openldap-servers/slapd.conf.obsolete
olcConfigDir: /etc/openldap/slapd.d
olcAllows: bind_v2
olcArgsFile: /var/run/openldap/slapd.args
olcAttributeOptions: lang-
olcAuthzPolicy: none
olcConcurrency: 0
olcConnMaxPending: 100
olcConnMaxPendingAuth: 1000
olcGentleHUP: FALSE
olcIdleTimeout: 0
olcIndexSubstrIfMaxLen: 4
olcIndexSubstrIfMinLen: 2
olcIndexSubstrAnyLen: 4
olcIndexSubstrAnyStep: 2
olcIndexIntLen: 4
olcListenerThreads: 1
olcLocalSSF: 71
olcLogLevel: 0
olcLogLevel: stats sync
olcPidFile: /var/run/openldap/slapd.pid
olcReadOnly: FALSE
olcReverseLookup: FALSE
olcSaslSecProps: noplain,noanonymous
olcSockbufMaxIncoming: 262143
olcSockbufMaxIncomingAuth: 16777215
olcThreads: 16
olcTLSCACertificatePath: /etc/openldap/certs
olcTLSCertificateFile: "OpenLDAP Server"
olcTLSCertificateKeyFile: /etc/openldap/certs/password
olcTLSVerifyClient: never
olcTLSProtocolMin: 0.0
olcToolThreads: 1
olcWriteTimeout: 0

レプリケーションが出来ない

上記全てやってみたが ん~、やはりレプリケーションが出来ていない。

コンシューマ側の設定
プロバイダ側の設定で行ったolcモジュール設定をコンシューマ側でも行ってみる。

# vi syncprov-module.ldif
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib/openldap
olcModuleLoad: syncprov.la
# ldapadd -x -W -D cn=config -f syncprov-module.ldif
Enter LDAP Password:   ← 管理者のパスワード
adding new entry "cn=module,cn=config"

確認してみると

# ldapsearch -x -h localhost -b "ou=People,dc=hoge,dc=com"

やっぱりダメ!

Logを確認してみると「conn=1035 op=0 RESULT tag=97 err=49 text=」を発見、
err=49 ???

Error 49 (decimal) is 0x31 (hex) which is LDAP_INVALID_CREDENTIALS
so the password does not match.

パスワードが違う??? もしかして
replace が失敗するので、delete & add で対応

# ldapsearch -x -LLL -W -D cn=config -b cn=config "(olcSyncRepl=*)"
Enter LDAP Password: ← 管理者のパスワード 
~中略
olcSyncrepl: {0}rid=001 の行に注目
~中略
# syncrepl-del.ldif
dn: olcDatabase={2}bdb,cn=config
changetype: modify
delete: olcSyncRepl
olcSyncRepl: {0}rid=001
provider=ldap://IPAddress:389/
bindmethod=simple
binddn="cn=Manager,dc=hoge,dc=com"
credentials={SSHA}nnnnnnnnnnnnnnnnnnnnnnn
searchbase="dc=hoge,dc=com"
scope=sub
schemachecking=on
type=refreshAndPersist
retry="30 5 300 3"
interval=00:00:05:00
# ldapadd -Y EXTERNAL -H ldapi:/// -f syncrepl-del.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}bdb,cn=config"
これで削除された。
# vi syncrepl-mod.ldif
dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
provider=ldap://IPAddress:389/
bindmethod=simple
binddn="cn=Manager,dc=hoge,dc=com"
credentials=password  ← ディレクトリマネージャーのパスワードを平文で
searchbase="dc=hoge,dc=com"
scope=sub
schemachecking=on
type=refreshAndPersist
retry="30 5 300 3"
interval=00:00:05:00
# ldapadd -Y EXTERNAL -H ldapi:/// -f syncrepl-mod.ldif 
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}bdb,cn=config"

確認してみると

# ldapsearch -x -h localhost -b "ou=People,dc=hoge,dc=com"

あっさりとレプリケーションされていました。

どうもコンシューマー側の設定時に「credentials=」は平文でパスワード指定する必要があるのと、
コンシューマー側にもプロバイダ側の設定同様にモジュール設定が必要なようです。

この後、プロバイダ側でユーザー登録してみると5分後ではなく即座にレプリケーションされていました。

proxyagent
マネージャーは追加・変更・削除を行いますが、認証系にマネージャーのパスワードを記述するのも好ましくない事から
proxyagentと呼ばれる認証専用ユーザーを登録します。

# vi proxyagent.ldif
dn: ou=Profile,dc=hogr,dc=com
ou: Profile
objectClass: top
objectClass: organizationalUnit

dn: cn=default,ou=Profile,dc=hoge,dc=com
defaultSearchBase: dc=hoge,dc=com
objectclassMap: automount:automountMap=nisMap
objectclassMap: automount:automount=nisObject
followReferrals: FALSE
attributeMap: automount:automountKey=cn
attributeMap: automount:automountMapName=nisMapName
attributeMap: automount:automountInformation=nisMapEntry
bindTimeLimit: 10
profileTTL: 43200
searchTimeLimit: 30
objectClass: DUAConfigProfile
cn: default
defaultSearchScope: one
authenticationMethod: tls:simple
passwordStorageScheme: crypt
credentialLevel: proxy
serviceSearchDescriptor: auto_home:nisMapName=auto_home,dc=hoge,dc=com?one
serviceSearchDescriptor: shadow:ou=People,dc=hoge,dc=com?one
serviceSearchDescriptor: auto_master:nisMapName=auto_master,dc=hoge,dc=com?one
dn: cn=proxyagent,ou=Profile,dc=hoge,dc=com
objectClass: top
objectClass: person
sn: proxyagent
cn: proxyagent
userPassword: {SHA}pppppppppppppppppppppppppp
# ldapadd -x -D cn=Manager,dc=hoge,dc=com -W -f proxyagent.ldif