Permission Manager
Regras com prioridade resource → tool → level. Default leitura, escrita exige regra explícita. Mudanças em configuração sensível emitem evento de policy change tipado.
Defesa em profundidade, por arquitetura. Cada camada tem código auditável e comportamento verificável.
A segurança do DEILE não é configuração. É arquitetura. Cada camada existe no código e pode ser auditada — e cada gap conhecido está documentado nas decisões e referenciado adiante na página.
Regras com prioridade resource → tool → level. Default leitura, escrita exige regra explícita. Mudanças em configuração sensível emitem evento de policy change tipado.
Gate por nível de risco (low / moderate / high / critical) antes de ações irreversíveis. Mensagens diretas, menções de cargo, comandos potencialmente destrutivos passam por aqui.
Eventos tipados via enum. Toda execução de ferramenta, todo policy change, todo bloqueio do loop guard vira linha JSON estruturada — nunca formato livre.
Detecta padrões de GitHub (ghp_/gho_/ghu_/ghs_/ghr_/github_pat_) e GitLab (glpat-/gldt-/glptt-/glsoat-), além de chaves AWS, tokens Discord/Slack e chaves de provedores LLM. Redação automática no session store.
Aborta turnos em runaway por 4 regras simultâneas (teto, repetição idêntica, janela móvel, sem progresso). Emite evento SUSPICIOUS_ACTIVITY auditado.
Cada pod roda como usuário não-root, sistema de arquivos raiz somente leitura, todas as capacidades do Linux dropadas, seccomp default. Imagem baked (COPY no Dockerfile, nada montado).
Tudo bloqueado por padrão. Ingress restrito por label de pod. Egress permite DNS e HTTPS 443 (não RFC1918), mitigando pivot lateral — o controle por host é aplicado em camada de aplicação.
Secrets do Kubernetes são montadas em /run/secrets, modo 0600, nunca como variáveis de ambiente — o que impede leitura via /proc/<pid>/environ por processos vizinhos.
O guarda fica entre o agente e cada chamada de tool. Quando detecta padrão de runaway, aborta o turno e emite um evento auditado. Vale para o tool-loop interativo e para os três provedores não-streaming.
Toda sessão tem um número máximo de tool calls. Ultrapassou, aborta.
Mesma tool com mesmos argumentos por 3 turnos seguidos — sinal claro de loop. Aborta.
Repetição alta em janela curta detecta loops parciais. Aborta.
Sequência longa de tools retornando vazio ou erro indica thrashing. Aborta.
Mandar uma mensagem direta para alguém, mencionar um cargo no Discord, executar uma operação destrutiva — antes de qualquer uma dessas, o pipeline pede aprovação classificada por nível de risco.
tool dangerous │ ▼ approval_system.request_approval(risk_level) │ ├─ LOW → auto-aprovado em auto bypass (configurável) ├─ MODERATE → aprovação humana esperada ├─ HIGH → aprovação obrigatória + log de motivação └─ CRITICAL → aprovação obrigatória + segunda confirmação │ ▼ executar ou abortar + audit
/proc/<pid>/environ.
Kubernetes Secret │ ▼ volumeMounts (defaultMode 0600) /run/secrets/<role>/<name> │ ▼ wrapper lê o arquivo no boot processo do wrapper recebe o valor em variável local │ ├─ wrapper popula os.environ APENAS o tempo necessário p/ bootstrap dos providers │ ▼ bootstrap_providers() consome processo do agente roda SEM o valor no environ │ └─ exceção controlada: tokens de SDK que exigem permanência (ex.: cliente Discord) continuam em variável de processo, NÃO em arquivo
Variáveis de ambiente são visíveis por qualquer processo do mesmo usuário via /proc.
Mantê-las em arquivos com modo restrito impede leitura por processos vizinhos no mesmo namespace.
O processo do agente ainda PODE ler o arquivo (ele tem permissão por desenho — precisa carregar a credencial). A defesa é contra processos laterais e contra exposição via core dumps.
Cada pod traduz a sua origem de entrada em uma whitelist diferente. Não confiamos no input do Discord do mesmo jeito que no operador rodando kubectl. A whitelist é aplicada antes do tool-loop, e cada bloqueio gera evento auditado.
Entrada vinda de fora do cluster. Toolset reduzido para mensageria + um único gancho de despacho controlado. Sem acesso a shell, escrita de arquivos ou git.
Roda code real. Toolset completo (bash, edição, git, testes), exceto mensageria — para não permitir que um brief malicioso peça DM. Ingress restrita ao pipeline com Bearer.
Acessível somente via kubectl exec por um operador autenticado no cluster. Toolset completo. Sem ingress de rede. Prompt vem do humano.
A imagem do DEILE é uma só (deile-stack:local) usada por todos os pods. O que muda é o entrypoint do wrapper
e a whitelist de ferramentas. Os controles abaixo são aplicados a TODOS.
| Controle | Valor |
|---|---|
| runAsNonRoot | true (uid 10001) |
| readOnlyRootFilesystem | true |
| allowPrivilegeEscalation | false |
| capabilities.drop | [ALL] |
| seccompProfile | RuntimeDefault |
| PodSecurity enforce | restricted (1.29+) |
| secrets mount mode | 0600 — file, não env var |
| imagePullPolicy | Never (image baked, não pull em runtime) |