Security and masking settings
Policies, DLP, masking, monitoring, notifications and SIEM: values and scope.
Role: deployment operator. These steps use the operator console. An ordinary hosted account exposes only its own keys and limits; request policy, protection-mode and masking changes from the operator.
IAM.Secure separates detection, policy action, replacement and event delivery. These mechanisms have independent settings. Changes require the appropriate tenant-scoped role; edition gates can further restrict availability.
Enable and disable controls
| Mechanism | Application path | Disabling affects |
|---|---|---|
| One policy | Policies → select → Pause | That policy only; other active policies and emergency protection remain. |
| New policy | New policy → Draft / Active | Draft does not execute; Active does. Saving an active document changes current processing. |
| Masking | Masking → mode → Save | Verdict classes reduces discovery; it does not disable replacement. |
| Threshold alert | Alert Rules → Active → Save | Notifications, not inspection. |
| Webhook | Webhooks → enabled | Subscription delivery. |
| SIEM | Enable SIEM export → Save | Export, leaving inspection/audit active. |
| Report/feed | Off / Pause | Browser display, not gateway processing. |
There is no universal customer-facing “disable all traffic analysis” switch on these pages. For observation without blocking use flag in a narrow scope and check other active policies; a stricter policy still wins. This changes the response action, not detection.
Create, activate, pause and configure a policy
- Policies → New policy: unique ID, name, owner, description, Draft status.
- Set a specific target tenant, not *. The hosted release rejects non-empty scope.apps and scope.groups with HTTP 422 because these boundaries are unsupported. Use a separate tenant for isolation.
- Add rule → Condition type → Condition value → Action. Add a note and move specific rules above general rules.
- Use JSON for compound conditions, point and canonical actions. Save, read back and test synthetic text.
- Activate only after checking. Pause stops this policy; confirm the resulting audit decision.
2026-10-15 · Actual shared staging with the recovered gateway and r8 editor. Synthetic policy restricted to an owned test tenant; profile and secrets excluded from the original capture. UI save and active/paused were independently checked on both replicas without reload. Original draft restored and temporary key revoked after qualification.
- Check all predicates
- Status
- Tenant
- true / false
- Action
- Save policy
Editor and server released on 15 October 2026. Canonical block, rule IDs and additional predicates survive JSON → Form → JSON. For injection_detected and provider_unlisted, the form displays and accepts true or false; false is no longer shown as RESTRICTED. Check compound predicates, including point, in JSON. Unsupported groups/apps are disabled with an explanation and rejected by the server with 422; use a specific tenant. All replicas read the saved state from shared storage.
| Field | Meaning |
|---|---|
| id / name / owner / description | Unique auditable ID and purpose/ownership metadata. |
| status | draft / active / paused; only active participates. |
| scope.tenant | Target tenant; empty or * means all. |
| scope.groups / scope.apps | Non-empty fields return HTTP 422 without changing the saved policy. Use a separate tenant; app/group isolation is not supported. |
| rules[].id | Unique rule ID within the policy. |
| when.data_class | Detector class from the registry/verdict. |
| when.min_severity | low / medium / high / critical threshold. |
| when.sensitivity | PUBLIC / INTERNAL / CONFIDENTIAL / RESTRICTED. |
| when.content_type | GENERAL / CODE / ARCHITECTURE / RESEARCH in the server contract. |
| when.point | request / response / attachment / tool_input / tool_output / web_content. Configure in JSON. |
| when.injection_detected | true matches injection; explicitly false matches its absence. |
| when.provider_unlisted | true matches a provider not authorized by the registry in the request context. |
| then | allow / flag / mask / reroute / block in the canonical server contract. |
| note | Rule explanation. |
| on_inspection_unavailable | fail_closed / empty; unavailable inspection must not become permission. |
| block_message | Rejection message without raw secrets. |
Some form versions emit blocked/masked/rerouted/flagged/allowed, while the gateway validator accepts block/mask/reroute/flag/allow. On 422 use canonical JSON values; a rejected form is not a saved policy. The simple form models one condition per rule. Keep compound conditions and point in JSON to avoid losing them during conversion.
Conflict resolution
First match wins within one policy. Across matching active policies, the strictest action wins: allow < flag < mask < reroute < block. Conditions in one when must all match. With available inspection and no matching rule the result is allow; ensure scope coverage. Inspection failure always blocks, including when on-prem is available: an uninspected request is dispatched to neither upstream. After successful inspection, an unreplaceable mask escalates to reroute if on-prem exists, otherwise block.
Validate a text attachment in your integration
API calls require your tenant’s inference key; audit viewing and original disclosure require separate administrative permissions. Submit a text file using OpenAI file.file_data / input_file.file_data or SDK document.source with type=base64 and media_type=text/plain. Text MIME types, JSON, XML, JavaScript and YAML are supported. For raw base64 file_data, provide a filename with a supported extension. This is an integration contract; it does not add an upload button to the console.
{"messages":[{"role":"user","content":[{"type":"file","file":{"filename":"example.txt","file_data":"data:text/plain;base64,aGVsbG8="}}]}],"point":"attachment","context":"chat"}
- Submit this synthetic object to staging
/v1/inspectwith your inference key. The file contenthellois decoded before classification; active policies determine the final action. - Repeat with synthetic private data and an injection inside the file. Check
decision,verdict.pointand Request ID in Audit and forensics. Inspect evaluates a decision without generating a provider response. - Allowed
/v1/chat/completionscalls retain original encoded bytes when forwarding to the provider. A streaming response containing a data URL/JSON is held until complete inspection; ordinary text still uses windows. - Invalid encoding, exhausted limits, unsupported binary files and documents referenced by
file_id,file_url/source.urlfail closed. Correct the input or provide a supported text export; retrying an unread reference cannot bypass inspection.
Extraction is bounded to 64 MiB of cumulative decoded data and eight nested encoding levels. Held SSE frames are bounded to 96 MiB; exhaustion blocks without partially releasing the attachment. PDF/DOCX extraction, OCR, audio transcription and remote document retrieval are not qualified by this text contract. Preserving SDK media fields during forwarding does not establish inspection of image/audio contents.
Decoded content reports span_basis=extracted_text: spans address the extracted text. Until safe rewriting of the original format is supported, that verdict is not maskable; a masking API request for actual replacement returns an error instead of reporting success with an unchanged secret. Check the block/routing reason in audit. Successful extraction does not by itself promise allow or reversible FPE.
Synthetic example: mask email in request traffic
Use the class ID from your deployed registry/verdict.
{"id":"DOCS-EMAIL","name":"Mask email in support requests","status":"draft","owner":"secops","description":"Educational policy; activate only after scoped checks","scope":{"tenant":"docs-demo","groups":[],"apps":[]},"on_inspection_unavailable":"fail_closed","block_message":"Request blocked by organization policy","rules":[{"id":"INJECTION","when":{"injection_detected":true},"then":"block"},{"id":"EMAIL","when":{"data_class":"pii.email","point":"request"},"then":"mask"}]}
Test synthetic email, clean text and injection using the intended tenant/app/point; also test another tenant, response and tool output. Draft does not execute: use supported simulation or activate only for a staging test tenant. Text inspector reports active policy decisions, not automatically the open draft.
For monitoring without blocking change the targeted rule from block to flag while preserving narrow scope. Flag passes text and records the event; another active block still wins. Check winning policy_id/rule_id. Restore the previous document/version to undo and test again.
Masking
- Masking → Auto-discovery / Verdict classes.
- Save → Refresh and verify the returned mode.
- Test replacement through the actually integrated protected flow, not just the toggle’s appearance.
2026-10-15 · Actual isolated Kubernetes staging with owned PostgreSQL/Redis and a synthetic customer. verdict_classes was saved through the UI and read on both replicas, then auto was restored through the UI. Shared customer settings were unchanged. Unretouched original pixels; this frame does not qualify every replacement class.
- Refresh
- Auto discovery
- Verdict classes only
- Save
| Parameter | Meaning | Editable location |
|---|---|---|
| auto | Rediscover known private values; auto_discover=true | Auto-discovery. |
| verdict_classes | Replace initial verdict classes; auto_discover=false | Verdict classes. |
| iam_masking / masking headers | Supported per-request override | Client integration. off/false means verdict_classes, not full bypass. |
| iam_masking.session_id | Stable KEY_N dictionary for a conversation | Opaque client-owned ID, without personal data. |
| session_backend / session_encrypted / session_ttl_hours | Mapping storage, encryption and lifetime | Read-only table; operator configuration. |
Router has an additional floor; do not assume the same administrative contract in standalone Secure. The hosted deployment stores the mode in shared Redis without a TTL and retains it across gateway restarts. settings_backend=redis means shared settings; memory means process-local settings. Redis loss and backup remain separate operator responsibilities.
Custom DLP
- Check edition availability and admin permissions.
- Provide JSON with a patterns array: stable id, name, check category, severity and regex/keywords. Mount through IAM_SEC_CUSTOM_DLP_PATH.
- Custom DLP → Reload, then check loaded pattern count. The page does not edit the file.
- Test positive and negative synthetic examples; configure a policy using the resulting class ID and verify the final action.
- Remove/change a detector in the file, reload and check referencing policies. Removing one detector does not disable other DLP classes.
Complete file and matching checks
{"patterns":[{"id":"org.customer_id","name":"Synthetic customer number","check":"dlp","severity":"high","regex":"\\bDOCS-CUST-[0-9]{6}\\b"},{"id":"org.project_name","name":"Synthetic project code","check":"dlp","severity":"medium","keywords":["DOCS-PROJECT-ORION"]}]}
| File field | Contract |
|---|---|
| id | Required and unique across the file; use this ID in policy when.data_class. |
| name | Operator label, not a match condition. |
| check | Required: secret / pii / dlp / toxicity; a check category, not regex/keywords. |
| severity | low / medium / high / critical; omitted defaults to medium. |
| regex | Go/RE2; expression controls case sensitivity. JSON requires doubled backslashes. |
| keywords | Case-insensitive substrings; no automatic word boundaries. |
| regex and keywords | At least one nonempty matcher is required; both can be present. |
This file contract has no separate type, pattern or sensitivity fields. Policy sensitivity refers to the inspection verdict, not a custom-file field. Current detectors are gateway-wide, not isolated by the top-bar tenant filter. Scope the policy action to a specific tenant and test another tenant; app scope is not enforced in the checked staging.
In Custom DLP → Test, DOCS-CUST-123456 should match org.customer_id; DOCS-CUST-12345 should not. Lowercase docs-project-orion should match; DOCS-PROJECT-OTHER should not. Test returns matched and masked_text, but does not execute every active policy: verify the final protected-request decision separately. A reload_failed / 400 keeps the previous successfully loaded set; fix the file, reload and test again. A not_configured / 404 means the operator has not mounted/configured the path.
Alerts, correlation, webhooks and SIEM
| Parameter | Where | Meaning |
|---|---|---|
| Name / tenant / kind / data_class | Alert Rules → Add rule | * means all tenants; empty class means all; kinds select blocks/injection/DLP/any. |
| threshold | Event threshold | > 0 event count, not severity or percentage. |
| window_minutes | Window | ≥ 1 minute; counting window. |
| cooldown_minutes | Cooldown | ≥ 0 minutes between repeat alerts. |
| enabled | Active | Alert generation, not policy enforcement. |
| injection_burst / dlp_burst | Incidents → Correlator | Grouped-incident creation thresholds. |
| block_rate_min_reqs / block_rate_threshold / window_seconds | Correlator | Minimum sample, block ratio and time window; different units from Alert Rules. |
| URL / events / secret / enabled | Add webhook | Receiver, subscribed events and signature secret. |
| Ping / replay / deliveries | Webhook details | Test/replay deliver externally; check receiver responses. |
| enabled / Endpoint / Format | SIEM → Save | JSON / CEF / LEEF; switch controls export only. |
| events_sent / last_sent / last_error | SIEM status | Sending evidence/errors; a saved setting does not prove delivery. |
2026-10-15 · Actual staging application and an existing operator session. Synthetic data or non-personal configuration only; credentials and the operator profile are excluded. A form alone does not establish persistence or replica consistency.
- Tenant
- Event
- Threshold / window / cooldown
- Save
Configure incident correlation
- Incidents → Correlator → Configure. If the panel is absent, check API availability; this does not prove analysis is disabled.
- Preserve the old values, edit and Apply. Cancel discards the unsaved editor.
- Read the panel again and compare values. Check synthetic tenant events, time window and resulting incident; these thresholds do not select the request’s enforcement action.
2026-10-15 · Actual staging application and an existing operator session. Synthetic data or non-personal configuration only; credentials and the operator profile are excluded. A form alone does not establish persistence or replica consistency.
- Injection threshold
- DLP threshold
- Block rate
- Window, seconds
- Apply
| Field | Accepted range | Source default / meaning |
|---|---|---|
| Injections / injection_burst | Integer ≥ 1 | 3 injection events per tenant in the window. |
| DLP / dlp_burst | Integer ≥ 1 | 15 audit entries with detected classes per tenant; multiple classes in one entry remain one event. |
| Minimum requests / block_rate_min_reqs | Integer ≥ 1 | 10 tenant entries before evaluating the blocked fraction. |
| Blocks (%) / block_rate_threshold | UI: 1–100%; API: fraction > 0 and ≤ 1 | 50% = 0.5, not 50 in JSON. Five blocked entries out of ten meet a 0.5 threshold. |
| Window (seconds) / window_seconds | Integer ≥ 10 seconds | 600 seconds = 10 minutes; also suppresses repeat incidents for the same rule+tenant. |
| Tick / tick_interval | Read-only through the runtime API/UI | 60 seconds between scans; changes take effect on the next scan. |
| Dedup / dedup_entries | Read-only | Active suppression keys, not threats. A green indicator alone does not prove a fresh scan. |
API: GET /admin/incidents/correlation-config, then administrative PATCH to the same endpoint; read again. GET returns window as a duration string such as 10m0s, rather than window_seconds.
{"injection_burst":3,"dlp_burst":15,"block_rate_min_reqs":10,"block_rate_threshold":0.5,"window_seconds":600}
These are illustrative source defaults, not verified hosted settings. PATCH updates supplied fields only; it cannot change tick_interval. 422 means invalid range; 503 means unavailable correlator. Runtime changes do not promise restart persistence or propagation to other replicas; re-read the affected instance. Restore previous values to undo and verify the next scan. The correlator reads at most 2000 recent entries in the window, so high-volume results are a sample rather than full organizational totals. Zero does not disable these thresholds; notification rules are separately controlled in Alert Rules.
Connect SIEM
- Obtain an approved receiver endpoint and format.
- SIEM → Endpoint URL → Event format → Enable SIEM export → Save.
- An operator sets receiver authorization through IAM_SEC_SIEM_WEBHOOK_AUTH; the UI never displays it. Do not embed tokens in published URLs.
- Test delivery sends to the configured receiver; verify both exporter status and receiver event.
- Disable the switch and save to stop export; verify Disabled status. Inspection and local audit continue.
Operator configuration
Source defaults below are not verified hosted settings. An operator changes them; customers request the value and verify its exposed contract.
| Parameter | Default / unit | Controls |
|---|---|---|
| IAM_SEC_MASKING_MODE | auto | Default discovery mode. |
| IAM_SEC_CLASSIFIER_TIMEOUT_MS | 1500 ms | Inspector wait limit. |
| IAM_SEC_CLASSIFIER_BREAKER_THRESHOLD / COOLDOWN_MS | 5 failures / 30000 ms | Breaker opening / retry wait. |
| IAM_SEC_PRIVATE_MASK_TTL_HOURS | 12 h | Replacement-mapping lifetime. |
| IAM_SEC_CUSTOM_DLP_PATH | Empty | Organizational detector file. |
| IAM_SEC_AUDIT_RING | 1000 records | Volatile audit buffer. |
| IAM_SEC_RESPONSE_WINDOW_CHARS | 240 chars | Ordinary text window size; encoded/JSON content waits until complete. Not retention. |
| PostgreSQL / Redis / encryption key | Operator configuration | History, analytics availability and protected sessions. |
| Upstream / on-prem | Connection configuration | Destinations for allowed/rerouted traffic; require a real provider. |
All sections · Traffic analysis · FAQ
Replica consistency after saving
In the hosted release dated 15 October 2026, policies are saved in shared PostgreSQL. Replicas read the committed overrides on administrative reads and before a new enforcement decision. Save policy, Activate and Pause no longer require a separate manual reload of every replica.
- Preserve the original JSON, ID and specific tenant. Prepare and qualify changes as a Draft on staging.
- Save, reread GET /admin/policies/{id}?format=document, and compare scope, status, rule IDs and every predicate. JSON → Form → JSON must retain
pointand explicitfalsevalues. - Activate the test policy and send a new
/v1/inspectwith your customer key. Comparedecision.action,policy_id,rule_idand request ID. The operator repeats the document and request checks on every serving replica. - Pause excludes only that policy. Other active rules remain, so the result need not become allow. Use Activate to resume.
- Restore the original document or selected version to roll back, then repeat readback and request checks. A file-backed base policy cannot be deleted through the API; pause it for a temporary exclusion.
A shared-store failure does not acknowledge an unpersisted edit. Inspection blocks when the current authoritative policy set cannot be read. Do not work around storage errors by setting scope to * or weakening rules. Older self-hosted versions may require manual reload; ask the operator to confirm the gateway version first.
Shared staging qualification saved through the operator editor and checked active → block → paused → another active rule → active on both replicas without reload. On a separate isolated staging stand, both replicas were replaced and saved policy/masking state survived.
What was verified on the working stand
- Normal customer SSO, key creation, inventory persistence after reload, a real API request, revocation and HTTP 401 for the old key.
- Customer limit editing, full-reload readback, sign-in suspension and restoration — customer account.
- Test policy save and switching with every-replica controls. Tenant isolation passed; app isolation did not enforce.
- Masking: the shared deployment saves the mode in Redis and rereads it across replicas. A separate real staging stand with owned PostgreSQL/Redis qualified UI saves auto → verdict_classes → auto, persistence after replacing both pods, a synthetic email becoming [CONTACT] at the test receiver, and no receiver call on block. This server mechanism is released in hosted production. This does not qualify every replacement class or guarantee recovery after losing Redis storage itself.
A harmless capital-of-France question returned HTTP 200, CONFIDENTIAL and reroute by another policy on /v1/inspect. This is a false-positive classification, not proof of secret data or successful response generation. Provide the operator with the request ID and a sanitized example; do not weaken global protection to make the test green.
Gateway PostgreSQL access
For self-hosted administrators. Hosted customers do not receive database credentials. Application keys and console operator roles are separate from PostgreSQL identities; use the console above to manage policies.
| Purpose | Permissions |
|---|---|
| Running gateway | Connect to its own database, read required tables, execute explicitly allowed INSERT/UPDATE/DELETE, and use allocators. Owns no objects and has no administrative memberships. |
| Schema owner | A separate NOLOGIN role used by administrators for controlled migrations. |
| Backup | A separate identity with SELECT on tables and sequences, without data mutation permissions. |
| Database maintenance | A separate local operator authenticated through OS-postgres peer mapping; network login is rejected. |
The gateway role has no SUPERUSER, CREATEROLE, CREATEDB, REPLICATION or BYPASSRLS. Schema changes, DROP/TRUNCATE, disabling triggers, server commands and server-file reads are denied. This does not replace application tenant isolation or make audit storage immutable: normal audit retention deletion remains allowed.
- Take a consistent backup and restore it into a separate database before restricting permissions. Keep role and authentication recovery details outside public documentation.
- Install the schema through an administrative identity. Set IAM_DB_SCHEMA_MODE=verify for the serving gateway so startup checks the schema without CREATE/ALTER. Resolve migrations administratively without granting the gateway SUPERUSER.
- Separate owner, runtime and backup identities. Preserve the existing DSN password; do not replace it with an administrator password. Backups require sequence SELECT, which the serving gateway does not need.
- Replace gateway replicas sequentially. Confirm every physical connection authenticated as the former privileged role has closed; changing role flags alone does not close existing connections.
- Test key creation, rotation and revocation; policy saving and Activate → Pause; audit/incidents; saved searches; and backup restoration. Revoke temporary keys and preserve customer tables during testing.
If settings stop saving after an update. Check verify mode, the target database and the specific DML permission named by the error. Key-cache triggers need UPDATE(version, updated_at) on the cache-version table. Original-request retention needs UPDATE(ciphertext, status); history needs INSERT and allocator USAGE. Fix the narrow grant and repeat the staging scenario. Do not enable migrate mode in the restricted serving gateway.