Compreendendo o Processo de Criptografia e Conexão SSH

Introdução

SSH, ou Secure Shell, é um protocolo seguro e a forma mais comum de administrar servidores remotos com segurança. Usando várias 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, estaremos examinando as técnicas de criptografia subjacentes que o SSH emprega e os métodos que ele usa 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 na transação. Estas incluem formas de criptografia simétrica, criptografia assimétrica e hashing.

Encriptação Simétrica

A relação dos componentes que encriptam e desencriptam dados determina se um esquema de encriptação é simétrico ou assimétrico.

Encriptação simétrica é um tipo de encriptação onde uma chave pode ser usada para encriptar mensagens para a parte oposta e também para desencriptar as mensagens recebidas do outro participante. Isso significa que qualquer pessoa que possua a chave pode encriptar e desencriptar mensagens para qualquer outra pessoa que possua a chave.

Este tipo de esquema de encriptação é frequentemente chamado de encriptação de “segredo compartilhado” ou “chave secreta”. Normalmente, existe apenas uma única 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 encriptar toda a conexão. Ao contrário do que alguns usuários presumem, pares de chaves assimétricas público/privadas que podem ser criadas são apenas usadas para autenticação, não para encriptar a conexão. A encriptação simétrica permite que até a autenticação por senha seja protegida contra espionagem.

Tanto o cliente quanto o servidor contribuem para estabelecer essa chave, e o segredo resultante nunca é conhecido por partes externas. A chave secreta é criada por meio de um processo conhecido como algoritmo de troca de chaves. Essa troca resulta no servidor e no cliente chegando independentemente à mesma chave, compartilhando certas peças de dados públicos e manipulando-as com certos dados secretos. Este processo é explicado em maior detalhe mais adiante.

A chave de criptografia simétrica criada por esse procedimento é baseada em sessão e constitui a criptografia real para os dados enviados entre servidor e cliente. Uma vez estabelecida, o resto dos dados deve ser criptografado com esse segredo compartilhado. Isso é feito antes de autenticar um cliente.

O SSH pode ser configurado para usar uma variedade de diferentes sistemas de cifra simétricos, incluindo Padrão de Criptografia Avançado (AES), Blowfish, 3DES, CAST128 e Arcfour. O servidor e o cliente podem ambos decidir sobre 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 o algoritmo de cifra em ambas as direções.

No Ubuntu 20.04, tanto o cliente quanto o servidor são configurados por padrão como segue:

Isso significa que se duas máquinas Ubuntu 20.04 estiverem se conectando uma com a outra (sem substituir os cifradores padrão por meio de opções de configuração), elas sempre usarão por padrão o cifrador [email protected] para criptografar sua conexão.

Encriptação Assimétrica

A encriptação assimétrica é diferente da encriptação 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 encripte mensagens que só podem ser desencriptadas pela chave privada. Isso é uma habilidade de via única, significando que a chave pública não tem capacidade de desencriptar as mensagens que ela escreve, nem pode desencriptar qualquer coisa que a chave privada possa enviar para ela.

A chave privada deve ser mantida totalmente secreta e nunca deve ser compartilhada com outra parte. Isso é um requisito fundamental para que o paradigma de chave pública funcione. A chave privada é o único componente capaz de desencriptar mensagens que foram encriptadas usando a chave pública associada. Por virtude deste fato, qualquer entidade capaz de desencriptar essas mensagens demonstrou que está no controle da chave privada.

O SSH usa criptografia assimétrica em alguns lugares diferentes. Durante o processo inicial de troca de chaves usado para configurar a criptografia simétrica (usada para criptografar a sessão), a criptografia assimétrica é usada. Nesta fase, ambas as partes produzem pares de chaves temporárias e trocam a chave pública para produzir o segredo compartilhado que será usado para criptografia simétrica.

O uso mais discutido da criptografia assimétrica com SSH vem da autenticação baseada em chave SSH. Pares de chaves SSH podem ser usados para autenticar um cliente para um servidor. O cliente cria um par de chaves e então carrega a chave pública para qualquer servidor remoto que deseja acessar. Isso é colocado em um arquivo chamado authorized_keys dentro do diretório ~/.ssh no diretório inicial 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 autorizado a acessar. 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 conseguiu descriptografar essa 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 hashing 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. Seus principais atributos distintivos são que nunca são destinados a serem reversíveis, são virtualmente impossíveis de serem influenciados de forma previsível e são praticamente únicos.

O uso da mesma função de hashing 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 eles devem ser capazes de dizer se uma determinada mensagem produziu um hash dado.

Dadas essas propriedades, os hashes são usados principalmente 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 intacto e não 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 de forma simétrica como parte final do pacote. Pesquisadores geralmente recomendam este método de primeiro criptografar os dados e depois calcular o MAC.

Entendendo Como o SSH Funciona

Você provavelmente já tem uma compreensão básica 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 do servidor fica ouvindo 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 handshake 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 autenticar.

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 pública de host, 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 secreta de sessão 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 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 cria 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 cumpre a tarefa de gerar um segredo compartilhado idêntico sem nunca precisar enviar essa informação por canais inseguros. A criptografia do segredo compartilhado usada para o resto da conexão é chamada de protocolo de pacotes binários.

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 do outro lado. O objetivo disso é envolver toda a comunicação posterior em um túnel criptografado que não pode ser decifrado por terceiros.

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 é quando o servidor solicita ao cliente a senha da conta com a qual estão tentando fazer login. A senha é enviada através da criptografia negociada, então é segura contra partes externas.

Mesmo que 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 desempenham 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 a partir da chave pública.

A autenticação usando pares de chaves SSH começa depois que a criptografia simétrica foi 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 deseja autenticar-se para o servidor.
  • O servidor verifica o arquivo authorized_keys da conta na qual o cliente está tentando fazer login em busca do 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 possuir a chave privada associada, ele poderá 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 desse valor. MD5 é um algoritmo de mensagem-digest 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 ao servidor como resposta à mensagem de número criptografado.
  • O servidor usa a mesma chave de sessão compartilhada e o número original que enviou ao 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 corresponderem, isso prova que o cliente estava na posse da chave privada e o cliente está autenticado.

Em resumo, a assimetria das chaves permite que o servidor criptografe mensagens para o cliente usando a chave pública. O cliente então pode provar que possui a chave privada ao descriptografar a mensagem corretamente. Os dois tipos de criptografia usados (segredo compartilhado simétrico e chaves pública/privada assimétricas) conseguem aproveitar suas forças específicas nesse modelo.

Conclusão

Entender os passos da negociação de conexão e as camadas de criptografia em funcionamento no SSH pode ajudá-lo a compreender melhor o que está acontecendo ao fazer 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 aprender mais sobre o SSH, confira os seguintes guias:

Source:
https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process