Módulo 2 · 2.3
Utilizar o SSH de forma inteligente
Módulo 2: SSH e chaves · Tempo de leitura: 10 minutos
Objetivo de aprendizagem: Após esta lição, saberá utilizar o SSH no dia a dia de forma prática com um ficheiro de configuração próprio, copiar ficheiros com scp e rsync e aceder a uma base de dados através de um túnel, sem que a porta da base de dados tenha de estar aberta para a Internet.
Conceitos-chave: ~/.ssh/config, Host, HostName, User, IdentityFile, scp, rsync, sftp, port forwarding (reencaminhamento de portas), -L, túnel, ProxyJump, ServerAliveInterval, outro número de porta, revogar uma chave
Escrever menos com ~/.ssh/config
Ao fim de algumas semanas, estará a escrever isto dezenas de vezes por dia:
anna@laptop:~$ ssh -i ~/.ssh/id_ed25519 anna@192.0.2.10Com um ficheiro de configuração para o cliente, o comando fica mais curto e comete menos erros. O ficheiro encontra-se no seu próprio computador: ~/.ssh/config (Windows: C:\Users\anna\.ssh\config, sem extensão).
Host web1
HostName 192.0.2.10
User anna
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
Host test
HostName test.example.com
User anna
Port 2222Agora basta:
anna@laptop:~$ ssh web1
anna@web1:~$O que fazem estas linhas?
- Host é a alcunha que o próprio escolhe. É o que escreve a seguir a
ssh,scpersync. - HostName é o endereço real: um endereço IP ou um nome que consta do DNS.
- User e Port são o nome de utilizador e a porta, para que já não tenha de os memorizar.
- IdentityFile indica a chave. É útil se tiver várias chaves; sem esta linha, o ssh experimenta as suas chaves predefinidas.
- ServerAliveInterval 60 envia a cada 60 segundos um pequeno sinal de vida. Muitos routers domésticos e redes wifi cortam uma ligação inativa ao fim de poucos minutos; assim, a sua sessão mantém-se aberta.
Também aqui conta o primeiro valor, tal como no servidor. Coloque, por isso, regras gerais como Host * no fim do ficheiro.
Copiar ficheiros: scp, rsync e sftp
O scp copia um ficheiro, com a mesma forma que cp, mas com host: antes:
anna@laptop:~$ scp backup.sql web1:/home/anna/
anna@laptop:~$ scp web1:/var/log/nginx/error.log .O rsync é mais inteligente com pastas e grandes quantidades de dados: envia apenas o que foi alterado e consegue retomar uma cópia interrompida. Tem de estar instalado em ambos os lados (apt install rsync).
anna@laptop:~$ rsync -avz --progress ./site/ web1:/var/www/example.com/Atenção à barra a seguir a ./site/: com barra, o rsync copia o conteúdo da pasta; sem barra, copia a própria pasta (obtém então /var/www/example.com/site/). Em caso de dúvida, experimente primeiro com --dry-run e tenha muito cuidado com --delete, que apaga no lado de destino tudo o que não existe no seu lado.
O sftp e programas gráficos como o FileZilla ou o WinSCP utilizam a mesma ligação SSH e a mesma chave. Não é, portanto, necessário um servidor FTP à parte. Um servidor FTP tradicional num VPS é desaconselhado: o FTP simples envia a sua palavra-passe pela rede sem encriptação.
Um túnel em vez de uma porta aberta
Esta é talvez a coisa mais útil que o SSH consegue fazer. Imagine que no seu servidor corre uma base de dados PostgreSQL e que pretende aceder-lhe a partir do seu portátil com um programa gráfico. A tentação de abrir a porta 5432 para a Internet é grande. Não o faça: portas de bases de dados abertas são uma das maiores causas de fugas de dados (lição 10.2), e o curso verifica mais tarde, a partir do exterior, que estão fechadas (exercício Z5.1).
Com o reencaminhamento de porta local (local port forwarding), o SSH cria um túnel:
anna@laptop:~$ ssh -L 5432:127.0.0.1:5432 web1Leia isto como: "escutar no meu portátil na porta 5432 e enviar tudo o que lá chegar, através da ligação SSH, para 127.0.0.1:5432, visto a partir do servidor". Enquanto esta sessão estiver aberta, liga o seu programa de base de dados a localhost porta 5432 no seu próprio portátil e chega à base de dados no servidor.
O que torna isto tão bom?
- A base de dados escuta apenas em
127.0.0.1no servidor e é inacessível a partir do exterior. - A ligação é encriptada pelo SSH, mesmo que a própria base de dados não tenha encriptação.
- Só quem consegue iniciar sessão por SSH lhe consegue aceder. Utiliza, portanto, a forte proteção que já tem.
Se já houver algo a correr na porta 5432 do seu portátil, escolha outro número à esquerda: -L 15432:127.0.0.1:5432, e ligue-se à porta 15432. Se colocar o túnel em ~/.ssh/config, tê-lo-á sempre à mão:
Host web1-db
HostName 192.0.2.10
User anna
LocalForward 15432 127.0.0.1:5432Com ssh -N web1-db obtém apenas o túnel, sem linha de comandos.
Através de um servidor intermédio: ProxyJump
Por vezes só é possível chegar a um servidor através de outro, por exemplo um servidor de base de dados sem endereço IP público por trás do seu servidor web. O ProxyJump salta através do primeiro servidor para o segundo:
Host db1
HostName 10.0.0.5
User anna
ProxyJump web1A diferença em relação ao agent forwarding (lição 2.1): com o ProxyJump, a encriptação vai de ponta a ponta entre o seu portátil e db1. O servidor intermédio limita-se a passar os pacotes e não pode utilizar a sua chave.
Outro número de porta: sim ou não?
Muitos guias recomendam colocar o SSH noutra porta, por exemplo 2222. O que faz isso realmente?
- Reduz o ruído: a maioria das tentativas automatizadas de adivinhar credenciais experimenta apenas a porta 22. O seu registo fica mais calmo.
- Não é uma medida de segurança. Um scanner que percorra todas as portas encontra o SSH em segundos pelo seu banner de versão.
Com chaves e o início de sessão por palavra-passe desativado (lição 2.2), a porta pouco importa para a segurança. Se mesmo assim quiser mudar, faça-o pela ordem certa: abrir a nova porta na firewall, pôr o SSH a escutar em ambas as portas, testar numa segunda janela e só então fechar a porta antiga. No Ubuntu 24.04 e posteriores, isso inclui systemctl daemon-reload e systemctl restart ssh.socket (lição 2.2). Não se esqueça de que o seu fornecedor pode também ter uma firewall.
Revogar o acesso
Um antigo colega ou um programador web tinha uma chave no seu servidor e já não trabalha para si? Revogar o acesso é simples, desde que mantenha o registo:
- Veja todas as chaves:
ssh-keygen -lf ~/.ssh/authorized_keys, e faça-o para cada utilizador (incluindo/root/.ssh/authorized_keys). - Remova a linha dessa pessoa.
- Se utilizava uma conta de utilizador própria, bloqueie-a (lição 3.1) e verifique se pertencia ao grupo
sudo(lição 3.2). - Se viu palavras-passe, como a palavra-passe de uma base de dados num ficheiro de configuração, substitua-as também.
Uma chave comum não tem data de validade. O que não remover continua a funcionar, mesmo anos depois. Se der acesso temporário a alguém, pode colocar a opção expiry-time="20261231" antes da linha dessa pessoa em authorized_keys; depois dessa data, o servidor recusa a chave.
Resumo
~/.ssh/configno seu próprio computador guarda, por servidor, o nome, o utilizador, a porta e a chave;Host *fica no fim.- scp para ficheiros individuais, rsync para pastas (atenção à barra e a
--delete), sftp em vez de FTP. - Com
ssh -Lacede a uma base de dados através de um túnel encriptado, enquanto a porta da base de dados continua fechada ao exterior. - O ProxyJump salta com segurança através de um servidor intermédio; é melhor do que o agent forwarding.
- Outro número de porta reduz o ruído, mas não protege. As chaves que não remover continuam a funcionar.
Questionário
Exercício
Exercício O2.3: Uma configuração SSH e um túnel. Crie no seu próprio computador um ~/.ssh/config com uma alcunha para o seu servidor, inicie sessão apenas com ssh <bijnaam>, copie um ficheiro com scp ou rsync e crie um túnel com -L para um serviço que no seu servidor escuta apenas em 127.0.0.1 (se ainda não tiver uma base de dados, utilize a porta 22 do próprio servidor: ssh -L 2200:127.0.0.1:22 <bijnaam> e depois ssh -p 2200 anna@localhost). Responda às perguntas sobre o que o túnel faz e porque é que a porta não precisa de estar aberta.
Exercício O2.3: Uma configuração SSH e um túnel
Este exercício faz você mesmo; ninguém o verifica. Assinale o que já fez e marque o exercício como concluído.
O seu portátil escuta na porta da esquerda, o tráfego passa cifrado pelo SSH e chega ao servidor em 127.0.0.1:<poort>. O serviço continua inacessível a partir do exterior. Outra porta SSH reduz o ruído no seu registo, mas não é segurança; chaves e o início de sessão por palavra-passe desativado, sim.
As suas marcações e notas ficam apenas neste navegador; não as enviamos para lado nenhum. Se tiver sessão iniciada, guardamos em Os meus cursos apenas que concluiu o exercício.
Para saber mais
Os passos destes artigos aplicam-se aos VPS e painéis da WebOké; noutros fornecedores, o funcionamento é semelhante.
- Iniciar sessão no seu VPS com SSH (e criar uma chave SSH)
- Manual do ssh_config (definições do cliente): https://man.openbsd.org/ssh_config
- Manual do ssh (opções
-L,-J,-N): https://man.openbsd.org/ssh - Revogar o acesso SSH ao seu VPS de um antigo colaborador ou de um portátil perdido
- VPS: do primeiro início de sessão a um servidor seguro 2.4: Uma configuração SSH: iniciar sessão com um nome curto
