SSH (Secure Shell) é a base da administração segura de servidores. Para além da funcionalidade básica de login, o SSH disponibiliza funcionalidades poderosas para tunneling, port forwarding e transferência segura de ficheiros. Este guia aborda configurações essenciais de SSH e técnicas avançadas na perspetiva de um programador sénior.
Porquê Dominar o SSH
A proficiência em SSH permite:
- Acesso Seguro: Comunicação encriptada para servidores remotos
- Autenticação por Chave: Eliminar vulnerabilidades associadas a palavras-passe
- Port Forwarding: Aceder a serviços internos de forma segura
- Transferência de Ficheiros: SFTP e SCP para cópias seguras
- Jump Hosts: Atravessar fronteiras de rede em segurança
Gestão de Chaves SSH
Gerar Chaves SSH
# Ed25519 moderno (recomendado)
ssh-keygen -t ed25519 -f ~/.ssh/project_name -C "[email protected]"
# RSA para servidores mais antigos
ssh-keygen -t rsa -b 4096 -f ~/.ssh/project_name -C "[email protected]"
Ficará com dois ficheiros:
~/.ssh/project_name - Chave privada (manter secreta)~/.ssh/project_name.pub - Chave pública (partilhar livremente)
Copiar a Chave para o Servidor
# Método automatizado
ssh-copy-id -i ~/.ssh/project_name user@hostname
# Método manual
cat ~/.ssh/project_name.pub | ssh user@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Definir as Permissões Corretas
chmod 700 ~/.ssh
chmod 600 ~/.ssh/project_name
chmod 644 ~/.ssh/project_name.pub
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/config
Ficheiro de Configuração SSH
Crie ~/.ssh/config para ligações mais convenientes:
# Default settings for all hosts
Host *
AddKeysToAgent yes
IdentitiesOnly yes
ServerAliveInterval 60
ServerAliveCountMax 3
# Production server
Host prod
HostName 192.168.1.100
User admin
Port 22
IdentityFile ~/.ssh/production_key
# Staging with non-standard port
Host staging
HostName staging.example.com
User deploy
Port 2222
IdentityFile ~/.ssh/staging_key
# Jump through bastion host
Host internal-server
HostName 10.0.0.50
User admin
ProxyJump bastion
Host bastion
HostName bastion.example.com
User jumpuser
IdentityFile ~/.ssh/bastion_key
# Development with forwarding
Host dev
HostName dev.example.com
User developer
LocalForward 3306 localhost:3306
LocalForward 6379 localhost:6379
Agora, ligue-se com comandos simples:
ssh prod
ssh staging
ssh internal-server
Túneis SSH e Port Forwarding
Port Forwarding Local
Aceda a serviços remotos como se fossem locais:
# Encaminhar local:8080 para remoto:80
ssh -L 8080:localhost:80 user@server
# Aceder à base de dados remota localmente
ssh -L 3306:localhost:3306 user@server
# Aceder ao serviço na rede remota
ssh -L 8080:internal-db:5432 user@bastion
Agora, localhost:8080 liga-se ao serviço remoto.
Port Forwarding Remoto
Exponha serviços locais ao servidor remoto:
# Tornar local:3000 acessível no remoto:8080
ssh -R 8080:localhost:3000 user@server
Os utilizadores remotos podem aceder a server:8080 para chegar à sua app local.
Port Forwarding Dinâmico (Proxy SOCKS)
Crie um proxy SOCKS através de SSH:
ssh -D 1080 user@server
Configure o browser/aplicação para usar o proxy SOCKS5 em localhost:1080.
Túnel SSH para Acesso a Base de Dados
Aceda a uma base de dados que só permite ligações a partir de localhost:
# MySQL
ssh -L 3306:127.0.0.1:3306 user@db-server
mysql -h 127.0.0.1 -P 3306 -u dbuser -p
# PostgreSQL
ssh -L 5432:127.0.0.1:5432 user@db-server
psql -h 127.0.0.1 -p 5432 -U dbuser database
Túnel Persistente com autossh
Mantenha os túneis ativos automaticamente:
# Instalar autossh
sudo apt install autossh
# Criar túnel persistente
autossh -M 0 -f -N -L 3306:localhost:3306 user@server
Aceder a Serviços Apenas em Localhost
Alguns serviços (como o phpMyAdmin) só aceitam ligações a partir de localhost. Use tunneling via SSH:
ssh -N -L 8080:127.0.0.1:80 -i key.pem user@server
Aceda via http://localhost:8080 no seu browser.
SSHFS - Montar Sistemas de Ficheiros Remotos
Monte diretórios remotos localmente:
# Instalar sshfs
sudo apt install sshfs
# Montar diretório remoto
sshfs user@server:/remote/path /local/mount -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3
# Com seguir symlinks
sshfs user@server:/remote/path /local/mount -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,follow_symlinks
# Desmontar
fusermount -u /local/mount
SSH Agent
Gira chaves sem ter de introduzir repetidamente a passphrase:
# Iniciar o agent
eval "$(ssh-agent -s)"
# Adicionar chave
ssh-add ~/.ssh/project_name
# Listar chaves carregadas
ssh-add -l
# Remover todas as chaves
ssh-add -D
Guardar Passphrases no Agent
Adicione a ~/.ssh/config:
Host *
AddKeysToAgent yes
UseKeychain yes # macOS only
Reforço de Segurança do Lado do Servidor
Configuração Segura do Daemon SSH
Edite /etc/ssh/sshd_config:
# Disable root login
PermitRootLogin no
# Disable password authentication
PasswordAuthentication no
ChallengeResponseAuthentication no
# Use only SSH Protocol 2
Protocol 2
# Restrict to specific users/groups
AllowUsers admin deploy
AllowGroups ssh-users
# Limit authentication attempts
MaxAuthTries 3
# Set idle timeout
ClientAliveInterval 300
ClientAliveCountMax 2
# Disable empty passwords
PermitEmptyPasswords no
# Disable X11 forwarding if not needed
X11Forwarding no
# Use strong ciphers only
Ciphers [email protected],[email protected]
MACs [email protected],[email protected]
KexAlgorithms curve25519-sha256,[email protected]
Reinicie o SSH após as alterações:
sudo systemctl restart sshd
Restringir Root a IPs Específicos
# In /etc/ssh/sshd_config
Match Address 10.0.0.0/8
PermitRootLogin yes
Restringir a Utilização de Chaves por IP de Origem
Em ~/.ssh/authorized_keys:
from="192.168.1.100,10.0.0.0/24" ssh-ed25519 AAAAC3... user@host
SSH Através de Proxy
Proxy HTTP
# A usar netcat
ssh -o ProxyCommand='nc -X connect -x proxy:3128 %h %p' user@server
# No ficheiro de configuração
Host server
ProxyCommand nc -X connect -x proxy:3128 %h %p
Proxy SOCKS
ssh -o ProxyCommand='nc -X 5 -x localhost:1080 %h %p' user@server
Resolução de Problemas
Depurar Problemas de Ligação
# Saída verbosa
ssh -v user@server
# Mais verboso
ssh -vv user@server
# Verbosity máxima
ssh -vvv user@server
Erros Comuns de Permissões
# Erro «Permissions are too open»
chmod 600 ~/.ssh/private_key
# «Host key verification failed»
ssh-keygen -R hostname # Remover chave de host antiga
Timeout de Ligação
# Aumentar o timeout de ligação
ssh -o ConnectTimeout=30 user@server
# Manter a ligação ativa
ssh -o ServerAliveInterval=60 user@server
Transferência Segura de Ficheiros
SCP
# Copiar para remoto
scp local_file user@server:/remote/path/
# Copiar a partir do remoto
scp user@server:/remote/file ./local/
# Copiar diretório recursivamente
scp -r ./local/dir user@server:/remote/
SFTP
sftp user@server
# Comandos interativos: get, put, ls, cd, mkdir, rm
Rsync sobre SSH
rsync -avz -e ssh ./local/ user@server:/remote/
Principais Conclusões
- Use chaves Ed25519: Modernas, seguras e rápidas
- Configure
~/.ssh/config: Simplifique ligações complexas - Desative a autenticação por palavra-passe: Use apenas chaves nos servidores
- Use o SSH agent: Evite a fadiga de passphrases
- Domine o tunneling: Aceda a serviços internos de forma segura
- Reforce os servidores: Limite utilizadores, desative root, use cifras fortes
O SSH é muito mais do que apenas login remoto — é um kit de ferramentas de rede seguro que, quando dominado, melhora drasticamente tanto a segurança como a produtividade.