Dicas de ~/.ssh/config: Organizando Suas Configuracoes de Conexao SSH

Dicas de ~/.ssh/config: Organizando Suas Configuracoes de Conexao SSH

O Que e ~/.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, usuario, porta e arquivo de chave para aquela conexao, tornando-o essencial ao gerenciar multiplos servidores.

Pontos Principais

  • Consolide todos os comandos ssh longos em aliases nomeados no ~/.ssh/config
  • Use ProxyJump para conexoes via bastion host em uma unica linha
  • Coloque Host * no final do arquivo para definir padroes globais

Pre-requisitos

Criando o Arquivo e Definindo Permissoes

Se o arquivo nao existir, crie-o e defina as permissoes corretas:

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

600 e obrigatorio. Se o arquivo de configuracao for legivel 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 Basica

O arquivo consiste em blocos Host, um por alias. As opcoes dentro de cada bloco sao indentadas (quatro espacos e a convencao).

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 correspondencia. Blocos posteriores podem adicionar valores para opcoes ainda nao definidas, mas nao podem sobrescrever valores ja correspondidos. Isso significa que entradas especificas devem vir antes dos padroes gerais.

Opcoes Comuns

Opcao Descricao Exemplo
HostName IP ou FQDN real 192.0.2.10
User Nome de usuario para login ubuntu
Port Numero da porta 2222
IdentityFile Caminho da chave privada ~/.ssh/id_ed25519_work
ProxyJump Jump host bastion
ServerAliveInterval Intervalo de KeepAlive (segundos) 60
ServerAliveCountMax Maximo de keepalives sem resposta antes de desconectar 3
Compression Habilitar compressao yes
ForwardAgent Encaminhamento do agente SSH yes
AddKeysToAgent Adicionar chave automaticamente ao ssh-agent yes
StrictHostKeyChecking Comportamento de verificacao da chave do host accept-new

Gerenciando Multiplos 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

Apos salvar, conecte-se com um alias curto:

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

scp e rsync tambem aceitam o alias, sem necessidade de repetir todas as opcoes de conexao.

ProxyJump: Conectando Atraves de um Bastion Host

Ambientes de producao frequentemente restringem o acesso SSH direto — todas as conexoes 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 unico comando:

ssh prod01

O SSH se conecta automaticamente ao bastion primeiro e depois faz um tunel ate prod01.

ProxyJump requer OpenSSH 7.3 ou superior. Verifique sua versao com ssh -V. Para versoes mais antigas, use ProxyCommand ssh -W %h:%p bastion como substituto.

Bastions multi-hop (bastion1 -> bastion2 -> destino) podem ser escritos com virgula:

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 usuario a todos os hosts naquele dominio, sem necessidade de listar cada servidor individualmente.

Padroes Globais com Host *

Host * se aplica a toda conexao. Sempre coloque-o no final do arquivo porque o OpenSSH para de avaliar apos a primeira correspondencia para cada opcao.

# 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 apos 180 segundos de inatividade. Evita sessoes travadas em redes instaveis.
  • AddKeysToAgent yes: carrega automaticamente a chave no ssh-agent no primeiro uso, para que a passphrase seja digitada apenas uma vez por sessao de login.

Verificando Sua Configuracao

Use -G para exibir todas as opcoes resolvidas para um alias sem conectar:

ssh -G prod01

Isso mostra cada opcao que seria aplicada, incluindo os padroes herdados de Host * — util para depurar comportamentos inesperados.

Para um rastreamento detalhado durante uma conexao real:

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

Modelo para Copiar e Colar

Modelo minimo 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

Proximas Leituras