Matheus Almeida

Matheus Almeida

Blog pessoal sobre Tecnologia da Informação

14 Jan 2021

Protocolo SSH

Definição

SSH significa Secure Shell, é um protocolo de rede criptografado utilizado para criar conexões seguras entre sistemas.

Seu principal uso é para fazer conexões remotas, embora seja possível fazer tunelamentos e redirecionamentos de portas TCP.

Roda na porta TCP de número 22 por padrão.

Como funciona

  • Cliente abre uma conexão para o Servidor.
  • Servidor responde com o protocolo e sua Public Host Key.
  • Cliente confirma que esse é o servidor correto.
  • Geração da Public Key.
    • Gerar um Large Prime Number.
    • Acordar o método de encriptação (exemplo: AES).
    • Gerar uma Private Key.
    • Combinar Private Key + método de encriptação + Large Prime.
    • Number para gerar a Public Key.
    • Realizada a troca de Public Keys (a chave publica do servidor pro cliente e chave publica do cliente pro servidor).
  • Geração da Secret Session Key.
    • Combinar Private Key local + Public Key recebida + Large Prime Number para gerar a Secret Session Key
    • Ela será igual para ambos (tanto o cliente e servidor tera essa chave localmente).
  • Essa Secret Session Key (simétrica) é usada para encriptar e decriptar a conexão.

Todas essas etapas descritas acima é para estabelecer a conexão, antes de enviar qualquer dado, por isso o SSH é seguro, não é atoa que seu nome é secure shell.

Uma maneira de ver todas as etapas detalhadas de uma conexão SSH é passando o -vvv como argumento, exemplo: ssh usuario@192.168.0.10 -vvv.

Observação: Neste artigo estou levando em consideracão que o usuário do servidor se chama usuario e que o IP é 192.168.0.10.

Configurar o SSH na prática

Para isso irei utilizar o OpenSSH.

Servidor

1 - Instalar

apt install openssh-server
#ou
yum install openssh-server -y

2 - Iniciar o serviço

systemctl start sshd

(Por padrão abre a porta 22 )

Testar funcionamento

No cliente basta usar o netcat no IP desse servidor.

nc -v 192.168.0.10 22

(Se tiver um resultado como SSH - 2.0-OpenSSH_7.4 significa que o serviço está ativo).

No servidor basta usar o comando ss (antigo netstat) para confirma se está escutando na porta 22 com o TCP.

ss -ln | grep 22

(Se não aparecer nada na tela é porque o serviço não está ativo).

Se o serviço não estiver ativo provavelmente é porque o firewall está bloqueando, nesse caso tem que criar uma exceção para a porta do SSH no firewall, outra opção é checar os possíveis erros no /var/log.

Cliente

1 - Instalar

apt-get install openssh-client
#ou
yum install openssh-client 

2 - Conectar no SSH

ssh usuario@10.10.10.10

Autenticação com chaves assimétricas

Conexão SSH

O cliente tem 2 chaves, uma pública e outra privada, a chave pública pode ser compartilhada com os outros, diferente da chave privada, que deve ficar no próprio dispositivo, de maneira confidencial.

Para o cliente poder conectar via SSH no servidor, a chave pública do cliente (id_rsa.pub) deve estar no arquivo authorized_keys do servidor, esse arquivo guarda as chaves dos clientes autorizados para a conexão SSH.

A chave pública e privada são complementares, isso porque quando o cliente for abrir uma conexão, ele envia sua chave privada e o servidor confere se essa chave privada complementa a chave pública autorizada, caso for, acontece a autenticação da conexão.

Servidor

Local das chaves: /etc/ssh `.

(ssh_host_rsa_key e ssh_host_rsa_key.pub)

Arquivo de configuração: /etc/ssh/sshd_config

Modificar no arquivo de configuração:

PubkeyAuthentication yes

O PubkeyAuthentication habilita a autenticação de chaves, já o AuthorizedKeysFile é o lugar onde vai ficar armazenada as chaves autorizadas, por padrão é em ~/.ssh/authorized_keys.

Configuração SSH

Sempre que modificar esse arquivo de configuração tem que reiniciar o serviço SSH.

systemctl restart sshd

Cliente

Local das chaves: ~/.ssh

(id_rsa e id_rsa.pub)

Local de configuração do ssh: /etc/ssh/ssh_config

Sempre que configurar tem que reiniciar o serviço com o comando systemctl restart ssh

Gerar chave no cliente com ssh-keygen.

ssh-keygen -b 2048 -t rsa -v

Essa chave deve estar no authorized_keys do servidor, portanto basta utilizar o comando:

ssh-copy-id usuario@192.168.0.10

Ou simplesmente copiar a chave pública do cliente ~/.ssh/id_rsa.pub e colocar no arquivo authorized_keys do servidor ~/.ssh/authorized_keys.

Após isso basta conectar normalmente.

ssh usuario@192.168.0.10 -p 22

Observação: -p é a porta; se o local padrão da chave privada for alterado deve passar o caminho dela “path” pelo argumento -i

Vale ressaltar que por se tratar de uma chave privada, no ponto de vista de segurança é interessante ter o menor acesso possível, com acesso de leitura somente pelo dono, isso pode ser feito a partir do comando chmod 400 ~/.aws/id_rsa.

Medidas de segurança

Cliente

As chaves ficam no arquivo ~/.ssh e isso não é muito seguro porque alguém pode chegar e copiar esse arquivo, a ideia é salvar a chave privada em local seguro, para isso podemos usar o ssh-agent.

O ssh-add manda as chaves para o ssh agent, que é um serviço que guarda as chaves criptografadas.

Para fazer isso basta utilizar o comando ssh-add e para listar a chave por impressão digital basta utilizar o comando ssh-add l , se quiser listar a chave de maneira completa basta utilizar o comando ssh-add L , feito isso já pode deletar a chave privada com o comando rm id_rsa

Para fica ainda mais seguro, utilizar um pen drive com a chave privada para fazer a conexão SSH é uma opção, assim utilizaria o seguinte comando:

ssh -i /mnt/id_rsa usuario@192.168.0.10

-i é para especificar o caminho da chave privada.

Servidor

Além do método de autenticação por chaves assimétricas podemos configurar mais coisas no arquivo de configuração do SSH (sshd_config). Essa técnica é chamada de Hardening.

Desabilitar o acesso por senha:

PasswordAuthentication no

(Isso se a autenticação por chave tiver ativada)

Não permitir acesso como root:

PermitRootLogin no

Mudar a porta TCP do SSH:

Port 30022

Desabilitar a opção de acesso com senha vazia:

PermitEmptyPasswords no

Bloquear conexão de usuários ou grupos específicos:

DenyUsers nome_do_usuario12

DenyGroups nome_do_grupo12

(Embora a opção de cima seja uma boa medida de segurança, a opção de baixo é melhor porque nega todo o resto).

Permitir alguns usuários ou grupos específicos:

AllowsUsers nome_do_usuario Domain\Users

AllowGroups nome_do_grupo

Utilizar a versão mais segura do protocolo:

Protocol 2

Definir um tempo limite de inatividade, ao passar desse tempo o usuário será automaticamente desconectado (terminal ocioso a partir do último comando):

ClientAliveInterval 360

ClientAliveCountMax 0

(Da pra fazer a mesma coisa utilizando o comando export TMOUT=360 no terminal).

Limitar o número de tentativas de conexão:

MaxAuthTries 6

Limitar a quantidade de pessoas que podem estar logadas simultaneamente utilizando shell via SSH:

MaxSessions 10

Limitar o número de conexões não autenticadas por um determinado IP:

MaxStartups 5:60:10

(Quando tiver 5 conexões não autenticadas, a partir daí irá rejeitar 60% das conexões do IP do cliente, quando chegar a 10 conexões não autenticadas desse mesmo endereço IP irá rejeitar todas, evitar bruteforce)

Autenticar com as contas do linux com todas restrições do PAM:

UsePAM yes

Mostrar quando ocorreu a última conexão do usuário:

PrintLasLog yes

Tempo do início da autenticação e final da autenticação:

LoginGraceTime 60

Verificar se o usuário tem as devidas permissões:

StrictModes yes

banner de aviso quando for conectar:

Banner /etc/issue.net

(Deve digitar o banner no arquivo /etc/issue.net)

banner depois de conectado:

PrintMotd yes

(Deve digitar o banner no arquivo /etc/motd)

Para aplicar as modificações do arquivo de configuração devemos utilizar os seguintes comandos:

/etc/init.d/ssh restart
#ou
systemctl restart sshd.service
#ou
service ssh restart

Outras dicas de segurança:

Utilizar a versão do SSH mais atualizada possível, porque versões anteriores podem ter vulnerabilidades.

Não colocar nomes de usuários comuns, porque a chance dos nomes comuns estarem em dicionários (wordlist) de atacantes é alta.

Para garantir ainda mais a segurança deve utilizar programas externos, como um firewall e o fail2ban.

Categoria