O que é um SSH
SSH (Secure Shell) é um protocolo de rede que estabelece uma conexão segura e criptografada entre computadores, dessa forma, conseguimos acesso remoto a servidores para gerenciamento e execução de comandos. O protocolo garante autenticação, criptografia e integridade dos dados.
Para se conectar, utilizamos um cliente SSH, que pode exigir autenticação por senha, ou outra opção mais segura, por um conjunto de chaves criptográficas publicas e privadas. Um dos clientes mais conhecidos e é reconhecido como padrão da indústria, é o OpenSSH, é um conjunto de ferramentas de rede de código aberto que fornece criptografia para comunicação de rede através do protocolo SSH.
Autenticação por Chaves Públicas e Privadas
A autenticação mais segura e comum da conexão SSH é feita por um conceito de criptografia assimétrica. Nesse modelo, são geradas duas chaves
- Chave Privada: Esta é a chave secreta e pessoal. Ela nunca deve ser compartilhada, armazenada em local seguro e é possível protegê-la por meio de uma senha.
- Chave Pública: Esta chave pode ser distribuída livremente. Ela é instalada nos servidores aos quais você deseja ter acesso. Uma analogia legal de se pensar, é que ela é uma fechadura que só a sua chave privada pode abrir.
O segredo desse tipo de autenticação é justamente sua criptografia assimétrica ou unidirecional, ou seja, a chave pública consegue criptografar dados que apenas a chave privada correspondente pode descriptografar. É impossível descobrir a chave privada a partir da chave pública.
O processo de Autenticação "Challenge-Response"
Quando você tenta se conectar a um servidor usando uma chave privada, não é simplesmente enviada a chave para o servidor e ele valida a autenticidade. Por trás dos bastidores existe um processo que explico a seguir:
- Seu computador inicia uma conexão com o servidor remoto. Ele envia informa qual a chave pública que deseja usar para autenticação.
- O servidor procura a chave pública informada no seu arquivo de chaves autorizadas (geralmente em ~/.ssh/authorized_keys). Se a chave for encontrada, o servidor gera uma passkey aleatória e única, chamada de challenge (desafio).
- Com a passkey gerada, o servidor utiliza a chave pública para criptografar essa passkey e envia de volta para seu cliente SSH.
- Agora, o cliente SSH recebe a passkey criptografada, e descriptografa utilizando a chave privada. O cliente então realiza uma operação matemática (geralmente criando um HASH MD5) com a passkey, e envia de volta para o servidor o HASH.
- O servidor que conhece a passkey (que ele mesmo gerou) faz a mesma operação matemática com ela. Se o resultado calculado for idêntico ao HASH enviado pelo cliente, o servidor tem certeza que o cliente possui a chave correspondente a chave pública. A autenticação é bem sucedida, e a conexão segura é estabelecida, concedendo a você o acesso.
Toda essa comunicação é feita em segundos ou até mesmo milissegundos, em nenhum momento a chave privada trafega pela rede. Apenas é provado ao servidor que a sua conexão é genuína por meio de um desafio de criptografia.
As vantagens desse método de autenticação é que ele não é propenso a ataques de força bruta, afinal, uma chave privada pode conter 2048bits, colocando em perspectiva, o número de chaves possíveis é de 2 elevado a potência 2048. Esse número é tão astronomicamente grande que supera o número de átomos no universo. Outra vantagem é de que caso algum dos seus servidores seja comprometido, o invasor não tem acesso a sua chave privada, apenas a sua chave publica, e com ela não é possível fazer nada.
Minha motivação para esse tópico foi o esse vídeo.