Como fazer backup e restaurar Objetos de Política de Grupo (GPOs)
Oct 18, 2022
Os objetos de Diretiva de Grupo são críticos para a gestão da infraestrutura do Windows Server. Para evitar problemas graves de serviço, os administradores devem configurar os GPOs cuidadosamente e estar preparados para reverter quaisquer alterações rapidamente, fazendo backup deles antes de modificá-los.
Atualização de Política de Grupo
Antes de mergulharmos no backup e recuperação de objeto de Diretiva de Grupo, vamos revisar alguns detalhes importantes sobre como os GPOs são criados e utilizados.
Componentes de GPO
Quando um novo objeto de Política de Grupo é criado, ele é atribuído um identificador único chamado GUID. Cada GPO tem duas partes:
- Modelo de Política de Grupo (GPT) — O GPT compreende um conjunto de pastas no compartilhamento de arquivos SYSVOL (“C:\WindowsSYSVOLdomainPolicies{GUID}”). Essas pastas são utilizadas para armazenar a maior parte do conteúdo de um objeto de Política de Grupo, incluindo os modelos, configurações, scripts e detalhes sobre pacotes MSI. O GPT é replicado para todos os DCs no domínio pelos Serviços de Replicação de Arquivos (FRS) ou Replicação do Sistema de Arquivos Distribuído (DFSR), dependendo da versão do Windows. De fato, as GPOs são efetivamente específicas do domínio porque o SYSVOL é replicado apenas dentro de um domínio.
- Contêiner de Política de Grupo (GPC) — O GPC é um objeto groupPolicyContainer localizado no contexto de nomeação do domínio sob CN=System,CN=Policies. Os atributos deste objeto AD são utilizados para armazenar informações referenciais relacionadas ao GPO. Significativamente, isso inclui o atributo gPCFileSysPath, que contém o caminho para o GPT do GPO em SYSVOL. Ao contrário do GPT, o GPC é replicado pelo Active Directory Domain Services de acordo com o custo de replicação configurado, agenda e intervalo.
Associações de GPO
Uma vez que um GPO foi criado, ele pode ser associado a um ou mais objetos do Active Directory: unidades organizacionais (OUs), domínios e os sites. Essa associação não é mantida pelo GPO, mas sim por cada um dos objetos AD associados, no seu atributo gPLink. O valor do atributo gPLink de um objeto é uma lista dos caminhos GPC de cada GPO com o qual o objeto foi associado. Quando uma associação de um GPO a um objeto é criada ou excluída, apenas o valor do atributo gPLink do objeto afetado é modificado.
Uma observação importante é que, embora a replicação do SYSVOL torne os GPOs específicos do domínio, o fato de os GPOs poderem ser vinculados a um objeto de site significa que as informações relacionadas ao GPO não estão necessariamente confinadas a um domínio. Os objetos de site são armazenados na partição de Configuração do Active Directory, que é replicada para todos os controladores de domínio na floresta. Isso resulta no caminho para o GPC de um objeto de Política de Grupo contido no atributo gPLink escapando do domínio durante a replicação do Active Directory.
Ordem de processamento de política de grupo
O Active Directory aplica GPOs na seguinte ordem:
- Políticas de Grupo Locais
- GPOs vinculados ao site
- GPOs vinculados a domínios
- GPOs vinculados a UO (processados a partir da raiz, então um GPO vinculado a uma UO aninhada terá precedência sobre um GPO vinculado à UO pai)
A política que é aplicada por último “vence” (a menos que a opção “Enforce” seja usada, o que impede que uma política seja substituída por outra aplicada posteriormente).
Configurações de usuário e computador
Uma última coisa a se notar é que os GPOs contêm tanto uma Configuração de Computador quanto uma Configuração de Usuário. Esses subgrupos contêm conjuntos quase idênticos de configurações de Política, mas diferem no momento em que as configurações dos GPOs são aplicadas.
As configurações de Configuração do Computador são aplicadas aos computadores durante a inicialização, e as configurações de Configuração do Usuário são aplicadas durante o logon. Isso significa que as opções na Configuração do Computador são sempre impostas aos computadores associados, enquanto as opções na Configuração do Usuário são impostas apenas quando uma conta de usuário associada está logada em um computador.
Se um usuário fizer login em um computador e houver um conflito entre uma configuração de Computador e uma configuração de Usuário, a configuração de Computador sempre terá precedência.
Processo de backup e restauração de GPO usando PowerShell
Com esses conceitos-chave totalmente compreendidos, podemos prosseguir para o backup e restauração de GPO.
Começaremos com os dois cmdlets relevantes do Group Policy PowerShell disponíveis como parte das Ferramentas de Administração Remota do Servidor Windows da Microsoft:
- Backup-GPO — Este cmdlet facilita muito a criação de um snapshot de todos os objetos de Política de Grupo de um domínio ou de um único GPO especificado.
- Restore-GPO — Este cmdlet pode restaurar um objeto de Política de Grupo para o estado em que foi capturado em um backup feito pelo cmdlet Backup-GPO.
Criando um backup de todas as GPOs
O seguinte script PowerShell utiliza o parâmetro -All do cmdlet Backup-GPO para criar backups de todos os GPOs no domínio especificado usando um DC especificado:
$BackupPath = '\HOSTNAMEGPOBackup'
$Domain = 'domain.local'
$DomainController = 'DC.domain.local'
$BackupFolder = New-Item -Path $BackupPath -Name (Get-Date -format yyyyMMddTHHmmss) -ItemType Directory
Backup-GPO -All -Domain $Domain -Server $DomainController -Path $BackupFolder
A saída do cmdlet Backup-GPO consiste em uma subpasta separada para as informações de backup de cada GPO e um arquivo manifest.xml que contém as informações necessárias para associar cada uma das subpastas ao seu respectivo GPO:
Olhando dentro de uma das subpastas, descobrimos que cada backup consiste em uma pasta e três arquivos XML:
A pasta contém uma cópia do objeto GPT da Política de Grupo, e os arquivos XML contêm os dados do GPC da Política de Grupo, informações específicas à execução do backup e um relatório que descreve o conteúdo do GPO.
Netwrix Recovery for Active Directory
Faça backup e recupere objetos do AD e da Política de Grupo em um único snapshot
Controle de versão de backup
O suporte para o backup repetido de objetos de Group Policy para um único local existe, mas cada execução deste script cria uma subpasta única para sua saída. As subpastas são nomeadas usando GUIDs específicos de backup gerados durante a execução do cmdlet, o que elimina quase completamente a chance de colisões de nomes com backups repetidos para um único local.
Separar a saída de cada execução em pastas únicas não é estritamente necessário, mas o comportamento do cmdlet Restore-GPO cria um benefício para fazê-lo. O cmdlet Restore-GPO permitirá que você restaure todos os GPOs de uma vez, mas ele usará o backup mais recente de cada objeto de Política de Grupo conforme identificado dentro do manifest.xml. Ao separar cada conjunto de backups em sua própria pasta, você garante que cada conjunto de backups tenha seu próprio manifest.xml. Isso permite a restauração de todos os GPOs em qualquer um desses conjuntos de backup em uma única operação.
Uma desvantagem de usar o parâmetro -All do cmdlet Backup-GPO é que ele faz backup de todos os objetos de Política de Grupo no domínio todas as vezes que é executado, em vez de apenas aqueles que foram alterados. Uma maneira de contornar esse problema é usando um script como o abaixo. Ele força o cmdlet Backup-GPO a usar um arquivo que o script cria na pasta de atualização para manter o registro de data e hora da última execução do script. Se o arquivo existir, o script faz backup de quaisquer GPOs do domínio que foram modificados desde o registro de data e hora no arquivo. Se o arquivo não existir, o script cria o arquivo, define o registro de data e hora e faz backup de todos os GPOs do domínio.
$BackupPath = '\DCGPOBackup'
$Domain = 'domain.local'
$DomainController = 'DC.domain.local'
$BackupPathTracker = "$BackupPathLastBackup.txt"
if((Test-Path "$BackupPathTracker")) {
$LastBackup = Get-Date (Get-Content -Path "$BackupPathTracker")
Set-Content -Path "$BackupPathTracker" -Value (Get-Date)
$GPOs = Get-GPO -All -Domain $Domain -Server $DomainController
$GPOs | Where-Object { $_.ModificationTime -gt $LastBackup } | ForEach-Object {
Backup-GPO -Guid $_.Id -Domain $Domain -Server $DomainController -Path $BackupPath
}
} else {
Set-Content -Path "$BackupPathTracker" -Value (Get-Date)
Backup-GPO -All -Domain $Domain -Server $DomainController -Path $BackupPath
}
Embora essa abordagem economize espaço ao limitar backups desnecessários, os backups realizados acabam todos na mesma pasta, o que dificulta a restauração de objetos de Política de Grupo para um momento específico.
Combinar as abordagens adotadas em cada um dos dois scripts resolveria todos os nossos problemas, certo?
BackupPath = '\HOSTNAMEGPOBackup'
$Domain = 'domain.local'
$DomainController = 'DC.domain.local'
$BackupPathTracker = "$BackupPathLastBackup.txt"
$BackupFolder = New-Item -Path $BackupPath -Name (Get-Date -format yyyyMMddTHHmmss) -ItemType Directory
if((Test-Path "$BackupPathTracker")) {
$LastBackup = Get-Content -Path "$BackupPathTracker"
Set-Content -Path "$BackupPathTracker" -Value (Get-Date)
$GPOs = Get-GPO -All -Domain $Domain -Server $DomainController
$GPOs | Where-Object { $_.ModificationTime -gt $LastBackup } | ForEach-Object {
Backup-GPO -Guid $_.Id -Domain $Domain -Server $DomainController -Path $BackupFolder
}
}
else {
Set-Content -Path "$BackupPathTracker" -Value (Get-Date)
Backup-GPO -All -Domain $Domain -Server $DomainController -Path $BackupFolder
}
Como se verifica, isolar cada um dos resultados do backup diferencial em suas próprias pastas na verdade piora tudo. Essa abordagem também isola cada um dos arquivos manifest.xml em suas próprias pastas, eliminando efetivamente a capacidade de restaurar todos os GPOs de uma vez, ao mesmo tempo que torna incrivelmente difícil encontrar os backups associados a qualquer objeto específico de Política de Grupo.
Restaurando GPOs a partir de backup
Na prática, essas abordagens estão encontrando uma limitação do cmdlet Restore-GPO: Restore-GPO pode restaurar um objeto específico de Política de Grupo a partir do backup mais recente referenciado em um arquivo manifest.xml ou de um backup especificado — mas restaurar todos os GPOs de um domínio de uma só vez está limitado a usar os backups mais recentes em um arquivo manifest.xml especificado.
# Restore a single GPO from its most recent backup
Restore-GPO -Name 'GpoName' -Path '\HOSTNAMEGPOBackup' -Domain 'domain.local' -Server 'DC.domain.local'
# Restore a single GPO from a specific backup
Restore-GPO -BackupId 12345678-09ab-cdef-1234-567890abcdef -Path '\HOSTNAMEGPOBackup' -Domain 'domain.local' -Server 'DC.domain.local'
# Restore all of a domain’s GPOs from their most recent backup
Restore-GPO -All -Path '\HOSTNAMEGPOBackup' -Domain 'domain.local' -Server 'DC.domain.local'
Quando um objeto de Política de Grupo é restaurado a partir de um backup, a versão do GPO é incrementada como parte do processo de restauração para forçar a replicação a favor da cópia restaurada do GPO.
Como os números de versão podem ficar desincronizados
A saída do cmdlet Restore-GPO inclui dois conjuntos de números de versão, um para a Configuração do Computador e outro para a Configuração do Usuário.
O GPT e o GPC são cada um responsáveis por manter seu próprio número de versão, com os valores separados de UserVersion e ComputerVersion sendo calculados a partir dos números de versão da Configuração de Usuário e Configuração de Computador, respectivamente. Isso é possível como resultado da maneira como o número de versão é incrementado. Ele é aumentado em 1 quando uma Configuração de Computador de um GPO é modificada e em 65536 cada vez que a Configuração de Usuário é modificada.
Tudo isso é necessário porque, conforme discutido acima, o GPT e o GPC de um objeto de Política de Grupo são replicados separadamente por diferentes serviços, o que pode resultar nos números de versão do GPT e do GPC de uma GPO em um controlador de domínio específico estarem desincronizados — o que impedirá que seja processado.
Restaurando uma GPO excluída
Uma limitação documentada do cmdlet Restore-GPO é que ele não pode ser usado para recuperar um objeto de Política de Grupo que foi excluído, pois não será capaz de encontrar a parte GPC do GPO no Active Directory. Tentar recuperar um GPO excluído resultará em um erro que se parece com isto:
No entanto, se você conseguir recuperar o GPC primeiro, o Restore-GPO pode ser usado para recuperar o GPO excluído. Para fazer isso, podemos usar o cmdlet Restore-ADObject para recuperar completamente a parte do Active Directory do GPO a partir da Active Directory Recycle Bin, e então o cmdlet Restore-GPO é capaz de restaurar o GPO:
Embora esse processo possa recuperar um GPO excluído, ele não pode restaurar os valores de gPLink que existiam antes da exclusão do GPO. Isso ocorre porque esses valores existiam apenas nos objetos vinculados. A única maneira segura de contornar essa limitação é utilizar backups externos do Active Directory que contenham os valores de gPLink.
Usando GPMC e AGPM para backup e restauração de GPO
Os cmdlets do PowerShell para Group Policy não são sua única opção para backup e restauração de GPO. A Microsoft também fornece o Group Policy Management Console (GPMC), um snap-in do MMC que pode ser usado para fazer backup e restaurar Objetos de Política de Grupo. Assim como o cmdlet Backup-GPO, ele pode fazer backup de um GPO especificado ou de todos os GPOs de um domínio. Diferentemente do cmdlet Restore-GPO, ele está limitado a restaurar um único GPO por vez.
O GPMC fornece um método para restaurar GPOs excluídos a partir de um backup, mas ele não recupera o GPO excluído; na verdade, ele apenas cria um novo GPO e o preenche com as informações do backup.
Outra vantagem do GPMC é a melhor visibilidade do conteúdo dos backups do GPO, embora ainda seja difícil comparar as configurações de um backup com as configurações atuais do GPO ao vivo.
A ferramenta Advanced Group Policy Management (AGPM) da Microsoft, que está disponível como parte do Microsoft Desktop Optimization Pack, estende o GPMC com funcionalidades de controle de versão que ajudam você a visualizar e entender o conteúdo dos seus backups. No entanto, os benefícios do AGPM tendem a ser superados por dois fatores: Parece que não é muito bem mantido, e tem a reputação de não interagir bem com outros (por exemplo, modificar um GPO gerenciado pelo AGPM fora do AGPM pode resultar em corrupção do banco de dados do AGPM). Dito isso, não é necessariamente uma ferramenta ruim; Eu apenas sugiro que você brinque bastante com ela em um ambiente de laboratório antes de tentar implementá-la em produção.
Como a Netwrix pode ajudar?
Netwrix Recovery for Active Directory oferece uma interface web unificada que permite fazer backup tanto de objetos do Active Directory quanto de objetos de Política de Grupo em um único snapshot, pesquisar e gerenciar backups, reverter alterações de atributos em objetos ativos e até recuperar GPOs excluídos e seus gPLinks associados.
Auditoria e Relatórios de Active Directory
Otimize a segurança com insights especializados para o seu Active Directory
Saiba maisFAQ
Qual comando posso usar para restaurar um GPO a partir de um backup?
O cmdlet do Windows PowerShell Restore-GPO restaura um único GPO ou todos os GPOs para o domínio original.
Como posso importar uma GPO de um arquivo?
Se você tem as permissões necessárias como administrador no Advanced Group Policy Management (AGPM) e exportou uma GPO para um arquivo CAB, então você pode importar as configurações da GPO para uma nova GPO ou uma GPO existente seguindo os passos fornecidos aqui.
Compartilhar em
Saiba Mais
Sobre o autor
Joe Dibley
Pesquisador de Segurança
Pesquisador de Segurança na Netwrix e membro da Equipe de Pesquisa de Segurança da Netwrix. Joe é um especialista em Active Directory, Windows e uma ampla variedade de plataformas de software empresarial e tecnologias, Joe pesquisa novos riscos de segurança, técnicas de ataque complexas e as respectivas mitigações e detecções.
Saiba mais sobre este assunto
Criar usuários do AD em massa e enviar suas credenciais por e-mail usando PowerShell
Como criar, alterar e testar senhas usando PowerShell
Como adicionar e remover grupos AD e objetos nos grupos com PowerShell
Confianças no Active Directory
Ataques de ransomware ao Active Directory