Capítulo 6 — Sistemas operacionais e virtualização
Mapa da aula
Aula 06 publicada. Mapa, exemplo, EX016.
flowchart TD
N0["6.1 Processos e permissões"]
N1["6.2 Contêineres e máquinas virtuais"]
N2["6.3 Sandbox para código gerado"]
N3["6.4 Arquivos de modelos em repouso"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4
N4 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX016"]
Desenho lógico
flowchart LR
N0["6.1 Processos e permissões"]
N1["6.2 Contêineres e máquinas virtuais"]
N2["6.3 Sandbox para código gerado"]
N3["6.4 Arquivos de modelos em repouso"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX016"]
[6.1 Processos e permissões]
|
v
[6.2 Contêineres e máquinas virtuais]
|
v
[6.3 Sandbox para código gerado]
|
v
[6.4 Arquivos de modelos em repouso]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX016]
Objetivos de aprendizagem
Você vai (1) explicar processos, usuários, permissões de arquivos e isolamento; (2) usar contêineres e máquinas virtuais para isolar componentes de IA; (3) isolar em sandbox o código gerado ou executado por ferramentas de IA; e (4) proteger arquivos de modelos em repouso.
6.1 Processos e permissões
Todo serviço roda como um processo sob uma conta de usuário. Se o orquestrador roda como root, um bug se torna um comprometimento completo do sistema. Rode cada componente com seu próprio usuário de baixo privilégio, com acesso de leitura apenas aos arquivos de que precisa. No Ask Brightwell, o orquestrador, o serviço de recuperação e os serviços de ferramentas rodam cada um sob sua própria conta, de modo que um bug no orquestrador não consegue ler diretamente o banco de dados de pedidos. A conta da ferramenta de pedidos pode ler pedidos, mas não alterá-los, e a conta da ferramenta de devoluções pode criar devoluções, mas não pode ler outras tabelas. Jonas confirma isso na homologação enviando uma consulta à tabela de pedidos com a conta do orquestrador e verificando que o banco de dados a recusa.
6.2 Contêineres e máquinas virtuais
Contêineres empacotam um serviço com suas dependências e o isolam usando recursos do kernel; máquinas virtuais isolam com mais força, com um kernel separado. Rode servidores de modelo, recuperação e serviços de ferramentas em contêineres separados, com imagens mínimas, sistemas de arquivos somente leitura sempre que possível e nenhum acesso de rede desnecessário. No CodePilot, o servidor do modelo hospedado internamente roda em seu próprio contêiner, com sistema de arquivos somente leitura, de modo que um servidor comprometido não consegue reescrever os arquivos do modelo. Os serviços de ferramentas do Ask Brightwell ficam em contêineres separados, com regras de rede que permitem apenas ao orquestrador chamá-los. Imagens separadas também deixam claro qual componente precisa de qual segredo.
6.3 Sandbox para código gerado
Assistentes de programação e agentes com uma ferramenta de "executar código" executam texto produzido por um modelo — texto que um atacante pode influenciar. Rode esse código numa sandbox descartável: sem rede por padrão, sem acesso a segredos, com limites de CPU e memória, um tempo-limite e destruição após o uso. O botão original de "executar testes" do CodePilot violava todas essas regras: rodava o código gerado num servidor de compilação compartilhado que tinha chaves de implantação. O novo desenho inicia um contêiner novo para cada execução, sem rede, sem segredos e com tempo-limite, e o destrói depois. Um comentário plantado ainda pode moldar o código, mas o código já não alcança nada de valor.
6.4 Arquivos de modelos em repouso
Arquivos de pesos de modelos podem ser trocados ou adulterados. Alguns formatos (por exemplo, arquivos baseados em pickle do Python) podem executar código quando carregados. Prefira formatos que armazenam apenas tensores, verifique os hashes antes de carregar e restrinja quem pode gravar nos diretórios de modelos.
"""Lab H: integrity of model artefacts with SHA-256 manifests (stdlib only).
Creates synthetic 'artefact' bytes, records a manifest, then detects a
one-byte tampering and a swapped file. No real models are involved."""
import hashlib, json
files = {"model.bin": bytes(range(256)) * 40, "tokenizer.json": b'{"vocab": ["a", "b"]}',
"config.yaml": b"layers: 4\nheads: 8\n"}
manifest = {n: hashlib.sha256(b).hexdigest() for n, b in files.items()}
print(json.dumps({k: v[:16] for k, v in manifest.items()}, indent=1))
received = dict(files)
tampered = bytearray(received["model.bin"]); tampered[5000] ^= 1
received["model.bin"] = bytes(tampered)
received["config.yaml"] = b"layers: 4\nheads: 8\ntrust_remote_code: true\n"
for n, b in sorted(received.items()):
ok = hashlib.sha256(b).hexdigest() == manifest[n]
print(f"{n:15s} {'OK' if ok else 'MISMATCH'}")
Saída esperada:
{
"model.bin": "e96760a87768717b",
"tokenizer.json": "f63d2ddabc61f2d9",
"config.yaml": "e5bbb570ca0fcb87"
}
config.yaml MISMATCH
model.bin MISMATCH
tokenizer.json OK
Para o modelo hospedado internamente do CodePilot, a Brightwell guarda o hash esperado de cada arquivo no controle de versão, e o carregador se recusa a iniciar se algum arquivo for diferente. Apenas a conta do pipeline de implantação pode gravar no diretório de modelos, e ela registra cada gravação, de modo que um arquivo trocado seria ao mesmo tempo bloqueado e visível.
6.5 Exemplo resolvido (caso sintético da Brightwell)
O CodePilot oferece um botão de "executar testes" que roda o código gerado num servidor de compilação compartilhado com acesso a chaves de implantação. Jonas mostra, numa cópia, que um comentário num arquivo de código aberto baixado pode levar o assistente a escrever código que imprime as variáveis de ambiente. Ele move a execução para um contêiner descartável, sem rede e sem segredos, e acrescenta verificações de hash para os arquivos do modelo hospedado internamente; o laboratório mostra como um arquivo alterado é detectado. O comentário plantado não precisou explorar nada: bastou persuadir o assistente, e o acesso do servidor de compilação fez o resto.
6.6 Erros e limites
Três erros são comuns: serviços rodando como root; executar código gerado por modelo em máquinas compartilhadas; e carregar arquivos de modelos sem verificações de integridade. O desenho original do CodePilot tinha o segundo erro, e o orquestrador anterior do Ask Brightwell corria o risco do primeiro. As mudanças deste capítulo dão a cada serviço sua própria conta, movem o código gerado para um contêiner descartável e verificam os hashes dos arquivos do modelo antes de carregá-los. Cada erro é barato de evitar quando um serviço é construído e caro de corrigir quando outros sistemas já dependem dele. O pipeline agora executa uma verificação para cada erro em toda implantação.
Exercícios
- EX016 — Menor privilégio. Liste as permissões de que o serviço de recuperação precisa e as de que não precisa. Rubrica: 3 = ler o índice, rede só até o orquestrador; sem gravação, sem segredos; 2 = parcial; 1 = vago; 0 = nenhum.
- EX017 — Sandbox. Especifique cinco configurações de sandbox para a ferramenta de código de um agente. Rubrica: 3 = sem rede, sem segredos, CPU/memória, tempo-limite, descartável; 2 = quatro; 1 = duas; 0 = nenhuma.
- EX018 — Laboratório de hash. O que deve acontecer quando o laboratório indica MISMATCH para model.bin? Rubrica: 3 = recusar o carregamento, alertar, investigar a origem; 2 = dois; 1 = um; 0 = carregar mesmo assim.
Síntese
O isolamento no sistema operacional limita o que um componente de IA comprometido pode fazer: contas de menor privilégio, contêineres, sandboxes descartáveis e arquivos de modelos verificados.
Continue estudando — capítulo 06 de 30
← Capítulo 05 (rascunho) · Índice de capítulos do curso · Capítulo 07 (rascunho) →