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
# 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
# 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
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
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:
§ 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.
§ 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/sshit
verifica ataques de força bruta contra SSH/FTP e bloqueia IPs fornecidas.
§ 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.
#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
#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
***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