◇ OpenCyber Academy
Técnico · Capítulo 3 · Português

Capítulo 3 — Sistemas operacionais e identidades

Ensino gratuito e aberto para quem deseja proteger pessoas e tecnologias. Não é preciso criar uma conta para estudar ou consultar as respostas.

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

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) →