Políticas de Senhas e Detecção de Ataques no Linux

CibersegurançaBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá técnicas essenciais para reforçar a segurança de um sistema Linux por meio da implementação e aplicação de políticas de senhas robustas. Você configurará regras em todo o sistema para exigir senhas mais complexas, com comprimento mínimo e uma combinação de diferentes tipos de caracteres, como letras maiúsculas, letras minúsculas e dígitos. Também configurará políticas de validade de senhas para garantir que as credenciais sejam alteradas regularmente, reduzindo os riscos associados a senhas comprometidas por meio da modificação dos principais arquivos de configuração do sistema.

Além de estabelecer a política, você garantirá que esses requisitos rigorosos sejam aplicados às novas contas de usuário. Em seguida, o laboratório passará de medidas de segurança preventivas para detecção reativa, ensinando você a monitorar os logs de autenticação do sistema. Ao analisar esses logs, será possível identificar atividades suspeitas, como repetidas tentativas de login malsucedidas, que podem indicar um ataque de força bruta ou outras tentativas de acesso não autorizado.

Configurar a política local de senhas do Linux para complexidade e validade

Nesta etapa, você aprenderá a reforçar a segurança de um sistema Linux configurando uma política de senhas robusta. Uma política de senhas forte é um controle de segurança fundamental que impõe dois aspectos importantes: complexidade e validade. As regras de complexidade garantem que as senhas não sejam facilmente adivinhadas, exigindo uma combinação de tipos de caracteres. Já as regras de validade obrigam os usuários a alterar suas senhas periodicamente, reduzindo o risco de credenciais comprometidas. Você usará utilitários padrão do Linux para modificar arquivos de configuração do sistema e aplicar essas políticas.

Primeiro, vamos examinar a complexidade das senhas. Em sistemas modernos baseados em Debian, como o Ubuntu, a qualidade das senhas é gerenciada pelo módulo pam_pwquality. Sua configuração está armazenada no arquivo /etc/security/pwquality.conf.

Vamos começar verificando as configurações padrão. Use o comando cat para visualizar o conteúdo do arquivo de configuração. Usaremos grep para filtrar linhas comentadas e linhas vazias, tornando a saída mais limpa.

grep -vE '^#|^$' /etc/security/pwquality.conf

Você poderá encontrar algumas configurações padrão ou descobrir que o arquivo não contém configurações ativas. Agora, vamos impor uma política mais rigorosa. Precisamos editar esse arquivo com privilégios administrativos, portanto usaremos sudo com o editor nano.

sudo nano /etc/security/pwquality.conf

Adicione as linhas a seguir ao arquivo para aplicar nossa nova política. Essas configurações exigem que a senha tenha pelo menos 10 caracteres, contenha pelo menos um dígito, uma letra maiúscula e uma letra minúscula, além de aplicar as verificações quando um administrador definir a senha de outro usuário.

minlen = 10
dcredit = -1
ucredit = -1
lcredit = -1
enforce_for_root

Veja o significado de cada opção:

  • minlen = 10: define 10 caracteres como o comprimento mínimo aceitável da senha.
  • dcredit = -1: exige pelo menos um dígito. O número negativo significa “pelo menos um”.
  • ucredit = -1: exige pelo menos um caractere maiúsculo.
  • lcredit = -1: exige pelo menos um caractere minúsculo.
  • enforce_for_root: impede que um administrador ignore uma verificação de qualidade malsucedida. Isso é necessário porque sudo adduser define a senha do novo usuário com privilégios de root.

Depois de adicionar essas linhas, salve o arquivo e saia do nano pressionando Ctrl+X, depois Y e Enter.

Agora, vamos configurar a validade das senhas. Essas definições determinam os períodos máximo e mínimo de validade de uma senha. Os valores padrão para novas contas de usuário são armazenados em /etc/login.defs.

Use grep para localizar as configurações relevantes nesse arquivo.

grep -E 'PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE' /etc/login.defs

Você verá os valores padrão, que geralmente definem um número muito alto para PASS_MAX_DAYS, desativando efetivamente a expiração.

##       PASS_MAX_DAYS   Maximum number of days a password may be used.
PASS_MAX_DAYS   99999
##       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
PASS_MIN_DAYS   0
##       PASS_WARN_AGE   Number of days warning is given before a password expires.
PASS_WARN_AGE   7

Vamos impor uma política de expiração de 9000 dias. Abra o arquivo com sudo nano.

sudo nano /etc/login.defs

Localize a linha PASS_MAX_DAYS e altere o valor de 99999 para 9000. Você também pode definir PASS_MIN_DAYS como 7 para impedir que os usuários alterem suas senhas com frequência excessiva.

##       PASS_MAX_DAYS   Maximum number of days a password may be used.
PASS_MAX_DAYS   9000
##       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
PASS_MIN_DAYS   7
##       PASS_WARN_AGE   Number of days warning is given before a password expires.
PASS_WARN_AGE   14

Salve o arquivo e saia do nano. Essas configurações em /etc/login.defs se aplicam aos usuários criados após essa alteração. Para aplicar a política a um usuário existente, como o usuário labex, usaremos o comando chage.

Primeiro, verifique as informações atuais de validade do usuário labex.

sudo chage -l labex

A saída mostrará que a senha nunca expira.

Last password change                                    : Jul 22, 2023
Password expires                                        : never
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

Agora, use chage com a opção -M para definir o número máximo de dias como 9000 para o usuário labex.

sudo chage -M 9000 labex

Verifique a alteração consultando novamente as informações de validade do usuário.

sudo chage -l labex

Agora você verá que a data em Password expires foi atualizada e que o número máximo de dias está definido como 9000, aplicando corretamente a política de validade.

Last password change                                    : Jul 22, 2023
Password expires                                        : Jan 01, 2048
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 9000
Number of days of warning before password expires       : 7

Agora você configurou com sucesso as políticas de complexidade e validade de senhas no sistema Linux.

Aplicar senhas fortes a novas contas de usuário

Nesta etapa, você verificará se as políticas de complexidade e validade configuradas anteriormente estão sendo aplicadas às novas contas de usuário. A melhor forma de testar isso é criar um novo usuário e tentar definir uma senha que viole as regras. Isso demonstrará como o módulo pam_pwquality e as configurações padrão do sistema trabalham em conjunto para proteger novas contas desde o momento de sua criação.

Usaremos o comando adduser, um script interativo e fácil de usar para criar usuários em sistemas baseados em Debian. Vamos criar um novo usuário chamado testuser.

sudo adduser testuser

O sistema solicitará imediatamente que você defina uma senha para o novo usuário. É nesse momento que nossa política será testada.

Primeiro, vamos tentar definir uma senha simples e fraca que viole nossa política. Quando for solicitada a nova senha, digite password e pressione Enter.

Adding user `testuser' ...
Adding new group `testuser' (1001) ...
Adding new user `testuser' (1001) with home directory `/home/testuser' ...
Copying files from `/etc/skel' ...
New password:

Como password viola nossas regras — é curta demais e não contém letras maiúsculas nem dígitos — o sistema a rejeitará. A mensagem exata pode variar, mas começará com BAD PASSWORD e solicitará novamente uma senha.

BAD PASSWORD: The password fails the dictionary check
New password:

A senha viola várias regras, e o sistema informa um dos motivos da rejeição antes de solicitar outra senha.

O aviso, por si só, não representa uma rejeição, a menos que o comando solicite uma nova senha novamente. A configuração enforce_for_root, adicionada na Etapa 1, garante que a senha fraca não seja aceita pelo processo privilegiado adduser.

Dica: se você criar um usuário acidentalmente, poderá usar sudo deluser testuser para excluí-lo e tentar novamente.

Agora, informe uma senha que atenda a todos os critérios. Quando solicitado, digite N7vQ2mR9xK4p e pressione Enter. Será necessário digitá-la novamente para confirmação.

New password:
Retype new password:
passwd: password updated successfully

Sucesso! O sistema aceitou a senha forte. Em seguida, ele solicitará informações adicionais sobre o usuário. Basta pressionar Enter em cada solicitação para aceitar os valores padrão.

Changing the user information for testuser
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y

O usuário testuser foi criado. Você pode verificar sua existência usando o comando id.

id testuser

A saída exibirá o ID do usuário, o ID do grupo e os grupos aos quais ele pertence.

uid=1001(testuser) gid=1001(testuser) groups=1001(testuser)

Em seguida, vamos confirmar se a política de validade definida em /etc/login.defs foi aplicada automaticamente a esse novo usuário. Use o comando chage para visualizar as informações de validade de testuser.

sudo chage -l testuser

A saída mostrará que Maximum number of days between password change está definido como 9000, exatamente como configuramos.

Last password change                                    : Jul 22, 2023
Password expires                                        : Jan 01, 2048
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 7
Maximum number of days between password change          : 9000
Number of days of warning before password expires       : 14

Por fim, para manter o sistema organizado, vamos remover o usuário de teste. O comando deluser removerá a conta de usuário.

sudo deluser testuser

O sistema confirmará que o usuário foi removido.

Removing user `testuser' ...
Warning: group `testuser' has no more members.
Done.

Você criou um novo usuário com sucesso, testou a aplicação da política de senhas e verificou que as regras padrão de validade foram aplicadas.

Monitorar logs de autenticação em busca de tentativas de login malsucedidas

Nesta etapa, você aprenderá a monitorar os logs de autenticação do sistema para detectar possíveis ameaças à segurança, como ataques de força bruta. Uma parte importante da administração de sistemas é revisar regularmente os logs em busca de atividades suspeitas. Tentativas de login malsucedidas são um indicador essencial de tentativas de acesso não autorizado. Você simulará um login malsucedido e usará comandos padrão do Linux para localizar e analisar as entradas correspondentes nos logs.

Em sistemas baseados em Debian, como o Ubuntu, os eventos de autenticação — bem-sucedidos ou malsucedidos — normalmente são registrados no arquivo /var/log/auth.log. A leitura desse arquivo requer privilégios administrativos.

Primeiro, vamos gerar uma tentativa de login malsucedida. Podemos fazer isso com segurança usando o comando su (substituição de usuário) para tentar mudar para nossa própria conta, labex, mas fornecendo intencionalmente uma senha incorreta.

su labex

O sistema solicitará uma senha. Digite qualquer senha incorreta, como wrongpassword, e pressione Enter.

Password:
su: Authentication failure

Vamos fazer isso mais uma vez para criar um padrão de falhas.

su labex

Novamente, informe uma senha incorreta. Agora que geramos alguns dados de log, vamos examinar o arquivo de autenticação. Usaremos o comando tail com sudo para visualizar as últimas linhas de /var/log/auth.log, onde os eventos mais recentes são registrados.

sudo tail /var/log/auth.log

Você verá várias linhas novas relacionadas às tentativas malsucedidas de su. A saída será semelhante à seguinte, exibindo o horário, o processo (su) e a mensagem de falha.

Jul 22 16:45:01 labex-vm su[12345]: pam_unix(su:auth): authentication failure; logname=labex uid=1000 euid=0 tty=/dev/pts/0 ruser=labex rhost=  user=labex
Jul 22 16:45:01 labex-vm su[12345]: FAILED SU (to labex) labex on /dev/pts/0
Jul 22 16:45:15 labex-vm su[12346]: pam_unix(su:auth): authentication failure; logname=labex uid=1000 euid=0 tty=/dev/pts/0 ruser=labex rhost=  user=labex
Jul 22 16:45:15 labex-vm su[12346]: FAILED SU (to labex) labex on /dev/pts/0

Pesquisar manualmente nos logs pode consumir bastante tempo. Um método mais eficiente é usar grep para filtrar palavras-chave específicas. Vamos procurar todas as linhas que contenham "authentication failure".

sudo grep "authentication failure" /var/log/auth.log

Esse comando exibirá apenas as linhas correspondentes ao padrão, facilitando a identificação das tentativas malsucedidas que você acabou de gerar.

Agora, vamos criar um script simples de shell para automatizar esse monitoramento. O script verificará o log em busca de falhas e exibirá um resumo. No diretório ~/project, crie um novo arquivo chamado log_monitor.sh usando o nano.

nano log_monitor.sh

Insira o script Bash a seguir no editor. Ele usa grep com a opção -c para contar o número de tentativas de login malsucedidas e, em seguida, exibe uma mensagem de status.

#!/bin/bash

LOG_FILE="/var/log/auth.log"
FAILURE_COUNT=$(sudo grep -c "authentication failure" $LOG_FILE)

echo "--- Authentication Log Monitor ---"
if [ "$FAILURE_COUNT" -gt 0 ]; then
  echo "WARNING: Found $FAILURE_COUNT failed login attempts."
else
  echo "OK: No failed login attempts found."
fi
echo "--------------------------------"

Salve o arquivo e saia do nano pressionando Ctrl+X, depois Y e Enter.

Em seguida, torne o novo script executável usando o comando chmod.

chmod +x log_monitor.sh

Por fim, execute o script de monitoramento para ver o resultado.

./log_monitor.sh

Como você gerou logins malsucedidos, o script os detectará e exibirá uma mensagem de aviso com a contagem exata.

--- Authentication Log Monitor ---
WARNING: Found 2 failed login attempts.
--------------------------------

Agora você aprendeu a simular, detectar e criar um script básico para monitorar tentativas de autenticação malsucedidas — uma habilidade essencial para manter a segurança do sistema.

Resumo

Neste laboratório, você aprendeu a reforçar a segurança de um sistema Linux configurando uma política local de senhas robusta. Você modificou o arquivo /etc/security/pwquality.conf para aplicar regras de complexidade por meio do módulo pam_pwquality. Isso envolveu definir um comprimento mínimo para as senhas e exigir pelo menos um dígito, uma letra maiúscula e uma letra minúscula, protegendo o sistema contra credenciais fáceis de adivinhar.

Além disso, você explorou como garantir que essas políticas rigorosas sejam aplicadas durante a criação de novas contas de usuário. O laboratório também abordou a habilidade essencial de monitorar os logs de autenticação do sistema para detectar e analisar eventos de segurança, como repetidas tentativas de login malsucedidas, que podem indicar um possível ataque.