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