Skip to main content
This guide manages your organization’s Data Control Center configuration in Terraform: the org-level switch, a custom detection type, allow-list entries that suppress false positives, and an enforcement policy rolled out safely with dry run.
Estimated time: 20–30 minutes. Complete Getting Started first. For the concepts, see the Data Control Center overview.

Before You Begin

  • A configured provider "barndoor" block (see Getting Started)
  • At least one Protection Profile — a named detection engine — configured in your organization. Enforcement policies can’t be created until one exists, and its ID is what detection_engine_ids references.

Step 1: Adopt the organization config

Data protection has one configuration object per organization, provisioned by the platform. The barndoor_dlp_org_config resource adopts that singleton rather than creating anything:
Reference: barndoor_dlp_org_config
Because it’s a singleton, terraform destroy doesn’t delete anything — it resets both settings to the platform defaults (enabled = true, global_dry_run = false) and drops the resource from state.

Step 2: Define a custom detection type

Custom detection types extend the built-in detectors with organization-specific patterns — project codenames, internal ticket formats, customer ID shapes:
Reference: barndoor_dlp_custom_detection_type Patterns are evaluated in order. Regex patterns use Rust regex syntax and are validated by the API — a pattern that doesn’t compile is rejected at apply time, not silently ignored. The platform assigns the type’s wire name (DETECTION_TYPE_CUSTOM_…), exposed as the detection_type attribute — that’s the value other data protection resources reference.

Step 3: Suppress false positives with allow-list entries

Allow-list entries stop known-safe values from being reported (and acted on) as findings:
Reference: barndoor_dlp_allow_list_entry
The platform has no update operation for allow-list entries, so changing any attribute replaces the entry (delete + create). Plans will show this as a replacement — that’s expected.

Step 4: Enforce with a policy — dry run first

Enforcement policies decide what happens when a detection engine reports a finding. A policy targets exactly one lane: MCP traffic (tool inputs/outputs) or model-provider traffic (prompts/responses). Start in dry run — the policy evaluates and records findings in activity, but takes no action:
And an MCP-lane example — tokenize PII in tool traffic for one group:
Reference: barndoor_dlp_enforcement_policy
The two lanes don’t mix. MCP_SERVER policies use mcp_targets with the RUNTIME_STAGE_TOOL_INPUT / RUNTIME_STAGE_TOOL_OUTPUT stages and may not set provider_ids or model_alias; MODEL_PROVIDER policies are the reverse, with RUNTIME_STAGE_PROMPT / RUNTIME_STAGE_RESPONSE. The API rejects mixed shapes. It also rejects (with a 422) any detection engine that doesn’t support the policy’s action.

Step 5: Flip to enforcement

Once dry-run findings in the activity view look right — expected matches, no false positives that an allow-list entry should cover — enforce by changing one line and re-applying:
This is the code-review moment the dry-run pattern exists for: the diff that turns on enforcement is one visible line in a pull request.
There are two dry-run levers, and they compose: global_dry_run on the org config forces every policy to observe-only (useful during initial rollout of the whole system), while per-policy dry_run stages an individual policy. Enforcement happens only when both are off.

Complete example