02 - Arquitetura Cliente-Servidor
video: https://youtu.be/... no frontmatter da nota.Arquitetura Cliente-Servidor (SSH)
A arquitetura Cliente-Servidor é o modelo estrutural dominante do protocolo SSH, permitindo que o controle remoto e a transferência de dados ocorram de forma segura em redes inseguras. Diferente de modelos Peer-to-Peer (P2P), onde as máquinas possuem funções simétricas, o SSH estabelece uma distinção clara entre a entidade que solicita o acesso e a entidade que provê o serviço e os recursos.
1. Definição dos Papéis
No ecossistema SSH, a comunicação é sempre iniciada por um dos lados, estabelecendo uma hierarquia funcional:
- Servidor SSH (SSHD): É o hospedeiro (host) que disponibiliza o acesso. Ele executa um processo em segundo plano (o daemon
sshd) que "escuta" permanentemente por conexões em uma porta específica (padrão TCP 22). Sua função é autenticar solicitantes e criar sessões de shell ou túneis de dados. - Cliente SSH: É a aplicação utilizada pelo usuário (como
sshno terminal Linux/macOS ou o PuTTY no Windows) para iniciar a conexão. O cliente é responsável por validar a identidade do servidor e apresentar as credenciais de acesso.
2. Componentes de Software Comuns
| Papel | Software Linux | Software Windows | Software macOS |
|---|---|---|---|
| Servidor | OpenSSH sshd |
OpenSSH Server (Win10+) | Remote Login (built-in) |
| Cliente CLI | ssh, scp, sftp |
PuTTY, ssh (Win10+) |
ssh (built-in) |
| Cliente GUI | FileZilla, WinSCP | WinSCP, MobaXterm | Cyberduck, FileZilla |
3. O Fluxo de Interação
A arquitetura dita uma sequência rigorosa de eventos para garantir que o "aperto de mão" (handshake) seja bem-sucedido:
- Solicitação de Conexão: O Cliente inicia um Three-Way Handshake TCP voltado para a porta 22 do Servidor.
- Negociação de Protocolo: Servidor e Cliente trocam versões de software e capacidades criptográficas suportadas (algoritmos de troca de chave, cifras simétricas e MACs).
- Troca de Chaves (KEX): Através de criptografia assimétrica, ambos geram uma chave de sessão compartilhada sem nunca enviá-la pela rede.
- Autenticação: O Servidor desafia o Cliente a provar sua identidade (via senha ou chave pública).
- Abertura de Canal: Uma vez autenticado, o Servidor cria um ambiente de execução (Shell) para o Cliente.
4. Gerenciamento de Múltiplas Sessões
Uma característica fundamental desta arquitetura é a capacidade do Servidor de gerenciar centenas de conexões de Clientes simultâneos.
- Para cada conexão de cliente, o processo mestre
sshdfaz um "fork" (cria um processo filho) ou utiliza threads para isolar a sessão daquele usuário específico. - Isso garante que, se a sessão de um cliente falhar ou for encerrada, as demais conexões ativas no servidor não sejam afetadas.
Arquitetura de Processos do OpenSSH
PID 1000: sshd master (escuta porta 22, faz fork por conexão)
├── PID 1101: sshd-session (usuário alice)
│ └── PID 1102: bash (shell interativo)
├── PID 1201: sshd-session (usuário bob)
│ └── PID 1202: rsync (execução remota)
└── PID 1301: sshd-session (usuário alice, segunda sessão)
O processo mestre roda como root (para poder abrir a porta 22 e fazer setuid), enquanto os processos filhos fazem setuid para o usuário autenticado, aplicando o princípio do menor privilégio.
5. Localização e Identidade
Nesta arquitetura, a confiança é bidirecional, mas os métodos de identificação diferem:
- Identidade do Servidor: O servidor é identificado pela sua Host Key. O cliente armazena essa chave no arquivo
known_hostspara garantir que está se conectando ao servidor correto em acessos futuros. - Identidade do Cliente: O servidor identifica o cliente através do seu nome de usuário e método de autenticação (senha ou
authorized_keys).
Estrutura de Arquivos de Confiança
| Arquivo | Localização | Conteúdo |
|---|---|---|
known_hosts |
~/.ssh/ (cliente) |
Chaves públicas dos servidores confiáveis |
authorized_keys |
~/.ssh/ (servidor) |
Chaves públicas de clientes autorizados |
ssh_host_rsa_key |
/etc/ssh/ (servidor) |
Chave privada RSA do servidor |
ssh_host_rsa_key.pub |
/etc/ssh/ (servidor) |
Chave pública RSA do servidor |
sshd_config |
/etc/ssh/ (servidor) |
Configuração do daemon |
ssh_config |
/etc/ssh/ ou ~/.ssh/ (cliente) |
Configuração do cliente |
6. Aplicação da Arquitetura (CLI e Encaminhamento)
A separação entre cliente e servidor permite funcionalidades avançadas, como o X11 Forwarding. Neste cenário, o Servidor SSH (remoto) pode encaminhar a interface gráfica de uma aplicação para que ela seja renderizada no Cliente SSH (local), utilizando o túnel seguro já estabelecido. O Servidor atua como o motor de processamento, enquanto o Cliente atua como a interface de visualização.
Tipos de Encaminhamento (Forwarding)
| Tipo | Comando | Função |
|---|---|---|
| Local | ssh -L 8080:remoto:80 |
Porta local acessa serviço remoto via túnel |
| Remoto | ssh -R 8080:local:80 |
Porta remota acessa serviço local via túnel |
| Dinâmico | ssh -D 1080 |
Cria proxy SOCKS5 no cliente |
| X11 | ssh -X |
Encaminha aplicações gráficas X11 |
7. Segurança e Portabilidade
Como o software Cliente é independente do Servidor, é possível utilizar um cliente Linux para gerenciar um servidor rodando AIX, Solaris ou Windows, desde que ambos sigam as especificações do protocolo SSH-2. A arquitetura cliente-servidor isola a complexidade da rede, permitindo que o usuário interaja com o sistema remoto como se estivesse fisicamente sentado à frente dele.
8. Exemplo Prático: Conexão SSH com Chave
# Gerar par de chaves no cliente (algoritmo ed25519 recomendado)
ssh-keygen -t ed25519 -C "alice@empresa.com"
# Copiar chave pública para o servidor (método manual)
ssh-copy-id alice@servidor.empresa.com
# Conectar usando chave (se senha desativada no servidor)
ssh -i ~/.ssh/id_ed25519 alice@servidor.empresa.com
# Verificar fingerprint do servidor antes de aceitar
ssh-keyscan servidor.empresa.com | ssh-keygen -lf -
9. Hardening Recomendado (sshd_config)
| Diretiva | Valor Recomendado | Justificativa |
|---|---|---|
Port |
22 ou porta customizada | Reduz varreduras automáticas |
PermitRootLogin |
no |
Força uso de usuário comum + sudo |
PasswordAuthentication |
no |
Apenas chaves (elimina brute force) |
PubkeyAuthentication |
yes |
Habilita autenticação por chave |
MaxAuthTries |
3 |
Limita tentativas por sessão |
AllowUsers |
alice bob |
Whitelist de usuários permitidos |
Protocol |
2 |
Apenas SSH-2 (SSH-1 obsoleto e inseguro) |
ClientAliveInterval |
300 |
Detecta conexões mortas em 5 min |
PermitEmptyPasswords |
no |
Nunca permitir senhas vazias |
10. Diferença entre SSH-1 e SSH-2
| Característica | SSH-1 | SSH-2 |
|---|---|---|
| Ano | 1995 | 2006 (RFC 4251-4254) |
| Algoritmos | DES, 3DES, RSA | AES, ChaCha20, Ed25519, ECDSA |
| Troca de chave | Estática | Diffie-Hellman a cada sessão |
| Múltiplos canais | Não | Sim (multiplexação) |
| Status | Obsoleto | Padrão atual |
11. Conclusão
A arquitetura cliente-servidor do SSH é o alicerce que possibilita administração remota segura em escala global. Compreender a separação de papéis, o fluxo de handshake, o gerenciamento de processos e os mecanismos de confiança mútua é indispensável para administradores de sistemas, engenheiros DevOps e analistas de segurança. A robustez do SSH decorre diretamente desta arquitetura assimétrica, que permite centralizar responsabilidades (servidor), manter isolamento (processos filhos) e oferecer portabilidade entre plataformas heterogêneas, tudo sobre um canal cifrado fim-a-fim.