Частичное (гранулярное) восстановление данных каталога

В некоторых случаях в процессе эксплуатации «Эллес» может возникать необходимость в восстановлении отдельных объектов службы каталогов, например, в связи с их ошибочным удалением или наполнением некорректными данными.

Ограничения

Текущий вариант реализации механизма частичного (гранулярного) восстановления данных каталога имеет следующие ограничения:

  1. Частичное восстановление доступно только при наличии файла резервной копии с необходимыми данными.

  2. Доступно частичное восстановление только измененных или удаленных объектов LDAP.

  3. При добавлении удаленных объектов создается новый объект с новыми системными полями (objectSID, objectGUID и т. д.).

  4. Для определения отличий между составом объектов каталога и их атрибутами используется подкоманда samba-tool ldapcmp, которая сравнивает две базы данных каталога. В текущей реализации она может работать только с запущенным контроллером домена, так как обращается к базам посредством LDAP-запроса.

  5. Для применения изменений используется утилита ldbmodify, которая в рамках одного вызова может работать либо в режиме добавления новых записей, либо в режиме изменения текущих записей. Для выполнения этих двух задач администратору необходимо подготовить отдельные LDIF-файлы.

Частичное восстановление данных из резервной копии

Для восстановления утерянных или поврежденных данных из резервной копии выполните следующие действия:

  1. Определите отличия между версией базы данных из файла резервной копии и текущей, чтобы определить, какие записи требуется восстановить или изменить.

    Для определения отличий может использоваться подкоманда samba-tool ldapcmp, которая сравнивает две базы данных каталога и формирует файл в формате JSON с перечнем различий в составе объектов и значениях их атрибутов (см. описание формата файла, синтаксис и примеры использования подкоманды в разделе «Сравнение БД LDAP на контроллерах домена»).

  2. На основе полученного JSON-файла сформируйте перечень DN, которые должны быть восстановлены или изменены. Они будут использоваться как ключи для поиска и фильтрации данных в резервной копии при формировании LDIF-файлов.

  3. Для модификации записей в текущей БД домена сформируйте файлы в формате LDIF с помощью подкоманды samba-tool domain backup granularrestore (см. описание синтаксиса подкоманды в разделе «Создание LDIF-файла для частичного (гранулярного) восстановления данных каталога из файла с резервной копией»).

  4. Проверьте, что все необходимые для восстановления данные присутствуют в LDIF-файле.

  5. Примените изменения, содержащиеся в LDIF-файле, на контроллере домена, используя утилиту ldbmodify (полный путь к утилите после установки пакета inno-samba — /app/inno-samba/bin/ldbmodify).

Пример восстановления отдельного объекта

Пример формирования и применения LDIF-файла для восстановления отдельного объекта из резервной копии:

  1. Сформируйте файл со списком DN восстанавливаемых объектов.

    Например:

    {
        "DNs": [
            "CN=User1,OU=OU1,DC=elles,DC=inno,DC=tech"
        ]
    }
  2. Сформируйте 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
  3. Убедитесь, что файл сформирован корректно.

    Пример 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: ...
  4. Примените изменения.

    Например:

    /app/inno-samba/bin/ldbmodify -H ldap://dc01 -UAdministrator /tmp/add_user1.ldif

Пример восстановления значений всех атрибутов объекта

Пример формирования и применения LDIF-файла для восстановления значений всех атрибутов, кроме игнорируемых, отдельного объекта на основе данных из резервной копии:

  1. Сформируйте файл со списком DN объектов, значения атрибутов которых должны быть восстановлены.
    Например:

    {
        "DNs": [
            "CN=User2,OU=OU1,DC=elles,DC=inno,DC=tech"
        ]
    }
  2. Сформируйте 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
  3. Убедитесь, что файл сформирован корректно.

    Пример 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: ...
    -
  4. Примените изменения.

    Например:

    /app/inno-samba/bin/ldbmodify -H ldap://dc01 -UAdministrator /tmp/modify_user2.ldif

Пример восстановления значений указанных атрибутов объекта

Пример формирования и применения LDIF-файла для восстановления указанных в дополнительном файле атрибутов объекта из резервной копии:

  1. Сформируйте файл со списком DN восстанавливаемых объектов.

    Например:

    {
        "DNs": [
            "CN=User3,OU=OU1,DC=elles,DC=inno,DC=tech"
        ]
    }
  2. Сформируйте файл со списком атрибутов.

    Например:

    company
    department
    title
    telephoneNumber
  3. Сформируйте 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
  4. Убедитесь, что файл сформирован корректно.

    Пример 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
    -
  5. Примените изменения.

    Например:

    /app/inno-samba/bin/ldbmodify -H ldap://dc01 -UAdministrator /tmp/modify_user3.ldif

Пример восстановления значений атрибутов объекта, кроме указанных

Пример формирования и применения LDIF-файла для восстановления атрибутов объекта, кроме указанных в файле, из резервной копии:

  1. Сформируйте файл со списком DN восстанавливаемых объектов.

    Например:

    {
        "DNs": [
            "CN=User4,OU=OU1,DC=elles,DC=inno,DC=tech"
        ]
    }
  2. Сформируйте файл со списком атрибутов, которые должны быть исключены из обработки.

    Например:

    userAccountControl
    codePage
    countryCode
    pwdLastSet
    primaryGroupID
    accountExpires
    userPrincipalName
    objectCategory
    nTSecurityDescriptor
  3. Сформируйте 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
  4. Убедитесь, что файл сформирован корректно.

    Пример 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
    -
  5. Примените изменения.

    Например:

    /app/inno-samba/bin/ldbmodify -H ldap://dc01 -UAdministrator /tmp/modify_user4.ldif