Настраиваем резервное копирование Active Directory
https://winitpro.ru/index.php/2019/10/10/nastraivaem-backup-active-directory/
Настраиваем резервное копирование Active Directory | Windows для системных администраторов
Настраиваем резервное копирование Active Directory
В этой статье мы поговорим об особенностях резервного копирования контроллеров домена Active Directory, рассмотрим, как настроить автоматическое резервное копирование AD с помощью PowerShell и встроенного Windows Server Backup.
Нужно ли бэкапить Active Directory?
Одним из способов повышения отказоустойчивой и распределения нагрузки в Active Directory является развертывание дополнительных контроллеров домена. В такой среде база AD реплицируется между всеми DC и при выходе из строя любого контроллера домена не происходит полный отказ сервиса. Клиенты смогут просто переключиться на оставшиеся DC. Администратор может затем быстро развернуть новый DC на площадке, реплицировать на него базу AD с оставшихся DC, а старый контроллер домена удалить согласно инструкции.
Однако наличие дополнительных контроллеров домена не поможет в случаях когда неисправны все контроллеры домена. Например, когда все DC инфицированы или зашифрованы (например в случае перехвата учетных данных администратора домена утилитой mimikatz), повреждений в логической структуре базы данных NTDS.DIT (которая была реплицирована на все DC), или в других катастрофических сценариях.
В общем, бэкапить AD можно и нужно. Как минимум вы должны регулярно создавать резервные копии ключевых контроллеров доменов, владельцев ролей FSMO (Flexible single-master operations). Вы можете получить список контролеров домена с ролями FSMO командой:
netdom query fsmo
Как проверить дату последнего бэкапа контроллера домена Active Directory?
Можно проверить, когда создавалась резервная копия текущего контроллера домена AD с помощью утилиты repadmin:
repadmin /showbackup
В данном примере видно, что последний раз бэкап DC и разделов AD выполнялся в 2021 году (скорее всего он не делался с момента развертывания контроллера домена).
Узнать время последнего резервному копированию всех DC в домене:
repadmin /showbackup *
С помощью следующей команды можно узнать сколько раз выполнялось резервное копирование AD на конкретном DC:
(Get-ADReplicationAttributeMetadata -Object "CN=Configuration,DC=WINITPRO,DC=LOC" -Properties dSASignature -Server DC01).Version
Бэкап контроллера домена AD с помощью Windows Server Backup
Если у вас нет специального ПО для резервного копирования, для создания резервных копий AD можно использовать встроенный Windows Server Backup (этот компонент пришел на замену NTBackup
).
Для резервного контроллера домена нужно создать резервную копию Состояния системы (System State). В System State бэкап попадает база Active Directory (NTDS.DIT), содержимое каталога SYSVOL с файлами групповых политик (GPO), DNS зоны, реестр, метаданные IIS, база данных службы сертификации AD CS, файлы загрузчика Windows, и другие системные файлы и ресурсы. Резервная копия создается через службу теневого копирования VSS.
Проверьте, установлен ли компонент Windows Server Backup с помощью PowerShell командлета Get-WindowsFeature:
Get-WindowsFeature Windows-Server-Backup
Если компонент WSB отсутствует, установите его с помощью PowerShell:
Add-Windowsfeature Windows-Server-Backup –Includeallsubfeature
Или из Server Manager -> Features.
Я буду сохранять бэкап данного контроллера домена AD в сетевую папку на отдельном выделенном сервере для резервного копирования. Например, путь к каталогу будет таким \\srvbak1\backup\dc01
. Измените NTFS разрешения на сетевой папке, чтобы права чтения-записи в каталог были только у SYSTEM, Domain Admins и Domain Controllers.
Вы можете настроить автоматическое задание резервного копирования в графической MMC оснастке Windows Server Backup ( wbadmin.msc
). Недостаток этого инструмента — новая резервная копия в каталоге WindowsImageBackup будет перезаписывать старую. Чтобы хранить копии AD от разных дат, можно автоматизировать резервное копирование с помощью консольной утилиты wbadmin.exe.
Резервное копирование Active Directory с помощью PowerShell
Для автоматизации бэкапов контроллера домена воспользуемся PowerShell скриптом. Для хранения нескольких уровней копий AD мы будем хранить каждый бэкап в отдельном каталоге с датой создания копии в качестве имени папки.
Базовая версия PowerShell скрипта резервного копирования DC будет выглядеть так (укажите UNC путь к сетевой папке:
$path="\\srvbak1\backup\dc1\"
Import-Module ServerManager
[string]$date = get-date -f 'yyyy-MM-dd'
$TargetUNC=$path+$date
$TestTargetUNC= Test-Path -Path $TargetUNC
if (!($TestTargetUNC)){
New-Item -Path $TargetUNC -ItemType directory
}
$WBadmin_cmd = "wbadmin.exe START BACKUP -backupTarget:$TargetUNC -systemState -noverify -vssCopy -quiet"
Invoke-Expression $WBadmin_cmd
Чтобы PowerShell скрипт удалял старые резервные копии (например, старше 60 дней), можно добавить такой код:
$Period = "-60" # Количество хранимых дней.
# Вычисляем дату после которой будем удалять файлы.
$CurrentDay = Get-Date
$ChDaysDel = $CurrentDay.AddDays($Period)
# Удаление файлов, дата создания которых больше заданного количества дней
GCI -Path $TargetUNC -Recurse | Where-Object {$_.CreationTime -LT $ChDaysDel} | RI -Recurse -Force
# Удаление пустых папок
GCI -Path $TargetUNC -Recurse | Where-Object {$_.PSIsContainer -and @(Get-ChildItem -Path $_.Fullname -Recurse | Where { -not $_.PSIsContainer }).Count -eq 0 } | RI -Recurse
$KeepVersion=10
$WBadmin_cmd = " wbadmin delete backup -keepVersions:$KeepVersion -quiet"
Invoke-Expression $WBadmin_cmd
В этом случае wbadmin будет хранить только последние 10 резервных копий. Более старые будут удалены.
Запустите данный скрипт. Должна появится консоль wbadmin с информацией о процессе создании теневой копии диска:
Если бэкап выполнен успешно, в логе появятся сообщения:
The backup operation successfully completed. The backup of volume (C:) completed successfully. The backup of the system state successfully completed [11/15/24 12:51 PM].
Лог бэкапа хранится в каталоге C:\Windows\Logs\WindowsServerBackup\
.
Теперь проверьте, что дата даты последнего бэкапа DC обновлена:
repadmin /showbackup
Размер каталога с резервной копией контроллера домена в сетевой папке в этом примере около 12 Гб. На выходе вы получили VHDX файл, который можно использовать для восстановления ОС через WSB, или вы можете вручную смонтировать VHDX файл и извлечь из него нужные файлы или папки.
$WBadmin_cmd = "wbadmin start backup -backuptarget:$path -include:C:\Windows\NTDS\ntds.dit -quiet"
Invoke-Expression $WBadmin_cmd
Размер такого бэкапа будет составлять всего 50-500 Мб в зависимости от размера базы AD.
Для автоматического выполнения бэкапа по расписанию, создайте на DC создать скрипт c:\ps\backup_ad.ps1
. Этот скрипт нужно запускать по расписанию через Task Scheduler. Можно создать задание планировщика из графического интерфейса или из PowerShell. Главное требование — задание должно запускать от имени SYSTEM с включенной опцией Run with highest privileges. Для бэкапа контролера домена AD три раза в неделю создайте следующее задание:
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Tuesday,Friday -At "01:00AM"
$User= "NT AUTHORITY\SYSTEM"
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "c:\ps\backup_ad.ps1"
Register-ScheduledTask -TaskName "BackupADScript_PS" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force
Итак, мы настроили резервное копирование на контроллере домена AD, а в следующей статье мы поговорим о способах восстановления Active Directory из имеющейся резервной копии.
Что если владельцем ролей был один домен контроллер, а бэкапы есть другого, при этом оба умерли. Восстановится нормально?
Поднимать новый сервер и попытаться подменить ntds.dit, SYSVOL. Возможно понадобится подменить кусты реестра SAM и SYSTEM.
Все верно. Досточно развернуть второй DC из бэкапа и принудительно захватить FSMO роли по стандартной процедуре.
Наткнулся в инете на блог с описанием реального случая восстановления AD. Описывался тяжелый случай — из-за помершей батарейки на кеше RAIDа умерли оба DC (ntds.dit был испорчен). Восстановление из резервной копии контроллера давало глючный сервер (постоянный экран смерти). Но в бэкапе была исправнst база AD и sysvol. Для восстановления AD оказалось недостаточно копий ntds.dit и sysvol. Нужно еще кусты реестра SAM и SYSTEM копировать. Получили глючный сервер, но с исправной AD и рабочей консолью. Дальше уже было дело техники.
Есть шутка. Админы делятся на 2 типа: те, кто делают бэкапы и те, кто не делаетт. Первый тип делится на 2 подтипа: те, кто проверяют бэкапы, те , кто не проверяют. )))
Попробовал все работает.
Решил немного изменить команду, у меня на диске «Е» объемные файлы, которые хотелось бы исключить из резервной копии.
$WBadmin_cmd = «wbadmin.exe START BACKUP -backupTarget:$TargetUNC -systemState -noverify -vssCopy -quiet -exclude:e:»
Не работает.
В systemstate другие диски и так не включаются. Да и с системного диска забирается далеко не все.
Вышла статья про восстановление Active Directory — https://winitpro.ru/index.php/2019/10/31/vosstanovlenie-active-directory-backup/
Я правильно понимаю — в такой бэкап не попадают объёкты домена (учётные записи ЭВМ и пользователей)? То есть, если удалить OU с учётными записями ЭВМ, например, то этот бэкап не поможет?
Неправильно. В бэкапе будет присуствовать полностью база данных AD (ntds.dit) со всеми объектами (OU, пользватели, компьютеры). Вы можете восстановить из него что-угодно.
Если вы хотите защититься от случайных удалений, включайте на защищаемых OU атрибут «Protect object from accidental deletion» и корзину AD для всего домена (Active Directory Recycle Bin). Так гораздо проще восстаналивать удаленные объекты.
Спасибо! Хорошая статья!
Может у кого этот скрипт оброс логированием и удалением старых резервных копий?
$(
‘Start_backup’
Import-Module ServerManager
[string]$date = get-date -f ‘yyyy-MM-dd’
$path=”\\nasd2n1\dcbak\srv-dc2\”
$TargetUNC=$path+$date
$TestTargetUNC= Test-Path -Path $TargetUNC
if (!($TestTargetUNC)){
New-Item -Path $TargetUNC -ItemType directory
}
$WBadmin_cmd = «wbadmin.exe START BACKUP -backupTarget:$TargetUNC -systemState -noverify -vssCopy -quiet»
Invoke-Expression $WBadmin_cmd
) *>&1 >> «C:\ps\out-log.txt»
# Выполняем настройку скрипта удаления старых бэкапов.
# Путь к папке логов.
$TargetFolder = «\\nasd2n1\dcbak\srv-dc2»
$Period = «-7» # Количество хранимых дней.
# Вычисляем дату после которой будем удалять файлы.
$CurrentDay = Get-Date
$ChDaysDel = $CurrentDay.AddDays($Period)
# Удаление файлов, дата создания которых больше заданного количества дней
GCI -Path $TargetFolder -Recurse | Where-Object {$_.CreationTime -LT $ChDaysDel} | RI -Recurse -Force
# Удаление пустых папок
GCI -Path $TargetFolder -Recurse | Where-Object {$_.PSIsContainer -and @(Get-ChildItem -Path $_.Fullname -Recurse | Where { -not $_.PSIsContainer }).Count -eq 0 } | RI -Recurse
Здравствуйте. Спасибо очень информативно. Все работает. Подскажите как доработать скрипт. Полный бэкап 1 раз в неделю, состояние системы 6 раз в неделю. Это делается через планировщик. А вот чтобы последующие затирали предыдущие, не понимаю как сделать.
Простите. Не увидел предыдущего коментария
$TargetUNC=$path+$date
И матерится, что Destination not found.
И как-то не видно в скрипте, где команда на создание папки с именем-давтой.
Есть ли скрипт правильный, выше пример не рабочий
Забивает бекапами все пространство.
Т.е. скрипт все-таки рабочий, бэкапы создаются и вам не хватает функции очистки старых бэкапов?
Да конечно, я про скрипт в коментах, тот что в статье работает отлично.
Еще бы как то добавить очистку.
Не поделитесь как можно модернизировать скрипт? Чтобы удалял? копии
Готового нет. Бэкапы сейчас управляются через veeam, там такой скрипт не нужен.
Посмотрите комментарии выше (Сергей 17.07.2020), там есть кусок кода, который удаляет старые файлы старше 7 дней. Вполне пойдет за основу для вашего скрипта.
А для veeam нужно делать какие то специализированные настройки?
Да.
Вариант 1 — на горячую. Поставить в джобе бекапа галку «veeam application aware processing» и ввести там же учетку от ВМ, что бы вим ммог залогиниться в вм и сделать бекап с учетом работы AD . Там еще есть кнопка тест (логина в вм).
Вариант — офлайн. ПО рассписанию выключать вм, бекапить, потом включать.
Import-Module ServerManager
[string]$date = get-date -f 'yyyy-MM-dd'
$path="\\WS-210134305\DC_backup\"
$TargetUNC=$path+$date
$TestTargetUNC= Test-Path -Path $TargetUNC
if (!($TestTargetUNC)){
New-Item -Path $TargetUNC -ItemType directory
}
$WBadmin_cmd = "wbadmin.exe START BACKUP -backupTarget:$TargetUNC -systemState -noverify -vssCopy -quiet"
Invoke-Expression $WBadmin_cmd
# Выполняем настройку скрипта удаления старых бэкапов.
# Путь к папке логов.
$TargetFolder = "\\WS-210134305\DC_backup\"
$Period = "-31" # Количество хранимых дней.
# Вычисляем дату после которой будем удалять файлы.
$CurrentDay = Get-Date
$ChDaysDel = $CurrentDay.AddDays($Period)
# Удаление файлов, дата создания которых больше заданного количества дней
GCI -Path $TargetFolder -Recurse | Where-Object {$_.CreationTime -LT $ChDaysDel} | RI -Recurse -Force
# Удаление пустых папок
GCI -Path $TargetFolder -Recurse | Where-Object {$_.PSIsContainer -and @(Get-ChildItem -Path $_.Fullname -Recurse | Where { -not $_.PSIsContainer }).Count -eq 0 } | RI -Recurse
В таком виде всё работает, делает резервные копии и удаляет старше 31 дня в моём случае, однако после удаления самих файлов с сетевого диска в wbadmin остается запись в журнале о наличии резервной копии на сетевом диске, это чистить руками.
Логика правильная, старые копии надо подчищать.
По хорошему нужно удалять старые резевные копии сразу через wbadmin. На досуге посмотрю как это в скрипте реализовать)
Здравствуйте!
Благодарю Вас за полезную статью.
Подскажите пожалуйста ,сделал все по шагам как указано в статье ,но при подключении к сетевой папке через WSB система просить логин и пароль как это исправить ?
Видимо у вашей учетки нет прав для доступа к удаленному сервер. Он в домене?
Import-Module ServerManager
[string]$date = get-date -f ‘yyyy-MM-dd’
$path=”\\ZAMGLAVBUH\dc”
$TargetUNC=$path+$date
$TestTargetUNC= Test-Path -Path $TargetUNC
if (!($TestTargetUNC)){
New-Item -Path $TargetUNC -ItemType directory
}
$WBadmin_cmd = «wbadmin.exe START BACKUP -backupTarget:$TargetUNC -systemState -noverify -vssCopy -quiet»
Invoke-Expression $WBadmin_cmd Не могу разобраться, в чем ошибка?
New-Item : Путь имеет недопустимую форму.
строка:2 знак:1
+ New-Item -Path $TargetUNC -ItemType directory
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (\\ZAMGLAVBUH\dc2023-06-13:String) [New-Item], ArgumentException
+ FullyQualifiedErrorId : CreateDirectoryArgumentError,Microsoft.PowerShell.Commands.NewItemCommand