Introdução
SSH, ou Secure Shell, é um protocolo seguro e a maneira mais comum de administrar servidores remotos com segurança. Utilizando diversas tecnologias de criptografia, o SSH fornece um mecanismo para estabelecer uma conexão criptograficamente segura entre duas partes, autenticando cada lado para o outro e passando comandos e saída de volta e para frente.
Neste guia, examinaremos as técnicas de criptografia subjacentes que o SSH emprega e os métodos que utiliza para estabelecer conexões seguras. Essas informações podem ser úteis para entender as várias camadas de criptografia e as diferentes etapas necessárias para formar uma conexão e autenticar ambas as partes.
Compreensão da Criptografia Simétrica, Criptografia Assimétrica e Hashes
Para garantir a transmissão segura de informações, o SSH emprega diversos tipos de técnicas de manipulação de dados em vários pontos da transação. Estas incluem formas de criptografia simétrica, criptografia assimétrica e hashing.
Encriptação Simétrica
A relação dos componentes que criptografam e descriptografam dados determina se um esquema de criptografia é simétrico ou assimétrico.
A encriptação simétrica é um tipo de criptografia onde uma chave pode ser usada para criptografar mensagens para a parte oposta, e também para descriptografar as mensagens recebidas do outro participante. Isso significa que qualquer pessoa que possua a chave pode criptografar e descriptografar mensagens para qualquer outra pessoa que possua a chave.
Esse tipo de esquema de criptografia é frequentemente chamado de criptografia de “segredo compartilhado” ou “chave secreta”. Tipicamente, há apenas uma chave que é usada para todas as operações ou um par de chaves onde a relação é descobrível e é trivial derivar a chave oposta.
Chaves simétricas são usadas pelo SSH para criptografar toda a conexão. Contrariamente ao que alguns usuários assumem, pares de chaves assimétricas público/privadas que podem ser criados são apenas usados para autenticação, não para criptografar a conexão. A encriptação simétrica permite que até mesmo a autenticação por senha seja protegida contra espionagem.
O cliente e o servidor contribuem para estabelecer esta chave, e o segredo resultante nunca é conhecido por partes externas. A chave secreta é criada através de um processo conhecido como um algoritmo de troca de chave. Esta troca resulta no servidor e no cliente chegando independentemente à mesma chave compartilhada, compartilhando certas partes de dados públicos e manipulando-os com certos dados secretos. Este processo é explicado com mais detalhes mais adiante.
A chave de criptografia simétrica criada por este procedimento é baseada na sessão e constitui a criptografia real para os dados enviados entre o servidor e o cliente. Uma vez estabelecido isso, o restante dos dados deve ser criptografado com este segredo compartilhado. Isso é feito antes de autenticar um cliente.
O SSH pode ser configurado para usar uma variedade de sistemas de cifra simétrica diferentes, incluindo o Padrão de Criptografia Avançada (AES), Blowfish, 3DES, CAST128 e Arcfour. O servidor e o cliente podem decidir uma lista de suas cifras suportadas, ordenadas por preferência. A primeira opção da lista do cliente que está disponível no servidor é usada como algoritmo de cifra em ambas as direções.
No Ubuntu 20.04, tanto o cliente quanto o servidor têm a seguinte configuração padrão:
[email protected]
aes128-ctr
aes192-ctr
aes256-ctr
[email protected]
[email protected]
Isso significa que se duas máquinas Ubuntu 20.04 estiverem se conectando uma à outra (sem substituir as cifras padrão por meio de opções de configuração), elas sempre usarão por padrão a cifra [email protected]
para criptografar sua conexão.
**Criptografia Assimétrica**
A criptografia assimétrica é diferente da criptografia simétrica porque, para enviar dados em uma única direção, são necessárias duas chaves associadas. Uma dessas chaves é conhecida como chave privada, enquanto a outra é chamada de chave pública.
A chave pública pode ser compartilhada livremente com qualquer parte. Ela está associada à sua chave emparelhada, mas a chave privada não pode ser derivada da chave pública. A relação matemática entre a chave pública e a chave privada permite que a chave pública criptografe mensagens que só podem ser descriptografadas pela chave privada. Isso é uma habilidade unidirecional, o que significa que a chave pública não tem capacidade de descriptografar as mensagens que escreve, nem pode descriptografar qualquer coisa que a chave privada possa enviar a ela.
A chave privada deve ser mantida totalmente em segredo e nunca deve ser compartilhada com outra parte. Este é um requisito fundamental para que o paradigma de chave pública funcione. A chave privada é o único componente capaz de descriptografar mensagens que foram criptografadas usando a chave pública associada. Em virtude desse fato, qualquer entidade capaz de descriptografar essas mensagens demonstrou que está no controle da chave privada.
SSH usa criptografia assimétrica em algumas áreas diferentes. Durante o processo inicial de troca de chaves usado para configurar a criptografia simétrica (usada para criptografar a sessão), é usada criptografia assimétrica. Nesta etapa, ambas as partes produzem pares de chaves temporárias e trocam a chave pública para produzir o segredo compartilhado que será usado para a criptografia simétrica.
O uso mais discutido da criptografia assimétrica com SSH vem da autenticação baseada em chaves SSH. Pares de chaves SSH podem ser usados para autenticar um cliente a um servidor. O cliente cria um par de chaves e então carrega a chave pública para qualquer servidor remoto que deseje acessar. Isso é colocado em um arquivo chamado authorized_keys
dentro do diretório ~/.ssh
no diretório pessoal da conta de usuário no servidor remoto.
Depois que a criptografia simétrica é estabelecida para garantir comunicações entre o servidor e o cliente, o cliente deve se autenticar para ser permitido o acesso. O servidor pode usar a chave pública neste arquivo para criptografar uma mensagem de desafio para o cliente. Se o cliente puder provar que foi capaz de descriptografar esta mensagem, ele demonstrou que possui a chave privada associada. Então o servidor pode configurar o ambiente para o cliente.
Hashing
Outra forma de manipulação de dados que o SSH aproveita é o hash criptográfico. Funções de hash criptográfico são métodos de criar uma “assinatura” sucinta ou resumo de um conjunto de informações. Suas principais características distintivas são que nunca são destinadas a serem reversíveis, são virtualmente impossíveis de influenciar de forma previsível e são praticamente únicas.
O uso da mesma função de hash e mensagem deve produzir o mesmo hash; modificar qualquer parte dos dados deve produzir um hash completamente diferente. Um usuário não deve poder produzir a mensagem original a partir de um hash dado, mas deve ser capaz de dizer se uma determinada mensagem produziu um determinado hash.
Dadas essas propriedades, os hashes são principalmente usados para fins de integridade de dados e para verificar a autenticidade da comunicação. O principal uso no SSH é com HMAC, ou códigos de autenticação de mensagem baseados em hash. Eles são usados para garantir que o texto da mensagem recebida esteja íntegro e não tenha sido modificado.
Como parte da negociação de criptografia simétrica descrita anteriormente, um algoritmo de código de autenticação de mensagem (MAC) é selecionado. O algoritmo é escolhido trabalhando através da lista de escolhas de MAC aceitáveis do cliente. O primeiro nesta lista que o servidor suporta será usado.
Cada mensagem enviada após a negociação da criptografia deve conter um MAC para que a outra parte possa verificar a integridade do pacote. O MAC é calculado a partir do segredo compartilhado simétrico, do número de sequência do pacote da mensagem e do conteúdo real da mensagem.
O próprio MAC é enviado fora da área criptografada simetricamente como a parte final do pacote. Pesquisadores geralmente recomendam este método de criptografar os dados primeiro e então calcular o MAC.
Entendendo Como o SSH Funciona
Você provavelmente já tem um entendimento básico de como o SSH funciona. O protocolo SSH emprega um modelo cliente-servidor para autenticar duas partes e criptografar os dados entre elas.
O componente servidor ouve em uma porta designada para conexões. Ele é responsável por negociar a conexão segura, autenticar a parte conectada e iniciar o ambiente correto se as credenciais forem aceitas.
O cliente é responsável por iniciar o aperto de mão inicial do protocolo de controle de transmissão (TCP) com o servidor, negociar a conexão segura, verificar se a identidade do servidor corresponde às informações previamente registradas e fornecer credenciais para autenticação.
Uma sessão SSH é estabelecida em duas etapas separadas. A primeira é concordar e estabelecer a criptografia para proteger comunicações futuras. A segunda etapa é autenticar o usuário e descobrir se o acesso ao servidor deve ser concedido.
Negociando Criptografia para a Sessão
Quando uma conexão TCP é feita por um cliente, o servidor responde com as versões de protocolo que ele suporta. Se o cliente puder corresponder a uma das versões de protocolo aceitáveis, a conexão continua. O servidor também fornece sua chave de host pública, que o cliente pode usar para verificar se este era o host pretendido.
Neste ponto, ambas as partes negociam uma chave de sessão usando uma versão de algo chamado algoritmo de Diffie-Hellman. Esse algoritmo (e suas variantes) tornam possível para cada parte combinar seus próprios dados privados com dados públicos do outro sistema para chegar a uma chave de sessão secreta idêntica.
A chave de sessão será usada para criptografar toda a sessão. Os pares de chaves pública e privada usados para esta parte do procedimento são completamente separados das chaves SSH usadas para autenticar um cliente no servidor.
A base deste procedimento para o clássico Diffie-Hellman são:
- Ambas as partes concordam com um número primo grande, que servirá como um valor de semente.
- Ambas as partes concordam com um gerador de criptografia (tipicamente AES), que será usado para manipular os valores de uma maneira predefinida.
- Independente, cada parte chega a outro número primo que é mantido em segredo da outra parte. Este número é usado como a chave privada para esta interação (diferente da chave SSH privada usada para autenticação).
- A chave privada gerada, o gerador de criptografia e o número primo compartilhado são usados para gerar uma chave pública que é derivada da chave privada, mas que pode ser compartilhada com a outra parte.
- Ambos os participantes então trocam suas chaves públicas geradas.
- A entidade receptora usa sua própria chave privada, a chave pública da outra parte e o número primo compartilhado original para calcular uma chave secreta compartilhada. Embora isso seja calculado independentemente por cada parte, usando chaves privadas e públicas opostas, resultará na mesma chave secreta compartilhada.
- O segredo compartilhado é então usado para criptografar toda a comunicação que segue.
Esse processo permite que cada parte participe igualmente na geração do segredo compartilhado, o que não permite que uma extremidade controle o segredo. Também realiza a tarefa de gerar um segredo compartilhado idêntico sem nunca precisar enviar essa informação por canais inseguros. A criptografia do segredo compartilhado que é usada para o restante da conexão é chamada de protocolo de pacote binário.
O segredo gerado é uma chave simétrica, o que significa que a mesma chave usada para criptografar uma mensagem pode ser usada para descriptografá-la no outro lado. O objetivo disso é envolver toda a comunicação posterior em um túnel criptografado que não pode ser decifrado por pessoas externas.
Depois que a criptografia da sessão é estabelecida, a etapa de autenticação do usuário começa.
A autenticação do acesso do usuário ao servidor
O próximo passo envolve autenticar o usuário e decidir sobre o acesso. Existem alguns métodos que podem ser usados para autenticação, com base no que o servidor aceita.
O método geral é a autenticação por senha, que ocorre quando o servidor solicita ao cliente a senha da conta com a qual estão tentando fazer login. A senha é enviada por meio de uma criptografia negociada, portanto, está protegida contra partes externas.
Embora a senha seja criptografada, este método geralmente não é recomendado devido às limitações na complexidade da senha. Scripts automatizados podem quebrar senhas de comprimentos normais muito facilmente em comparação com outros métodos de autenticação.
A alternativa mais popular e recomendada é o uso de pares de chaves SSH. Pares de chaves SSH são chaves assimétricas, o que significa que as duas chaves associadas têm funções diferentes.
A chave pública é usada para criptografar dados que só podem ser descriptografados com a chave privada. A chave pública pode ser compartilhada livremente, porque, embora possa criptografar para a chave privada, não há método para derivar a chave privada da chave pública.
A autenticação usando pares de chaves SSH começa após a criptografia simétrica ter sido estabelecida, conforme descrito na seção anterior. O procedimento acontece da seguinte forma:
- O cliente começa enviando um ID para o par de chaves com o qual ele gostaria de autenticar com o servidor.
- O servidor verifica o arquivo
authorized_keys
da conta na qual o cliente está tentando fazer login para o ID da chave. - Se uma chave pública com um ID correspondente for encontrada no arquivo, o servidor gera um número aleatório e usa a chave pública para criptografar o número.
- O servidor envia ao cliente esta mensagem criptografada.
- Se o cliente realmente tiver a chave privada associada, ele será capaz de descriptografar a mensagem usando essa chave, revelando o número original.
- O cliente combina o número descriptografado com a chave de sessão compartilhada que está sendo usada para criptografar a comunicação, e calcula o hash MD5 deste valor. MD5 é um algoritmo de resumo de mensagem que usa a função de hash para gerar um valor de hash de 128 bits.
- O cliente então envia este hash MD5 de volta para o servidor como resposta à mensagem de número criptografada.
- O servidor usa a mesma chave de sessão compartilhada e o número original que ele enviou para o cliente para calcular o valor MD5 por conta própria. Ele compara seu próprio cálculo com o que o cliente enviou de volta. Se esses dois valores coincidirem, isso prova que o cliente estava de posse da chave privada e o cliente está autenticado.
Em suma, a assimetria das chaves permite que o servidor cifre mensagens para o cliente usando a chave pública. O cliente então pode comprovar que possui a chave privada ao decifrar a mensagem corretamente. Os dois tipos de cifragem usados (segredo compartilhado simétrico e chaves públicas/privadas assimétricas) são capazes de aproveitar suas forças específicas neste modelo.
Conclusão
Aprender sobre as etapas de negociação de conexão e as camadas de cifragem em funcionamento no SSH pode ajudá-lo a entender melhor o que está acontecendo quando você faz login em um servidor remoto. Agora você pode reconhecer a relação entre vários componentes e algoritmos e entender como todas essas peças se encaixam. Para saber mais sobre o SSH, confira os seguintes guias:
- Como Configurar Autenticação Baseada em Chave SSH em um Servidor Linux
- Como Usar SSH para Conectar-se a um Servidor Remoto
- Como Configurar Chaves SSH para vários sistemas operacionais
- Princípios Básicos do SSH: Trabalhando com Servidores, Clientes e Chaves SSH