Segurança¶
O AIOS implementa defesa em profundidade seguindo OWASP LLM Top 10, NIST AI RMF e ISO 27001.
OWASP LLM Top 10 — Implementação¶
LLM01 — Prompt Injection¶
Risco: Inputs maliciosos manipulam o comportamento do LLM.
Implementação:
infrastructure/api-gateway/src/middleware/input-sanitizer.ts
const INJECTION_PATTERNS = [
/ignore (previous|all|prior|above) (instructions?|prompts?|rules?)/i,
/forget (everything|all|what you)/i,
/you are now (a|an|the)/i,
/\[SYSTEM\]/i,
/\<\|im_start\|\>/i,
/###\s*instruction/i,
];
Todas as requisições passam por detecção de padrões antes de chegar ao LLM. Retorna 400 Bad Request se detectado.
LLM06 — Sensitive Information Disclosure¶
Risco: LLMs vazam dados sensíveis de outros tenants.
Implementação:
- Inputs são armazenados apenas como hash SHA-256 no banco
- Tenant isolation via JWT claim
tenant_id - Cada execução é escopo ao tenant — sem acesso cruzado
infrastructure/docker/init-db.sql
-- Input nunca armazenado em raw — apenas hash
input_hash VARCHAR(64) NOT NULL, -- SHA-256 do input
LLM09 — Overreliance¶
Risco: Sistema confia cegamente no output do LLM sem validação.
Implementação — Quality Gate numérico:
elroi-core/adapters/langchain/src/squad-tool.ts
// Quality gate numérico (NIST AI RMF)
const minScore = this.config.quality_gate?.min_axioma_score ?? 70;
if (result.quality_score < minScore) {
// Tentar novamente (até maxAttempts)
}
LLM10 — Model Theft / IP Violation¶
Implementação:
- Ollama roda offline no host local — dados nunca saem
- Claude API via chave pessoal — não compartilhada
- circuit breaker evita loops infinitos de requisições
Audit Log Imutável¶
Toda execução gera um registro que não pode ser deletado ou alterado:
-- Regras PostgreSQL que bloqueiam DELETE e UPDATE
CREATE RULE no_delete_audit AS ON DELETE TO audit_logs DO INSTEAD NOTHING;
CREATE RULE no_update_audit AS ON UPDATE TO audit_logs DO INSTEAD NOTHING;
Cada log inclui checksum SHA-256 para detecção de adulteração:
infrastructure/api-gateway/src/middleware/audit.ts
const checksum = createHash("sha256")
.update(JSON.stringify(entry))
.digest("hex");
Hierarquia de Autenticação¶
graph TD
A[Requisição] --> B{Bearer Token?}
B -->|Não| C[401 Unauthorized]
B -->|Sim| D[Verificar JWT HS256]
D -->|Inválido/Expirado| E[401 Unauthorized]
D -->|Válido| F[Extrair tenant_id + scopes]
F --> G[Rate Limit Check]
G -->|Excedido| H[429 Too Many Requests]
G -->|OK| I[Input Sanitization]
I -->|Injection Detectada| J[400 Bad Request]
I -->|OK| K[Executar Squad] Secrets Management¶
| Secret | Local | Rotação recomendada |
|---|---|---|
ANTHROPIC_API_KEY | .env.docker (nunca versionado) | 90 dias |
JWT_SECRET | .env.docker | 180 dias |
POSTGRES_PASSWORD | .env.docker | 90 dias |
REDIS_PASSWORD | .env.docker | 90 dias |
N8N_ENCRYPTION_KEY | .env.docker | Nunca (quebra workflows) |
Regra absoluta
Nunca commite arquivos .env* (exceto .env.example). Antes de qualquer git push, verificar:
Checklist de segurança pré-deploy¶
- Todas as senhas no
.env.dockerforam trocadas deCHANGE_ME -
JWT_SECRETtem no mínimo 64 caracteres aleatórios -
N8N_ENCRYPTION_KEYtem no mínimo 32 caracteres -
.env.dockerestá no.gitignore -
git log --oneline -5não mostra credenciais em nenhum commit - Rate limits configurados para o volume esperado
- PostgreSQL acessível apenas na rede
elroi-internal(não exposta externamente)