Políticas de Senha e Detecção de Ataques em Linux

CompTIABeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá técnicas essenciais para aprimorar a segurança de um sistema Linux implementando e aplicando políticas de senha robustas. Você configurará regras em todo o sistema para impor complexidade de senha, exigindo um comprimento mínimo e uma mistura de diferentes tipos de caracteres, como letras maiúsculas, minúsculas e dígitos. Você também configurará políticas de envelhecimento de senha para garantir que as credenciais sejam alteradas regularmente, reduzindo o risco associado a senhas comprometidas, modificando arquivos de configuração essenciais do sistema.

Além de estabelecer a política, você garantirá que esses requisitos de senha forte sejam aplicados a novas contas de usuário. O laboratório muda então de medidas de segurança proativas para detecção reativa, ensinando como monitorar logs de autenticação do sistema. Ao analisar esses logs, você poderá identificar atividades suspeitas, como tentativas repetidas de login falhas, que podem ser um indicador de um ataque de força bruta ou outras tentativas de acesso não autorizado.

Configurar Política de Senha Local do Linux para Complexidade e Idade

Nesta etapa, você aprenderá como fortalecer a segurança de um sistema Linux configurando uma política de senha robusta. Uma política de senha forte é um controle de segurança fundamental que impõe dois aspectos críticos: complexidade e idade. As regras de complexidade garantem que as senhas não sejam facilmente adivinhadas, exigindo uma mistura de tipos de caracteres, enquanto as regras de envelhecimento forçam 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 em todo o sistema e aplicar essas políticas.

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

Vamos começar examinando 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 para tornar a saída mais limpa.

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

Você poderá ver algumas configurações padrão ou o arquivo pode estar vazio de configurações ativas. Agora, vamos impor uma política mais forte. Precisamos editar este arquivo com privilégios de administrador, então usaremos sudo com o editor nano.

sudo nano /etc/security/pwquality.conf

Adicione as seguintes linhas ao arquivo para impor nossa nova política. Essas configurações exigem que a senha tenha pelo menos 10 caracteres de comprimento e contenha pelo menos um dígito, uma letra maiúscula e uma letra minúscula.

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

Vamos detalhar essas opções:

  • minlen = 10: Define o comprimento mínimo aceitável para a senha como 10 caracteres.
  • dcredit = -1: Requer pelo menos um dígito. O número negativo significa "pelo menos um".
  • ucredit = -1: Requer pelo menos um caractere maiúsculo.
  • lcredit = -1: Requer pelo menos um caractere minúsculo.

Após adicionar essas linhas, salve o arquivo e saia do nano pressionando Ctrl+X, depois Y e Enter.

Agora, vamos passar para a configuração do envelhecimento da senha (password aging). Essas configurações definem a vida útil máxima e mínima de uma senha. Os valores padrão para novas contas de usuário são armazenados em /etc/login.defs.

Use grep para encontrar as configurações relevantes neste arquivo.

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

Você verá os valores padrão, que geralmente são definidos como um número muito alto para PASS_MAX_DAYS, desabilitando 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

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

##       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 esta alteração. Para aplicar a política a um usuário existente, como nosso usuário labex, usamos o comando chage.

Primeiro, verifique as informações de envelhecimento atuais para o 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 flag -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 verificando novamente as informações de envelhecimento do usuário.

sudo chage -l labex

Você verá agora que a data de Password expires foi atualizada e o número máximo de dias está definido como 9000, aplicando com sucesso a política de envelhecimento.

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

Você configurou com sucesso as políticas de complexidade e envelhecimento de senha em seu sistema Linux.

Impor Senhas Fortes para Novas Contas de Usuário

Nesta etapa, você verificará se as políticas de complexidade e envelhecimento de senha que você configurou na etapa anterior estão sendo aplicadas a novas contas de usuário. A melhor maneira 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 juntos para proteger novas contas a partir do momento em que são criadas.

Usaremos o comando adduser, que é um script interativo e amigável 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. É aqui que nossa política será testada.

Primeiro, vamos tentar definir uma senha simples e fraca que viole nossa política. Quando solicitado 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 (é muito curta e não contém letras maiúsculas ou dígitos), o sistema a rejeitará. Vamos ver o motivo que ele fornece.

BAD PASSWORD: The password contains less than 1 digits

O sistema a rejeita, apontando a falta de dígitos. Ela viola várias políticas, mas esta é a primeira que ele relata.

O sistema solicitará novamente. Agora, vamos tentar uma senha que atenda ao requisito de comprimento, mas que ainda viole as regras de complexidade. Digite 12345 e pressione Enter.

BAD PASSWORD: The password contains less than 1 uppercase letters
New password:

Dicas: Se você acidentalmente criar um usuário, poderá usar sudo deluser testuser para excluir o usuário e tentar novamente.

O sistema a rejeita novamente. Desta vez, é porque a senha não tem um dígito. Ela também não tem uma letra maiúscula, portanto, não atende aos nossos requisitos de complexidade. Agora, vamos fornecer uma senha que atenda a todos os nossos critérios. Quando solicitado, digite StrongPass2025 e pressione Enter. Você será solicitado a digitá-la novamente para confirmação.

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

Sucesso! O sistema aceitou a senha forte. Ele agora perguntará sobre informações adicionais sobre o usuário. Você pode simplesmente pressionar Enter para cada solicitação para aceitar os padrões.

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 se o usuário existe usando o comando id.

id testuser

Isso mostrará o ID do usuário, o ID do grupo e as afiliações de grupo.

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

Em seguida, vamos confirmar que a política de envelhecimento de senha que definimos em /etc/login.defs foi aplicada automaticamente a este novo usuário. Use o comando chage para visualizar as informações de envelhecimento para testuser.

sudo chage -l testuser

A saída mostrará que o Maximum number of days between password change (Número máximo de dias entre a alteração da senha) 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

Finalmente, para manter nosso sistema limpo, vamos remover o usuário de teste. O comando deluser removerá a conta do 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 com sucesso um novo usuário, testou a aplicação da política de senha e verificou se as regras de envelhecimento padrão foram aplicadas.

Monitorar Logs de Autenticação para Tentativas de Login Falhadas

Nesta etapa, você aprenderá como monitorar os logs de autenticação do sistema para detectar possíveis ameaças de segurança, como ataques de força bruta. Uma parte fundamental da administração do sistema é revisar regularmente os logs em busca de atividades suspeitas. Tentativas de login falhas são um indicador crítico de tentativas de acesso não autorizado. Você simulará um login falho e, em seguida, usará comandos padrão do Linux para encontrar e analisar as entradas de log correspondentes.

Em sistemas baseados em Debian, como o Ubuntu, eventos de autenticação (bem-sucedidos e falhos) são tipicamente registrados no arquivo /var/log/auth.log. Este arquivo requer privilégios de administrador para leitura.

Primeiro, vamos gerar uma tentativa de login falha. Podemos fazer isso com segurança usando o comando su (substituir usuário) para tentar alternar para nossa própria conta de usuário, labex, mas fornecendo intencionalmente a 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, insira uma senha incorreta. Agora que geramos alguns dados de log, vamos examinar o arquivo de log de autenticação. Usaremos o comando tail com sudo para visualizar as últimas linhas de /var/log/auth.log, que é onde os eventos mais recentes são registrados.

sudo tail /var/log/auth.log

Você verá várias novas linhas relacionadas às suas tentativas de su falhas. A saída será semelhante a esta, mostrando o carimbo de data/hora, 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 em logs pode consumir tempo. Um método mais eficiente é usar grep para filtrar palavras-chave específicas. Vamos procurar por todas as linhas que contêm "authentication failure".

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

Este comando exibirá apenas as linhas que correspondem ao padrão, facilitando a identificação das tentativas falhas que você acabou de criar.

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

nano log_monitor.sh

Insira o seguinte script Bash no editor. Este script usa grep com o sinalizador -c para contar o número de tentativas de login falhas 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 seu novo script executável usando o comando chmod.

chmod +x log_monitor.sh

Finalmente, execute seu script de monitoramento para ver o resultado.

./log_monitor.sh

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

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

Você aprendeu como simular, detectar e criar um script de monitoramento básico para tentativas de autenticação falhas, uma habilidade crucial para manter a segurança do sistema.

Resumo

Neste laboratório, você aprendeu como aprimorar a segurança do sistema Linux configurando uma política de senha local robusta. Você modificou o arquivo /etc/security/pwquality.conf para impor regras de complexidade de senha usando o módulo pam_pwquality. Isso envolveu definir um comprimento mínimo de senha e exigir a inclusão de pelo menos um dígito, uma letra maiúscula e uma letra minúscula para proteger contra credenciais facilmente adivinháveis.

Além disso, você explorou como garantir que essas políticas de senha forte sejam aplicadas ao criar novas contas de usuário. O laboratório também abordou a habilidade crítica de monitorar os logs de autenticação do sistema para detectar e analisar eventos de segurança, como tentativas repetidas de login falhas, que podem indicar um ataque potencial.