Skip to main content
CID222 Docs

Roll out the browser extension

Force-install and pre-provision the CID222 browser extension across managed Chrome and Edge, and prove devices are enrolled and healthy.

  • Version: 0.4
  • Feature: ext.browser
  • Role: admin_user
  • Type: task

The browser extension inspects prompts and uploads inside a managed browser before they leave the machine, and it keeps working when the device is off the corporate network. A managed rollout force-installs it and hands it its gateway and key, so nobody signs in and nobody can remove it.

What do I need?

Licence
Any
Role
admin_user

Prerequisites

  • A management tool that pushes browser enterprise policy: Group Policy, Intune, Jamf, or a configuration-management tool on Linux.
  • The signed extension package and its update manifest are published where every managed browser can reach them.
  • A gateway API key for the tenant or department this rollout covers, created on the Access Keys page.
  • The appliance's API hostname is reachable from managed devices, including from outside the corporate network if devices roam.
  • A pilot organisational unit of a handful of machines to receive the policy first.

The whole managed surface is four keys: the gateway host, the API key, the fail posture, and optionally an update-channel URL. Everything else the extension does — which filters apply, which thresholds, which sites — is pulled from the appliance at run time and is not configured per device.

Note

The sign-in screen in the extension's panel gates only its analyst dashboard. Filtering authenticates with the key from managed policy and consults no user session, so a force-installed device is protected from first launch with no screens at all.

Generate the managed policy

Open the deployment page

Select Administration → Browser Extension.

The Managed policy tile shows the JSON this appliance would push, with its own hostnames filled in.

Set the two hostnames

Fill in CID host (cidHost) with the appliance's API host, and CRX host with the host that publishes the signed package and its update manifest.

A wrong gateway host surfaces on the device as an Invalid credentials message the user cannot fix, because managed policy overrides anything set locally.

Generate

Select Generate policy.

The JSON below the buttons updates. If either hostname is unknown to the appliance, the JSON carries a REPLACE-WITH-… placeholder and the page warns Placeholders still present — fix the hostname and generate again rather than editing the JSON by hand.

Insert the tenant key

Replace the cid_key_REPLACE_WITH_TENANT_KEY placeholder with a real key.

Create it on the Access keys page. The key decides which tenant the events belong to and which filter policy governs the device.

Decide the fail posture

The generated policy sets the fail-closed flag to true: when the gateway is unreachable, AI sites stop working.

That is the correct security posture, and it is also the first help-desk complaint. Change it deliberately, not by discovery. Fail-open leaves the control silent during an outage.

Take the extension identity

Copy the extension id shown under Before you push it and pin it in your management tool.

The id is derived from the package's signing key, so it is the extension's identity rather than a deployment choice.

The result has two halves: a force-install entry naming the extension id and its update manifest, and a third-party managed-storage block carrying the gateway host, the key and the fail posture.

{
  "ExtensionInstallForcelist": [
    "<extension-id>;https://<crx-host>/extensions/stable/extension-update.xml"
  ],
  "3rdparty": {
    "extensions": {
      "<extension-id>": {
        "cidHost": "https://<appliance-fqdn>",
        "cidApiKey": "cid_key_0123…",
        "failClosed": true
      }
    }
  }
}

Push it to managed browsers

PlatformMechanismWhere the policy lands
WindowsGroup Policy or IntuneThe Chrome and Edge policy keys under the machine policy hive
macOSJamf, Intune or Kandji configuration profileThe managed preference domain for Chrome or Edge
LinuxAnsible, Puppet or any file-placement stepThe browser's managed-policy directory

Also set the installation mode to force-installed and block removal, so the extension is a control rather than a suggestion. On an unmanaged device you can enforce none of this — scope the promise to company-managed browsers.

Warning

Firefox has its own certificate and extension stores and is not covered by a Chrome or Edge policy. A second browser without the extension is an uncovered path on an otherwise covered machine.

Different policies for different departments

One managed-policy object carries one key, and one key resolves to one tenant. A device that tries to enrol into a second tenant is refused.

Where Finance needs a stricter policy than Marketing, push one policy object per directory group, each with its own key. This needs no product change and uses tenant groups exactly as designed, so the base-and-override filter model from the dashboard applies unchanged.

Enable the firewall block list

Device attestation lets a firewall you already run enforce the rule that AI is reachable only from a device that is genuinely running the extension. CID222 blocks nothing here; the firewall does.

Understand what is proven

Each install enrols a device key and signs a nonce-fresh heartbeat with it. The appliance publishes the addresses of devices whose heartbeat is recent as an external dynamic list.

The signature proves the extension is running. The address is what the firewall can act on, and an address is not a device — see the limits below.

Issue a list token

There is no dashboard screen for these tokens yet. Create one against the API as an administrator:

curl -X POST https://<appliance-fqdn>/admin/edl-tokens \
  -H "Authorization: Bearer <admin-jwt>" \
  -H 'Content-Type: application/json' \
  -d '{"name":"perimeter-firewall","expires_at":"2027-01-01T00:00:00Z"}'

The raw token is in the response and is never returned again. An expiry is mandatory for these tokens, because a firewall fetching a bare URL puts the token in access logs.

Point the firewall at the list

Configure the external dynamic list to fetch /api/v1/edl/healthy-ips with the token, either as a bearer header or as a query parameter for firewalls that cannot set headers.

The response is one address per line as plain text. A DNS response-policy-zone format is also available and is IPv4-only.

Tune the freshness window

The default window keeps a device listed for 15 minutes after its last heartbeat, against a heartbeat interval of 5 minutes.

Shortening it below the heartbeat interval makes healthy devices flap out of the list.

Require managed policy, once the fleet is managed

Turn on the per-tenant switch that lists only devices whose enterprise policy provisioned the connection.

It is off by default on purpose: enabling it for a fleet that is not yet under policy empties the list, and a fail-closed firewall would then block all AI.

Keep it updated

Managed browsers pull new versions from the update manifest named in the force-install entry. A release reaches every enrolled browser within a few hours; a user who wants it immediately can trigger an update check from the browser's own extensions page.

Loading an unpacked folder by hand is a demo and development path only. It receives no updates.

Verify

  1. On a pilot device, open the browser's policy page and confirm the extension is listed as installed by policy and that the third-party values arrived.

  2. Type a message containing test personal data into one of the covered AI sites. The values are masked before the request leaves the browser.

  3. Open All Detections, set Source to Extension events, and confirm the row with its verdict and the site it came from.

  4. Open AI Usage and confirm clean traffic is also being reported, which is what proves the extension is inspecting everything rather than only what it stopped.

  5. Confirm the device enrolled. There is no device screen yet, so read the inventory from the API:

    curl -s https://<appliance-fqdn>/admin/extension-devices \
      -H "Authorization: Bearer <admin-jwt>"

    The row carries the platform, the extension version, the last-seen time, the observed address and whether enterprise policy provisioned the connection.

  6. Revoke that device through the same admin surface and confirm it drops out of the firewall list on the next poll.

If it fails

  • The extension is installed but shows as unmanaged — the third-party managed-storage block did not arrive, only the force-install entry. Both halves must be in the same policy object.
  • The panel reports invalid credentials and the user cannot fix it — the gateway host in managed policy is wrong, or the key does not belong to that gateway. Managed policy overrides the local value, so the user genuinely cannot correct it.
  • AI sites stop working during an appliance outage — the fail-closed flag is doing its job. Decide the posture, do not toggle it in an incident.
  • A device never appears in the inventory — enrolment did not complete. Confirm the API host is reachable from the device, and that the key is valid and not expired.
  • A revoked device keeps working — revocation removes it from the firewall list, it does not stop the extension. Revocation is deliberately sticky across re-enrolment, so a revoked device cannot re-add itself.
  • Uploads of PDF, DOCX or CSV files are refused rather than cleaned — document redaction in place is not implemented. Image redaction works.
  • A large or resumable upload is refused with a not-inspected notice — no path reassembles a body across requests, so such uploads are blocked rather than passed through uninspected.

Known gaps

  • Coverage is per browser, not per device. A machine whose Chrome is healthy can use Firefox with no extension and the same address stays in the firewall list. Closing this needs the endpoint agent.
  • A device id is one browser profile. Two profiles on one laptop are two devices sharing one address.
  • An address is not a device. Network address translation, virtual private network concentrators, address-lease churn and shared terminals all break address-as-identity. This control is workable on a well-run corporate network and leaky elsewhere.
  • Events are client-reported. The tenant comes from the credential, but the verdict, the hostname and the user attribution are whatever the extension sent. The attestation heartbeat is the cryptographically strong part; the event feed is telemetry, not an audit trail.
  • There is no fleet screen. The appliance stores every device's posture, version and last-seen time, and serves the policy each one pulls, but the dashboard has no page that lists them. Read the inventory from the admin API until one ships.
  • Sites change their wire format. A vendor that moves its prompt-submit endpoint silently breaks the adapter that recognises it, and requests pass uninspected until the rule is updated.

Next steps

Last updated on

On this page

Download PDF