Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

02 - Arquitetura Cliente-Servidor

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione 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 ssh no 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:

  1. Solicitação de Conexão: O Cliente inicia um Three-Way Handshake TCP voltado para a porta 22 do Servidor.
  2. 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).
  3. Troca de Chaves (KEX): Através de criptografia assimétrica, ambos geram uma chave de sessão compartilhada sem nunca enviá-la pela rede.
  4. Autenticação: O Servidor desafia o Cliente a provar sua identidade (via senha ou chave pública).
  5. 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 sshd faz 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_hosts para 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.