Chaves SSH: geração, configuração e múltiplas contas

Ferramentas de desenvolvimento

Chaves SSH: um método de autenticação mais seguro que senhas

Comparação Senha Chave SSH
Método de autenticação Fator de conhecimento (o que você sabe) Fator de posse (o que você tem)
Força bruta Possível Praticamente impossível
Risco de phishing Alto Baixo (a chave privada não sai da máquina local)
Vazamento do servidor Senhas em texto/hashe vulneráveis Apenas a chave pública é armazenada, não é possível derivar a privada
Conveniência Digitar toda vez Configurar uma vez, autenticação automática

1. Gerar um par de chaves

Ed25519 (recomendado)

ssh-keygen -t ed25519 -C "your@email.com"
Parâmetro Descrição
-t ed25519 Tipo de algoritmo (Ed25519, mais seguro e rápido)
-C Comentário (geralmente o email para identificação)

RSA (alternativa por compatibilidade)

ssh-keygen -t rsa -b 4096 -C "your@email.com"
Algoritmo Comprimento da chave Segurança Performance Recomendação
Ed25519 256 bit Máxima Mais rápido ✅
ECDSA P256 256 bit Alta Rápido Opcional
RSA 4096 4096 bit Alta Lento Alternativa por compatibilidade
RSA 2048 2048 bit Média Lento ❌ Não recomendado

Processo de geração

$ ssh-keygen -t ed25519 -C "dev@example.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase): ****
Enter same passphrase again: ****
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub

É altamente recomendado definir uma passphrase: mesmo que a chave privada vaze, uma passphrase impede o uso direto.


2. Implantar a chave pública

GitHub / GitLab

# Copiar a chave pública
cat ~/.ssh/id_ed25519.pub | clip

# GitHub → Settings → SSH and GPG keys → New SSH key
# Colar o conteúdo da chave pública

Servidor

# Método 1: ssh-copy-id
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server.com

# Método 2: Adicionar manualmente
cat ~/.ssh/id_ed25519.pub | ssh user@server.com 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'

Verificar conexão

ssh -T git@github.com
# Hi username! You've successfully authenticated...

ssh user@server.com
# Login direto, sem senha

3. Configuração de múltiplas contas

Cenário: GitHub de trabalho + GitHub pessoal

# Gerar dois pares de chaves
ssh-keygen -t ed25519 -C "work@company.com" -f ~/.ssh/id_work
ssh-keygen -t ed25519 -C "personal@gmail.com" -f ~/.ssh/id_personal

SSH Config

# ~/.ssh/config
Host github-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_work
  IdentitiesOnly yes

Host github-personal
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_personal
  IdentitiesOnly yes

Uso com Git

# Repositório de trabalho
git clone git@github-work:company/project.git

# Repositório pessoal
git clone git@github-personal:username/project.git

Configuração multiplataforma

# ~/.ssh/config
Host github.com
  User git
  IdentityFile ~/.ssh/id_github

Host gitlab.com
  User git
  IdentityFile ~/.ssh/id_gitlab

Host gitee.com
  User git
  IdentityFile ~/.ssh/id_gitee

Host dev.azure.com
  User git
  IdentityFile ~/.ssh/id_azure

4. Gerenciamento do SSH Agent

Iniciar Agent

eval "$(ssh-agent -s)"

Adicionar chave

ssh-add ~/.ssh/id_ed25519
# Enter passphrase: ****

# Ver chaves adicionadas
ssh-add -l
# 256 SHA256:xxx... dev@example.com (ED25519)

Início automático (bashrc)

# ~/.bashrc ou ~/.zshrc
if [ -z "$SSH_AUTH_SOCK" ]; then
  eval "$(ssh-agent -s)"
  ssh-add ~/.ssh/id_ed25519 2>/dev/null
fi

Persistência com keychain

# macOS: usar Keychain para armazenar a passphrase
ssh-add --apple-use-keychain ~/.ssh/id_ed25519

# Linux: usar keychain
eval "$(keychain --eval id_ed25519)"

5. Configuração de servidor de salto

Cenário: Local → Servidor de salto → Servidor de produção

# ~/.ssh/config
Host jumpbox
  HostName jump.example.com
  User jump-user
  IdentityFile ~/.ssh/id_jump

Host production
  HostName 10.0.1.100
  User deploy
  IdentityFile ~/.ssh/id_prod
  ProxyJump jumpbox
# Conexão direta ao servidor de produção (passa automaticamente pelo servidor de salto)
ssh production

Encaminhamento de Agent

Host jumpbox
  HostName jump.example.com
  ForwardAgent yes

Aviso de segurança: Ative o encaminhamento de Agent apenas quando confiar no servidor de salto.


6. Segurança reforçada

sshd_config do servidor

# /etc/ssh/sshd_config
PermitRootLogin no                    # Proibir login root
PasswordAuthentication no             # Proibir login com senha
PubkeyAuthentication yes             # Permitir apenas login com chave
AuthorizedKeysFile .ssh/authorized_keys
MaxAuthTries 3                       # Máximo de tentativas
LoginGraceTime 30                    # Timeout de login de 30 segundos
AllowUsers deploy admin              # Lista de usuários permitidos

Permissões de chaves

# A chave privada deve ser 600
chmod 600 ~/.ssh/id_ed25519

# O diretório .ssh deve ser 700
chmod 700 ~/.ssh

# authorized_keys deve ser 600
chmod 600 ~/.ssh/authorized_keys

Rotação de chaves

# 1. Gerar nova chave
ssh-keygen -t ed25519 -C "dev@example.com" -f ~/.ssh/id_ed25519_new

# 2. Implantar a nova chave pública em todos os servidores/plataformas Git
ssh-copy-id -i ~/.ssh/id_ed25519_new.pub user@server

# 3. Verificar se a nova chave funciona
ssh -i ~/.ssh/id_ed25519_new user@server

# 4. Remover a chave pública antiga
# Editar servidor ~/.ssh/authorized_keys, deletar a linha da chave pública antiga

# 5. Deletar a chave antiga
rm ~/.ssh/id_ed25519_old

7. Solução de problemas comuns

Problema Causa Solução
Permission denied Chave pública não implantada ssh-copy-id
Too many authentication failures Muitas chaves no Agent IdentitiesOnly yes
Are you sure you want to continue connecting Primeira conexão StrictHostKeyChecking=accept-new
Conexão lenta Consulta DNS reversa UseDNS no (no servidor)
Chave não funciona Permissões incorretas chmod 600 na chave privada

Modo de depuração

ssh -vvv user@server.com
# Saída detalhada do processo de conexão, localizar a causa da falha de autenticação
#SSH#密钥#Git#免密登录#安全