読者です 読者をやめる 読者になる 読者になる

OpenLDAPを新しいバージョンに移行する

サーバを新しくしたら、OpenLDAPのバージョンが上がっていろいろ変わってました。

  • 旧サーバは、CentOS 4上で動いているopenldap-2.2.13
  • 新サーバは、Ubuntu Server 14.04 LTS上で動いているslapd-2.4.31

インストール

$ sudo aptitude install slapd
$ sudo aptitude install ldap-utils ldapvi

設定

  • 最近のOpenLDAPは管理情報をDBに持っているようです。
    • cn=config用のolcRootDNとolcRootPWがないと外部からアクセス出来ません。
$ ldapsearch -Y EXTERNAL -H ldapi:/// -b 'olcDatabase={0}config,cn=config'
$ slappasswd -h "{CRYPT}" -c '$6$%s$' -s password
{CRYPT}##########################################################################################################
  • config用の情報や移行元サーバと設定を合わせるために設定を追加します。
    • 1回目はolcRootPWを変えられなかったので、2回めにolcRootPWのみ変更しました。
      • 1回目でうまくいくこともありました。
    • 差分だけ記述してます。
$ sudo ldapvi -Y EXTERNAL -h ldapi:/// -b 'olcDatabase={0}config,cn=config'
---
olcRootDN: cn=config
olcRootPW: (パスワードのハッシュ)
---

$ sudo ldapvi -Y EXTERNAL -h ldapi:/// -b 'olcDatabase={1}hdb,cn=config'
---
olcSuffix: dc=ldap,dc=example,dc=com
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=root,dc=ldap,dc=example,dc=com" write by * none
olcAccess: {2}to * by self write by dn="cn=root,dc=ldap,dc=example,dc=com" write by * read
olcRootDN: cn=root,dc=ldap,dc=example,dc=com
olcDbIndex: objectClass eq
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
olcDbIndex: uidNumber,gidNumber,loginShell eq,pres
olcDbIndex: uid,memberUid eq,pres,sub
olcDbIndex: nisMapName,nisMapEntry eq,pres,sub
---

データ投入

  • LDAPの中身を確認します。(空なはず)
$ ldapsearch -x -b "dc=ldap,dc=example,dc=com" -D "cn=root,dc=ldap,dc=example,dc=com" -W
---
# extended LDIF
#
# LDAPv3
# base <dc=ldap,dc=example,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1
---
  • 初期データを投入します。
$ vi base.ldif
---
dn: dc=ldap,dc=example,dc=com
objectClass: dcObject
objectClass: organization
o: foo-system
dc: ldap

dn: ou=Users,dc=ldap,dc=example,dc=com
objectClass: organizationalUnit
ou: Users

dn: ou=Groups,dc=ldap,dc=example,dc=com
objectClass: organizationalUnit
ou: Groups
---
$ ldapadd -x -D "cn=root,dc=ldap,dc=example,dc=com" -W -f base.ldif
  • 初期ユーザを投入して、動作を確認します。
$ vi users.ldif
---
dn: uid=admin,ou=Users,dc=ldap,dc=example,dc=com
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: admin
sn: admin
uid: admin
uidNumber: 1000
gidNumber: 513
homeDirectory: /home/admin
loginShell: /bin/bash
gecos: System User
description: System User
displayName: System User
userPassword:: ########################################

dn: uid=test,ou=Users,dc=ldap,dc=example,dc=com
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: test
sn: test
uid: test
uidNumber: 1001
gidNumber: 513
homeDirectory: /home/test
loginShell: /bin/bash
gecos: Test User
description: Test User
displayName: Test User
userPassword:: ########################################
---

$ ldapadd -x -D "cn=root,dc=ldap,dc=example,dc=com" -W -f users.ldif
  • 投入したユーザのパスワード変えたいときは以下のようにパスワードのハッシュ値を作っておいて、その文字列を投入します。
$ slappasswd -h "{MD5}"
$ sudo ldapvi -Y EXTERNAL -h ldapi:/// -D "cn=root,dc=ldap,dc=example,dc=com" -b "uid=test,ou=Users,dc=ldap,dc=example,dc=com"
  • パスワード変わってるか確認
$ ldapsearch -x -b "dc=ldap,dc=example,dc=com" -D "uid=test,ou=Users,dc=ldap,dc=example,dc=com" -W
  • 後は旧サーバから移行するデータをldifで作って流すだけです。