Частичное (гранулярное) восстановление данных каталога
В некоторых случаях в процессе эксплуатации «Эллес» может возникать необходимость в восстановлении отдельных объектов службы каталогов, например, в связи с их ошибочным удалением или наполнением некорректными данными.
Ограничения
Текущий вариант реализации механизма частичного (гранулярного) восстановления данных каталога имеет следующие ограничения:
-
Частичное восстановление доступно только при наличии файла резервной копии с необходимыми данными.
-
Доступно частичное восстановление только измененных или удаленных объектов LDAP.
-
При добавлении удаленных объектов создается новый объект с новыми системными полями (
objectSID,objectGUIDи т. д.). -
Для определения отличий между составом объектов каталога и их атрибутами используется подкоманда
samba-tool ldapcmp, которая сравнивает две базы данных каталога. В текущей реализации она может работать только с запущенным контроллером домена, так как обращается к базам посредством LDAP-запроса. -
Для применения изменений используется утилита
ldbmodify, которая в рамках одного вызова может работать либо в режиме добавления новых записей, либо в режиме изменения текущих записей. Для выполнения этих двух задач администратору необходимо подготовить отдельные LDIF-файлы.
Частичное восстановление данных из резервной копии
Для восстановления утерянных или поврежденных данных из резервной копии выполните следующие действия:
-
Определите отличия между версией базы данных из файла резервной копии и текущей, чтобы определить, какие записи требуется восстановить или изменить.
Для определения отличий может использоваться подкоманда
samba-tool ldapcmp, которая сравнивает две базы данных каталога и формирует файл в формате JSON с перечнем различий в составе объектов и значениях их атрибутов (см. описание формата файла, синтаксис и примеры использования подкоманды в разделе «Сравнение БД LDAP на контроллерах домена»). -
На основе полученного JSON-файла сформируйте перечень DN, которые должны быть восстановлены или изменены. Они будут использоваться как ключи для поиска и фильтрации данных в резервной копии при формировании LDIF-файлов.
-
Для модификации записей в текущей БД домена сформируйте файлы в формате LDIF с помощью подкоманды
samba-tool domain backup granularrestore(см. описание синтаксиса подкоманды в разделе «Создание LDIF-файла для частичного (гранулярного) восстановления данных каталога из файла с резервной копией»). -
Проверьте, что все необходимые для восстановления данные присутствуют в LDIF-файле.
-
Примените изменения, содержащиеся в LDIF-файле, на контроллере домена, используя утилиту
ldbmodify(полный путь к утилите после установки пакета inno-samba — /app/inno-samba/bin/ldbmodify).
Пример восстановления отдельного объекта
Пример формирования и применения LDIF-файла для восстановления отдельного объекта из резервной копии:
-
Сформируйте файл со списком DN восстанавливаемых объектов.
Например:
{ "DNs": [ "CN=User1,OU=OU1,DC=elles,DC=inno,DC=tech" ] } -
Сформируйте LDIF-файл.
Например:
samba-tool domain backup granularrestore \ --makeldif \ /tmp/dn_to_restore.json \ /backups/samba-backup-elles.inno.tech-2025-01-17T16-06-26.224778.tar.bz2 \ > /tmp/add_user1.ldif -
Убедитесь, что файл сформирован корректно.
Пример LDIF-файла
dn: CN=User1,OU=OU1,DC=elles,DC=inno,DC=tech changetype: add objectClass: top objectClass: person objectClass: organizationalPerson objectClass: user cn: User1 title: Manager instanceType: 4 whenCreated: 20250117122503.0Z whenChanged: 20250117122503.0Z uSNCreated: 6236 uSNChanged: 6236 department: Department1 company: Company1 name: lct_u5 # objectGUID: 33ad1607-5929-4b99-93b9-b64e1aff1861 userAccountControl: 512 codePage: 0 countryCode: 0 # pwdLastSet: 133815903036300238 # primaryGroupID: 513 # objectSid: S-1-5-21-207620958-708556064-199204346-1108 accountExpires: 9223372036854775807 sAMAccountName: User1 # sAMAccountType: 805306368 userPrincipalName: user1@elles.inno.tech objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=elles,DC=inno,DC=tech # memberOf: CN=Group1,OU=OU1,DC=elles,DC=inno,DC=tech distinguishedName: CN=User1,OU=OU1,DC=elles,DC=inno,DC=tech nTSecurityDescriptor: ...
-
Примените изменения.
Например:
/app/inno-samba/bin/ldbmodify -H ldap://dc01 -UAdministrator /tmp/add_user1.ldif
Пример восстановления значений всех атрибутов объекта
Пример формирования и применения LDIF-файла для восстановления значений всех атрибутов, кроме игнорируемых, отдельного объекта на основе данных из резервной копии:
-
Сформируйте файл со списком DN объектов, значения атрибутов которых должны быть восстановлены.
Например:{ "DNs": [ "CN=User2,OU=OU1,DC=elles,DC=inno,DC=tech" ] } -
Сформируйте LDIF-файл.
Например:
samba-tool domain backup granularrestore \ --makeldif \ /tmp/dn_to_restore.json \ /backups/samba-backup-elles.inno.tech-2025-01-17T16-06-26.224778.tar.bz2 \ --action=Modify \ > /tmp/modify_user2.ldif -
Убедитесь, что файл сформирован корректно.
Пример LDIF-файла
dn: CN=User2,OU=OU1,DC=elles,DC=inno,DC=tech changetype: modify # objectClass: top # objectClass: person # objectClass: organizationalPerson # objectClass: user - # cn: User2 - replace: title title: Manager - # instanceType: 4 - # whenCreated: 20250117140149.0Z - # whenChanged: 20250117140149.0Z - # uSNCreated: 3847 - # uSNChanged: 3847 - replace: department department: Department1 - replace: company company: Company1 - # name: User2 - # objectGUID: 0c5629ae-9a54-42c3-8fe1-1149295b49b1 - replace: userAccountControl userAccountControl: 512 - replace: codePage codePage: 0 - replace: countryCode countryCode: 0 - replace: pwdLastSet pwdLastSet: 133815961096627785 - replace: primaryGroupID primaryGroupID: 513 - # objectSid: S-1-5-21-207620958-708556064-199204346-1112 - replace: accountExpires accountExpires: 9223372036854775807 - replace: sAMAccountName sAMAccountName: User2 - # sAMAccountType: 805306368 - replace: userPrincipalName userPrincipalName: user2@elles.inno.tech - replace: objectCategory objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=elles,DC=inno,DC=tech - # memberOf: CN=Group1,OU=OU1,DC=elles,DC=inno,DC=tech - # distinguishedName: CN=User2,OU=OU1,DC=elles,DC=inno,DC=tech - replace: nTSecurityDescriptor nTSecurityDescriptor: ... -
-
Примените изменения.
Например:
/app/inno-samba/bin/ldbmodify -H ldap://dc01 -UAdministrator /tmp/modify_user2.ldif
Пример восстановления значений указанных атрибутов объекта
Пример формирования и применения LDIF-файла для восстановления указанных в дополнительном файле атрибутов объекта из резервной копии:
-
Сформируйте файл со списком DN восстанавливаемых объектов.
Например:
{ "DNs": [ "CN=User3,OU=OU1,DC=elles,DC=inno,DC=tech" ] } -
Сформируйте файл со списком атрибутов.
Например:
company department title telephoneNumber
-
Сформируйте LDIF-файл.
Например:
samba-tool domain backup granularrestore \ --makeldif \ /tmp/dn_to_restore.json \ /backups/samba-backup-elles.inno.tech-2025-01-17T16-06-26.224778.tar.bz2 \ --attributes /tmp/attrs.txt \ --action=Modify \ > /tmp/modify_user3.ldif -
Убедитесь, что файл сформирован корректно.
Пример LDIF-файла
dn: CN=User3,CN=OU1,DC=elles,DC=inno,DC=tech changetype: modify replace: company company: Company1 - replace: department department: Department1 - replace: title title: Manager - replace: telephoneNumber telephoneNumber: 123-45-67 -
-
Примените изменения.
Например:
/app/inno-samba/bin/ldbmodify -H ldap://dc01 -UAdministrator /tmp/modify_user3.ldif
Пример восстановления значений атрибутов объекта, кроме указанных
Пример формирования и применения LDIF-файла для восстановления атрибутов объекта, кроме указанных в файле, из резервной копии:
-
Сформируйте файл со списком DN восстанавливаемых объектов.
Например:
{ "DNs": [ "CN=User4,OU=OU1,DC=elles,DC=inno,DC=tech" ] } -
Сформируйте файл со списком атрибутов, которые должны быть исключены из обработки.
Например:
userAccountControl codePage countryCode pwdLastSet primaryGroupID accountExpires userPrincipalName objectCategory nTSecurityDescriptor
-
Сформируйте LDIF-файл.
Например:
samba-tool domain backup granularrestore \ --makeldif \ /tmp/dn_to_restore.json \ /backups/samba-backup-elles.inno.tech-2025-01-17T16-06-26.224778.tar.bz2 \ --attributes /tmp/attrs_to_exclude.txt \ --exclude \ --action=Modify \ > /tmp/modify_user4.ldif -
Убедитесь, что файл сформирован корректно.
Пример LDIF-файла
dn: CN=User4,OU=OU1,DC=elles,DC=inno,DC=tech changetype: modify # objectClass: top # objectClass: person # objectClass: organizationalPerson # objectClass: user - # cn: lct_u5 - replace: title title: Job - # instanceType: 4 - # whenCreated: 20250117135451.0Z - # whenChanged: 20250117135451.0Z - # uSNCreated: 6245 - # uSNChanged: 6245 - replace: department department: Department1 - replace: company company: Company1 - # name: User4 - # objectGUID: ff0bd725-5f69-4377-b0f2-03de397aa55b - # objectSid: S-1-5-21-207620958-708556064-199204346-1111 - replace: sAMAccountName sAMAccountName: User4 - # sAMAccountType: 805306368 - # memberOf: CN=Group1,OU=OU1,DC=elles,DC=inno,DC=tech - # distinguishedName: CN=User4,OU=OU1,DC=elles,DC=inno,DC=tech -
-
Примените изменения.
Например:
/app/inno-samba/bin/ldbmodify -H ldap://dc01 -UAdministrator /tmp/modify_user4.ldif