DevSecOps

5 fev, 2013

Top 21 melhores práticas de segurança em servidor OpenSSH – Parte 02

Publicidade

No artigo anterior, vimos as 11 primeiras de 21 melhores práticas de segurança em servidor OpenSSH. Neste, você vai conhecer as 1o restantes.

#12: Use chave pública baseada em autenticação

Use o par chave pública/privada com proteção de senha para a chave privada. Veja como usar RSA e autenticação baseada na chave DSA. Nunca, jamais, use o key pair de login.

#13: Utilize a autenticação baseada em keychain

O keychain é um script bash destinado a tornar a  autenticação baseada em chave extremamente conveniente e flexível. Ele oferece benefícios de segurança diferentes sobre chaves passphrase-free. Veja como configurar e usar o software keychain.

#14: SSHD Chroot (prenda os usuários em seus diretórios pessoais)

Por padrão, os usuários podem percorrer os diretórios do servidor, como /etc/, /bin, e assim por diante. Você pode proteger ssh, usando choort baseado em SO ou utilizando ferramentas especiais, como rssh. Com o lançamento do OpenSSH 4.8p1 ou 4.9p1, você já não precisa depender de hacks de terceiros, como rssh ou setups chroot(1) complicados para bloquear usuários de seus diretórios home. Veja este artigo sobre a nova diretiva ChrootDirectory para bloquear usuários de seus diretórios home.

#15: Use wrappers TCP

O wrapper TCP é um sistema host-based Networking ACL, usado para filtrar o acesso da rede à Internet. O OpenSSH não suporta o wrapper TCP. Basta atualizar o seu arquivo/etc/hosts.allow da seguinte forma para permitir SSH apenas a partir de 192.168.1.2 172.16.23.12:

sshd : 192.168.1.2 172.16.23.12

Veja este FAQ sobre como configurar e usar o wrapper TCP em Linux/Mac OS X e Unix como sistemas operacionais.

#16: Desative senhas vazias

Você precisa desabilitar de maneira explícita o login remoto em contas com senhas vazias; atualize sshd_config com a seguinte linha:

PermitEmptyPasswords no

#17: Thwart SSH Crackers (ataque de força bruta)

A força bruta é um método de derrotar um esquema de criptografia, tentando um grande número de possibilidades através do uso de uma rede de computador única ou distribuída. Para prevenir ataques de força bruta contra o SSH, use os seguintes softwares:

  • O DenyHosts é uma ferramenta de segurança baseada em Python para servidores SSH. A intenção é evitar ataques de força bruta em servidores SSH, monitorando tentativas de login inválidas no registro de autenticação e bloqueando os endereços IP de origem.
  • Explica como configurar DenyHosts sob RHEL/Fedora e CentOS Linux.
  • Fail2ban é um programa semelhante que impede ataques de força bruta contra o SSH.
  • security/sshguard-pf protege os hosts de ataques de força bruta contra os serviços de SSH e outros usando pf.
  • security/sshguard-ipfw protege os hosts de ataques de força bruta contra SSH e outros serviços usando ipfiw.
  • security/sshguard-ipfilter protege os hosts de ataques de força bruta contra SSH e outros serviços usando ipfilter.
  • security/sshblock bloqueia tentativas de login abusivos no SSH.
  • security/sshit verifica ataques de força bruta contra SSH/FTP e bloqueia IPs fornecidas.
  • BlockHosts bloqueio automático de hosts IP abusivos.
  • Blacklist se livra dessas tentativas de ataques de força bruta.
  • Brute Force Detection um script shell modular para a análise de logs de aplicativos e verificação de falhas de autenticação. Ele faz isso usando um sistema de regras em que as opções específicas do aplicativo são armazenadas incluindo expressões regulares para cada formato de autenticação única.
  • IPQ BDB filter pode ser considerado como um fail2ban light.

#18: Limite de taxa de conexões da porta de entrada 22

Tanto o netfilter quanto o pf oferecem opção de limite de taxa para realizar a otimização simples em conexões de entrada na porta #22.

Exemplo de iptables

O exemplo a seguir vai descartar as conexões de entrada que fazem mais de 5 tentativas de conexão na porta 22 em 60 segundos:

#!/bin/bash
inet_if=eth1
ssh_port=22
$IPT -I INPUT -p tcp --dport ${ssh_port} -i ${inet_if} -m state --state NEW -m recent  --set
$IPT -I INPUT -p tcp --dport ${ssh_port} -i ${inet_if} -m state --state NEW -m recent  --update --seconds 60 --hitcount 5 -j DROP

Chame o script acima a partir dos seus scripts iptables. Olhe só outra opção de configuração:

$IPT -A INPUT  -i ${inet_if} -p tcp --dport ${ssh_port} -m state --state NEW -m limit --limit 3/min --limit-burst 3 -j ACCEPT
$IPT -A INPUT  -i ${inet_if} -p tcp --dport ${ssh_port} -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o ${inet_if} -p tcp --sport ${ssh_port} -m state --state ESTABLISHED -j ACCEPT
# another one line example
# $IPT -A INPUT -i ${inet_if} -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 22 -m limit --limit 5/minute --limit-burst 5-j ACCEPT

Veja a página principal de iptables para obter mais detalhes.

Exemplo BSD PF

O que se segue limita o número máximo de conexões por fonte para 20 e limita a taxa do número de ligações para 15 em um período de 5 segundos. Se alguém violar nossas regras, adicione-as à nossa tabela abusive_ips e bloqueie-as para que não façam ligações adicionais. Finalmente, palavra-chave embutida mata todos os estados criados pela regra de correspondência, que se origina a partir do host que ultrapassa esses limites.

sshd_server_ip="202.54.1.5"
table <abusive_ips> persist
block in quick from <abusive_ips>
pass in on $ext_if proto tcp to $sshd_server_ip port ssh flags S/SA keep state (max-src-conn 20, max-src-conn-rate 15/5, overload <abusive_ips> flush)

 #19: Use Port knocking

O Port knocking é um método de abrir portas externamente em um firewall, gerando uma tentativa de conexão em um conjunto de portas fechadas especificadas previamente. Uma vez que a sequência correta de tentativas de conexão é recebida, as regras de firewall são dinamicamente modificadas para permitir que o host que enviou a conexão tente se conectar pela porta específica. Um exemplo de port Knocking para ssh usando iptables:

$IPT -N stage1
$IPT -A stage1 -m recent --remove --name knock
$IPT -A stage1 -p tcp --dport 3456 -m recent --set --name knock2

$IPT -N stage2
$IPT -A stage2 -m recent --remove --name knock2
$IPT -A stage2 -p tcp --dport 2345 -m recent --set --name heaven

$IPT -N door
$IPT -A door -m recent --rcheck --seconds 5 --name knock2 -j stage2
$IPT -A door -m recent --rcheck --seconds 5 --name knock -j stage1
$IPT -A door -p tcp --dport 1234 -m recent --set --name knock

$IPT -A INPUT -m --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p tcp --dport 22 -m recent --rcheck --seconds 5 --name heaven -j ACCEPT
$IPT -A INPUT -p tcp --syn -j doo
  • fwknop é uma implementação que combina knocking port e fingerprint passiva de OS.
  • Vários port knocking Netfilter / iptables única implementação.

#20: Use Log Analyzer

Leia seus logs usando logwatch ou logcheck. Essas ferramentas tornam a leitura de log mais fácil. Elas vão passar por seus logs durante um determinado período de tempo e fazer um relatório nas áreas que você deseja, com o detalhe que você quer. Certifique-se de que o LogLevel está definido para INFO ou DEBUG no sshd_config:

LogLevel INFO

#21: Patch OpenSSH e sistemas operacionais

É recomendado que você use ferramentas como yum, apt-get e freebsd-update e para manter os sistemas atualizados com os patches de segurança mais recentes.

Outras opções

Para esconder a versão openssh, você precisa atualizar o código fonte e compilar o openssh novamente. Certifique-se de que as seguintes opções estão habilitadas no sshd_config:

#  Turn on privilege separation
UsePrivilegeSeparation yes
# Prevent the use of insecure home directory and key file permissions
StrictModes yes
# Turn on  reverse name checking
VerifyReverseMapping yes
# Do you need port forwarding?
AllowTcpForwarding no
X11Forwarding no
#  Specifies whether password authentication is allowed.  The default is yes.
PasswordAuthentication no

Verifique o seu arquivo sshd_config antes de reiniciar recargar as modificações:

Maior segurança em autenticação SSH com dois ou três fatores (ou mais).

Referências:

  1. O projeto OpenSSH oficial.
  2. Tópico do fórum: Tentativas falhas de login SSH e como evitar ataques brutais ssh.
  3. Páginas do manual sshd_config, ssh_config, tcpd, yum e apt-get.

***

Texto original disponível em http://www.cyberciti.biz/tips/linux-unix-bsd-openssh-server-best-practices.html