Sobre nós Guias Projetos Contactos
Админка
please wait

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:

  1. Acesso Seguro: Comunicação encriptada para servidores remotos
  2. Autenticação por Chave: Eliminar vulnerabilidades associadas a palavras-passe
  3. Port Forwarding: Aceder a serviços internos de forma segura
  4. Transferência de Ficheiros: SFTP e SCP para cópias seguras
  5. 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

  1. Use chaves Ed25519: Modernas, seguras e rápidas
  2. Configure ~/.ssh/config: Simplifique ligações complexas
  3. Desative a autenticação por palavra-passe: Use apenas chaves nos servidores
  4. Use o SSH agent: Evite a fadiga de passphrases
  5. Domine o tunneling: Aceda a serviços internos de forma segura
  6. 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.

 
 
 
Языки
Темы
Copyright © 1999 — 2026
ZK Interactive