SSH (Secure Shell) é um protocolo de rede que permite acesso remoto seguro a sistemas, criptografando toda a comunicação entre cliente e servidor. É ferramenta essencial para administradores de sistemas e profissionais DevOps, pois possibilita gerenciar servidores, executar comandos e transferir arquivos de forma segura.

Nesta aula, você aprenderá a configurar chaves SSH, conectar-se a servidores remotos, transferir arquivos com scp e rsync, e adotar boas práticas para manter seu ambiente seguro.

Chaves SSH

As chaves SSH são um par de arquivos (chave privada e chave pública) que autenticam um usuário sem necessidade de senha. A chave privada fica no cliente (nunca compartilhada), e a pública é instalada no servidor. Quando o cliente tenta se conectar, o servidor usa a chave pública para criptografar um desafio que só pode ser decifrado pela chave privada.

Para gerar um par de chaves, use o comando ssh-keygen. Por padrão, ele cria chaves RSA de 3072 bits (ou 2048 em versões antigas). Você pode especificar o tipo (-t rsa, -t ed25519) e o tamanho (-b 4096). O ED25519 é recomendado por ser mais rápido e seguro.

# Gerar chave RSA de 4096 bits
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -C "seu@email.com"

# Gerar chave ED25519
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C "seu@email.com"

Após gerar, você terá dois arquivos: id_rsa (privada) e id_rsa.pub (pública). A chave pública deve ser copiada para o servidor. O comando ssh-copy-id facilita isso:

ssh-copy-id -i ~/.ssh/id_rsa.pub usuario@servidor

Isso adiciona a chave pública ao arquivo ~/.ssh/authorized_keys do servidor.

Conexão segura

Com as chaves instaladas, você pode conectar-se ao servidor sem senha:

ssh usuario@servidor

Se a porta SSH não for a padrão (22), use -p:

ssh -p 2222 usuario@servidor

Para maior segurança, desabilite o login por senha no servidor editando /etc/ssh/sshd_config:

# Desabilitar login por senha
PasswordAuthentication no

# Desabilitar login root
PermitRootLogin no

Reinicie o serviço SSH: sudo systemctl restart sshd.

Use o arquivo de configuração ~/.ssh/config para simplificar conexões frequentes:

Host meuservidor
    HostName 192.168.1.100
    Port 2222
    User admin
    IdentityFile ~/.ssh/id_ed25519

Depois, basta digitar ssh meuservidor.

scp e rsync

scp (secure copy) copia arquivos entre hosts usando SSH. Exemplo:

# Copiar arquivo local para servidor
scp arquivo.txt usuario@servidor:/caminho/destino/

# Copiar diretório recursivamente
scp -r pasta/ usuario@servidor:/caminho/destino/

rsync é mais avançado: sincroniza arquivos e pastas de forma eficiente, copiando apenas diferenças. É ideal para backups e deploys.

# Sincronizar diretório local para servidor
rsync -avz pasta/ usuario@servidor:/caminho/destino/

# Sincronizar do servidor para local
rsync -avz usuario@servidor:/caminho/origem/ pasta/

Explicação das flags: -a (arquivo, preserva permissões, dono, etc.), -v (verbose), -z (compressão). Para deletar arquivos no destino que não existem na origem, use --delete (cuidado!).

Boas práticas

  • Use chaves fortes: Prefira ED25519 ou RSA de pelo menos 4096 bits.
  • Proteja a chave privada: Defina permissão 600 (chmod 600 ~/.ssh/id_rsa) e nunca a compartilhe.
  • Use frase secreta (passphrase): Adicione uma ao gerar a chave para proteger contra roubo. O ssh-agent pode armazená-la temporariamente.
  • Desabilite autenticação por senha: Após configurar chaves, desligue PasswordAuthentication no servidor.
  • Restrinja acesso por IP: Use AllowUsers e Match Address no sshd_config.
  • Mude a porta padrão (22): Isso reduz ataques automatizados.
  • Mantenha o software atualizado: Atualize o OpenSSH regularmente.
  • Use agent forwarding com cautela: Evite ssh -A em hosts não confiáveis.

Referências

Exercícios

  1. Gere um par de chaves SSH ED25519 com comentário "devops@exemplo.com" e liste os arquivos criados.

    ✓ Resposta: Comando:
    ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C "devops@exemplo.com"
    Os arquivos criados são ~/.ssh/id_ed25519 (privada) e ~/.ssh/id_ed25519.pub (pública).
  2. Copie sua chave pública para um servidor remoto e conecte-se sem senha.

    ✓ Resposta: Use ssh-copy-id usuario@servidor e depois ssh usuario@servidor. Se não tiver ssh-copy-id, manualmente:
    cat ~/.ssh/id_ed25519.pub | ssh usuario@servidor "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
  3. Configure o arquivo ~/.ssh/config para conectar ao host "dev-server" na porta 2222 com usuário "admin".

    ✓ Resposta: Adicione ao ~/.ssh/config:
    Host dev-server
        HostName 192.168.1.100
        Port 2222
        User admin
        IdentityFile ~/.ssh/id_ed25519
    Depois conecte com ssh dev-server.
  4. Use scp para copiar o diretório local "logs/" para o servidor remoto em /var/backups.

    ✓ Resposta:
    scp -r logs/ usuario@servidor:/var/backups/
  5. Use rsync para sincronizar o diretório local "projeto/" com o servidor remoto em ~/projeto, deletando arquivos que não existem mais localmente.

    ✓ Resposta:
    rsync -avz --delete projeto/ usuario@servidor:~/projeto/
    Cuidado: --delete remove arquivos no destino que não estão na origem.