SSH e acesso remoto
Esta aula aborda o uso de SSH para acesso remoto seguro em ambientes DevOps, incluindo a geração e gerenciamento de chaves SSH, conexão remota, transferência de arquivos com scp e rsync, e boas práticas de segurança.
O SSH (Secure Shell) é um protocolo de rede que permite acesso remoto seguro a servidores e sistemas, sendo fundamental em ambientes DevOps para administração de servidores, automação de deploys e transferência de arquivos. Nesta aula, você aprenderá a configurar e utilizar chaves SSH para autenticação, estabelecer conexões seguras, transferir arquivos com scp e rsync, e adotar boas práticas de segurança.
Dominar o SSH é essencial para qualquer profissional de DevOps, pois grande parte das operações em infraestrutura como código, CI/CD e gerenciamento de servidores depende de acesso remoto seguro. Vamos explorar desde a geração de chaves até técnicas avançadas de sincronização e hardening.
Chaves SSH
As chaves SSH são um par de arquivos criptográficos (pública e privada) que permitem autenticação sem senha. A chave privada fica no cliente (sua máquina) e nunca deve ser compartilhada; a chave pública é copiada para os servidores que você deseja acessar. Esse método é mais seguro que senhas, pois utiliza criptografia assimétrica.
Para gerar um par de chaves, use o comando ssh-keygen. Por padrão, ele cria chaves RSA de 2048 bits. Recomenda-se usar algoritmos mais modernos como Ed25519, que oferece melhor segurança e desempenho.
ssh-keygen -t ed25519 -C "seu-email@exemplo.com"O comando acima gera uma chave Ed25519 com um comentário (geralmente seu e-mail). Você pode especificar o local do arquivo (padrão: ~/.ssh/id_ed25519) e uma frase secreta (passphrase) para proteger a chave privada.
Após gerar as chaves, copie a chave pública para o servidor usando ssh-copy-id:
ssh-copy-id usuario@servidorIsso adiciona a chave pública ao arquivo ~/.ssh/authorized_keys do usuário no servidor, permitindo login sem senha.
Conexão segura
Uma vez configuradas as chaves, você pode conectar-se a um servidor remoto usando o comando ssh. A sintaxe básica é:
ssh usuario@servidorO SSH usa criptografia para proteger a sessão, garantindo confidencialidade e integridade dos dados transmitidos. Você também pode especificar opções como porta (-p), identidade (-i) e encaminhamento de portas (-L, -R).
Exemplo de conexão com porta não padrão e chave específica:
ssh -p 2222 -i ~/.ssh/id_ed25519 usuario@servidorAo conectar pela primeira vez, o SSH exibe a impressão digital do servidor. Verifique-a com o administrador para evitar ataques Man-in-the-Middle. Você pode configurar o arquivo ~/.ssh/config para simplificar conexões frequentes, definindo aliases, portas e chaves padrão.
Host meuservidor
HostName 192.168.1.100
Port 2222
User usuario
IdentityFile ~/.ssh/id_ed25519Depois, basta usar ssh meuservidor.
scp e rsync
O SCP (Secure Copy) é um comando que copia arquivos entre máquinas usando SSH. Sintaxe:
scp [opções] origem destinoExemplo: copiar um arquivo local para o servidor:
scp /caminho/local/arquivo.txt usuario@servidor:/caminho/remoto/Para copiar diretórios recursivamente, use -r.
Já o rsync é uma ferramenta mais avançada que sincroniza arquivos e diretórios, transferindo apenas as diferenças (delta encoding). Ele também usa SSH como transporte. Exemplo básico:
rsync -avz /caminho/local/ usuario@servidor:/caminho/remoto/Opções comuns: -a (archive, preserva atributos), -v (verbose), -z (compressão), --delete (remove arquivos no destino que não existem na origem).
Exemplo com exclusão de arquivos:
rsync -avz --exclude='*.log' /origem/ usuario@servidor:/destino/O rsync é ideal para backups e deploys incrementais, pois reduz tempo e largura de banda.
Boas práticas
Para manter seu ambiente SSH seguro, siga estas recomendações:
- Desative o login por senha no servidor (edite
/etc/ssh/sshd_config:PasswordAuthentication no). - Use chaves com frase secreta (passphrase) ou um agente SSH (
ssh-agent) para gerenciar chaves. - Altere a porta padrão (22) para uma porta não padrão (ex.: 2222) para reduzir ataques automatizados.
- Restrinja o acesso por IP usando
AllowUsersou firewall (iptables, ufw). - Mantenha o servidor atualizado com patches de segurança.
- Use autenticação de dois fatores (2FA) quando possível.
- Revogue chaves comprometidas imediatamente removendo-as de
authorized_keys. - Monitore logs de autenticação (
/var/log/auth.logoujournalctl).
Além disso, considere usar ferramentas como Fail2ban para bloquear IPs com múltiplas tentativas falhas e bastion hosts para acessar redes privadas.
Referências
- OpenSSH Manual
- SSH Key Generation - SSH.com
- scp man page
- rsync man page
- SSH Essentials - DigitalOcean
- Top 20 SSH Security Best Practices - nixCraft
Exercícios
- Gere um par de chaves SSH Ed25519 com comentário e frase secreta.✓ Resposta:
O comando solicitará o local do arquivo (padrão ~/.ssh/id_ed25519) e a frase secreta. Digite uma frase forte.ssh-keygen -t ed25519 -C "seu-email@exemplo.com" - Conecte-se a um servidor remoto usando uma chave específica na porta 2222.✓ Resposta:
ssh -p 2222 -i ~/.ssh/id_ed25519 usuario@servidor - Copie um diretório local para um servidor remoto usando scp recursivamente.✓ Resposta:
scp -r /caminho/local/diretorio usuario@servidor:/caminho/remoto/ - Use rsync para sincronizar um diretório local com um remoto, excluindo arquivos .tmp e deletando arquivos que não existem mais na origem.✓ Resposta:
rsync -avz --delete --exclude='*.tmp' /local/ usuario@servidor:/remoto/ - Configure o arquivo ~/.ssh/config para conectar-se ao servidor 'meuservidor' com hostname 192.168.1.100, porta 2222, usuário 'admin' e chave ~/.ssh/id_ed25519.✓ Resposta:
Depois, useHost meuservidor HostName 192.168.1.100 Port 2222 User admin IdentityFile ~/.ssh/id_ed25519ssh meuservidorpara conectar.