03 - Sessão SSH
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:
- Cliente abre canal com
window_size = 2097152(2 MB). - Servidor envia dados até esgotar a janela.
- Quando a janela chega a zero, servidor para de enviar.
- Cliente consome os dados e envia
SSH_MSG_CHANNEL_WINDOW_ADJUSTpara aumentar a janela. - 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.
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".