O SSH (Secure Shell) é um dos protocolos mais importantes do mundo Linux e da administração de sistemas. Ele permite acessar remotamente qualquer servidor ou computador Linux com total segurança, transferir arquivos, executar comandos e criar túneis criptografados — tudo pela linha de comando. Se você administra servidores, desenvolve software ou simplesmente quer acessar seu computador de casa a partir do trabalho, dominar o SSH é essencial. Este tutorial cobre desde a instalação básica até configurações avançadas de segurança.
O que é o SSH?
O SSH é um protocolo de rede criptografado que permite comunicação segura entre dois computadores. Ele substitui protocolos antigos e inseguros como Telnet e rlogin, que transmitiam dados — incluindo senhas — em texto puro.
O que você pode fazer com SSH:
- Acessar o terminal de qualquer servidor remotamente
- Transferir arquivos com segurança (via SCP e SFTP)
- Executar comandos remotos sem abrir uma sessão interativa
- Criar túneis criptografados para outros protocolos
- Fazer port forwarding
- Montar sistemas de arquivos remotos (via SSHFS)
Como funciona a autenticação SSH:
| Método | Como funciona | Segurança |
|---|---|---|
| Senha | Digite usuário e senha | ⭐⭐ Média |
| Chave pública/privada | Par de chaves criptográficas | ⭐⭐⭐⭐⭐ Muito alta |
| Certificado SSH | Assinado por uma autoridade | ⭐⭐⭐⭐⭐ Muito alta |
A autenticação por chave pública é o método recomendado — é mais segura que senha e mais conveniente, pois não precisa digitar nada.
Conceitos fundamentais
Antes de começar, entenda os dois componentes do SSH:
SSH Client (cliente) — o programa que você usa para conectar em outro computador. Já vem instalado em Linux, macOS e Windows 10+.
SSH Server (servidor) — o serviço que recebe conexões. Precisa estar instalado e rodando no computador que você quer acessar remotamente. No Linux, o servidor SSH é o OpenSSH Server (sshd).
Seu computador (cliente) ──SSH──► Servidor remoto (sshd rodando)
ssh usuario@servidor porta 22 (padrão)
Parte 1 — Instalando o OpenSSH
Instalar o cliente SSH
Em distribuições baseadas em Debian/Ubuntu:
sudo apt update
sudo apt install -y openssh-client
Verifique a instalação:
ssh -V
# OpenSSH_9.6p1 Ubuntu-3ubuntu13, OpenSSL 3.2.1 30 Jan 2024
Instalar o servidor SSH
Para que outros computadores possam se conectar ao seu Linux:
sudo apt update
sudo apt install -y openssh-server
Verificar o status do serviço
sudo systemctl status ssh
A saída deve mostrar active (running):
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled)
Active: active (running) since Mon 2026-05-11 08:00:00 -03; 2h ago
Iniciar, parar e reiniciar o SSH
sudo systemctl start ssh # inicia o serviço
sudo systemctl stop ssh # para o serviço
sudo systemctl restart ssh # reinicia o serviço
sudo systemctl reload ssh # recarrega configurações sem desconectar sessões ativas
Ativar inicialização automática
sudo systemctl enable ssh # inicia automaticamente com o sistema
sudo systemctl disable ssh # desativa a inicialização automática
Parte 2 — Primeiras conexões SSH
Sintaxe básica
ssh usuario@endereco
Exemplos:
ssh joao@192.168.1.100 # IP na rede local
ssh joao@servidor.empresa.com # hostname ou domínio
ssh joao@servidor.com -p 2222 # porta personalizada
ssh root@192.168.1.100 # conectar como root (evite quando possível)
Primeira conexão — verificação da chave do host
Na primeira vez que conecta em um servidor, o SSH mostra um aviso:
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Digite yes para aceitar e adicionar o servidor à lista de hosts conhecidos (~/.ssh/known_hosts). Nas próximas conexões esse aviso não aparece.
Em ambientes corporativos, verifique o fingerprint com o administrador do servidor antes de aceitar — isso garante que você está se conectando ao servidor correto e não a um impostor.
Executar um comando remoto sem abrir sessão interativa
ssh usuario@servidor "df -h" # ver uso de disco
ssh usuario@servidor "sudo apt update" # atualizar repositórios
ssh usuario@servidor "ls -la /var/log/" # listar arquivos de log
ssh usuario@servidor "cat /etc/os-release" # ver versão do sistema
Sair da sessão SSH
exit
# ou
logout
# ou pressione Ctrl + D
Parte 3 — Autenticação por chave pública
Este é o método mais seguro e conveniente. Uma vez configurado, você se conecta sem digitar senha.
Como funciona o par de chaves
Chave privada (~/.ssh/id_ed25519) → Fica no SEU computador. NUNCA compartilhe.
Chave pública (~/.ssh/id_ed25519.pub) → Vai para o servidor remoto.
O servidor usa a chave pública para verificar se você tem a chave privada correspondente — sem que a privada saia do seu computador.
Passo 1 — Gerar o par de chaves
ssh-keygen -t ed25519 -C "seu-email@exemplo.com"
O algoritmo Ed25519 é o mais moderno e seguro. Para servidores mais antigos que não suportam Ed25519, use RSA com 4096 bits:
ssh-keygen -t rsa -b 4096 -C "seu-email@exemplo.com"
O comando pergunta três coisas:
1. Onde salvar a chave:
Enter file in which to save the key (/home/usuario/.ssh/id_ed25519):
Pressione Enter para usar o local padrão.
2. Senha da chave (passphrase):
Enter passphrase (empty for no passphrase):
Recomendamos definir uma passphrase — uma camada extra de segurança caso a chave privada seja roubada. Pode deixar em branco para conexão sem senha.
3. Confirmação da passphrase: Repita a passphrase.
Resultado:
Your identification has been saved in /home/usuario/.ssh/id_ed25519
Your public key has been saved in /home/usuario/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx seu-email@exemplo.com
Passo 2 — Copiar a chave pública para o servidor
Método automático (recomendado):
ssh-copy-id usuario@servidor
Esse comando copia a chave pública para o arquivo ~/.ssh/authorized_keys no servidor automaticamente. Você precisará da senha do usuário pela última vez.
Método manual (quando ssh-copy-id não está disponível):
# Ver o conteúdo da chave pública
cat ~/.ssh/id_ed25519.pub
# Copiar manualmente para o servidor
ssh usuario@servidor "mkdir -p ~/.ssh && echo 'COLE_A_CHAVE_AQUI' >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh"
Método alternativo com pipe:
cat ~/.ssh/id_ed25519.pub | ssh usuario@servidor "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Passo 3 — Testar a conexão com chave
ssh usuario@servidor
Se configurado corretamente, conecta sem pedir senha (ou pede apenas a passphrase da chave, se definiu uma).
Gerenciar múltiplas chaves
Se tiver chaves diferentes para servidores diferentes, especifique qual usar:
ssh -i ~/.ssh/chave_empresa usuario@servidor.empresa.com
ssh -i ~/.ssh/chave_pessoal usuario@servidor-pessoal.com
Parte 4 — Arquivo de configuração do SSH
O arquivo ~/.ssh/config permite criar atalhos e configurar comportamentos diferentes para cada servidor — evita digitar IPs, usuários e portas toda vez.
Criar o arquivo de configuração
mkdir -p ~/.ssh
nano ~/.ssh/config
Estrutura básica
Host apelido
HostName endereco-do-servidor
User nome-do-usuario
Port 22
IdentityFile ~/.ssh/nome-da-chave
Exemplos práticos
# Servidor de produção da empresa
Host producao
HostName 203.0.113.10
User deploy
Port 2222
IdentityFile ~/.ssh/id_empresa
# Servidor de desenvolvimento
Host dev
HostName 192.168.1.50
User joao
Port 22
IdentityFile ~/.ssh/id_ed25519
# Raspberry Pi em casa
Host pi
HostName 192.168.1.200
User pi
Port 22
IdentityFile ~/.ssh/id_rpi
# Configuração padrão para todos os hosts
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes
Usando os atalhos
Com o arquivo configurado, a conexão fica simples:
ssh producao # em vez de: ssh deploy@203.0.113.10 -p 2222 -i ~/.ssh/id_empresa
ssh dev # em vez de: ssh joao@192.168.1.50
ssh pi # em vez de: ssh pi@192.168.1.200
Permissões corretas do arquivo config
chmod 600 ~/.ssh/config
Parte 5 — Configurando o servidor SSH
O arquivo de configuração principal do servidor SSH fica em /etc/ssh/sshd_config. Edite com cuidado — uma configuração errada pode te impedir de acessar o servidor.
Regra de ouro: Sempre mantenha uma sessão SSH aberta enquanto edita o
sshd_config. Assim, se algo der errado, você ainda tem acesso para corrigir.
Abrir o arquivo de configuração
sudo nano /etc/ssh/sshd_config
Configurações essenciais de segurança
1. Mudar a porta padrão
A porta 22 é constantemente varrida por bots. Mudar para uma porta alta reduz muito o ruído:
Port 2222
Escolha uma porta entre 1024 e 65535 que não esteja em uso. Lembre de abrir a nova porta no firewall.
2. Desativar login do root
PermitRootLogin no
Nunca permita login direto como root via SSH. Use um usuário comum e eleve privilégios com sudo quando necessário.
3. Desativar autenticação por senha (após configurar chaves)
PasswordAuthentication no
PubkeyAuthentication yes
Só desative a autenticação por senha depois de confirmar que a autenticação por chave está funcionando. Caso contrário, você ficará trancado fora do servidor.
4. Desativar autenticação por senha vazia
PermitEmptyPasswords no
5. Limitar tentativas de login
MaxAuthTries 3
6. Definir tempo limite de conexão
LoginGraceTime 30
O servidor fecha a conexão se o login não for concluído em 30 segundos.
7. Desativar recursos não usados
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
Reative apenas o que precisar usar.
8. Restringir acesso a usuários específicos
AllowUsers joao maria deploy
Ou por grupo:
AllowGroups sshusers administradores
9. Banner de aviso (opcional)
Banner /etc/ssh/banner.txt
Crie o arquivo com uma mensagem de aviso:
echo "Acesso restrito. Atividades monitoradas." | sudo tee /etc/ssh/banner.txt
Exemplo completo de sshd_config seguro
# Porta e protocolo
Port 2222
# Autenticação
PermitRootLogin no
MaxAuthTries 3
LoginGraceTime 30
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
AuthenticationMethods publickey
# Usuários permitidos
AllowUsers joao deploy
# Recursos
X11Forwarding no
AllowAgentForwarding yes
AllowTcpForwarding yes
# Keepalive
ClientAliveInterval 300
ClientAliveCountMax 2
# Banner
Banner /etc/ssh/banner.txt
Aplicar as configurações
Sempre verifique a sintaxe antes de reiniciar:
sudo sshd -t # testa a configuração sem aplicar
sudo systemctl reload ssh # aplica sem derrubar sessões ativas
Parte 6 — Transferência de arquivos via SSH
O SSH inclui protocolos seguros para transferência de arquivos.
SCP — cópia simples e rápida
# Copiar arquivo do local para o servidor
scp arquivo.txt usuario@servidor:/home/usuario/
# Copiar arquivo do servidor para o local
scp usuario@servidor:/home/usuario/arquivo.txt ./
# Copiar pasta inteira (recursivo)
scp -r pasta/ usuario@servidor:/home/usuario/
# Com porta personalizada
scp -P 2222 arquivo.txt usuario@servidor:/destino/
# Usando atalho do ~/.ssh/config
scp arquivo.txt producao:/home/deploy/
SFTP — transferência interativa
sftp usuario@servidor
Comandos dentro do SFTP:
ls # lista arquivos no servidor
lls # lista arquivos no computador local
pwd # pasta atual no servidor
lpwd # pasta atual no local
cd /var/www # mudar de pasta no servidor
lcd ~/Downloads # mudar de pasta local
get arquivo.txt # baixar arquivo do servidor
put documento.pdf # enviar arquivo para o servidor
get -r pasta/ # baixar pasta inteira
put -r projeto/ # enviar pasta inteira
mkdir nova-pasta # criar pasta no servidor
rm arquivo.txt # remover arquivo no servidor
exit # sair do SFTP
Rsync via SSH — sincronização eficiente
O Rsync é mais inteligente que o SCP — transfere apenas o que mudou:
# Sincronizar pasta local para servidor
rsync -avz --progress pasta/ usuario@servidor:/destino/
# Sincronizar do servidor para local
rsync -avz usuario@servidor:/var/www/html/ ./backup/
# Com porta SSH personalizada
rsync -avz -e "ssh -p 2222" pasta/ usuario@servidor:/destino/
# Excluir arquivos que não existem mais na origem
rsync -avz --delete pasta/ usuario@servidor:/destino/
# Simular sem transferir (dry-run)
rsync -avzn pasta/ usuario@servidor:/destino/
Flags do rsync:
-a— modo arquivo (preserva permissões, timestamps, links simbólicos)-v— verbose (mostra progresso)-z— comprime os dados durante a transferência--progress— barra de progresso por arquivo--delete— remove no destino o que não existe mais na origem
Parte 7 — Port Forwarding e Túneis SSH
O SSH permite criar túneis criptografados para redirecionar tráfego de rede — um recurso poderoso para acessar serviços internos com segurança.
Local Port Forwarding
Acessa um serviço no servidor remoto como se estivesse local:
ssh -L porta_local:destino:porta_remota usuario@servidor
Exemplo prático — acessar banco de dados MySQL remoto:
ssh -L 3307:localhost:3306 usuario@servidor
Agora conecte ao MySQL local na porta 3307 — o tráfego vai pelo túnel SSH até o MySQL do servidor na porta 3306:
mysql -h 127.0.0.1 -P 3307 -u root -p
Exemplo — acessar painel web interno:
ssh -L 8080:192.168.1.50:80 usuario@servidor
Abra http://localhost:8080 no navegador — acessa o servidor web interno.
Remote Port Forwarding
Expõe um serviço local para o servidor remoto:
ssh -R porta_remota:localhost:porta_local usuario@servidor
Exemplo — expor servidor local para a internet:
ssh -R 8080:localhost:3000 usuario@servidor
Qualquer um que acessar servidor:8080 chega no seu serviço local na porta 3000.
Dynamic Port Forwarding — proxy SOCKS
Cria um proxy SOCKS5 que roteia todo o tráfego pelo servidor:
ssh -D 1080 usuario@servidor
Configure seu navegador para usar proxy SOCKS5 em 127.0.0.1:1080 — todo o tráfego passa pelo servidor SSH de forma criptografada.
Manter túneis ativos em segundo plano
ssh -fNL 3307:localhost:3306 usuario@servidor
-f— vai para segundo plano-N— não executa comando remoto (só mantém o túnel)
Parte 8 — SSH Agent — gerenciamento de chaves
O SSH Agent armazena as chaves privadas na memória, evitando digitar a passphrase a cada conexão.
Iniciar o SSH Agent
eval "$(ssh-agent -s)"
# Agent pid 12345
Adicionar chaves ao agent
ssh-add ~/.ssh/id_ed25519
# Enter passphrase for /home/usuario/.ssh/id_ed25519: (digite a passphrase)
# Identity added: /home/usuario/.ssh/id_ed25519
Listar chaves carregadas
ssh-add -l
Remover chaves do agent
ssh-add -d ~/.ssh/id_ed25519 # remove chave específica
ssh-add -D # remove todas as chaves
Adicionar automaticamente ao abrir o terminal
Adicione ao ~/.bashrc ou ~/.zshrc:
# Inicia o SSH Agent se não estiver rodando
if [ -z "$SSH_AGENT_PID" ]; then
eval "$(ssh-agent -s)" > /dev/null
ssh-add ~/.ssh/id_ed25519 2>/dev/null
fi
Parte 9 — Segurança avançada
Fail2Ban — bloqueio automático de IPs
O Fail2Ban monitora tentativas de login malsucedidas e bloqueia IPs automaticamente:
sudo apt install -y fail2ban
Crie uma configuração local:
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
[sshd]
enabled = true port = 2222 logpath = /var/log/auth.log maxretry = 3 bantime = 86400
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Verificar IPs bloqueados:
sudo fail2ban-client status sshd
Configurar o firewall UFW para SSH
sudo ufw allow 2222/tcp # permite SSH na porta personalizada
sudo ufw enable # ativa o firewall
sudo ufw status # verifica o status
Se mudou a porta, não esqueça de bloquear a porta 22:
sudo ufw deny 22/tcp
Autenticação em dois fatores (2FA)
Para uma camada extra de segurança, ative o Google Authenticator:
sudo apt install -y libpam-google-authenticator
Execute como o usuário que vai usar o 2FA:
google-authenticator
Responda y para todas as perguntas e escaneie o QR code com o app Google Authenticator.
Configure o PAM:
sudo nano /etc/pam.d/sshd
Adicione no início:
auth required pam_google_authenticator.so
No sshd_config, ative:
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
Reinicie o SSH:
sudo systemctl restart ssh
Parte 10 — Monitoramento e logs
Ver tentativas de acesso
sudo tail -f /var/log/auth.log # logs em tempo real
sudo grep "Failed password" /var/log/auth.log | tail -20 # tentativas falhas
sudo grep "Accepted publickey" /var/log/auth.log | tail -20 # logins bem-sucedidos
sudo grep "Invalid user" /var/log/auth.log | tail -20 # usuários inválidos tentados
Ver sessões ativas
who # usuários conectados agora
w # mais detalhes sobre sessões ativas
last # histórico de logins
lastb # histórico de tentativas falhas
ss -tnp | grep :22 # conexões ativas na porta 22
Ver IPs que mais tentam acessar
sudo grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -20
Problemas comuns e soluções
“Connection refused”
# Verificar se o SSH está rodando
sudo systemctl status ssh
# Verificar se está na porta correta
sudo ss -tlnp | grep sshd
# Verificar o firewall
sudo ufw status
“Permission denied (publickey)”
# Verificar permissões no servidor
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# Verificar se a chave foi copiada corretamente
cat ~/.ssh/authorized_keys
# Testar com verbose para ver o problema
ssh -vvv usuario@servidor
“Host key verification failed” O servidor mudou de chave (reinstalação, por exemplo). Remova a entrada antiga:
ssh-keygen -R endereco-do-servidor
Conexão cai após ficar inativa Adicione ao ~/.ssh/config:
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
“Too many authentication failures”
ssh -o IdentitiesOnly=yes -i ~/.ssh/chave-correta usuario@servidor
Resumo — Referência rápida
| Comando | O que faz |
|---|---|
ssh usuario@servidor | Conectar ao servidor |
ssh -p 2222 usuario@servidor | Conectar em porta específica |
ssh-keygen -t ed25519 | Gerar par de chaves |
ssh-copy-id usuario@servidor | Copiar chave pública |
scp arquivo usuario@servidor:/destino | Copiar arquivo para servidor |
scp usuario@servidor:/arquivo ./ | Copiar arquivo do servidor |
sftp usuario@servidor | Transferência interativa |
rsync -avz pasta/ usuario@servidor:/destino | Sincronizar pasta |
ssh -L 8080:localhost:80 usuario@servidor | Túnel local |
ssh -D 1080 usuario@servidor | Proxy SOCKS |
ssh-add ~/.ssh/id_ed25519 | Adicionar chave ao agent |
sudo systemctl restart ssh | Reiniciar o servidor SSH |
sudo sshd -t | Testar configuração do servidor |
Dica final: A configuração mínima de segurança que todo servidor SSH deveria ter é: porta não padrão, login de root desabilitado e autenticação apenas por chave pública. Essas três mudanças eliminam 99% dos ataques automatizados. Configure o Fail2Ban como camada extra e você terá um servidor SSH sólido e seguro para uso profissional.
