Segurança SSH

July 30, 2011   

Use senhas fortes

Senhas fortes consistem em uma string que nenhum hacker conseguiria adivinhar nem por palpite nem por um bruteforce de poucas horas.

Procure escolher senhas com:

  • No mínimo 15 caracteres.
  • Combinação de letras (maiúsculas e minúsculas), números e caracteres não alfanuméricos.

Existem programas como o pwgen, o makepasswd, o apg, o KeePassX e comandos do Unix que geram senhas aleatórias seguras: julio@acer ~> echo tr -dc _A-Z-a-z-0-9 < /dev/urandom | head -c25

As senhas geradas por esses programas são, de fato, seguras. Porém são muito difíceis de lembrar, o que faz com que você tenha que anotar em algum lugar. Portanto eu recomendo fortemente que você crie uma frase (passphrase) longa que você (e apenas você) consiga memorizar.

Desabilite o login do root por SSH

Edite a seguinte linha no arquivo /etc/ssh/sshd_config: PermitRootLogin no

Reinicie o daemon: julio@acer ~> sudo /etc/rc.d/sshd restart ou, caso use systemd: julio@acer ~> sudo systemctl restart sshd

Quando precisar de acesso como root, utilize o comando su.

Limite quem pode efetuar login por ssh

É útil quando apenas alguns usuários precisam acessar o sistema por ssh. Adicione a seguinte linha em /etc/ssh/sshd_config: AllowUsers usuario1 usuario2 usuario3

Desative o “Protocol 1”

SSH possui dois protocolos. Como o Protocol 1 é antigo e inseguro, descomente a linha Protocol 2

Altere a porta

Por padrão, a porta usada para ssh é a 22. Mude para algum número aleatório, preferivelmente acima de 1024. Exemplo: Port 2345

Perceba que agora teremos sempre que avisar a qual porta conectar: jbsilva@ssh ~> ssh -p 2345 julio@casa.juliobs.com

Aqui eu também tive que abrir a porta (só TCP) pelo meu roteador.

Use um firewall

Podemos configurar o iptables para permitir que apenas alguns IPs específicos conectem à porta utilizada para SSH: julio@acer ~> iptables -A INPUT -p tcp -s 201.43.81.111 –dport 22 -j ACCEPT

Aqui não posso utilizar a opção acima, pois frequentemente preciso conectar de IPs diferentes. Portanto uma solução mais interessante é limitar a quantidade de tentativas vindas do mesmo IP.

Registra IP que tentou acessar a porta 22 e rejeita pacotes caso o mesmo IP tenha tentado conectar 4 vezes ou mais no último minuto: julio@acer ~> iptables -A INPUT -p tcp –dport 22 -m recent –set –name ssh –rsource julio@acer ~> iptables -A INPUT -p tcp –dport 22 -m recent ! –rcheck –seconds 60 –hitcount 4 –name ssh –rsource -j ACCEPT

Cancela a conexão se o mesmo IP tentar conectar mais de 3 vezes na porta 22 no mesmo minuto: julio@acer ~> iptables -A INPUT -p tcp –dport 22 –syn -m limit –limit 1/m –limit-burst 3 -j ACCEPT julio@acer ~> iptables -A INPUT -p tcp –dport 22 –syn -j DROP

Use chaves públicas/privadas para autenticação

  1. Crie uma chave: julio@acer ~/.ssh> ssh-keygen -t rsa -b 4096 -f servidorx -C “pubkey para servidor X”
    Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in servidorx. Your public key has been saved in servidorx.pub. The key fingerprint is: e1:5c:44:b2:f4:48:c7:22:62:16:99:fb:44:11:23:a7 pubkey para servidor X The key’s randomart image is: +–[ RSA 4096]—-+ | o+=o+o+ | | *+o+.B. | | oE+ .+.o | | . .o o | | o S | | . | | | | | | | +—————–+

    O algoritmo padrão do ssh-keygen é RSA de 2048 bits, nesse exemplo eu usei RSA de 4096 bits. Pode até ser um exagero, mas nunca se sabe. Sou paranoico mesmo.

  2. Copie a chave para o servidor remoto. julio@acer ~/.ssh> ssh-copy-id -i servidorx.pub ‘-p 2345 julio@servidorx.com’

    Esse comando é equivalente a concatenar o arquivo ~/.ssh/authorized_keys do servidor remoto com a chave pública servidorx.pub.

  3. Certifique que as permissões estão corretas: julio@acer ~> chmod 700 ~/.ssh julio@acer ~> chmod 600 ~/.ssh/servidorx

  4. Crie o arquivo ~/.ssh/config, que contem algumas configurações per-host, atalhos e aliases úteis: Host github.com HostName github.com IdentityFile ~/.ssh/github User jbsilva

    Host juliobs.com
        HostName        juliobs.com
        IdentityFile    ~/.ssh/juliobs
        User            julio
    
    Host servidorx
        HostName        ssh.servidorx.com
        IdentityFile    ~/.ssh/servidorx
        User            usuariox
        Port            2345
    

    Esse arquivo facilita um pouco nossa vida, pois agora não precisamos mais lembrar o nome o usuário, o endereço completo do servidor nem a porta.

    Em vez de conectarmos ao servidorX usando: julio@acer ~> ssh -i servidorx -p 2345 usuariox@ssh.servidorx.com

    Podemos simplesmente: julio@acer ~> ssh servidorx


Links:



comments powered by Disqus