Skip to content

Wiz Integration

Overview

This guide connects Wiz to Britive so that Wiz findings are cross-referenced against your Britive applications and profiles. Britive generates the credentials; Wiz sends the events.

What you’ll accomplish:

  • Create a named Wiz integration in Britive and capture its token, ingest URL, and action template
  • Configure an outbound webhook in Wiz using those three values
  • Confirm findings arrive and resolve against your Britive profiles

Before You Begin

  • A Britive tenant, with an identity holding the securityadmin.security.manage permission
  • A Wiz account with permission to create webhooks or automation actions
  • At least one cloud application already onboarded in Britive (AWS, Azure, GCP, OCI)

Onboarding an application is what gives Britive its catalog of cloud roles. Without it, findings still arrive — they just all report as Unresolved with no application, because there’s nothing to match against. See the Cloud Providers guides.

Create the Integration in Britive

A tenant can hold multiple CSPM integrations, including several Wiz integrations — one per Wiz tenant, per business unit, or per environment. Each gets its own token and its own ingest URL, and findings are always scoped to exactly one integration.

Using the Britive Console

Open CSPM Integration

Navigate to System AdminCSPM Integration.

If no integrations exist yet, select New Integration. Otherwise select Manage on an existing one, or New Integration to add another.

Add a Wiz integration

Find Wiz in the list of available integrations and click the + icon in the Action column.

Name the integration

FieldValue
NameA unique, descriptive name (for example, wiz-production)
DescriptionOptional context — which Wiz tenant or business unit this covers

Names must be unique across all CSPM integrations on the tenant, not just Wiz ones.

Click Add.

Copy the three values

Britive immediately shows a dialog with everything Wiz needs:

ValueWhat it’s for
TokenThe shared secret Wiz sends on every request
Ingest URLThe endpoint Wiz POSTs to
Action TemplateThe payload body Wiz must render

Copy all three now, then click Ok.

The token is shown once. Britive stores only its SHA-256 hash and cannot display it again. If you lose it, use Rotate Token to generate a replacement — but note that rotating immediately invalidates the old token.

Understand the Three Values

Before configuring Wiz, it’s worth knowing what each value actually does.

Ingest URL

https://<your-tenant>.britive-app.com/wiz-ingest/cspm-<uuid>

The trailing cspm-<uuid> is the integration’s id. It’s what tells Britive which integration a given event belongs to — which is why every integration has a distinct URL. The URL is derived from the id, not the token, so rotating the token leaves the URL unchanged.

Token

A randomly generated UUID, sent by Wiz in the Authorization header. Britive stores only SHA-256(token) and compares hashes on every request using a constant-time comparison.

Britive rejects the request unless all of the following agree: the token hashes to the stored value, the tenant in the request host matches the tenant that owns the integration, and the integration id in the URL path is the one the token actually authenticates. A token from one integration cannot be used to post to another integration’s URL.

Action Template

A Mustache template that tells Wiz what JSON to send. Britive’s parser expects exactly this shape — four objects, trigger, issue, resource, and control:

{
  "trigger": {
    "source": "{{triggerSource}}",
    "type": "{{triggerType}}",
    "ruleId": "{{ruleId}}",
    "ruleName": "{{ruleName}}",
    "updatedFields": "{{#changedFields}} {{name}} field was changed from {{previousValue}} to {{newValue}}, {{/changedFields}}",
    "changedBy": "{{changedBy}}"
  },
  "issue": {
    "id": "{{issue.id}}",
    "status": "{{issue.status}}",
    "severity": "{{issue.severity}}",
    "created": "{{issue.createdAt}}",
    "projects": "{{#issue.projects}}{{name}}, {{/issue.projects}}"
  },
  "resource": {
    "id": "{{issue.entitySnapshot.providerId}}",
    "name": "{{issue.entitySnapshot.name}}",
    "type": "{{issue.entitySnapshot.nativeType}}",
    "cloudPlatform": "{{issue.entitySnapshot.cloudPlatform}}",
    "subscriptionId": "{{issue.entitySnapshot.subscriptionExternalId}}",
    "subscriptionName": "{{issue.entitySnapshot.subscriptionName}}",
    "region": "{{issue.entitySnapshot.region}}",
    "status": "{{issue.entitySnapshot.status}}",
    "cloudProviderURL": "{{issue.entitySnapshot.cloudProviderURL}}"
  },
  "control": {
    "id": "{{issue.control.id}}",
    "name": "{{issue.control.name}}",
    "description": "{{issue.control.descriptionPlainText}}",
    "severity": "{{issue.control.severity}}",
    "risks": {{issue.control.risks}}{{^issue.control.risks}}[]{{/issue.control.risks}}
  }
}

Paste the template Britive gives you rather than the one printed here, and don’t edit the field names. Britive parses these keys by name — renaming or dropping one silently drops that data from your findings. Three fields are load-bearing for correlation:

  • resource.id — the cloud provider’s native role identifier, used to match against Britive’s catalog
  • resource.type — must render as role for the finding to appear in the report
  • resource.subscriptionId — used to resolve the Britive environment

Configure the Webhook in Wiz

Create a webhook action

In Wiz, create a new outbound webhook action (under Wiz’s integrations or automation actions, depending on your Wiz version).

Set the endpoint

SettingValue
MethodPOST
URLThe Ingest URL from Britive
Content-Typeapplication/json

Add the token

Add an Authorization header whose value is the Britive token, verbatim:

Authorization: 6f1c9b2e-8d4a-4f77-9c31-b0e5a7d4e912

No Bearer or TOKEN prefix. Britive hashes the entire header value and compares it to the stored hash, so any prefix causes a 403.

Set the body

Paste the Action Template from Britive as the webhook’s body template.

Test the connection

Use Wiz’s Test action on the webhook. A correctly configured webhook returns 204 No Content.

Attach it to a rule

Bind the webhook action to the Wiz automation rule(s) that should feed Britive — typically the rules covering IAM and identity controls, since role findings are what Britive correlates.

Verify

Confirm Wiz got a 204

The test in the previous step is the fastest signal that the URL, token, and tenant all line up. A 403 means authentication failed; a 404 means the URL path is wrong. See Troubleshooting.

Open the Findings report

In Britive, go to System AdminCSPM IntegrationManage on your integration → the Findings tab.

Allow a short delay after Wiz sends an event — ingestion is asynchronous, so findings appear after the correlation step completes, not the instant Wiz gets its 204.

Confirm findings resolved

You should see rows with a Source Role and a Severity. Check that at least some rows show a populated Application and Profile with Status Resolved.

If every row is Unresolved with an empty Application, the roles Wiz is reporting aren’t in any onboarded Britive application — see Troubleshooting.

Verify via the API

curl -s -X GET \
  "https://$BRITIVE_TENANT/api/cspm/wiz/findings/wiz-roles?integration=wiz-production&size=5" \
  -H "Authorization: TOKEN $BRITIVE_API_TOKEN"
{
  "page": 0,
  "size": 5,
  "count": 128,
  "data": [
    {
      "sourceRoleName": "acme-prod-admin",
      "sourceEnvironment": "Acme Production (123456789012)",
      "britiveRoleName": "acme-prod-admin",
      "controlName": "IAM role with administrative privileges",
      "controlDescription": "Role grants unrestricted access to all resources.",
      "controlSeverity": "CRITICAL",
      "appName": "AWS Production",
      "appType": "AWS",
      "profileName": "Prod-Admin-Breakglass",
      "environment": "Production (a1b2c3d4)",
      "source": "britive",
      "resolved": "resolved"
    }
  ]
}

Manage the Integration

Rename or re-describe

Editing the name or description leaves the token, id, and ingest URL untouched.

On the integration’s General tab, click Edit, change the Name or Description, then Save.

Rotate the token

Rotation generates a fresh token and replaces the stored hash in place.

On the General tab, click Rotate Token, confirm, then copy the new token from the dialog.

The old token stops working immediately. There is no grace period and no overlap window. Wiz will receive 403 on every event until you paste the new token into the webhook — and those events are not retried by Britive. Plan the rotation and the Wiz update as a single change.

The id, name, description, and ingest URL survive rotation unchanged. Only the token and the Created timestamp change — that timestamp tracks the active token’s creation, so it’s how you tell when a token was last rotated.

Delete an integration

Delete the integration from the CSPM Integration list.

Deleting removes the integration record and invalidates its token, so its ingest URL starts rejecting requests. Disable or delete the corresponding webhook in Wiz too, so it isn’t posting into a dead endpoint.

Troubleshoot

SymptomLikely CauseFix
Wiz test returns 403Token wrong, has a Bearer/TOKEN prefix, or belongs to a different integrationRe-copy the token; send it bare in the Authorization header. If it’s lost, rotate
Wiz test returns 404Ingest URL path is wrong or truncatedRe-copy the full Ingest URL, including the cspm-<uuid> segment
Wiz test returns 400Empty or unparseable bodyConfirm the Action Template is set as the webhook body
204 received but no findingsCorrelation still running, or no role-type events sent yetWait, then confirm the Wiz rule fires on IAM/role controls
Every row Unresolved, Application emptyRoles aren’t cataloged in BritiveOnboard the cloud application covering those accounts

For the full diagnostic path, see Troubleshooting.

Next Steps

Last updated on