Entendendo a Autenticação por Chave SSH: Chaves Pública e Privada Explicadas

Desvende os segredos da autenticação por chave SSH com este guia abrangente. Aprenda os papéis fundamentais das chaves pública e privada, como elas trabalham juntas para proteger suas conexões remotas e por que esse método supera amplamente os logins baseados em senha. Este artigo fornece instruções passo a passo para gerar e implantar chaves, juntamente com benefícios essenciais de segurança e melhores práticas. Melhore a segurança do seu servidor e simplifique o acesso com chaves SSH.

Entendendo a Autenticação por Chave SSH: Chaves Pública e Privada Explicadas

A autenticação por chave SSH é a forma padrão que muitos administradores, desenvolvedores, sistemas de CI e ferramentas de implantação usam para fazer login em servidores. Seu laptop mantém uma chave privada, o servidor armazena a chave pública correspondente, e o SSH prova que você possui a chave privada sem enviá-la pela rede.

Essa última parte é o ponto principal. Uma senha é um segredo que você digita em muitos lugares. Uma chave privada é um segredo que deve permanecer em sua máquina. Se você a proteger com uma frase secreta e armazenar apenas a chave pública nos servidores, obtém um método de login que é ao mesmo tempo mais seguro e mais fácil de automatizar do que senhas compartilhadas.

O Problema com Senhas

A autenticação tradicional baseada em senha depende de um segredo compartilhado: a senha. Embora senhas fortes possam fornecer um nível decente de segurança, elas são suscetíveis a várias fraquezas:

  • Ataques de força bruta: Atacantes podem tentar inúmeras combinações de senhas até acertar.
  • Ataques de dicionário: Usando palavras ou frases comuns, atacantes podem comprometer contas rapidamente.
  • Keyloggers: Software malicioso pode capturar digitações, revelando senhas.
  • Phishing: Táticas de engenharia social podem enganar usuários para que divulguem suas credenciais.
  • Erro humano: Usuários frequentemente escolhem senhas fracas, adivinháveis ou reutilizadas, e podem expô-las acidentalmente.

A autenticação por chave SSH reduz esses riscos porque o segredo privado não é digitado no servidor remoto. Isso não torna as chaves mágicas. Uma chave privada não criptografada roubada ainda pode ser abusada, e um arquivo authorized_keys mal gerenciado pode se tornar uma porta dos fundos silenciosa.

Autenticação por Chave SSH: Uma Visão Geral

A autenticação por chave SSH aproveita a criptografia assimétrica, um sistema que usa um par de chaves matematicamente ligadas: uma chave pública e uma chave privada. Diferente da criptografia simétrica, onde a mesma chave é usada tanto para criptografar quanto para descriptografar, a criptografia assimétrica usa uma chave para criptografar e uma chave diferente, mas relacionada, para descriptografar.

Quando você se conecta com chaves, o servidor verifica se sua conta confia na chave pública que está sendo oferecida. Seu cliente então assina dados de autenticação com a chave privada correspondente. O servidor verifica essa assinatura com a chave pública. A chave privada não é enviada para o servidor.

A Dupla Criptográfica: Chaves Pública e Privada

No centro da autenticação por chave SSH estão esses dois componentes distintos, mas interconectados.

A Chave Privada

A chave privada é sua identidade secreta. É uma longa e complexa sequência de caracteres que deve ser mantida em absoluto sigilo e nunca compartilhada com ninguém. Pense nela como a chave única para seu cofre digital.

  • Crítica para a Segurança: Se sua chave privada for comprometida, um atacante pode se passar por você e obter acesso não autorizado a qualquer servidor onde a chave pública correspondente foi implantada.
  • Localização: Normalmente armazenada em sua máquina local (ex.: ~/.ssh/id_rsa, ~/.ssh/id_ed25519).
  • Proteção: Pode ser protegida por uma frase secreta. Se alguém copiar o arquivo de chave, a frase secreta é a barreira extra entre "arquivo roubado" e "acesso ao servidor roubado".

A Chave Pública

A chave pública é a contraparte da sua chave privada. Ela é derivada da sua chave privada, mas não pode ser usada para recriar a chave privada. Como o nome sugere, a chave pública deve ser compartilhada e colocada em qualquer servidor ao qual você deseja acessar.

  • Compartilhável: Você pode distribuir com segurança sua chave pública para qualquer pessoa ou servidor sem comprometer sua segurança.
  • Localização: No servidor, as chaves públicas são normalmente armazenadas no arquivo ~/.ssh/authorized_keys para cada conta de usuário. Cada linha neste arquivo representa uma chave pública confiável.
  • Função: A chave pública permite que o servidor verifique uma assinatura feita pela chave privada correspondente.

Como Funciona a Autenticação por Chave SSH: O Handshake

Vamos detalhar o processo passo a passo de como a autenticação por chave SSH estabelece uma conexão segura:

  1. Geração do Par de Chaves: Primeiro, você gera um par de chaves pública e privada em sua máquina local. A chave privada permanece secreta, e a chave pública é o que você distribuirá.
  2. Implantação da Chave Pública: Você copia sua chave pública para o servidor remoto ao qual deseja acessar. Esta chave é normalmente adicionada ao arquivo ~/.ssh/authorized_keys no diretório home do seu usuário no servidor.
  3. Tentativa de Conexão: Quando você inicia uma conexão SSH de sua máquina local para o servidor remoto, seu cliente SSH indica que deseja autenticar usando uma chave.
  4. Verificação do Servidor: O servidor verifica se a chave pública oferecida é permitida para aquele usuário.
  5. Prova do Cliente: Seu cliente assina dados de autenticação com a chave privada. Se a chave privada tiver uma frase secreta, você pode ser solicitado a desbloqueá-la localmente.
  6. Verificação: O servidor verifica a assinatura usando a chave pública do authorized_keys. Se a assinatura for válida e a conta tiver permissão para fazer login, a autenticação é bem-sucedida.
  7. Autenticação Concedida: Se a verificação for bem-sucedida, o servidor concede acesso e uma sessão SSH segura é estabelecida.

Crucialmente, sua chave privada nunca sai de sua máquina local durante todo esse processo. Apenas provas criptográficas derivadas dela são trocadas.

Gerando um Par de Chaves SSH

Gerar um par de chaves SSH é um processo direto usando o comando ssh-keygen em sua máquina local (Linux, macOS ou WSL/Git Bash no Windows).

ssh-keygen -t ed25519 -C "[email protected]"
  • -t ed25519: Especifica o tipo de chave a ser criada. Ed25519 é um padrão moderno para a maioria das novas chaves OpenSSH. RSA ainda é comum, especialmente em sistemas mais antigos.
  • -C "[email protected]": Adiciona um comentário à chave pública, o que ajuda a identificar seu propósito ou proprietário.

Você será solicitado a fornecer um arquivo para salvar a chave (padrão é ~/.ssh/id_ed25519) e uma frase secreta. Sempre use uma frase secreta forte para proteger sua chave privada.

Generating public/private ed25519 key pair.
Enter file in which to save the key (~/.ssh/id_ed25519):
Created directory '/home/seuusuario/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/seuusuario/.ssh/id_ed25519.
Your public key has been saved in /home/seuusuario/.ssh/id_ed25519.pub.
The key fingerprint is: SHA256:...
The key's randomart image is:
+--[ED25519 256]----+
|      .=+          |
|     . o. .        |
|    . + o.         |
|   o = B o.        |
|  . S @ + +        |
|   = + B .         |
|  o * * E          |
| . o o             |
|  . .              |
+----[SHA256]-------+

Após a geração, você terá dois arquivos em seu diretório ~/.ssh:

  • id_ed25519 (sua chave privada)
  • id_ed25519.pub (sua chave pública)

Certifique-se de que seu arquivo de chave privada tenha permissões restritas:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519

Implantando Sua Chave Pública

Para usar a autenticação por chave, sua chave pública deve ser colocada no servidor remoto ao qual você deseja acessar.

Usando ssh-copy-id (Recomendado)

O utilitário ssh-copy-id é a maneira mais simples e segura de implantar sua chave pública. Ele cuida da criação do diretório ~/.ssh e do arquivo authorized_keys com as permissões corretas, se eles não existirem.

ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@servidor_remoto

Substitua usuario pelo seu nome de usuário no servidor remoto e servidor_remoto pelo endereço IP ou nome do host do servidor. Você será solicitado a fornecer sua senha para usuario@servidor_remoto pela última vez para enviar a chave.

Implantação Manual

Se o ssh-copy-id não estiver disponível, você pode copiar a chave pública manualmente:

  1. Copie o conteúdo da chave pública: Exiba sua chave pública usando cat.

    cat ~/.ssh/id_ed25519.pub
    

    Copie toda a saída, que começa com ssh-ed25519 ... e termina com seu comentário.

  2. Conecte-se via SSH ao servidor remoto usando autenticação por senha:

    ssh usuario@servidor_remoto
    

    Digite sua senha quando solicitado.

  3. Crie o diretório ~/.ssh e o arquivo authorized_keys se eles não existirem:

    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    touch ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    
  4. Adicione sua chave pública ao authorized_keys: Cole o conteúdo da chave pública que você copiou anteriormente no arquivo authorized_keys.

    echo "ssh-ed25519 AAAA..." >> ~/.ssh/authorized_keys
    

    (Substitua ssh-ed25519 AAAA... pelo conteúdo real da sua chave pública)

Conectando-se com Chaves SSH

Depois que sua chave pública estiver no servidor, você pode se conectar simplesmente especificando o usuário e o host:

ssh usuario@servidor_remoto

Se você tiver vários pares de chaves ou sua chave privada não estiver no local padrão (~/.ssh/id_rsa ou ~/.ssh/id_ed25519), você pode precisar especificá-la usando a opção -i:

ssh -i ~/.ssh/minha_chave_personalizada usuario@servidor_remoto

Se sua chave privada for protegida por uma frase secreta, você será solicitado a digitá-la. Para evitar digitar a frase secreta repetidamente durante uma sessão, você pode usar o ssh-agent.

Benefícios de Segurança da Autenticação por Chave SSH

  1. Reduz o risco de adivinhação de senha: Se o login por senha estiver desabilitado, os atacantes não podem usar força bruta nessa conta através de senhas SSH.
  2. Credenciais mais fortes: Uma chave SSH gerada corretamente não é algo que um humano possa adivinhar.
  3. Nenhum upload de chave privada: Sua chave privada permanece local durante a autenticação.
  4. Amigável para Automação: As chaves permitem logins com script, sem senha, o que é essencial para ferramentas de automação e pipelines de CI/CD.
  5. Proteção por Frase Secreta: Adicionar uma frase secreta à sua chave privada fornece uma camada extra de segurança. Mesmo que seu arquivo de chave privada seja roubado, ele permanece inutilizável sem a frase secreta.

Gerenciando Suas Chaves SSH

ssh-agent

ssh-agent é um programa que é executado em segundo plano e mantém suas chaves privadas descriptografadas na memória. Quando você tenta se conectar a um servidor SSH, seu cliente SSH pode consultar o ssh-agent pela chave privada necessária, eliminando a necessidade de digitar sua frase secreta repetidamente.

Para iniciar o ssh-agent e adicionar sua chave:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

Você digitará sua frase secreta uma vez ao adicionar a chave ao agente.

Nomenclatura e Organização de Chaves

Para gerenciar várias chaves (por exemplo, para diferentes organizações, projetos ou uso pessoal), considere usar nomes significativos:

ssh-keygen -t ed25519 -f ~/.ssh/id_trabalho_projeto -C "chave_trabalho_projeto"
ssh-keygen -t ed25519 -f ~/.ssh/id_pessoal_github -C "chave_pessoal_github"

Você pode então especificar qual chave usar com a opção -i, ou configurar seu arquivo ~/.ssh/config para selecionar automaticamente a chave correta com base no host.

Exemplo de ~/.ssh/config:

Host github.com
    IdentityFile ~/.ssh/id_pessoal_github
    User git

Host servidor-trabalho
    Hostname 192.168.1.100
    IdentityFile ~/.ssh/id_trabalho_projeto
    User devuser

Melhores Práticas e Dicas

  • Nunca compartilhe sua chave privada: Esta é a regra de ouro. Sua chave privada é sua identidade digital.
  • Use uma frase secreta forte: Proteja sua chave privada com uma frase secreta robusta, semelhante a uma senha forte. Isso torna sua chave inútil mesmo se cair em mãos erradas.
  • Rotacione quando houver um motivo: Gere uma nova chave quando um dispositivo for perdido, um contratante sair, uma chave for compartilhada por engano ou um algoritmo antigo não atender mais à sua política.
  • Restrinja as permissões de arquivo: Certifique-se de que seu arquivo de chave privada tenha permissões 600 (rw-------) e seu diretório ~/.ssh tenha 700 (rwx------).
  • Desabilite a autenticação por senha com cuidado: Assim que o login por chave funcionar a partir de um segundo terminal, muitos servidores devem definir PasswordAuthentication no em /etc/ssh/sshd_config. Mantenha o acesso ao console disponível antes de alterar isso em sistemas remotos.
  • Use ssh-agent: Para conveniência e segurança, use o ssh-agent para gerenciar suas chaves, especialmente aquelas com frases secretas.

Um Modelo Mental Simples

A chave pública é a fechadura que você instala na conta do servidor. A chave privada é a credencial que você mantém em sua própria máquina. A frase secreta protege essa credencial se o arquivo for copiado. O arquivo authorized_keys é a lista de acesso.

A maioria dos problemas com chave SSH vem de confundir esses conceitos: copiar a chave privada para o servidor, colar a chave pública sob o usuário errado, usar o arquivo de identidade errado ou deixar permissões muito abertas para o OpenSSH confiar nelas. Nomeie as chaves por propósito, proteja as chaves privadas com frases secretas, use ssh-agent para conveniência, remova chaves públicas antigas quando o acesso deve terminar e teste as alterações a partir de um segundo terminal antes de desabilitar o login por senha.