slapdのDBのバックアップ(3パターン+1)、DBの初期化、リストア

■slapdのDBのバックアップ(3パターン+1)、DBの初期化、リストア

 WheezyでLDAP認証、SSHログイン
 http://d.hatena.ne.jp/labunix/20130418

■バックアップとバックアップデータの検証

$ sudo slapcat -s "dc=openldap,dc=local" -l backup.ldif
$ sudo slapadd -u -v -l backup.ldif
added: "dc=openldap,dc=local"
added: "cn=admin,dc=openldap,dc=local"
added: "ou=People,dc=openldap,dc=local"
added: "ou=Group,dc=openldap,dc=local"
added: "uid=ldapuser,ou=People,dc=openldap,dc=local"
added: "cn=ldapgroup,ou=Group,dc=openldap,dc=local"
_#################### 100.00% eta   none elapsed            none fast!

$ sudo slapcat -v -s "ou=People,dc=openldap,dc=local" -l user_backup.ldif
# id=00000003
# id=00000005

$ sudo slapadd -u -v -l user_backup.ldif
added: "ou=People,dc=openldap,dc=local"
added: "uid=ldapuser,ou=People,dc=openldap,dc=local"
_#################### 100.00% eta   none elapsed            none fast!

$ sudo slapcat -v -s "ou=Group,dc=openldap,dc=local" -l group_backup.ldif
# id=00000004
# id=00000006

$ sudo slapadd -u -v -l group_backup.ldif
added: "ou=Group,dc=openldap,dc=local"
added: "cn=ldapgroup,ou=Group,dc=openldap,dc=local"
_#################### 100.00% eta   none elapsed            none fast!

■これには、前回別にした「ug_init_ou.ldif」の内容が含まれている。

$ grep objectClass [ug]*backup.ldif
group_backup.ldif:objectClass: organizationalUnit
group_backup.ldif:objectClass: top
group_backup.ldif:objectClass: posixGroup
user_backup.ldif:objectClass: organizationalUnit
user_backup.ldif:objectClass: top
user_backup.ldif:objectClass: account
user_backup.ldif:objectClass: posixAccount
user_backup.ldif:objectClass: shadowAccount

■「backup.ldif」では「dn」の2つが含まれており、このままでは使えない。

$ grep ^dn *backup.ldif
backup.ldif:dn: dc=openldap,dc=local
backup.ldif:dn: cn=admin,dc=openldap,dc=local
backup.ldif:dn: ou=People,dc=openldap,dc=local
backup.ldif:dn: ou=Group,dc=openldap,dc=local
backup.ldif:dn: uid=ldapuser,ou=People,dc=openldap,dc=local
backup.ldif:dn: cn=ldapgroup,ou=Group,dc=openldap,dc=local
group_backup.ldif:dn: ou=Group,dc=openldap,dc=local
group_backup.ldif:dn: cn=ldapgroup,ou=Group,dc=openldap,dc=local
user_backup.ldif:dn: ou=People,dc=openldap,dc=local
user_backup.ldif:dn: uid=ldapuser,ou=People,dc=openldap,dc=local


■初期化

$ sudo /etc/init.d/slapd stop
[ ok ] Stopping OpenLDAP: slapd.
$ ls /var/lib/ldap
DB_CONFIG  __db.002  __db.004  __db.006  dn2id.bdb     log.0000000001
__db.001   __db.003  __db.005  alock     id2entry.bdb  objectClass.bdb

$ sudo rm -fr /var/lib/ldap/*

■リストア前の再設定

$ sudo dpkg-reconfigure slapd
OpenLDAP サーバの設定を省略しますか? 			<いいえ>
DNS ドメイン名:						openldap.local
組織名:							openldap.local
管理者のパスワード:					※初期化前と同じもの
利用するデータベースバックエンド:			HDB
slapd をパージしたときにデータベースを削除しますか?	<いいえ>
LDAPv2 プロトコルを許可しますか?			<いいえ>
[ ok ] Stopping OpenLDAP: slapd.
  Creating initial configuration... done.
  Creating LDAP directory... done.
[ ok ] Starting OpenLDAP: slapd.

■所有者がopenldapとしてDBが再作成される。

$ ls -l /var/lib/ldap/
合計 1404
-rw-r--r-- 1 openldap openldap       96  418 21:31 DB_CONFIG
-rw------- 1 openldap openldap    24576  418 21:31 __db.001
-rw------- 1 openldap openldap   368640  418 21:31 __db.002
-rw------- 1 openldap openldap  2629632  418 21:31 __db.003
-rw------- 1 openldap openldap   163840  418 21:31 __db.004
-rw------- 1 openldap openldap  1286144  418 21:31 __db.005
-rw------- 1 openldap openldap    32768  418 21:31 __db.006
-rw-r--r-- 1 openldap openldap     2048  418 21:31 alock
-rw------- 1 openldap openldap     8192  418 21:31 dn2id.bdb
-rw------- 1 openldap openldap    32768  418 21:31 id2entry.bdb
-rw------- 1 openldap openldap 10485760  418 21:31 log.0000000001
-rw------- 1 openldap openldap     8192  418 21:31 objectClass.bdb

■DBが初期化されたことを確認

$ ldapsearch -x -LLL -h localhost -b "dc=openldap,dc=local" "objectClass=top"
dn: dc=openldap,dc=local
objectClass: top
objectClass: dcObject
objectClass: organization
o: openldap.local
dc: openldap

dn: cn=admin,dc=openldap,dc=local
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

■パターン1
 前回の2つの登録を行う場合

$ sudo ldapadd -f ug_init_ou.ldif -x -D "cn=admin,dc=openldap,dc=local" -W
$ sudo ldapadd -f ldapuser_init_cn.ldif -x -D "cn=admin,dc=openldap,dc=local" -W

 前回の2つの登録の確認

$ ldapsearch -x -LLL -h localhost -b "dc=openldap,dc=local" "uid=ldapuser"
dn: uid=ldapuser,ou=People,dc=openldap,dc=local
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
uid: ldapuser
uidNumber: 10000
gidNumber: 10000
loginShell: /bin/bash
homeDirectory: /home/ldapuser
cn: OpenLdap Div

$ ldapsearch -x -LLL -h localhost -b "dc=openldap,dc=local" "cn=ldapgroup"
dn: cn=ldapgroup,ou=Group,dc=openldap,dc=local
objectClass: posixGroup
cn: ldapgroup
gidNumber: 10000
memberUid: ldapuser

 sshログインチェック

$ ssh ldapuser@localhost

■パターン2
 「user_backup.ldif」「group_backup.ldif」を使用する

$ sudo /etc/init.d/slapd stop
[ ok ] Stopping OpenLDAP: slapd.

$ sudo slapadd -u -v -l user_backup.ldif
added: "ou=People,dc=openldap,dc=local"
added: "uid=ldapuser,ou=People,dc=openldap,dc=local"
_#################### 100.00% eta   none elapsed            none fast!

$ sudo slapadd -v -l user_backup.ldif
added: "ou=People,dc=openldap,dc=local" (00000003)
added: "uid=ldapuser,ou=People,dc=openldap,dc=local" (00000004)
_#################### 100.00% eta   none elapsed            none fast!
Closing DB...

$ sudo slapadd -u -v -l group_backup.ldif
added: "ou=Group,dc=openldap,dc=local"
added: "cn=ldapgroup,ou=Group,dc=openldap,dc=local"
_#################### 100.00% eta   none elapsed            none fast!

$ sudo slapadd -v -l group_backup.ldif
added: "ou=Group,dc=openldap,dc=local" (00000005)
added: "cn=ldapgroup,ou=Group,dc=openldap,dc=local" (00000006)
_#################### 100.00% eta   none elapsed            none fast!
Closing DB...

 slapindexで再構成

$ sudo -u openldap slapindex
$ sudo /etc/init.d/slapd restart
[ ok ] Stopping OpenLDAP: slapd.
[ ok ] Starting OpenLDAP: slapd.

 sshでログインチェック

$ ssh ldapuser@localhost

■パターン3
 「backup.ldif」からリストアする方法
 「dn」がtopとadminは削除する。

$ sudo /etc/init.d/slapd stop

$ sudo slapadd -u -v -l backup.ldif
added: "ou=People,dc=openldap,dc=local"
added: "ou=Group,dc=openldap,dc=local"
added: "uid=ldapuser,ou=People,dc=openldap,dc=local"
added: "cn=ldapgroup,ou=Group,dc=openldap,dc=local"
_#################### 100.00% eta   none elapsed            none fast!

$ sudo slapadd -v -l backup.ldif
added: "ou=People,dc=openldap,dc=local" (00000003)
added: "ou=Group,dc=openldap,dc=local" (00000004)
added: "uid=ldapuser,ou=People,dc=openldap,dc=local" (00000005)
added: "cn=ldapgroup,ou=Group,dc=openldap,dc=local" (00000006)
_#################### 100.00% eta   none elapsed            none fast!
Closing DB...

$ sudo -u openldap slapindex
$ sudo /etc/init.d/slapd start

■おまけ
 DBが壊れてないなら苦労しませんよね。

$ sudo tar zcvf hdb.tar.gz /var/lib/ldap/
tar: メンバ名から先頭の '/' を取り除きます
/var/lib/ldap/
/var/lib/ldap/__db.003
/var/lib/ldap/__db.005
/var/lib/ldap/__db.006
/var/lib/ldap/objectClass.bdb
/var/lib/ldap/__db.002
/var/lib/ldap/log.0000000001
/var/lib/ldap/dn2id.bdb
/var/lib/ldap/alock
/var/lib/ldap/id2entry.bdb
/var/lib/ldap/__db.004
/var/lib/ldap/__db.001
/var/lib/ldap/DB_CONFIG

$ sudo /etc/init.d/slapd stop
$ sudo rm -fr /var/lib/ldap/*
$ sudo tar zxvf hdb.tar.gz -C /
$ sudo /etc/init.d/slapd start
[ ok ] Starting OpenLDAP: slapd.

■最終チェック

$ ldapsearch -x -LLL -b "ou=People,dc=openldap,dc=local" "uid=*"
dn: uid=ldapuser,ou=People,dc=openldap,dc=local
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
uid: ldapuser
uidNumber: 10000
gidNumber: 10000
loginShell: /bin/bash
homeDirectory: /home/ldapuser
cn: OpenLdap Div

$ ldapsearch -x -LLL -b "ou=Group,dc=openldap,dc=local" "cn=*"
dn: cn=ldapgroup,ou=Group,dc=openldap,dc=local
objectClass: posixGroup
cn: ldapgroup
gidNumber: 10000
memberUid: ldapuser