Que medidas posso / devo tomar para garantir que a segurança no meu servidor SSH seja absolutamente impermeável?
Este será um wiki da comunidade desde o início, então vamos ver o que as pessoas fazem para proteger seus servidores.
Que medidas posso / devo tomar para garantir que a segurança no meu servidor SSH seja absolutamente impermeável?
Este será um wiki da comunidade desde o início, então vamos ver o que as pessoas fazem para proteger seus servidores.
Respostas:
Use pares de chaves públicas / privadas para autenticação em vez de senhas.
Gere uma chave SSH protegida por senha para todos os computadores que precisam acessar o servidor:
ssh-keygen
Permitir acesso SSH de chave pública a partir dos computadores permitidos:
Copie o conteúdo de ~/.ssh/id_rsa.pub
cada computador em linhas individuais ~/.ssh/authorized_keys
no servidor ou execute ssh-copy-id [server IP address]
em todos os computadores aos quais você está concedendo acesso (você precisará digitar a senha do servidor no prompt).
Desative o acesso SSH da senha:
Abra /etc/ssh/sshd_config
, encontre a linha que diz #PasswordAuthentication yes
e mude para PasswordAuthentication no
. Reinicie o daemon do servidor SSH para aplicar a alteração ( sudo service ssh restart
).
Agora, a única maneira possível de fazer o SSH no servidor é usar uma chave que corresponda a uma linha ~/.ssh/authorized_keys
. Usando este método, eu não me importo com ataques de força bruta, porque mesmo que acho que a minha senha, ela será rejeitada. Forçar brutalmente um par de chaves pública / privada é impossível com a tecnologia atual.
Eu sugeriria:
Usando fail2ban para impedir tentativas de login de força bruta.
Desativando o login como root via SSH. Isso significa que um invasor precisou descobrir o nome de usuário e a senha, tornando o ataque mais difícil.
Adicione PermitRootLogin no
ao seu /etc/ssh/sshd_config
.
Limitando os usuários que podem SSH ao servidor. Por grupo ou apenas usuários específicos.
Adicione AllowGroups group1 group2
ou AllowUsers user1 user2
limite quem pode SSH ao servidor.
sshd
configuração está correta antes de reiniciar o sshd, para evitar bloquear-se fora da máquina. Veja este blog para obter detalhes - basta executar sshd -T
após uma alteração na configuração antes de reiniciar o principal sshd
. Além disso, abra uma sessão SSH na máquina ao fazer a alteração na configuração e não feche isso até que você tenha validado a configuração conforme mencionado e talvez tenha feito um teste de login no SSH.
Outras respostas fornecem segurança, mas há uma coisa que você pode fazer que tornará seus logs mais silenciosos e menos provável que você seja bloqueado da sua conta:
Mova o servidor da porta 22 para outra. No seu gateway ou no servidor.
Isso não aumenta a segurança, mas significa que todos os scanners aleatórios da Internet não irão sobrecarregar os arquivos de log.
Habilite a autenticação de dois fatores com HOTP ou TOTP . Está disponível a partir das 13h10.
Isso inclui o uso da autenticação de chave pública sobre autenticação de senha, como em outra resposta aqui, mas também exige que o usuário prove que ele possui seu dispositivo de segundo fator além de sua chave privada.
Resumo:
sudo apt-get install libpam-google-authenticator
Peça a cada usuário que execute o google-authenticator
comando, que gera ~/.google-authenticator
e ajuda a configurar seus dois dispositivos de fator (por exemplo, o aplicativo Google Authenticator para Android).
Edite /etc/ssh/sshd_config
e defina:
ChallengeResponseAuthentication yes
PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive
Execute sudo service ssh reload
para pegar suas alterações em /etc/ssh/sshd_config
.
Edite /etc/pam.d/sshd
e substitua a linha:
@include common-auth
com:
auth required pam_google_authenticator.so
Mais detalhes sobre as diferentes opções de configuração estão no meu blog do ano passado: Melhor autenticação ssh de dois fatores no Ubuntu .
Faça com que os IPs do cliente do bloco sshd que falharam em fornecer informações de login corretas " DenyHØsts " possam fazer esse trabalho com bastante eficiência. Eu tenho isso instalado em todas as minhas caixas de Linux que são de alguma forma alcançáveis do lado de fora.
Isso garantirá que ataques de força no SSHD não sejam eficazes, mas lembre-se (!) Dessa maneira, você pode acabar se trancando se esquecer sua senha. Isso pode ser um problema em um servidor remoto ao qual você não tem acesso.
Aqui está uma coisa fácil de fazer: instalar o ufw (o "firewall não complicado") e usá-lo para classificar o limite de conexões de entrada.
Em um prompt de comando, digite:
$ sudo ufw limit OpenSSH
Se o ufw não estiver instalado, faça isso e tente novamente:
$ sudo aptitude install ufw
Muitos invasores tentarão usar o servidor SSH para senhas de força bruta. Isso permitirá apenas 6 conexões a cada 30 segundos do mesmo endereço IP.
Se eu quiser ter alguma segurança adicional ou precisar acessar servidores SSH dentro de uma rede corporativa, configurei um serviço oculto usando o software de anonimização Tor .
localhost
./etc/tor/torrc
. Conjunto HiddenServiceDir /var/lib/tor/ssh
e HiddenServicePort 22 127.0.0.1:22
.var/lib/tor/ssh/hostname
. Existe um nome como d6frsudqtx123vxf.onion
. Este é o endereço do serviço oculto.Abra $HOME/.ssh/config
e adicione algumas linhas:
Host myhost
HostName d6frsudqtx123vxf.onion
ProxyCommand socat STDIO SOCKS4A:127.0.0.1:%h:%p,socksport=9050
Além disso, preciso do Tor no meu host local. Se estiver instalado, posso entrar ssh myhost
e o SSH abre uma conexão via Tor. O servidor SSH do outro lado abre sua porta apenas no host local. Para que ninguém possa conectá-lo via "internet normal".
Há um artigo de administração Debian sobre este tópico. Abrange a configuração básica do servidor SSH e também as regras de firewall. Isso também pode ser interessante para proteger um servidor SSH.
Veja o artigo: Mantendo o acesso SSH seguro .
Minha abordagem ao endurecimento SSH é ... complexa. Os itens a seguir estão em termos de como eu faço isso, desde a borda mais extrema da (s) minha (s) rede (s) até os próprios servidores.
Filtragem no nível de borda do tráfego através do IDS / IPS com scanners de serviço e assinaturas conhecidas na lista de bloqueio. Consigo isso com o Snort através do meu firewall de borda (esta é a minha abordagem, um dispositivo pfSense). Às vezes, não posso fazer isso, como nos meus VPS.
Filtragem de firewall / rede da (s) porta (s) SSH. Eu permito explicitamente apenas que determinados sistemas cheguem aos meus servidores SSH. Isso é feito através de um firewall pfSense na borda da minha rede ou dos firewalls de cada servidor que estão sendo configurados explicitamente. Existem casos em que não posso fazer isso (o que quase nunca acontece, exceto em ambientes de laboratório de teste de caneta ou de segurança em que os firewalls não ajudam a testar as coisas).
Em conjunto com o meu pfSense, ou um firewall de borda, NAT - entrando na rede interna e separando da Internet e dos sistemas, acesso apenas a VPN aos servidores . Tenho que VPN em minhas redes para acessar os servidores, porque não há portas voltadas para a Internet. Definitivamente, isso não funciona para todos os meus VPSs, mas em conjunto com o # 2, posso ter um VPS como o 'gateway' por VPNing nesse servidor e depois permitir seus IPs para as outras caixas. Dessa forma, eu sei exatamente o que pode ou não fazer o SSH - minha única caixa que é a VPN. (Ou, na minha rede doméstica por trás do pfSense, minha conexão VPN, e eu sou o único com acesso VPN).
Onde o número 3 não é factível, fail2ban, configurado para bloquear após 4 tentativas com falha e bloquear os IPs por uma hora ou mais, é uma proteção decente contra pessoas que constantemente atacam com força bruta - apenas bloqueie-as no firewall automaticamente com fail2ban e meh. Configurar fail2ban é uma dor ...
Ofuscação da porta alterando a porta SSH. No entanto, essa também não é uma boa idéia sem medidas adicionais de segurança - o mantra de "Segurança através da obscuridade" já foi refutado e contestado em muitos casos. Fiz isso em conjunto com o IDS / IPS e a filtragem de rede, mas ainda é uma coisa MUITO ruim de se fazer por conta própria.
Autenticação de dois fatores OBRIGATÓRIA, através das soluções de autenticação de dois fatores da Duo Security . Cada um dos meus servidores SSH tem o Duo configurado, de modo que, para entrar, prompts 2FA acontecem e eu tenho que confirmar cada acesso. (Esse é o recurso útil final - porque, mesmo que alguém tenha minha senha ou quebre a senha, eles não conseguem passar pelos plugins Duo PAM). Essa é uma das maiores proteções em meus servidores SSH contra acesso não autorizado - cada login de usuário DEVE estar vinculado a um usuário configurado no Duo e, como eu tenho um conjunto restritivo, nenhum novo usuário pode ser registrado no sistema.
Meus dois centavos para garantir SSH. Ou, pelo menos, meus pensamentos sobre a abordagem.
Convém fazer check-out do aplicativo FreeOTP no RedHat em vez de usar o Google Authenticator. Às vezes, ao atualizar o aplicativo, eles bloqueiam você! ;-)
Se você quiser usar outros tokens de hardware, como um Yubikey ou um eToken PASS ou NG, ou se tiver muitos usuários ou muitos servidores, convém usar um back-end de autenticação de dois fatores de código aberto.
Ultimamente, escrevi um tutorial sobre isso .
Eu escrevi um pequeno tutorial sobre como fazer isso recentemente. Basicamente, você precisa usar a PKI e meu tutorial também mostra como usar a autenticação de dois fatores para obter ainda mais segurança. Mesmo se você não usar nenhuma dessas coisas, também há alguns boatos sobre a proteção do servidor, removendo pacotes de códigos fracos e outros princípios básicos. https://joscor.com/blog/hardening-openssh-server-ubuntu-14-04/
Para um grande número de usuários / certificados, considere a integração LDAP. As grandes organizações usam o LDAP como um repositório para credenciais e certificados de usuário armazenados em emblemas ou fobs, independentemente de os certificados serem usados para autenticação ou assinatura de emails. Os exemplos incluem openLDAP, openDJ, Active Directory, Oracle Universal Directory, IBM Directory Server, snareWorks ...
Computadores e grupos também podem ser gerenciados no LDAP, oferecendo gerenciamento central de credenciais. Dessa forma, os balcões de atendimento podem ter um balcão único para lidar com grandes populações.
Aqui está um link para a integração do centOS: http://itdavid.blogspot.com/2013/11/howto-configure-openssh-to-fetch-public.html
Você também pode bloquear com base no país de origem usando o banco de dados geoIP.
Basicamente, se você mora nos EUA, não há motivo para alguém na Rússia se conectar ao seu SSH, para que eles sejam bloqueados automaticamente.
O script pode ser encontrado aqui: https://www.axllent.org/docs/view/ssh-geoip/
Você também pode adicionar comandos do iptables (como fiz para minhas gotículas) para eliminar automaticamente todo o tráfego de / para esses IPs.