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

02 - Implementada via Processos

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

Implementada via Processos

1. Definição e Contexto

A Camada de Aplicação é a única camada do modelo OSI que não reside dentro do Kernel do sistema operacional. Enquanto o processamento de quadros (L2), roteamento de pacotes (L3) e controle de sessão TCP/UDP (L4) acontece dentro do kernel space, as aplicações de rede (HTTP, SSH, SMTP, DNS) executam como processos de usuário no user space. Esta é uma decisão arquitetural central do design Unix moderno: isolar falhas de aplicação do núcleo do sistema operacional, garantindo que um crash no Nginx não derrube o servidor inteiro (e vice-versa).

Características Fundamentais

  • Execução como processo: Cada servidor de aplicação é um processo com PID próprio, sujeito ao escalonamento do SO.
  • Chamada de sistema (syscall): Toda comunicação com a pilha de rede do Kernel ocorre via syscalls (socket, bind, listen, accept, recv, send).
  • Isolamento de memória: Cada processo tem seu espaço de endereçamento virtual próprio — não há compartilhamento direto entre servidores web e de e-mail, mesmo coexistindo no mesmo host.
  • RFC de referência: RFC 1123 (Requirements for Internet Hosts — Application and Support), que define como aplicacões devem se portar em relação à pilha TCP/IP.

2. User Space vs Kernel Space

A separação de privilégios é o pilar da resiliência corporativa. A pilha TCP/IP do Kernel é o "motorista" dos pacotes; as aplicações em user space são os "passageiros" que só recebem os bytes depois de tratados.

Aspecto Kernel Space User Space
Privilégio Ring 0 (supervisor) Ring 3 (usuário)
Acesso direto a hardware Sim Não (via syscall)
Pilha TCP/IP Aqui (sk_buff, netfilter) Não
Aplicações (nginx, postfix) Não Aqui
Falha catastrófica Kernel panic SIGSEGV, core dump
Tolerância a bugs Baixíssima Alta (reinicia processo)

Fluxo de um pacote entrante

  1. NIC recebe o quadro e dispara IRQ.
  2. Driver do Kernel copia o pacote para sk_buff e passa para a pilha IP.
  3. IP entrega ao TCP (porta de destino é consultada).
  4. TCP encontra o socket vinculado à porta e copia os dados para o buffer de recepção do socket.
  5. Aplicação em user space é acordada (via epoll_wait, select ou read bloqueante) e lê os bytes.
  6. Aplicação interpreta L7 (ex.: parseia um GET /index.html HTTP/1.1).

3. Modelos de Concorrência

Servidores de alta escala utilizam diferentes estratégias para gerenciar milhares de conexões simultâneas. A escolha do modelo impacta diretamente latência, throughput e consumo de memória.

Comparativo de Modelos

Modelo Processo representativo Memória/conexão Escalabilidade Complexidade
Multi-Process (fork) Apache MPM prefork ~2-8 MB Baixa (~centenas) Baixa
Multi-Threaded Apache MPM worker, IIS ~64-256 KB Média (~milhares) Média
Event-driven (epoll/kqueue) Nginx, Node.js, Redis ~8-32 KB Alta (~dezenas de milhares) Alta
Async I/O (io_uring) Redpanda, Caddy moderno ~4-16 KB Muito alta Muito alta

Multi-Processo (fork)

Cada nova conexão gera um processo-filho via fork(). Exemplo: Apache MPM prefork. É seguro (falha de um filho não afeta outros) mas caro: cada processo tem sua própria tabela de páginas, heap, file descriptors.

Multi-Threaded

Um único processo gerencia múltiplas threads. Threads compartilham heap e file descriptors, reduzindo consumo de memória. O risco é que um segfault em uma thread derruba o processo inteiro.

Event-driven (epoll)

Um único processo monitora milhares de sockets via epoll (Linux) ou kqueue (BSD). Quando dados chegam em qualquer socket, o Kernel acorda o processo com a lista de sockets prontos. É o modelo do Nginx, Redis, Node.js, HAProxy — padrão de facto para servidores modernos de alta concorrência.

io_uring (Linux 5.1+)

Interface assíncrona moderna baseada em ring buffers compartilhados entre user space e kernel, eliminando syscalls por operação de I/O. Adotada por bancos de dados modernos como Redpanda e ScyllaDB.

4. Segurança e Isolamento de Processos

Para analistas de segurança, a implementação via processos é o que define o raio de ação de um atacante após comprometer um serviço.

Princípio do Menor Privilégio

Servidores como Nginx e Postfix iniciam como root apenas para fazer bind() em portas < 1024, e então "abandonam" privilégios via setuid() para usuários como www-data ou nobody. Isso limita o dano caso a aplicação seja explorada.

Mecanismos de Isolamento

Mecanismo Camada Foco
chroot Syscall Sistema de arquivos
Namespaces (Linux) Kernel PID, rede, mount, UTS, IPC, user
Cgroups v2 Kernel CPU, memória, IO, rede
Seccomp-BPF Kernel Filtro de syscalls permitidas
AppArmor / SELinux LSM Políticas MAC
Containers (Docker/Podman) User space Namespaces + cgroups + imagens

Chroot

Altera o diretório raiz aparente do processo, impedindo acesso a arquivos fora da "jail". Limitação: não isola PID, rede ou usuários —已被 superseded por containers.

Namespaces e Containers

Containers (Docker, Podman, LXC) combinam namespaces (isolamento de visão) e cgroups (limites de recursos). Um container "enxerga" apenas seus próprios processos, interfaces de rede virtuais e limites de CPU/memória. É o padrão moderno para deploy de microserviços.

Seccomp-BPF

Filtra quais syscalls um processo pode invocar. Docker, por padrão, bloqueia ~44 syscalls perigosas (como kexec_load, pivot_root, swapon), reduzindo drasticamente a superfície de ataque do kernel.

5. Auditoria e Diagnóstico de Processos de Rede

# Listar processos que escutam em portas TCP/UDP (com PID e usuário)
sudo ss -tulpn

# Identificar usuário e UID dono de um socket específico
sudo ps -o pid,user,uid,comm -p $(sudo lsof -t -i :22)

# Monitorar consumo (CPU/RAM) de um processo de rede em tempo real
top -p $(pidof nginx)

# Verificar árvore de processos de daemons multi-process
pstree -p $(pidof apache2)

# Rastrear syscalls de rede de um processo (debug avançado)
sudo strace -f -e trace=network -p $(pidof nginx)

# Listar capacidades (Linux capabilities) de um binário
getcap /usr/sbin/nginx

# Verificar namespaces de um processo (containers)
sudo ls -l /proc/$(pidof nginx)/ns/

# Inspeção de arquivos abertos por uma aplicação de rede
sudo lsof -p $(pidof sshd) | head -30

6. Aplicações Práticas em Cenários Reais

Servidor Web Moderno

Um servidor Nginx típico roda com 1 processo master (root, apenas para bind na 443) e N workers (usuário nginx, via epoll). Em um host com 8 cores, configura-se worker_processes auto; para gerar 8 workers, cada um capaz de tratar milhares de conexões simultâneas com poucos MB de RAM.

Servidor de E-mail (Postfix)

Arquitetura multi-processo modulada: master (root) coordena smtpd (recebe), qmgr (fila), smtp (envia), cleanup, local/virtual (entrega). Cada componente roda como usuário postfix isolado. Comprometer o smtpd não compromete a entrega local.

Banco de Dados

PostgreSQL usa processo por conexão (fork). Em servidores com milhares de conexões simultâneas, recomenda-se usar poolers como PgBouncer (modo transaction pooling) para reutilizar conexões.

7. Resumo Técnico

Atributo Valor
Camada OSI 7 (Application)
Espaço de execução User Space (Ring 3)
Comunicação com Kernel Syscalls (socket/bind/accept/recv/send)
Isolamento de memória Sim (espaço de endereçamento virtual)
Modelo de concorrência dominante Event-driven (epoll/kqueue/io_uring)
Mecanismos de isolamento chroot, namespaces, cgroups, seccomp, LSM
RFC de referência RFC 1123

8. Conclusão

A implementação da Camada de Aplicação via processos é a garantia de que a inteligência de rede possa evoluir com segurança, modularidade e tolerância a falhas. A correta escolha do modelo de concorrência (multi-processo, threads, evento ou io_uring) somada ao uso disciplinado de isolamento (chroot, containers, seccomp) e ao princípio do menor privilégio (drop privileges, capabilities) define a resiliência da infraestrutura. Para administradores e analistas de segurança, dominar a vida de cada processo, suas syscalls e o mapeamento entre portas e PIDs é pré-requisito para auditoria, hardening e resposta a incidentes.