O SSH (Secure Shell) é o protocolo padrão para acesso remoto seguro a servidores e sistemas Unix-like. Ele criptografa toda a comunicação entre o cliente e o servidor, protegendo contra interceptação e ataques. Nesta aula, vamos explorar os comandos essenciais para conectar-se a máquinas remotas e transferir arquivos com segurança, além de entender a autenticação por chaves e as boas práticas de uso.

Dominar SSH e as ferramentas associadas é fundamental para administradores de sistemas, desenvolvedores e qualquer pessoa que precise gerenciar servidores remotos. Você aprenderá a conectar, copiar arquivos e automatizar tarefas de forma eficiente e segura.

ssh

O comando ssh permite estabelecer uma sessão interativa em um servidor remoto. A sintaxe básica é ssh usuário@host. Por padrão, ele usa a porta 22, mas pode ser alterada com a opção -p. Durante a primeira conexão, o cliente exibe a impressão digital do servidor para verificação, e você pode aceitá-la para armazená-la no arquivo ~/.ssh/known_hosts.

Além de abrir um shell remoto, o SSH pode executar comandos diretamente sem entrar na sessão interativa, o que é útil para scripts e automação. Por exemplo, ssh usuário@host 'comando' executa o comando no servidor e retorna a saída localmente.

Exemplo básico de conexão:

# Conectar a um servidor remoto
ssh usuario@192.168.1.100

# Executar um comando remoto sem entrar no shell
ssh usuario@192.168.1.100 'uptime'

# Conectar em uma porta diferente (ex.: 2222)
ssh -p 2222 usuario@exemplo.com

# Ativar modo verboso para depuração
ssh -v usuario@exemplo.com

O SSH também oferece opções para encaminhamento de portas (túnel), permitindo acessar serviços internos de forma segura. Por exemplo, ssh -L 8080:localhost:80 usuario@servidor redireciona o tráfego da porta local 8080 para a porta 80 do servidor.

scp e rsync

Para transferir arquivos entre máquinas, temos duas ferramentas principais: scp (secure copy) e rsync. O scp é simples e direto, mas não possui recursos avançados como sincronização incremental. O rsync é mais poderoso, permitindo transferências incrementais, compressão e preservação de atributos.

scp copia arquivos ou diretórios inteiros. A sintaxe é similar ao cp, mas com a especificação de host. Para copiar um arquivo local para o remoto: scp arquivo usuario@host:/caminho/destino. Para copiar do remoto para o local, inverta a ordem.

Exemplos de scp:

# Copiar arquivo local para o servidor
scp /home/user/documento.txt usuario@192.168.1.100:/tmp/

# Copiar diretório recursivamente (-r)
scp -r /home/user/pasta usuario@192.168.1.100:/home/usuario/

# Copiar do servidor para o local
scp usuario@192.168.1.100:/var/log/syslog ./

# Usar porta diferente
scp -P 2222 arquivo usuario@exemplo.com:/destino/

rsync é mais eficiente para grandes volumes de dados, pois transfere apenas as diferenças entre arquivos. Ele também pode preservar permissões, timestamps e links simbólicos. A sintaxe básica: rsync [opções] origem destino. Para transferência remota, use user@host:/caminho.

Exemplos de rsync:

# Sincronizar diretório local para remoto
rsync -avz /home/user/projeto/ usuario@192.168.1.100:/backup/projeto/

# Sincronizar do remoto para local
rsync -avz usuario@192.168.1.100:/var/www/ ./www-backup/

# Usar opção --delete para remover arquivos que não existem mais na origem
rsync -avz --delete /origem/ usuario@host:/destino/

# Compressão e progresso (-z para compressão, --progress para mostrar progresso)
rsync -az --progress arquivo usuario@host:/destino/

Enquanto scp é suficiente para cópias pontuais, rsync é preferível para backups e sincronizações periódicas.

Chaves SSH (visão geral)

A autenticação por senha é vulnerável a ataques de força bruta. Uma alternativa mais segura é usar chaves SSH (pares de chave pública/privada). A chave privada fica no cliente, enquanto a pública é instalada no servidor em ~/.ssh/authorized_keys.

Para gerar um par de chaves, use ssh-keygen. O comando cria os arquivos id_ed25519 (privada) e id_ed25519.pub (pública) por padrão, mas você pode escolher outros algoritmos como RSA. É recomendável proteger a chave privada com uma frase secreta (passphrase).

Depois de gerar, copie a chave pública para o servidor com ssh-copy-id. Esse comando instala a chave automaticamente no arquivo authorized_keys do usuário remoto.

Exemplo de geração e instalação:

# Gerar par de chaves (algoritmo Ed25519)
ssh-keygen -t ed25519 -C "comentario@exemplo.com"

# Copiar chave pública para o servidor
ssh-copy-id usuario@192.168.1.100

# Verificar a chave pública
cat ~/.ssh/id_ed25519.pub

Com as chaves configuradas, você pode conectar-se sem digitar senha (a menos que a chave privada tenha passphrase). Para maior segurança, use um agente SSH (ssh-agent) para armazenar a chave descriptografada em memória.

Boas práticas

SSH é poderoso, mas exige cuidados. Algumas boas práticas incluem desabilitar o login por senha no servidor (após configurar chaves), usar autenticação por chave, alterar a porta padrão (embora não seja uma segurança forte, reduz ruído), e restringir o acesso por IP com firewalls.

Também é importante manter o software SSH atualizado, usar frases secretas fortes para chaves, e nunca compartilhar chaves privadas. Para automação, considere usar ssh-agent e opções como ControlMaster para multiplexar conexões.

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

# Alias para um servidor
Host meu-servidor
    HostName 192.168.1.100
    User usuario
    Port 22
    IdentityFile ~/.ssh/id_ed25519

Com esse arquivo, você pode conectar apenas com ssh meu-servidor.

Referências

Exercícios

  1. Escreva o comando SSH para conectar-se a um servidor na porta 2222 com o usuário 'admin' no IP 10.0.0.5.
  2. ✓ Resposta:
    ssh -p 2222 admin@10.0.0.5
  3. Copie o arquivo local 'backup.tar.gz' para o diretório /home/user/backups/ no servidor 'meuserver.com' usando scp.
  4. ✓ Resposta:
    scp backup.tar.gz usuario@meuserver.com:/home/user/backups/
  5. Use rsync para sincronizar o diretório local 'projeto/' com o diretório remoto '~/backup/projeto/' no servidor 'servidor', preservando permissões e mostrando progresso.
  6. ✓ Resposta:
    rsync -avz --progress projeto/ usuario@servidor:~/backup/projeto/
  7. Explique a diferença entre autenticação por senha e por chave SSH.
  8. ✓ Resposta: A autenticação por senha exige que o usuário digite uma senha a cada conexão, que pode ser interceptada ou adivinhada. A autenticação por chave usa um par de chaves criptográficas: a chave privada fica no cliente e a pública no servidor. É mais segura, pois não transmite segredos pela rede e é resistente a ataques de força bruta.
  9. Qual comando você usaria para gerar um par de chaves SSH com algoritmo Ed25519 e depois copiá-la para um servidor? Escreva os dois comandos.
  10. ✓ Resposta:
    ssh-keygen -t ed25519
    ssh-copy-id usuario@servidor

Observações Finais

O SSH é uma ferramenta indispensável no dia a dia de quem administra sistemas. Além dos comandos vistos, explore recursos como encaminhamento de portas, agentes SSH e multiplexação para otimizar seu fluxo de trabalho. Sempre priorize a segurança: use chaves, desative senhas quando possível e mantenha tudo atualizado.