Pages

Subscribe:

Ads 468x60px

segunda-feira, 18 de fevereiro de 2013

Práticas de segurança em servidor OpenSSH - 21 configurações eficazes

21 práticas de segurança em servidor OpenSSH 
O OpenSSH é a implementação do protocolo SSH. Ele é recomendado para login remoto, fazer backups, transferência de arquivos remotos via scp ou sftp, e muito mais. O SSH é perfeito para manter a confidencialidade e a integridade dos dados trocados entre duas redes e sistemas. No entanto, a principal vantagem é a autenticação do servidor, pelo uso de criptografia de chave pública. De tempos em tempos, aparecem rumores sobre o exploite zero day do OpenSSH. Aqui estão algumas coisas que você precisa ajustar para melhorar a segurança do servidor OpenSSH.
Arquivos de Configuração Padrão e porta SSH
§  /etc/ssh/sshd_config - arquivo de configuração do servidor OpenSSH.
§  /etc/ssh/ssh_config - arquivo de configuração do cliente OpenSSH.
§  ~/.ssh/ - diretório de configuração de usuários ssh.
§  ~/.ssh/authorized_keys ou ~/.ssh/authorized_keys - lista as chaves públicas (RSA ou DSA) que podem ser utilizadas para fazer login na conta do usuário.
§  /etc/nologin - se esse arquivo existir, o sshd só permite que o root faça login.
§  /etc/hosts.allow e /etc/hosts.deny: as listas de controle de acesso devem ser reforçadas pelo tcp-wrappers são definidas aqui.
§  SSH default port: TCP 22

#1: Desativar servidor OpenSSH
As estações de trabalho e os laptops podem funcionar sem o servidor OpenSSH. Se você não precisa fornecer o login remoto e recursos de transferência de arquivos do SSH, desabilite e remova o servidor SSHD. O usuário de CentOS/RHEL/Fedora Linux pode desabilitar e remover openssh-server com o comando yum:
# chkconfig sshd off
# yum erase openssh-server
O usuário de Debian/Ubuntu Linux pode desativar e remover o mesmo com o comando apt-get:
# apt-get remove openssh-server
Pode ser preciso atualizar o script iptables para remover a regra de exceção ssh. No CentOS/RHEL/Fedora, edite os arquivos /etc/sysconfig/iptables e /etc/sysconfig/ip6tables. Uma vez feito isso, reinicie o serviço iptables:
# service iptables restart
# service ip6tables restart
#2: Use apenas protocolo SSH 2
A versão 1 do protocolo SSH (SSH-1) apresenta problemas de ataques e vulnerabilidades de segurança. A versão SSH-1 é obsoleta e deve ser evitada a todo custo. Abra sshd_config e verifique se existe a seguinte linha:
Protocol 2
#3: Limite o acesso SSH do usuário
Por padrão, todos os usuários de sistemas podem fazer login via SSH utilizando sua senha ou chave pública. Às vezes, você cria uma conta de usuário UNIX/Linux para fins de ftp ou e-mail. No entanto, os usuários podem acessar o sistema utilizando ssh. Eles terão acesso total a ferramentas do sistema, incluindo compiladores e linguagens de script como Perl e Python, que podem abrir as portas de rede e fazer muitas outras coisas extravagantes. Um dos meus clientes tinha um script php muito desatualizado e um invasor foi capaz de criar uma nova conta no sistema através de um script php. No entanto, ele não conseguiu entrar na box via ssh, porque não estava em AllowUsers.
Permita somente que os usuários root, vivek e jerry utilizem o sistema via SSH; adicione o seguinte ao sshd_config:
AllowUsers root vivek jerry
Alternativamente, você pode permitir que todos os usuários façam login via SSH, porém negue apenas alguns, com a seguinte linha:
DenyUsers saroj anjali foo
Você pode também configurar o Linux PAM para que ele permita ou negue o login via servidor sshd. Você pode permitir ou negar o acesso de uma lista de nome de grupos ao ssh.
#4: Configure Idle Log Out Timeout Interval
O usuário pode se conectar ao servidor via ssh e é possível que você defina um tempo limite ocioso para evitar uma sessão ssh inativa. Abra o sshd_config e verifique se os seguintes valores estão configurados:
ClientAliveInterval 300
ClientAliveCountMax 0
Você está definindo um intervalo de tempo limite ocioso em segundos (300 segs = 5 minutos). Depois que esse intervalo passou, o usuário ocioso será automaticamente expulso (leia-se desconectado). Veja como fazer automaticamente o login BASH / tcsh / SSH do usuário depois de um período de inatividade para mais detalhes.
#5: Desativar arquivos .rhosts
Não leie os arquivos do usuário ~/.rhosts e ~/.shosts. Atualize o sshd_config com as seguintes configurações:
IgnoreRhosts yes
O SSH pode emular o comportamento do comando obsoleto rsh. Para isso, você só precisa desabilitar o acesso inseguro via RSH.
#6: Desativar o host-based authentication
Para desativar o host-based authentication, atualize o sshd_config com a seguinte opção:
HostbasedAuthentication no
#7: Desativar login root via SSH
Não existe necessidade de entrar como root via ssh em uma rede. Os usuários normais podem usar su ou sudo (recomendado) para ter acesso de nível root. Isso também garante que você tenha informações completas de auditoria sobre quem rodou comandos privilegiados no sistema via sudo. Para desativar root login via SSH, atualize sshd_config com a seguinte linha:
PermitRootLogin no
No entanto, o Bob fez uma excelente observação:
Dizer “não logar como root” é bobagem. Isso vem dos dias em que as pessoas usaram os primeiros pacotes de sessões. Assim, logar como você e su-ing diminuiu a chance de um invasor ver o root pw e diminuiu a chance de você ser falsificado quanto a seu alvo de telnet host. Você teria a sua senha falsificada mas não o pw do root. Dá um tempo. Isso é 2005 – Temos o ssh, que se usado corretamente é seguro. Se utilizado indevidamente nada disso de 1989 vai fazer nenhuma de diferença. – Bob
# 8: Ative um banner de aviso
Defina um banner de aviso, atualizando sshd_config com a seguinte linha:
Banner /etc/issue
Arquivo de exemplo /etc/issue:
----------------------------------------------------------------------------------------------
You are accessing a XYZ Government (XYZG) Information System (IS) that is provided for authorized use only.
By using this IS (which includes any device attached to this IS), you consent to the following conditions:
+ The XYZG routinely intercepts and monitors communications on this IS for purposes including, but not limited to,
penetration testing, COMSEC monitoring, network operations and defense, personnel misconduct (PM),
law enforcement (LE), and counterintelligence (CI) investigations.
+ At any time, the XYZG may inspect and seize data stored on this IS.
+ Communications using, or data stored on, this IS are not private, are subject to routine monitoring,
interception, and search, and may be disclosed or used for any XYZG authorized purpose.
+ This IS includes security measures (e.g., authentication and access controls) to protect XYZG interests--not
for your personal benefit or privacy.
+ Notwithstanding the above, using this IS does not constitute consent to PM, LE or CI investigative searching
or monitoring of the content of privileged communications, or work product, related to personal representation
or services by attorneys, psychotherapists, or clergy, and their assistants. Such communications and work
product are private and confidential. See User Agreement for details.
----------------------------------------------------------------------------------------------
Acima está o exemplo padrão. Consulte a sua equipe jurídica para os detalhes sobre os termos de uso.
# 9: Porta 22 no ssh do firewall
Você precisa ativar a porta 22 no ssh do firewall, atualizando as configurações de firewall iptables ou pf. Normalmente, o servidor OpenSSH só deve aceitar conexões da sua LAN ou de outros sites WAN remotos.
Configuração do Netfilter (iptables)
Atualize Update  /etc/sysconfig/iptables (RedHat e friends  de arquivo específico) para aceitar conexão apenas de 192.168.1.0/24 e 202.54.1.5/29. Digite:
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -s 202.54.1.5/29 -m state --state NEW -p tcp --dport 22 -j ACCEPT
Se você tiver dual stacked sshd com o IPv6, edite /etc/sysconfig/ip6tables (arquivo específico para RedHat e derivados)Digite:
 -A RH-Firewall-1-INPUT -s ipv6network::/ipv6mask -m tcp -p tcp --dport 22 -j ACCEPT
Substitua ipv6network::/ipv6maskcom intervalos de IPv6 reais.
Configuração do Firewall * BSD PF
Se você estiver usando firewall PF, atualize update /etc/pf.conf da seguinte forma:
Port 300
ListenAddress 192.168.1.5
ListenAddress 202.54.1.5
#10: Mude a porta SSH e o limite de binding de IP
Por padrão, o SSH ouve todas as interfaces disponíveis e os endereços de IP no sistema. Limite a porta ssh e o binding e altere a porta ssh (por padrão, scripts de força bruta só tentam se conectar à porta # 22). Para ligar a 192.168.1.5 e 202.54.1.5 IPs e para a porta 300, adicione ou corrija a seguinte linha:
Port 300
ListenAddress 192.168.1.5
ListenAddress 202.54.1.5
Uma abordagem melhor para usar scripts de abordagens proativas, como fail2ban ou denyhosts.
#11: Use senhas SSH fortes e passphrase
Nunca é demais falar o quão importante é a utilização de senhas de usuários fortes e passphrase para suas chaves. O ataque de força bruta funciona porque você utiliza de senhas baseadas no dicionário. Você pode forçar os usuários a não utilizarem senhas que possam ser quebradas com um “ataque de dicionário” e usar o john the ripper para descobrir passwords fracos já existentes. Aqui está um exemplo de gerador de senhas aleatórias (coloque no seu ~/.bashrc):
genpasswd() {
         local l=$1
         [ "$l" == "" ] && l=20
         tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs
}
Execute:
genpasswd 16
Output:
uw8CnDVMwC6vOKgW

#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:
§  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
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 yumapt-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


***Este artigo foi publicado originalmente em http://www.cyberciti.biz/tips/linux-unix-bsd-openssh-server-best-practices.html e traduzido pela equipe de Redação iMasters (http://imasters.com.br/perfil/redacao_imasters), de onde copiei para guardar como fonte de pesquisa.

0 comentários:

Postar um comentário