Blog do Julio

Hacks, tutoriais e dicas

Segurança SSH

| Comments

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