Pular para conteúdo

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:

git diff --staged | grep -i "key\|token\|secret\|password"


Checklist de segurança pré-deploy

  • Todas as senhas no .env.docker foram trocadas de CHANGE_ME
  • JWT_SECRET tem no mínimo 64 caracteres aleatórios
  • N8N_ENCRYPTION_KEY tem no mínimo 32 caracteres
  • .env.docker está no .gitignore
  • git log --oneline -5 nã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)