Dicas de ~/.ssh/config: Organizando Suas Configurações de Conexão SSH

Dicas de ~/.ssh/config: Organizando Suas Configurações de Conexão SSH

O Que é ~/.ssh/config?

~/.ssh/config permite substituir um comando SSH longo como ssh user@192.0.2.10 -i ~/.ssh/mykey -p 2222 por um alias simples: ssh myserver. Cada bloco de host armazena o hostname, usuário, porta e arquivo de chave para aquela conexão, tornando-o essencial ao gerenciar múltiplos servidores.

Pontos Principais

  • Consolide todos os comandos ssh longos em aliases nomeados no ~/.ssh/config
  • Use ProxyJump para conexões via bastion host em uma única linha
  • Coloque Host * no final do arquivo para definir padrões globais

Pré-requisitos

Criando o Arquivo e Definindo Permissões

Se o arquivo não existir, crie-o e defina as permissões corretas:

touch ~/.ssh/config
chmod 600 ~/.ssh/config

600 é obrigatório. Se o arquivo de configuração for legível pelo grupo ou outros, o OpenSSH o ignora completamente e exibe:

Bad owner or permissions on /home/user/.ssh/config

Corrija com chmod 600 ~/.ssh/config.

Sintaxe Básica

O arquivo consiste em blocos Host, um por alias. As opções dentro de cada bloco são indentadas (quatro espaços é a convenção).

Host <alias>
    HostName      <endereco IP ou FQDN>
    User          <nome de usuario>
    Port          <numero da porta>
    IdentityFile  <caminho para chave privada>

O OpenSSH avalia os blocos de cima para baixo e usa a primeira correspondência. Blocos posteriores podem adicionar valores para opções ainda não definidas, mas não podem sobrescrever valores já correspondidos. Isso significa que entradas específicas devem vir antes dos padrões gerais.

Opções Comuns

Opção Descrição Exemplo
HostName IP ou FQDN real 192.0.2.10
User Nome de usuário para login ubuntu
Port Número da porta 2222
IdentityFile Caminho da chave privada ~/.ssh/id_ed25519_work
ProxyJump Jump host bastion
ServerAliveInterval Intervalo de KeepAlive (segundos) 60
ServerAliveCountMax Máximo de keepalives sem resposta antes de desconectar 3
Compression Habilitar compressão yes
ForwardAgent Encaminhamento do agente SSH yes
AddKeysToAgent Adicionar chave automaticamente ao ssh-agent yes
StrictHostKeyChecking Comportamento de verificação da chave do host accept-new

Gerenciando Múltiplos Servidores com Aliases

O caso de uso mais comum: um bloco por servidor.

Host web01
    HostName 192.0.2.10
    User ubuntu
    Port 22
    IdentityFile ~/.ssh/id_ed25519

Host web02
    HostName 192.0.2.20
    User ec2-user
    IdentityFile ~/.ssh/id_ed25519_aws

Host staging
    HostName staging.example.com
    User deploy
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_staging

Após salvar, conecte-se com um alias curto:

ssh web01
ssh staging
scp file.txt staging:/home/deploy/

scp e rsync também aceitam o alias, sem necessidade de repetir todas as opções de conexão.

ProxyJump: Conectando Através de um Bastion Host

Ambientes de produção frequentemente restringem o acesso SSH direto — todas as conexões devem passar por um bastion host. O ProxyJump lida com isso de forma transparente.

Host bastion
    HostName bastion.example.com
    User ubuntu
    IdentityFile ~/.ssh/id_ed25519

Host prod01
    HostName 10.0.0.10
    User ubuntu
    ProxyJump bastion
    IdentityFile ~/.ssh/id_ed25519

Host prod02
    HostName 10.0.0.11
    User ubuntu
    ProxyJump bastion
    IdentityFile ~/.ssh/id_ed25519

Conecte-se com um único comando:

ssh prod01

O SSH se conecta automaticamente ao bastion primeiro e depois faz um túnel até prod01.

ProxyJump requer OpenSSH 7.3 ou superior. Verifique sua versão com ssh -V. Para versões mais antigas, use ProxyCommand ssh -W %h:%p bastion como substituto.

Bastions multi-hop (bastion1 -> bastion2 -> destino) podem ser escritos com vírgula:

Host deep-prod
    HostName 10.1.0.5
    User ubuntu
    ProxyJump bastion1,bastion2

Usando Chaves Diferentes por Host

Use chaves separadas para GitHub, AWS e servidores internos com curingas:

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

Host *.company.internal
    IdentityFile ~/.ssh/id_ed25519_company
    User john

Host *.amazonaws.com
    IdentityFile ~/.ssh/id_rsa_aws
    User ec2-user

O curinga *.company.internal aplica a mesma chave e usuário a todos os hosts naquele domínio, sem necessidade de listar cada servidor individualmente.

Padrões Globais com Host *

Host * se aplica a toda conexão. Sempre coloque-o no final do arquivo porque o OpenSSH para de avaliar após a primeira correspondência para cada opção.

# Entradas especificas primeiro
Host web01
    HostName 192.0.2.10
    User ubuntu

Host bastion
    HostName bastion.example.com
    User ubuntu

# Padroes globais — sempre no final
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_ed25519
  • ServerAliveInterval 60 + ServerAliveCountMax 3: desconecta após 180 segundos de inatividade. Evita sessões travadas em redes instáveis.
  • AddKeysToAgent yes: carrega automaticamente a chave no ssh-agent no primeiro uso, para que a passphrase seja digitada apenas uma vez por sessão de login.

Verificando Sua Configuração

Use -G para exibir todas as opções resolvidas para um alias sem conectar:

ssh -G prod01

Isso mostra cada opção que seria aplicada, incluindo os padrões herdados de Host * — útil para depurar comportamentos inesperados.

Para um rastreamento detalhado durante uma conexão real:

ssh -v prod01 2>&1 | grep -E "identity|proxy|config"

Modelo para Copiar e Colar

Modelo mínimo funcional

# Bastion host
Host bastion
    HostName bastion.example.com
    User ubuntu
    IdentityFile ~/.ssh/id_ed25519

# Servidor de producao (via bastion)
Host prod01
    HostName 10.0.0.10
    User ubuntu
    ProxyJump bastion
    IdentityFile ~/.ssh/id_ed25519

# Padroes globais — deve ser o ultimo
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
    AddKeysToAgent yes
    StrictHostKeyChecking accept-new

Próximas Leituras