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:

Como funciona a autenticação SSH:

MétodoComo funcionaSegurança
SenhaDigite usuário e senha⭐⭐ Média
Chave pública/privadaPar de chaves criptográficas⭐⭐⭐⭐⭐ Muito alta
Certificado SSHAssinado 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:


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

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

ComandoO que faz
ssh usuario@servidorConectar ao servidor
ssh -p 2222 usuario@servidorConectar em porta específica
ssh-keygen -t ed25519Gerar par de chaves
ssh-copy-id usuario@servidorCopiar chave pública
scp arquivo usuario@servidor:/destinoCopiar arquivo para servidor
scp usuario@servidor:/arquivo ./Copiar arquivo do servidor
sftp usuario@servidorTransferência interativa
rsync -avz pasta/ usuario@servidor:/destinoSincronizar pasta
ssh -L 8080:localhost:80 usuario@servidorTúnel local
ssh -D 1080 usuario@servidorProxy SOCKS
ssh-add ~/.ssh/id_ed25519Adicionar chave ao agent
sudo systemctl restart sshReiniciar o servidor SSH
sudo sshd -tTestar 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.


Deixe um comentário