Pular para o conteúdo

SSH

fundamentos
Comando O que faz
ssh-keygen -t ed25519 -C "ana@empresa" Gera par de chaves (padrão atual)
ssh-keygen -t rsa -b 4096 RSA, quando ed25519 não é suportado
ssh-keygen -l -f ~/.ssh/id_ed25519.pub Fingerprint da chave
ssh-keygen -y -f ~/.ssh/id_ed25519 Deriva a pública a partir da privada
ssh-copy-id user@host Instala a pública no destino
ssh-keygen -p -f ~/.ssh/id_ed25519 Troca a senha da chave
ssh-keygen -R host Remove entrada do known_hosts

Permissões obrigatórias: 700 em ~/.ssh, 600 na chave privada. Com permissão frouxa, o cliente recusa usar a chave.

Janela do terminal
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l # chaves carregadas
ssh-add -D # remove todas
ssh -A user@host # encaminha o agente (cuidado: veja pegadinhas)

~/.ssh/config — o que mais economiza tempo no dia a dia:

Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes
HashKnownHosts yes
Host bastion
HostName bastion.exemplo.com.br
User ana
IdentityFile ~/.ssh/id_ed25519
Port 22
Host prod-*
User deploy
ProxyJump bastion # salto automático pelo bastion
IdentityFile ~/.ssh/id_prod
IdentitiesOnly yes
Host git-empresa
HostName github.com
User git
IdentityFile ~/.ssh/id_trabalho
IdentitiesOnly yes

IdentitiesOnly yes evita que o cliente ofereça todas as chaves do agente — é o que resolve o erro “too many authentication failures”.

Comando O que faz
ssh user@host Conexão simples
ssh -p 2222 user@host Porta alternativa
ssh -i ~/.ssh/chave user@host Chave específica
ssh -J bastion user@interno Salto por bastion (ProxyJump)
ssh -J b1,b2 user@destino Vários saltos
ssh user@host 'comando' Executa e sai
ssh -t user@host 'sudo -i' Força TTY (necessário para interativos)
ssh -v / -vvv Diagnóstico (o -vvv mostra a negociação inteira)

Prefira ProxyJump a ProxyCommand com netcat: o tráfego não é decifrado no bastion.

Janela do terminal
# local: acessa um banco interno como se fosse local
ssh -L 5432:db-interno:5432 bastion
# → psql -h 127.0.0.1 -p 5432
# remoto: expõe um serviço local no servidor
ssh -R 8080:localhost:3000 host
# dinâmico: proxy SOCKS para o navegador
ssh -D 1080 bastion
# túnel em segundo plano, sem shell
ssh -fN -L 5432:db-interno:5432 bastion
Flag Significado
-L local:destino:porta Encaminha porta local para o destino
-R porta:local:porta Expõe porta local no servidor remoto
-D porta Proxy SOCKS
-f Vai para segundo plano
-N Não executa comando remoto
Comando O que faz
scp arquivo user@host:/destino/ Cópia simples
scp -r dir user@host:/destino/ Recursivo
rsync -avz --progress dir/ user@host:/destino/ Sincroniza, retomável
rsync -avz --delete dir/ user@host:/destino/ Espelha (apaga o que não existe na origem)
sftp user@host Sessão interativa

rsync é preferível a scp para volume: transfere só a diferença e retoma.

/etc/ssh/sshd_config — o essencial:

PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
AllowGroups sshusers
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
X11Forwarding no
AllowAgentForwarding no
Janela do terminal
sshd -t # valida a configuração ANTES de reiniciar
systemctl reload sshd

Deixe uma sessão aberta ao alterar a configuração do SSH: se algo quebrar, você ainda tem acesso para corrigir.

Sintoma Causa provável
Permission denied (publickey) Chave não instalada, usuário errado, permissão do ~/.ssh
Too many authentication failures Agente oferecendo muitas chaves; use IdentitiesOnly
Host key verification failed Chave do host mudou; verifique antes de remover
Connection timed out Firewall, security group ou rota
Connection refused Serviço não está escutando naquela porta
Conexão cai sozinha Falta ServerAliveInterval, ou NAT com timeout curto
Lento para conectar DNS reverso no servidor (UseDNS no)
  • Encaminhamento de agente (-A) permite que quem controla o host use suas chaves. Prefira ProxyJump.
  • Chave sem senha em máquina compartilhada é credencial em texto claro.
  • Alterar known_hosts sem verificar o fingerprint anula a proteção contra man-in-the-middle.
  • Chave permanente é credencial de longa duração: prefira certificado SSH de curta duração emitido por identidade.
  • rsync --delete apaga no destino; teste com --dry-run.