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#免密登录#安全