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
sshlongos em aliases nomeados no~/.ssh/config - Use
ProxyJumppara conexoes via bastion host em uma unica linha - Coloque
Host *no final do arquivo para definir padroes globais
Pre-requisitos
- SO: Ubuntu / Linux (cliente OpenSSH)
- Autenticacao por chave SSH ja configurada (veja Configuracao de Autenticacao por Chave SSH se ainda nao feito)
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_stagingApos 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_ed25519Conecte-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,bastion2Usando 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-userO 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_ed25519ServerAliveInterval 60+ServerAliveCountMax 3: desconecta apos 180 segundos de inatividade. Evita sessoes travadas em redes instaveis.AddKeysToAgent yes: carrega automaticamente a chave nossh-agentno 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