Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

SQL Server – Como identificar senhas frágeis, vazias ou iguais ao nome do usuário

Post Views 2,402 views
Reading time 4 minutes

Olá pessoal,
Boa noite!

Neste post, vou demonstrar como identificar senhas frágeis, vazias ou iguais ao nome do usuário no SQL Server. Isso é especialmente útil para que administradores de bancos de dados consigam evitar ataques por conta de descuidos de usuários na escolha de suas senhas.

Introduction

Para realizar essa verificação, vamos utilizar a função PWDCOMPARE, presente no SQL Server desde 2008, mas que infelizmente, está marcada como deprecated e será descontinuada em alguma versão futura do SQL Server (embora eu não tenha identificado nenhuma outra alternativa para isso). Essa função é bem simples, onde você informa a senha que você gostaria de testar, o hash de comparação e a função retorna um valor booleano (0 ou 1) se a senha que você tentou corresponde ao hash informado.

Embora essa função seja pública, ou seja, qualquer usuário da instância pode utilizá-la, isso não representa uma ameaça à segurança do banco de dados, uma vez que a coluna password_hash da view sys.sql_logins é visível apenas para usuários com privilégio CONTROL SERVER na instância, o que eu imagino que sejam pouquíssimos usuários, todos eles, DBA’s. Caso contrário, seria muito fácil um usuário mal intencionado realizar ataques de força bruta para tentar adivinhar as senhas, mas isso não é possível devido à essa restrição de permissão (embora isso seja possível para um usuário DBA).

Um outro ponto importante a ser falado, é que essa técnica se aplica apenas a usuários com autenticação SQL Server. Usuários com autenticação Active Directory (Windows AD) tem o valor da coluna password_hash como NULL, mesmo para usuários sysadmin.

Identificando o hash da senha do usuário (password_hash)

Um passo importante para conseguir identificar essas senhas frágeis, é conseguir descobrir o hash da senha do usuário. Vamos precisar desse hash para utilizar na função PWDCOMPARE e identificar a senha atual do usuário.

Para recuperar esse hash do usuário é bem simples, basta utilizar uma das 2 queries abaixo:

sql-server-loginproperty-password_hash-sys-sql_logins

Identificando as senhas frágeis

Agora que já identificamos como recuperar o password_hash, vamos consultar a quão frágil são as senhas dos nossos usuários no banco. Para isso, vou criar uma tabela de senhas fracas que vou tentar, e depois vou testar cada senha, em cada usuário, para achar qual a senha que coincidiu.

Script de criação da tabela de senhas:
Com o script abaixo, vou criar uma tabela com as senhas que vou utilizar para tentar identificar a senha atual do usuário. Sinta-se a vontade para alterar esse script e adicionar suas tentativas de senha.

Nesse script você pode facilmente criar uma lista com todas as possibilidades e fazer um ataque de força bruta, caso você seja um usuário com privilégio de DBA, tenha perdido a senha de um usuário e realmente precise descobrir uma determinada senha (porque é muito mais fácil simplesmente alterá-la, se for o caso).

E agora, tentamos identificar as senhas frágeis na instância:

sql-server-identify-weak-blank-empty-passwords-with-pwdcompare

No relatório acima, todos os usuários onde foi possível identificar a senha são mostrados, com as suas respectivas senhas encontradas.

O ideal é que nas próximas definições de senha, você ative a opção “Enforce password policy” (https://msdn.microsoft.com/en-us/library/ms161959.aspx), para garantir que as suas senhas sejam fortes e seguras.

sql-server-enforce-password-policy

Espero que tenham gostado do post e até mais.