Policy Layer
Главный принцип: ограничения в КОДЕ, не в промптах. Промпт можно сломать prompt injection — код нет.
Два уровня проверки
Pre-execution (до tool call)
Проверяется перед выполнением действия агентом:
- Tool allowlist — инструмент в списке разрешённых для роли?
- Params validation — параметры валидны и в допустимых диапазонах?
- Red Lines — действие не нарушает Codex?
- Budget — агент не превысил budget_tokens / budget_usd / budget_seconds?
- Destructive check — если destructive →
human_approval = Trueв payload?
Post-execution (до передачи результата)
Проверяется после выполнения, перед сохранением результата:
- Output schema — результат соответствует ожидаемой структуре?
- PII detection — нет ли утечки персональных данных?
- Secrets detection — нет ли API keys, паролей, tokens в output?
- Confidence score — агент указал confidence?
- Audit log — запись в лог выполнена?
PolicyEngine (псевдокод)
class PolicyEngine:
def validate_tool_call(self, agent: Agent, tool: str, params: dict) -> Optional[str]:
"""Returns violation description or None if OK."""
# 1. Role-based tool access
if tool not in agent.role.allowed_tools:
return f"Tool '{tool}' not in allowlist for role '{agent.role.name}'"
# 2. Destructive tools require human approval
if tool in DESTRUCTIVE_TOOLS:
if not params.get('human_approval'):
return f"Destructive tool '{tool}' requires human_approval=True"
# 3. Rate limiting
if rate_limiter.exceeded(agent.id, tool):
return f"Rate limit exceeded for {agent.id} on {tool}"
# 4. Budget check
if budget_tracker.exceeded(agent.task_id):
return f"Budget exceeded for task {agent.task_id}"
return None # OK
def validate_output(self, agent: Agent, output: dict) -> Optional[str]:
"""Returns violation description or None if OK."""
# 1. PII scan
pii = pii_detector.scan(str(output))
if pii:
return f"PII detected in output: {pii.types}"
# 2. Secrets scan
secrets = secrets_detector.scan(str(output))
if secrets:
return f"Secrets detected in output: {secrets.types}"
# 3. Audit log
audit_logger.log(agent=agent, output=output)
return None # OKDestructive Tools (требуют human approval)
| Tool | Approval |
|---|---|
send_email | human |
send_message (external) | human |
publish_post | human |
make_payment | human + 2FA |
delete_* | human |
deploy_production | human |
modify_dns | human |
modify_firewall | human |
create_user | human |
grant_access | human |
Defence in Depth
Шесть уровней защиты, каждый независим:
1. [[Codex]] → Правила в системном промпте агента
2. Role config → allowed_tools, budget limits в roles/*.yaml
3. Policy Engine → Программная проверка pre/post
4. Tool implementations → Валидация внутри самих инструментов
5. Human approval → Telegram confirmation для destructive
6. Audit log → Полная запись для post-mortem
Нарушение на любом уровне → блокировка. Все уровни должны быть пройдены.
Реакция на нарушение
При обнаружении policy violation:
- Задача →
status = 'escalated' - Telegram alert отправляется Human Owner
- Запись в
security_incidentsтаблицу - 3+ попытки нарушения за 24 часа от одного агента → агент заморожен до human review
CREATE TABLE security_incidents (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
agent TEXT NOT NULL,
task_id UUID REFERENCES tasks(id),
violation TEXT NOT NULL,
severity TEXT NOT NULL, -- 'low' | 'medium' | 'high' | 'critical'
details JSONB,
created_at TIMESTAMPTZ DEFAULT now()
);Связанные документы
- Codex — Red Lines, правила поведения
- Rules-Security — security policies
- Observability — audit logging
- System-Overview — место Policy Layer в архитектуре