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@servidor

Isso 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@servidor

O 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@servidor

Ao 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_ed25519

Depois, 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 destino

Exemplo: 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 AllowUsers ou 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.log ou journalctl).

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

Exercícios

  1. Gere um par de chaves SSH Ed25519 com comentário e frase secreta.

    ✓ Resposta:
    ssh-keygen -t ed25519 -C "seu-email@exemplo.com"
    O comando solicitará o local do arquivo (padrão ~/.ssh/id_ed25519) e a frase secreta. Digite uma frase forte.
  2. Conecte-se a um servidor remoto usando uma chave específica na porta 2222.

    ✓ Resposta:
    ssh -p 2222 -i ~/.ssh/id_ed25519 usuario@servidor
  3. Copie um diretório local para um servidor remoto usando scp recursivamente.

    ✓ Resposta:
    scp -r /caminho/local/diretorio usuario@servidor:/caminho/remoto/
  4. 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/
  5. 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:
    Host meuservidor
        HostName 192.168.1.100
        Port 2222
        User admin
        IdentityFile ~/.ssh/id_ed25519
    Depois, use ssh meuservidor para conectar.