Descubra os dez comandos do PowerShell que podem ser realmente úteis para manter controlado o seu servidor AD DS e os objetos que este contém (utilizadores, computadores, grupos), poupando tempo na sua manutenção, mas sem perder nada de controlo ou poder
A configuração e controlo de uma infraestrutura de TI é uma tarefa árdua na qual a equipa técnica tem de investir muito esforço, com centenas de horas dedicadas ao correto planeamento e configuração, e centenas, ou até milhares de horas de manutenção, incluindo tarefas de vários tipos.
Dentro de todas essas tarefas, a gestão da infraestrutura do Active Directory Domain Services (AD DS) deve ser sempre uma das nossas prioridades, pois é um dos pontos mais sensíveis dentro das nossas instalações.
A má gestão da segurança deste serviço fulcral do nosso departamento pode comprometer a segurança de toda a empresa, e por isso devemos prestar sempre atenção ao estado do AD DS.
Neste artigo, vamos falar sobre alguns comandos do PowerShell que nos ajudarão a verificar o status de diferentes elementos do nosso diretório ativo para realizar essa monitorização de maneira rápida e eficiente.
Devemos dizer que estes não são todos os comandos necessários para um controlo exaustivo da infraestrutura, mas permitem-nos começar com esta tarefa. Podemos depois ir acrescentando comandos adicionais pouco a pouco ou até preparar scripts que nos permitem realizar verificações de forma automatizada.
Por outro lado, também devemos esclarecer que, neste artigo, falamos de monitorização, auditoria ou simples verificações, e que as configurações são discutidas, pelo menos como introdução, noutro artigo sobre AD DS.
NOTA: Os comandos e scripts expostos abaixo foram testados no Windows Server 2022 e podem não funcionar da mesma forma se forem executados noutras versões do Windows. Isto acontece porque existem diferentes versões do PowerShell. Para identificar a versão que o seu sistema está a executar, pode executar um dos seguintes comandos numa janela do Windows PowerShell: “Get-Host” ou “$PSVersionTable” ou “$PSVersionTable.PSVersion”.
Comandos para auditar a segurança do seu servidor AD DS
A primeira coisa que vamos abordar tem a ver com a verificação de diferentes objetos dentro da nossa infraestrutura AD DS:
- Utilizadores.
- Máquinas.
Embora abordemos estes elementos do AD DS, possivelmente veremos os utilizadores com mais profundidade, pois geralmente estes são os mais propensos a comprometer a segurança da nossa empresa.
NOTA: Antes de podermos trabalhar com o PowerShell para gerir os Active Directory Domain Services (AD DS), precisamos de importar o módulo. Para fazer isto, o comando a seguir deve ser executado numa consola do PowerShell com permissões de administrador “Import-Module Active Directory”.
As consultas que vamos realizar são as seguintes:
- Listar utilizadores de uma UO específica.
- Listar contas de utilizador expiradas.
- Listar contas de utilizador desativadas.
- Listar contas de utilizador bloqueadas.
- Listar utilizadores inativos.
- Listar utilizadores cuja password nunca expira.
- Listar utilizadores com passwords fracas.
- Listar novos utilizadores.
- Listar máquinas inativas no domínio.
- Listar máquinas desativadas.
1. Listar utilizadores de uma UO específica:
Neste caso, mostramos como fazer uma lista de utilizadores pertencentes a uma Unidade Organizacional (UO) específica, para conhecer os utilizadores que fazem parte dessa UO e tiram partido dos GPOs que lhe são aplicados.
Podemos executá-lo de várias maneiras, mas a maneira mais confortável, porque permite fazer diferentes consultas rapidamente, é com uma variável na qual passamos a Unidade Organizacional.
Neste caso, por exemplo, vamos supor que estamos a trabalhar com o domínio “programasnacho.com” e queremos conhecer os utilizadores da Unidade Organizacional de “Zaragoza” dentro de “Delegações”. A forma de declarar a variável seria :
$OU = ‘ou=Zaragoza,ou =Delegaciones,dc=pruebasnacho,dc=com’
Podemos então executar o seguinte comando:
Get-ADUser -Filter * -SearchBase $OU | Select-object Name,DistinguishedName,UserPrincipalName,Enabled,SID | Export-CSV “C:\Temp\UsuariosOU1.CSV” –NoTypeInformation
Imagem. Lista de utilizadores de uma UO específica do nosso servidor AD DS com o PowerShell
A segunda forma, um pouco menos “limpa”, é colocar os dados da OU diretamente dentro do comando, e ficaria assim:
Get-ADUser -Filter * -SearchBase ‘ou=Zaragoza,ou =Delegaciones,dc=pruebasnacho,dc=com’ | Select-object Name,DistinguishedName,UserPrincipalName,Enabled,SID | Export-CSV “C:\Temp\UsuariosOU1.CSV” –NoTypeInformation
Em seguida, comentamos as diferentes opções que estamos a usar aqui:
- Get-ADUser: faz uma consulta sobre utilizadores do AD DS.
- SearchBase: permite alterar a abrangência da consulta para mostrar apenas os utilizadores que nos interessam, neste caso, os de uma UO específica.
- Select-object: Permite selecionar que campos queremos que sejam exibidos na consulta que estamos a fazer. Para conhecer os campos, é recomendável iniciar o comando original sem modificadores para ver que informações podemos obter “Get-ADUser -Filter *”.
- Export-CSV: Permite extrair a informação para um ficheiro em formato CSV separado por vírgulas (,) que permitirá que seja utilizado por scripts subsequentes ou que seja aberto com Excel para visualização.
- NoTypeInformation: Este modificador remove a primeira linha do ficheiro CSV. Esta linha contém informação sobre a execução do comando e pode dificultar o uso do ficheiro caso seja necessário executar outro script.
Imagem. Exemplo de arquivo CSV após executar o comando PowerShell no nosso servidor AD DS
Da mesma forma, poderíamos obter todos os utilizadores de todas as UOs, ou seja, de todo o domínio, eliminando “SearchBase”, e ficaria como se mostra abaixo:
Get-ADUser -Filter * | Select-object Name,DistinguishedName,UserPrincipalName,Enabled,SID | Export-CSV “C:\Temp\UsuariosOU1.CSV” –NoTypeInformation
2. Listar contas de utilizador expiradas:
Outra coisa que devemos observar é quais os utilizadores que temos no diretório cujas contas expiraram. Por outras palavras, as contas que já não deveriam existir porque o tempo para o qual foram criadas já passou.
Para lançar esta consulta, usaremos o comando “Search-ADAccount”, pois este comando, ao contrário de “Get-ADUser”, permite consultar a data de expiração dos acessos.
El comando ficaria assim:
Search-ADAccount -AccountExpired | Select-Object Name,DistinguishedName,UserPrincipalName,Enabled,SID,AccountExpirationDate
Este caso é muito mais simples, pois temos menos modificadores e parâmetros a considerar:
- Search-ADAccount: lista as contas do Active Directory que cumprem várias condições.
- AccountExpired: a condição de que a conta expirou. Também podemos ver este campo manualmente se acedermos às propriedades de um utilizador e no separador “Conta” verificarmos o campo “A conta expira”.
- Select-Object: permite selecionar os campos que queremos que sejam exibidos na consulta que estamos a fazer. Para conhecer os campos, é recomendável iniciar o comando original sem modificadores para ver que informações podemos obter. Neste caso, podemos incluir o nome, conta, SID, etc., sendo aconselhável incluir também “AccountExpirationDate” para ver a data em que a conta expirou.
Imagem. O campo “A conta expira” no separador “Conta” do nosso servidor AD DS
Também podemos adicionar o modificador “UsersOnly” após a expiração para que não liste nada mais que os utilizadores.
Normalmente, no nosso caso, usaríamos o “Export-CSV” para exportar um ficheiro, pois preferimos guardar as consultas para poder rever alterações, erros, etc. Neste caso, como em alguns dos seguintes, não o vamos fazer, para poder agilizar as demonstrações e poder ver a execução diretamente nos screenshots.
Imagem. Lista de contas de utilizador expiradas no nosso servidor AD DS com PowerShell
3. Listar contas de utilizador desativadas:
Outro ponto que deve ser auditado são as contas que foram desativadas. Estas contas, geralmente, são contas de utilizadores que deixaram a empresa, foram despedidos, deixaram de ser usadas, etc. Em princípio, não devem ser perigosas porque não permitem que o utilizador se autentique no diretório, mas devem ser removidas para maior segurança.
As contas desativadas são listadas com o comando “Get-ADUser”, e é necessário verificar se a propriedade “Enabled” é um booleano falso, não necessitando de mais parâmetros, como se vê na linha seguinte:
Get-ADUser -Filter {(Enabled -eq $False)} | Select-Object Name,DistinguishedName,UserPrincipalName,Enabled,SID,LastLogon
Neste caso, basta usar “Select-Object” para selecionar os campos que queremos que apareçam na consulta que estamos a fazer. Mais uma vez, para conhecer os campos, é recomendável executar o comando original sem modificadores para ver que informações podemos obter. Neste caso, podemos incluir o nome, conta, SID, etc. Além disso, pode ser interessante listar também o “LastLogon” para ver quando foi validado pela última vez no sistema.
Imagem. Lista de contas de utilizador desativadas no nosso servidor AD DS com PowerShell
Também podemos fazer uma consulta manual para um utilizador específico com o comando Get-ADUser:
Get-ADUser <nome_de_utilizador> | select Name,DistinguishedName,UserPrincipalName,Enabled,SID,LastLogon
Onde <nome_de_utilizador> é o utilizador sobre o qual se quer fazer uma consulta.
No caso de querer consultar o utilizador “Sandra”, deve-se escrever o seguinte:
Get-ADUser Sandra | select Name,DistinguishedName,UserPrincipalName,Enabled,SID,LastLogon
Imagem. Verificação de se uma conta de utilizador no nosso servidor AD DS está desativada
4. Listar contas de utilizador bloqueadas:
Outro ponto a ser analisado são as contas bloqueadas por terem ultrapassado um número específico de tentativas falhadas de acesso. Isso pode ser uma indicação de que esta conta é alvo de utilizadores mal-intencionados que tentam fazer login com passwords aleatórias, embora é possível que sejam apenas utilizadores a tentar entrar na sua conta sem se lembrarem da password.
O comando a ser executado é bastante simples e, mais uma vez, é baseado em “Search-ADAccount”.
Search-ADAccount -LockedOut | Select-Object Name,DistinguishedName,UserPrincipalName,Enabled,SID,LastLogon
Onde usaríamos os seguintes modificadores:
- LockedOut: para selecionar apenas as contas bloqueadas.
- Export-CSV: para encaminhá-lo para um ficheiro para processamento posterior.
- UsersOnly: para mostrar apenas utilizadores bloqueados.
Imagem. Lista de contas de utilizador bloqueadas no nosso servidor AD DS com PowerShell
5. Listar utilizadores inativos:
Neste caso, vamos procurar os utilizadores que não fazem login há algum tempo (como exemplo, 90 dias), e que são considerados utilizadores inativos no domínio.
A pesquisa é realizada com base no comando “Search-ADAccount”:
Search-ADAccount –AccountInActive –TimeSpan 90:00:00:00 | Select-Object Name,DistinguishedName,SID,LastLogon
Teríamos então o seguinte:
- AccountInActive: listam-se as contas ativas.
- TimeSpan: tempo a partir do qual o utilizador se considera inativo. Neste caso são 90 dias “90:00:00:00”.
- Select-Object: filtramos as propriedades que queremos que apareçam na pesquisa. Neste caso, foram selecionados Name, DistinguishedName, SID, LastLogon.
Imagem. Execução do comando para procurar utilizadores inativos no nosso servidor AD DS
6. Listar utilizadores cuja password nunca expira:
Outro ponto que devemos monitorizar dentro da nossa infraestrutura são os utilizadores cuja password nunca expira. O mecanismo de expiração de password permite que as mesmas se mantenham seguras através de uma rotação que impossibilita que os utilizadores se relaxem e usem, por exemplo, as mesmas passwords para todos os sistemas, sites, bancos, etc.
As únicas contas que devem permanecer com uma password perene são as que estão associadas a serviços, pois a sua expiração pode interromper o funcionamento dos serviços em questão.
Para localizar o resto dos utilizadores, podemos usar o comando “get-aduser” com uma série de parâmetros e fazer uma seleção com base nos utilizadores cuja password não expira. O comando seria o seguinte:
get-aduser -filter * -properties PasswordNeverExpires | where {através da opção “PasswordNeverExpires”
$_.passwordNeverExpires -eq “true” } | Select-Object Name,DistinguishedName,UserPrincipalName,Enabled,SID
Como nos casos anteriores, para estes exemplos mostramos as propriedades “Name,DistinguishedName,UserPrincipalName,Enabled,SID” mas pode ser exibida qualquer propriedade. Para ver as opções disponíveis, pode ser executado o comando “get-aduser -filter *”.
Imagem. Lista de contas de utilizador do nosso servidor AD DS que nunca expiram
7. Listar utilizadores com passwords fracas:
Um dos maiores erros que podemos cometer ao gerir utilizadores é permitir a existência de utilizadores com passwords fracas, pois estes estarão expostos a ataques de força bruta, baseados em dicionários, etc.
Isto resolve-se com políticas de password forte e, no caso de novas versões do Windows Server, estas políticas estão geralmente ativas por padrão. Para saber mais sobre as políticas de password da Microsoft, pode consultar este link.
Mas, se temos políticas de password que forçam os utilizadores a terem passwords fortes, como é possível que encontremos utilizadores com passwords fracas? Isto pode acontecer quando existem diretores ou outros utilizadores com privilégios que precisam de criar passwords em circunstâncias únicas, o que acaba por criar uma política de passwords especial para permitir passwords ridiculamente fáceis. Esta é uma prática que devemos tentar erradicar.
Para realizar esta pesquisa devemos importar o módulo “DSInternals” com o seguinte comando:
Install-Module DSInternals
Imagem. Importação do módulo DSInternals PowerShell aceitando as opções
Neste caso, primeiro usa-se um ficheiro para carregar um dicionário de passwords. Pode usar um dos muitos disponíveis na internet ou criar o seu próprio. No caso de descarregar um da internet, seria aconselhável incluir, por exemplo, o nome da empresa, a cidade, etc.
$Passwords = “C:\Users\Administrador\Desktop\passwords.txt”
Uma vez carregado o dicionário, pode-se executar o comando de consulta, que tem a seguinte forma:
Get-ADReplAccount -All -Server ‘<SERVIDOR_CON_FQDN>’ | Test-PasswordQuality -WeakPasswordsFile $Passwords -IncludeDisabledAccounts
Assim, teremos o seguinte:
- <SERVIDOR_CON_FQDN>: deve ser alterado para o nome do servidor AD DS (um DC) com o seu FQDN, num formato como este: “’WIN-Q28KD6B1DN2.testnacho.com”.
- Test-PasswordQuality: para testar a qualidade das passwords.
- WeakPasswordsFile: as passwords fracas são pesquisadas com base num ficheiro de texto que é passado como parâmetro e que é fornecido pela variável “$Passwords” que carregamos anteriormente.
- IncludeDisabledAccounts: São incluídas as contas desativadas para tornar o teste mais completo.
No nosso exemplo, seria assim:
Get-ADReplAccount -All -Server ‘WIN-Q28KD6B1DN2.pruebasnacho.com’ | Test-PasswordQuality -WeakPasswordsFile $Passwords -IncludeDisabledAccounts
Imagem. Execução da consulta do PowerShell para encontrar as passwords fracas no AD DS Server
Como este caso é bastante complexo, optamos por utilizar o script criado por Adam Bertram.
8. Listar novos utilizadores:
Ao auditar o nosso Active Directory, devemos também prestar atenção a todos os novos utilizadores criados, e se tudo estiver organizado como deve ser, deveríamos saber quando um novo utilizador for criado.
Ao listar, por exemplo, os novos utilizadores do nosso AD DS semanalmente e comparar a lista obtida com as listas que o departamento de TI possui de novos utilizadores, poderemos detetar utilizadores criados sem autorização.
Para fazer esta pesquisa, pode criar previamente uma variável na qual é passado o tempo de antiguidade dos utilizadores. Se, por exemplo, queremos mostrar os que foram criados nos últimos 7 dias, devemos usar o valor “7” em “AddDays”, pois o que esta variável faz é calcular a data atual e subtrair o valor que temos inserido em “AddDays”.
Uma vez declarada a referida variável, usaremos o comando “Get-ADUser” para fazer uma consulta com base no parâmetro de criação de conta “whenCreated”, em que a data é comparada com a data que declaramos anteriormente nessa variável. Se, ao fazer a comparação, descobrirmos que o valor devolvido é maior (-ge), é exibida a contagem, passando apenas as propriedades que foram marcadas nos filtros.
O comando seria como mostrado abaixo, embora neste exemplo tenha um dia de antiguidade.
$Fecha = ((Get-Date).AddDays(-1)).Date
Get-ADUser -Filter {whenCreated -ge $Fecha} -Properties *| Select-Object Name,DistinguishedName,SID,Enabled,whenCreated
Imagem. Lista de novos utilizadores no nosso servidor AD DS com o PowerShell
9. Lista de máquinas inativas do Domínio:
Sobre os computadores registados no domínio, podemos fazer uma consulta para extrair os seus dados e poder listá-los para inventário ou processá-los posteriormente.
A consulta é bastante simples e consiste basicamente em lançar o comando “Get-ADComputer”, que lista os computadores e servidores (todos os elementos registados como “computer”), filtra as suas propriedades e extrai os elementos que nos parecem relevantes.
O comando ficaria assim:
Get-ADComputer -Filter * -Property * | Select-Object Name,DNSHostName,OperatingSystem,ipv4Address
Neste caso, decidimos extrair as seguintes propriedades ou campos:
- Name: nome do equipamento. Seria aquele que podemos ver em “Este PC” dentro de nome do computador.
- DNSHostName: é o nome completo pelo qual é identificado como um item do diretório. É o que é conhecido como FQDN (Fully Qualified Domain Name ou Nome de Domínio Totalmente Qualificado).
- OperatingSystem: sistema operativo em execução no computador e preenchido com base no campo “Nome” no separador “Sistema Operativo” das propriedades de objeto do domínio.
- ipv4Address: endereço IPv4 atribuído ao dispositivo.
Imagem. Lista das máquinas registadas no nosso servidor AD DS com o PowerShell
Também devemos preocupar-nos em remover do domínio os computadores que estão inativos há muito tempo. Estes computadores geralmente são PCs antigos que ninguém informou que tinham sido desativados.
Muitas vezes, este equipamento acaba por ser cedido a funcionários, entidades não governamentais ou centros educativos, como forma de divulgar a sua marca, demonstrar o seu compromisso com a sociedade, etc., numa ótica de RSC.
O problema é que muitos desses computadores, quando saem da empresa, fazem-no sem ter passado por um processo de limpeza, ou seja, sem terem sido formatados e passado por um processo de destruição de dados.
A deteção deste equipamento, portanto, deve ser uma prioridade para o nosso departamento, para removê-lo o mais rápido possível e garantir que este não possa ser usado para conexões fraudulentas.
Para detetar estes computadores usaremos o comando “Get-ADComputer“, mas com uma variável na qual o tempo é calculado, de forma semelhante a como calculamos os novos utilizadores do domínio.
Se a condição for cumprida, o que é feito é filtrar e exibir os campos que queremos ver, que no nosso exemplo serão apenas o nome da máquina e a última vez que foi validada.
$time = (Get-Date).Adddays(-(180))
Get-ADComputer -Filter {LastLogonTimeStamp -lt $time} -Properties Name ,LastLogonDate
Para fazer esta pesquisa, assim como aconteceu no caso de utilizadores inativos, pode-se criar previamente uma variável na qual é passado o tempo que passa de hoje até à margem marcada. Por exemplo, para os 180 dias (6 meses) que queremos usar como filtro, e que marcamos neste exemplo, devemos usar um valor de “180” para “AddDays”, pois o que esta variável faz é calcular a data atual e subtrair o valor que colocamos em “AddDays”.
Imagem. Lista das máquinas inativas no nosso servidor AD DS com o PowerShell
10. Listar máquinas desativadas.
Outro ponto que deveríamos ter sob controlo são os computadores que foram desativados dentro do domínio, pois são computadores que em teoria deveriam ter sido removidos.
Para localizá-los, basta fazer uma consulta com “Get-ADComputer” filtrando aqueles que possuem a propriedade “Enabled” como false.
O comando pode ser algo semelhante ao mostrado abaixo:
Get-ADComputer -Filter {(Enabled -eq $False)} | Select-Object Name
Como sempre, através de “Select-Object” podemos dizer quais as propriedades que queremos que sejam mostradas. Neste caso, selecionamos apenas o nome da máquina, mas recomendamos rever quais são as que nos fornecem as informações mais úteis.
Imagem. Lista das máquinas desativadas no nosso servidor AD DS com o PowerShell
NOTA: A definição dos dias que devem passar para que uma máquina seja considerada inativa é uma questão que deve ser cuidadosamente pensada, pois depende das idiossincrasias de cada empresa.
Conclusões sobre Powershell e servidor AD DS:
Claro que, como o leitor já deve ter notado, esta não é uma lista definitiva, pois poderíamos falar de muito mais comandos, mas escolhemos os 10 primeiros que podem ser usados para extrair informações relevantes para a segurança de utilizadores e computadores.
Poderíamos abordar muitas coisas, como o status de integridade dos servidores Domain Controller, rever os eventos do sistema relacionados com o AD DS, a sincronização entre os DCs, a sincronização do serviço de tempo e muitas outras coisas, mas não queremos tornar os artigos demasiado longos, para dar-lhe informação concisa, razão pela qual esses tópicos são ou serão abordados noutros artigos do nosso blog.
Com o que foi exposto aqui, podemos começar a controlar os elementos dos objetos (utilizadores e computadores) que temos no nosso servidor AD DS, e podemos incluí-los como uma tarefa agendada nas nossas tarefas de manutenção, sendo uma boa prática executá-los pelo menos uma vez por mês, para ver que mudanças ocorreram e se há algo que escapou ao nosso radar.
Como sempre, recomendamos que explore o PowerShell, pois o seu potencial é ilimitado e pode ser usado para gerir com eficiência toda a infraestrutura da Microsoft: tanto clientes, servidores e serviços, como certos elementos GNU/Linux.