O time de operações decidiu que, para contas de serviço e algumas identidades privilegiadas, a troca periódica de senha não acrescenta valor de segurança. Com a Política de Senha Granular (FGPP) do Active Directory é possível impedir a expiração sem abrir mão de comprimento mínimo e complexidade. Veja como implantar o controle de forma sustentada, auditável e alinhada às recomendações modernas.
Por que evitar a expiração de senhas
A renovação obrigatória a cada 30, 60 ou 90 dias era tida como melhor prática quando o risco principal era o password spraying offline. Hoje, com autenticação federada, MFA e monitoramento de comprometimento em tempo real, obrigar o usuário a lembrar novas senhas complexas tende a aumentar tickets de suporte, reutilização de padrões previsíveis e até anotações inseguras. A Microsoft, o NIST SP 800‑63B e o Centro de Cibersegurança Nacional do Reino Unido já recomendam abolir alterações periódicas — salvo indicação de vazamento. Manter as credenciais estáveis reduz atrito, porém requer controles compensatórios, como autenticação multifator e revisão de privilégios.
Compreendendo a FGPP
Introduzida no Windows Server 2008, a Fine‑Grained Password Policy (FGPP) permite múltiplos conjuntos de requisitos dentro do mesmo domínio. Cada conjunto é um Password Settings Object (PSO) armazenado no contêiner CN=Password Settings Container,CN=System,DC=...
. Principais atributos:
msDS-MaximumPasswordAge
: tempo máximo antes da expiração.msDS-PasswordComplexityEnabled
: exige caracteres de classes distintas.msDS-MinimumPasswordLength
: número mínimo de caracteres.msDS-PasswordSettingsPrecedence
: prioridade — valor menor tem precedência.msDS-PSOAppliesTo
: lista de usuários ou grupos aos quais o PSO se aplica.
Quando várias FGPPs disputam um usuário, a de menor precedence vence. Se não houver FGPP, entram em vigor as diretivas herdadas da GPO de domínio.
Configurando uma FGPP sem expiração
Pré‑requisitos
- Nível funcional de domínio ≥ Windows Server 2008.
- Conta com direitos Domain Admin ou delegação específica sobre o contêiner System.
- Módulo RSAT instalado para usar os cmdlets
ActiveDirectory
.
Criar o PSO pela interface gráfica
No Active Directory Administrative Center (ADAC):
- Navegue em System → Password Settings Container e clique em New → Password Settings.
- Defina um Name amigável e atribua Precedence coerente (por exemplo, 10).
- Marque Password must meet complexity requirements; em Minimum password length, insira 16.
- Em Maximum password age, a UI impede o valor zero; insira temporariamente 1 dia ou deixe em branco e salve.
Até aqui o PSO existe mas ainda não impede a expiração. É necessário ajustar o atributo msDS-MaximumPasswordAge
para 0
via PowerShell ou ADSI Edit, pois o valor “não definido” não é interpretado como infinito.
Ajustar MaxPasswordAge
via PowerShell
# Abrir sessão elevada
Import-Module ActiveDirectory
Alterar MaxPasswordAge para zero (TimeSpan 0.00:00:00)
Set-ADFineGrainedPasswordPolicy ` -Identity "FGPP_SemExpiracao"`
-MaxPasswordAge 0.0:0:0
O cmdlet aceita o formato dd.hh:mm:ss
. A sequência 0.0:0:0
equivale a um TimeSpan de zero, efetivamente desativando a expiração.
Vincular o PSO aos alvos
O atributo msDS-PSOAppliesTo
recebe DNs de usuários ou grupos de segurança globais. Prática recomendada: criar um grupo dedicado, adicionar os usuários e vincular o PSO ao grupo — facilita auditoria e remoção.
Add-ADGroupMember -Identity "GRPSenhaSemExpirar" -Members svcsql,svc_iis
Set-ADFineGrainedPasswordPolicy -Identity "FGPP_SemExpiracao" `
-AppliesTo "CN=GRP_SenhaSemExpirar,OU=ServiceAccounts,DC=contoso,DC=local"
A partir daí, a alteração replica para todos os controladores de domínio. Para forçar aplicação em estações e servidores, rode klist purge
seguido de gpupdate /force
ou simplesmente peça logoff/logon.
Validar a configuração
Use Get-ADUser
e verifique o PSO resultante:
Get-ADUser svc_sql -Properties msDS-ResultantPSO `
| Select-Object DistinguishedName,msDS-ResultantPSO
Outra verificação é rodar net user <conta> /domain
e confirmar a linha Password expires como Never.
Alternativa com “Password never expires”
Em um cenário de urgência, marque manualmente a caixa Password never expires na guia Account de cada usuário. Apesar de rápido, deixa a lógica dispersa em várias contas, prejudicando governança. Com FGPP, o controle fica centralizado, documentado no AD e versionável via scripts.
Comparativo entre abordagens
Critério | FGPP | Atributo de conta |
---|---|---|
Escalabilidade | Alvo por grupo; muda centenas de contas em uma linha | Alteração individual ou script customizado |
Audição | Cmdlet único lista quem recebe o PSO | Necessário enumerar todas as contas e filtrar por flag |
Compatível com Políticas de Complexidade | Sim, no mesmo objeto | Depende de GPO separada; pode haver conflito |
Gerência de ciclo de vida | Versão, backup e delegação via ACL | Propenso a erro manual, difícil de rastrear |
Boas práticas de segurança moderna
- Ative MFA para todas as contas persistentes, mitigando o impacto de senhas que não expiram.
- Monitore tentativas de logon anômalas com Azure AD Identity Protection ou SIEM.
- Use senhas únicas e longas. Com 16 caracteres, um ataque de força bruta online é inviável sob políticas de bloqueio.
- Faça revisões periódicas de privilégio. A conta que não expira, mas mantém acesso além do necessário, vira alvo valioso.
- Combine com senha protegida por hardware (PSK) ou credenciais gerenciadas (gMSA) quando possível.
Perguntas frequentes
A FGPP afeta controladores de domínio?
Não diretamente. Os DCs herdam a política de senha do domínio. Para contas de computador, use configurações de “Default Domain Policy” ou fine‑grained apenas para objetos de usuário.
É seguro definir MaxPasswordAge 0
?
Se houver MFA e detecção de ameaça, sim. O valor zero apenas impede expiração automática; o administrador ainda pode forçar reset quando necessário, por exemplo após suspeita de vazamento.
Posso combinar FGPP com políticas de bloqueio de conta?
Sim. A FGPP também expõe atributos de Lockout. Ajuste msDS-LockoutThreshold
e msDS-LockoutObservationWindow
conforme a superfície de ataque.
Qual o impacto em ambientes híbridos?
Para contas sincronizadas com Azure AD, respeita-se a expiração local; portanto, se o AD on‑prem não expira, o Azure AD também não expirará. Use políticas de senha na nuvem apenas para contas nativas de nuvem.
Script de implantação completo
# Variáveis de conveniência
$PSOName = "FGPP_SemExpiracao"
$GrpName = "GRP_SenhaSemExpirar"
$MinSize = 16
$Prec = 10
Criar grupo se não existir
if (-not (Get-ADGroup -Filter "Name -eq '\$GrpName'")) {
New-ADGroup -Name \$GrpName -GroupScope Global ` -Path "OU=ServiceAccounts,DC=contoso,DC=local"`
-Description "Contas cujas senhas não expiram"
}
Criar FGPP
if (-not (Get-ADFineGrainedPasswordPolicy -Filter "Name -eq '\$PSOName'")) {
New-ADFineGrainedPasswordPolicy ` -Name $PSOName`
-Precedence \$Prec ` -MinPasswordLength $MinSize`
-PasswordComplexityEnabled \$true ` -MaxPasswordAge ([TimeSpan]::Zero)`
-AppliesTo \$GrpName
} else {
Set-ADFineGrainedPasswordPolicy -Identity \$PSOName ` -MinPasswordLength $MinSize`
-PasswordComplexityEnabled \$true ` -MaxPasswordAge 0.0:0:0`
-AppliesTo \$GrpName
}
Adicionar contas de serviço ao grupo
\$svcAccounts = "svc\sql","svc\iis","svc\_backup"
\$svcAccounts | ForEach-Object {
Add-ADGroupMember -Identity \$GrpName -Members $\_
}
Checklist rápido
- Confirme o nível funcional ≥ 2008.
- Crie grupo de destino.
- Configure FGPP com complexidade e 16+ caracteres.
- Ajuste
MaxPasswordAge
para zero via PowerShell. - Vincule grupo ao PSO.
- Valide com
Get-ADUser -Property msDS-ResultantPSO
. - Implemente MFA e monitoramento.
- Documente a mudança para auditoria.
Adotando a FGPP sem expiração, você preserva a robustez das senhas e elimina trocas forçadas que já não ampliam a segurança. Combine com controles modernos e mantenha registros claros para passar por auditorias sem percalços.