Recentemente, entrei em um ambiente em que muitos logons de bancos de dados não têm o enforce_password_policy
sinalizador ativado.
Uma próxima auditoria está exigindo a verificação das senhas desses logons.
Usei a consulta a seguir para obter uma lista de logons e se os sinalizadores estão ativados ou desativados.
select
@@SERVERNAME as servername,
name,
IS_SRVROLEMEMBER('sysadmin', name) as SYSADMIN,
type_desc,
create_date,
is_policy_checked,
is_disabled,
password_hash,
PWDCOMPARE(name, password_hash) as UsernameAsPassword
FROM sys.sql_logins
No entanto, isso não indica se as senhas realmente aderem à política de senhas, pois o sinalizador é relevante apenas ao criar um usuário.
Existe uma maneira conhecida de testar os usuários existentes quanto à conformidade com a diretiva de senha?
Não tenho acesso às senhas antigas e prefiro um método que não as exija.
PWDCOMPARE()
, não encontrei muita coisa, apesar de obrigado pelo esforço!Respostas:
Isso pode não ser popular entre seus usuários, mas acredito que a única maneira de saber com certeza é forçar uma alteração de senha para cada login SQL
CHECK_POLICY = ON
. Isso gerará um conjunto deALTER LOGIN
comandos com senhas em branco. Você pode atualizar a consulta, fornecendo a todos uma senha comum ou atualizar manualmente cada uma com senhas individuais - apenas verifique se elas atendem à sua política. Obviamente, você precisa ter certeza de que a política de senha é tão complexa quanto o esperado e ativada (Painel de Controle> Ferramentas Administrativas> Política de Segurança Local> Políticas de Conta> Políticas de Senha> Política de Senha> A senha deve atender aos requisitos de complexidade).Steve Jones escreveu sobre isso há um tempo. Observe que, devido ao que descobri abaixo, você não pode confiar
is_policy_checked = 1
para que a senha realmente atenda à sua política atual, pois o login pode ter sido criado com uma senha com hash (nesse caso, a senha em texto sem formatação não pode ser marcado) ou enquanto a política de complexidade local estava desativada (o que ainda leva ais_policy_checked = 1
).Outra abordagem que pensei que funcionaria seria tentar criar uma cópia de cada login com seu atual
password_hash
e comCHECK_POLICY = ON
e anotar todos que falharem. No entanto, isso não pode funcionar - mesmo comCHECK_POLICY = ON
, ele não executa nenhuma validação de uma senha já com hash. Incluirei o código da posteridade - mas, por padrão, a política simplesmente não pode ser verificada.Pessoalmente, acho que isso é um bug. Se a sintaxe permitir que eu crie um login usando uma senha com hash e eu possa estipular que essa senha deve atender à minha política de complexidade, ela deverá gerar um erro ou aviso de que a política não foi, de fato, verificada.
UPDATE : Eu registrei um bug contra esse comportamento.
fonte
select @@SERVERNAME as servername, name FROM sys.sql_logins where PWDCOMPARE(name, password_hash) = 1 AND is_policy_checked = 1;
deu vários resultados positivos. Portanto, terei que fazer isso em todos os logins, não apenas nos que estãois_policy_checked
desativados.Não há como você obter isso 100% preciso. Embora você possa usar
PWDCOMPARE
para verificar uma lista de senhas fracas (você pode adicionar à lista de senhas fracas e fazer uma comparação).Eu escrevi um script semelhante que faz a comparação e fornece os resultados. Eu postei no github .
EDITAR:
Agora você pode ter uma lista de senhas fracas em um csv e, em seguida, usar dbatools
Test-DbaLoginPassword
com-Dictionary
switch (especifica uma lista de senhas a serem incluídas no teste de senhas fracas).fonte
Política de senha por logon do SQL é apenas um sinalizador para ativar ou desativar. Se o sinalizador de Política de Senha estiver marcado, a Política de Senha do Windows do sistema operacional será aplicada.
Verifique a documentação de CREATE LOGIN para obter detalhes sobre o que acontece quando CHECK_POLICY e CHECK_EXPIRATION estão definidos.
Você pode ver as configurações por usuário SQL, verificando as colunas is_policy_checked e is_expiration_checked em sys.sql_logins
algo como abaixo:
Para logons de autenticação do SQL Server:
select * from sys.server_principals where type in ('U','G')
- mostrará os logins e grupos que podem acessar um SQL Server via autenticação do Windows.fonte