Capítulo 3 — Sistemas operacionais e identidades
Mapa da aula
Aula 03 publicada. Mapa, exemplo, EX009.
flowchart TD
N0["3.1 Privilégio mínimo"]
N1["3.2 Contêineres"]
N2["3.3 Identidades de serviços e de agentes"]
N3["3.4 Protegendo arquivos"]
N4["3.4b Aplicação de correções"]
N5["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5
N5 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX009"]
Desenho lógico
flowchart LR
N0["3.1 Privilégio mínimo"]
N1["3.2 Contêineres"]
N2["3.3 Identidades de serviços e de agentes"]
N3["3.4 Protegendo arquivos"]
N4["3.4b Aplicação de correções"]
N5["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> Q["EX009"]
[3.1 Privilégio mínimo]
|
v
[3.2 Contêineres]
|
v
[3.3 Identidades de serviços e de agentes]
|
v
[3.4 Protegendo arquivos]
|
v
[3.4b Aplicação de correções]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX009]
Objetivos de aprendizagem
Você vai (1) executar serviços de IA com contas de privilégio mínimo; (2) configurar contêineres com segurança; (3) gerenciar identidades de serviços e de agentes; (4) proteger arquivos de modelo e de configuração.
3.1 Privilégio mínimo
Cada serviço roda com seu próprio usuário, que não é root, e com acesso apenas ao que precisa. O serviço de recuperação lê o índice; ele não precisa das credenciais do banco de dados. O orquestrador lê seus arquivos de prompt; em produção, ele não precisa de permissão de escrita sobre eles. A verificação que Ana fez nos serviços do HelpBot encontrou duas violações disso. A conta de produção do orquestrador podia escrever nos arquivos de prompt, o que significava que qualquer pessoa que a comprometesse poderia mudar as instruções do HelpBot sem uma implantação. O serviço de recuperação tinha a senha do banco de dados de contas em seu ambiente, resto de um protótipo antigo que personalizava as respostas. Remover as duas coisas levou uma tarde. O teste seguinte foi simples: tentar a escrita e a conexão ao banco de dados com cada conta de serviço na homologação e registrar que ambas foram recusadas.
3.2 Contêineres
Use imagens de base mínimas; rode sem root; deixe os sistemas de arquivos somente leitura sempre que possível; descarte as capabilities desnecessárias; limite CPU e memória; restrinja o tráfego de saída. Atualize as imagens com regularidade e reconstrua-as, em vez de aplicar correções em contêineres em execução. No LineWatch, essas configurações tiveram efeitos concretos. Rodar sem root e montar o diretório do modelo como somente leitura significava que um processo comprometido não conseguiria substituir o arquivo do modelo. Limitar a memória impediu que um único lote de telemetria grande demais derrubasse o host. Restringir a saída significava que o contêiner podia alcançar o broker de telemetria e o serviço de registro, mas não a internet, de modo que um arquivo de modelo malicioso não conseguiria enviar dados para fora. Reconstruir em vez de corrigir no lugar manteve exato o manifesto de hashes, porque toda imagem vinha do mesmo pipeline.
3.3 Identidades de serviços e de agentes
Os serviços se autenticam uns com os outros com identidades próprias (certificados ou tokens). Quando o HelpBot age em nome de um cliente, a chamada de ferramenta deve levar a identidade do cliente, para que o serviço de ferramentas possa verificar se o roteador pertence a ele. Uma única conta de serviço com todos os poderes deixa qualquer pessoa que manipule o modelo agir com o poder dessa conta. Esse é o problema do representante confuso (confused deputy). No teste de Ana na homologação, o HelpBot chamava a ferramenta de reinicialização com uma única conta de serviço para todos os clientes, então a ferramenta não sabia de quem era o roteador que estava reiniciando, e 9 de 60 pedidos para reiniciar o roteador de outra conta de teste tiveram sucesso. Quando a chamada de ferramenta passou a levar a identidade do cliente e o serviço de ferramentas a compará-la com o titular do roteador no banco de dados de contas, as mesmas 60 tentativas falharam. A linha de registro de cada reinicialização agora nomeia o cliente, o que também torna as auditorias possíveis.
3.4 Protegendo arquivos
Arquivos de modelo, arquivos de prompt e configurações devem estar protegidos contra escrita em produção e ser verificados por hash na inicialização. Um arquivo alterado deve impedir o serviço de iniciar e gerar um alerta.
"""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
O laboratório mostra o que uma verificação dessas detecta. A mudança de um único byte em model.bin produz um hash completamente diferente, e o mesmo acontece ao acrescentar uma única linha, trust_remote_code: true, a config.yaml, o que deixaria o código de carregamento executar qualquer coisa que o pacote do modelo contenha. O arquivo do tokenizer, sem mudanças, continua indicando OK. Um manifesto só ajuda se estiver guardado num lugar que o usuário de implantação não possa editar; do contrário, quem puder trocar o modelo também poderá atualizar o hash esperado.
3.4b Aplicação de correções
Os serviços de IA dependem de muitas bibliotecas. Reconstrua as imagens quando saírem atualizações de segurança, teste-as na homologação e mantenha um registro das versões, para poder responder rapidamente se um aviso de segurança afeta você. No HelpBot, isso significa saber, para cada biblioteca, que imagem a contém e que versão está instalada. Quando chegou o aviso sobre a biblioteca de análise de documentos, a lista de versões permitiu que Ana respondesse em minutos que a imagem de ingestão do HelpBot era afetada e a do orquestrador não. Reconstruir a partir de uma imagem de base corrigida, rodar a bateria de testes do HelpBot na homologação e só então promover a imagem é mais lento que corrigir um contêiner em execução, mas mantém verdadeiros o manifesto de hashes da inicialização e o registro de versões.
3.5 Exemplo resolvido (caso sintético da Kestrel)
O LineWatch roda um modelo hospedado pela própria empresa. Ana descobre que o contêiner roda como root e que o diretório do modelo pode ser escrito pelo usuário de implantação. Ela muda o contêiner para um usuário sem root, monta o modelo como somente leitura e acrescenta uma verificação de hash na inicialização, como a do laboratório. Na implantação seguinte, uma divergência impede a inicialização: alguém havia copiado um modelo de teste para a produção. A verificação impediu uma mudança silenciosa. A divergência não era um ataque, mas a resposta foi a mesma que seria para um: parar, investigar e depois decidir. Ana comparou o hash do arquivo com o do modelo do ambiente de teste e encontrou correspondência exata, e o registro de implantação mostrou qual engenheiro o havia copiado. Como a inicialização foi recusada, o LineWatch continuou rodando o contêiner anterior até o arquivo correto ser restaurado, então nenhum alerta foi perdido. Sem a verificação, o LineWatch teria rodado por semanas com um modelo ajustado para dados de teste.
3.6 Erros e limites
Três erros são comuns: contêineres rodando como root; diretórios de modelo graváveis em produção; e ferramentas que aceitam a autoridade de uma conta de serviço para qualquer cliente. Cada um desses erros apareceu no caso da Kestrel antes de ser corrigido. O contêiner do LineWatch rodava como root, então qualquer código num modelo carregado teria controle total do contêiner. Seu diretório de modelo podia ser escrito pelo usuário de implantação, e foi assim que um modelo de teste chegou à produção. A ferramenta de reinicialização do HelpBot aceitava a autoridade da conta de serviço para qualquer cliente, o que permitiu que 9 de 60 tentativas de reinicialização entre contas tivessem sucesso na homologação. Em cada caso, a correção foi uma mudança de configuração, não um produto novo.
Exercícios
- EX009 — Permissões. Liste o que o orquestrador precisa e o que não precisa. Rubrica: 3 = precisa ler os prompts, chamar o modelo e as ferramentas; não precisa de credenciais do banco nem de escrita; 2 = parcial; 1 = vago; 0 = nada.
- EX010 — Configurações de contêiner. Escreva seis configurações de endurecimento de contêineres. Rubrica: 3 = seis pertinentes; 2 = quatro ou cinco; 1 = duas ou três; 0 = menos.
- EX011 — Identidade do agente. Explique por que as chamadas de ferramenta devem levar a identidade do cliente. Rubrica: 3 = verificações por cliente, representante confuso, auditoria; 2 = duas; 1 = uma; 0 = nenhuma.
- EX012 — Verificação de hash. O que o script de inicialização deve fazer diante de uma divergência? Rubrica: 3 = recusar a inicialização, alertar, registrar arquivo e hash; 2 = duas; 1 = uma; 0 = continuar.
Síntese
Privilégio mínimo, contêineres endurecidos, identidades por cliente e arquivos verificados limitam o que qualquer componente de IA pode fazer se se comportar mal.
Continue estudando — capítulo 03 de 18
← Capítulo 02 (rascunho) · Índice de capítulos do curso · Capítulo 04 (rascunho) →