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

03 - Sessão SSH

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

A Sessão SSH é o período de tempo entre o estabelecimento da conexão segura e o seu encerramento. Uma das características mais poderosas do protocolo SSH é a sua capacidade de gerenciar múltiplos canais lógicos dentro de uma única conexão TCP física.

1. Ciclo de Vida da Sessão

A sessão SSH passa por quatro fases principais:
1. Conexão TCP: Estabelecida na porta 22 (ou outra porta configurada).
2. Handshake de Transporte: Onde o servidor se autentica para o cliente e as chaves de criptografia são trocadas.
3. Autenticação do Usuário: Onde o cliente prova que tem permissão para acessar o servidor.
4. Canais de Comunicação: Uma vez autenticado, a sessão entra em modo operacional, abrindo canais conforme a necessidade do usuário.

Detalhamento das Fases

A fase 1 (TCP) é trivial — uma conexão TCP/22 com o servidor. A fase 2 (Transporte) envolve a troca de versões, negociação de algoritmos criptográficos, troca de chaves Diffie-Hellman e derivação das 6 chaves de sessão. A fase 3 (Autenticação) ocorre dentro do túnel cifrado, protegendo credenciais. A fase 4 é o foco deste documento: a camada de conexão (Connection Layer), definida na RFC 4254.

2. Canais Multiplexados (RFC 4254)

Diferente do Telnet ou do FTP original, o SSH permite que você abra vários "Canais" lógicos ao mesmo tempo sobre a mesma conexão segura:

  • Canal de Shell (Session Channel): Usado para a linha de comando interativa.
  • Canal de Execução (Exec Channel): Usado pelo comando ssh servidor "ls -l" para rodar um comando e fechar imediatamente.
  • Canal de Tunelamento (Port Forwarding): Redireciona portas locais ou remotas através do túnel.
  • Canal de Subsistema: Usado por serviços como o SFTP para transferência de arquivos.
  • Canal X11: Permite redirecionar aplicativos gráficos do servidor para o cliente (forward X11).

Estrutura de um Canal

Cada canal possui:

  • Sender Channel Number: Identificador único atribuído pelo lado que abre o canal.
  • Initial Window Size: Quantos bytes o canal pode receber antes de pedir mais.
  • Maximum Packet Size: Tamanho máximo de cada pacote dentro do canal.
  • Channel Type: String identificando o tipo (session, x11, forwarded-tcpip, direct-tcpip).

3. Tipos de Canais Detalhados

A. Session Channel (session)

Tipo mais comum, usado para qualquer comunicação interativa ou não-interativa. Pode conter sub-tipos:

  • Shell: Inicia um shell de login padrão (/bin/bash).
  • Exec: Executa um comando específico e encerra.
  • Subsystem: Inicia um subsistema registrado no servidor (ex: sftp).
# Exemplo de exec command
ssh usuario@servidor "uptime"

# Exemplo de shell interativo
ssh usuario@servidor

B. X11 Channel (x11)

Permite rodar aplicativos gráficos X11 do servidor SSH na máquina cliente. Configurado com ForwardX11 yes em ~/.ssh/config ou -X/-Y na linha de comando:

ssh -X usuario@servidor "xterm"

O servidor X11 local exibe a janela do aplicativo remoto.

C. Direct TCP/IP Channel (direct-tcpip)

Usado para port forwarding local. O cliente SSH abre um canal no servidor pedindo para conectar-se a um host:porta remotos.

# Acesso ao MySQL remoto via túnel SSH
ssh -L 3306:localhost:3306 usuario@servidor

A partir desse momento, conectar em localhost:3306 na máquina local equivale a conectar em localhost:3306 no servidor remoto.

D. Forwarded TCP/IP Channel (forwarded-tcpip)

Usado para port forwarding remoto (reverse tunnel). O servidor SSH abre um canal para o cliente, conectando-se a um host:porta locais ao servidor.

# Expõe porta do cliente para o servidor
ssh -R 8080:localhost:80 usuario@servidor

A partir desse momento, conexões em servidor:8080 são redirecionadas para cliente:80.


4. Gestão de Canais e Encerramento

Cada canal possui seu próprio identificador (número do canal) e janelas de controle de fluxo individuais. Isso garante que, se um canal for bloqueado por uma transferência lenta, os outros canais continuem funcionando.

Controle de Fluxo (Windowing)

O SSH implementa um mecanismo de janela deslizante para controle de fluxo:

  1. Cliente abre canal com window_size = 2097152 (2 MB).
  2. Servidor envia dados até esgotar a janela.
  3. Quando a janela chega a zero, servidor para de enviar.
  4. Cliente consome os dados e envia SSH_MSG_CHANNEL_WINDOW_ADJUST para aumentar a janela.
  5. Servidor volta a enviar.

Esse mecanismo evita que um canal lento (ex: terminal humano digitando) bloqueeie a conexão inteira, enquanto outro canal (ex: SFTP transferindo arquivo) pode usar toda a banda.

Encerramento Amigável

  • O cliente envia uma mensagem de fechamento de canal (SSH_MSG_CHANNEL_CLOSE). Quando todos os canais são fechados, a conexão TCP é finalizada.
  • Encerramento gracioso é importante para que o servidor libere recursos (PID do shell, memória do canal) corretamente.

Interrupção

Se a rede cair ou o processo for morto, os canais são perdidos, mas a segurança do túnel de transporte garante que nenhum lixo de dados vaze para a rede.


5. Multiplexação de Conexão (ControlPersist)

O OpenSSH permite reutilizar uma conexão SSH existente para múltiplos logins, sem precisar refazer o handshake a cada vez. Configuração no ~/.ssh/config:

Host *
  ControlMaster auto
  ControlPath ~/.ssh/cm-%r@%h:%p
  ControlPersist 10m

Vantagens:
- Velocidade: Segundo login é instantâneo (sem handshake, sem KEX, sem auth).
- Recursos: Compartilha o mesmo túnel TCP, economizando sockets.
- Desvantagem: Se a conexão master cair, todos os "slave" caem juntos.


6. Comandos Práticos de Diagnóstico

  • ssh -v servidor: Mostra processo completo de handshake, KEX e abertura de canal.
  • ssh -vv servidor: Detalha ainda mais, incluindo pacotes individuais.
  • ssh -vvv servidor: Nível máximo de debug.
  • ss -tnp | grep :22: Lista conexões SSH ativas no servidor.
  • pkill -SIGUSR1 sshd: Força gravação de debug em runtime.

Tip

Você pode abrir múltiplos terminais em uma única conexão SSH usando ferramentas de multiplexação de terminal como o TMUX ou o Screen, mantendo suas sessões vivas mesmo se você se desconectar do servidor.

7. Resumo Técnico

Atributo Valor
RFC Connection Layer 4254
Tipos de canal session, x11, direct-tcpip, forwarded-tcpip
Controle de fluxo Janela deslizante por canal
Multiplexação TCP Sim (múltiplos canais sobre 1 TCP)
ControlPersist Reutilização de conexão OpenSSH
Port forwarding Local (-L), Remoto (-R), Dinâmico (-D SOCKS)

8. Conclusão

A sessão SSH é uma arquitetura elegante: uma única conexão TCP serve para múltiplos canais lógicos independentes, cada um com seu próprio controle de fluxo e tipo de comunicação. Isso permite, num mesmo túnel cifrado, rodar um shell interativo, transferir arquivos via SFTP e estabelecer port forwards locais e remotos simultaneamente. Compreender o modelo de canais da RFC 4254 é fundamental para explorar todo o poder do SSH além do simples "shell remoto".