Skip to main content

Deploy AI DLP via Jamf Pro

This guide shows you how to deploy AI DLP to your managed Macs from Jamf Pro. You add a script Anzenna provides, label two parameters, and attach it to a policy. Deploying AI DLP installs the Anzenna Update agent, which installs AI DLP and keeps it current automatically.

To monitor desktop AI apps such as Claude Desktop and ChatGPT, also

deliver the trust certificate

after the install.

Prerequisites​

  • Jamf Pro admin access with permission to create Scripts and Policies

  • Target Macs enrolled in Jamf Pro
  • Target devices reported to Anzenna by a connected MDM or EDR integration (see

    Devices must already be known to Anzenna

    )

  • Your Anzenna domain and its Client Token (see

    AI DLP Overview

    )

  • The install and uninstall scripts, provided by Anzenna support

Required Step

Before beginning deployment, contact Anzenna support to obtain the install and uninstall scripts. The scripts are plain text and are the same for every customer — your per-tenant values go in your own Jamf console, not in the scripts themselves.

Overview​

Jamf Pro delivers AI DLP as a policy script rather than a package. Jamf passes script parameters positionally, so the two values you supply arrive as parameters 4 and 5 — parameters 1 through 3 are reserved by Jamf for mount point, computer name, and username.

  • One script serves every customer; your domain and token live in your Jamf console

  • The script runs as root, which the install requires

  • It verifies the downloaded agent's Apple Developer ID signature before running it

  • Policy frequency is Once per computer — this is a bootstrap, not a recurring task

Step-by-Step Instructions​

1. Add the script to Jamf Pro​

  1. Log in to Jamf Pro and go to Settings (the gear icon) > Computer Management > Scripts

  2. Click New

  3. On the General tab, give the script a display name, for example Anzenna AI DLP - Install

  4. Open the Script tab and paste the entire install script Anzenna provided

2. Label the script parameters​

Labelling the parameters is what makes them fillable — and correctly labelled — when you attach the script to a policy.

  1. Open the Options tab

  2. Set the parameter labels exactly as follows, leaving Parameters 6 through 11 empty:

FieldLabel
Parameter 4Anzenna domain
Parameter 5Client Token
  1. Click Save

3. Create the install policy​

  1. Go to Computers > Policies and click New

  2. On the General payload, set a display name, for example Anzenna AI DLP - Install

  3. Set Trigger to Recurring Check-in

  4. Set Execution Frequency to Once per computer

  5. Check Automatically re-run policy on failure, then set Retry Event to On next recurring check-in and Retry Attempts to 3

Use "Once per computer", not "Ongoing"

This policy is a bootstrap — the agent keeps itself current afterwards, so a recurring policy has nothing to do. Setting it to Ongoing makes every managed Mac re-download roughly 15 MB on each check-in to accomplish nothing. If a machine needs repair, re-run the policy manually; the install is idempotent.

Why retry-on-failure, and why bounded

"Once per computer" means a Mac that fails on its one attempt — a network blip, a feed that was briefly unreachable — stays uninstalled until someone notices. Automatic re-run on failure covers that: the policy tries again on the next few check-ins and then stops. Three attempts is enough to ride out a transient problem without turning a genuinely broken install into an indefinite retry loop.

  1. Select the Scripts payload and click Configure, then add the install script

  2. Fill in the two parameter fields with your values:

ParameterValue
Anzenna domainYour Anzenna domain
Client Token

Your domain's Client Token —

find it in the portal

The Client Token appears as plain text

Jamf displays script parameters as ordinary unmasked text fields, so the Client Token is readable by anyone with access to this policy. This is expected — it is a domain-shared credential, not a per-device key.

4. Scope and deploy​

  1. Open the Scope tab

  2. Under Targets, add a small test group first — a handful of Macs — rather than your whole fleet. A static computer group is the simplest way to do this; a smart group works too.

  3. Click Save

  4. Scoped Macs run the policy on their next check-in. Once you have confirmed a successful install, widen the scope.

Forcing an immediate run

To test without waiting for a check-in, run sudo jamf policy on a scoped Mac.

Verifying Deployment​

Check the policy log in Jamf Pro​

  1. Open the policy and click Logs

  2. Find a target computer and click Details for its run

  3. Check that Script exit code is 0, and that the script result ends with anzenna-update(jamf-install): install complete

Verify on the Mac​

The agent's own log is the authoritative record, and it does not require sudo:

tail -20 "/Library/Application Support/Anzenna/Update/logs/update.log"

A quick structural check, which does not need the log at all:

ls -la "/Library/Application Support/Anzenna/Update/"
launchctl print system/ai.anzenna.update | head -5

The first should list the agent binary plus cache, config, logs, and store directories. The second should find the service rather than reporting "Could not find service".

See

AI DLP Overview

for how to read the log's install and update lines.

Monitor Desktop AI Apps: Deliver the Trust Certificate​

AI DLP monitors desktop AI apps such as Claude Desktop and ChatGPT through a local proxy on each Mac. Each Mac has its own certificate for that proxy. The proxy takes traffic only after macOS trusts the certificate. macOS trusts it without prompting the user only when an MDM delivers it, so the steps below set up Jamf Pro to deliver it.

Until the certificate is trusted, the Mac's traffic goes direct and desktop AI apps are not monitored. Claude Code is not affected, because AI DLP monitors it through Claude Code's own hooks. About a minute after the certificate arrives, the Mac starts sending traffic through the proxy. You do not need to reinstall AI DLP.

On the Mac, the AI DLP agent is named Pharos. That name appears in the script, the profile URL and the profile macOS shows.

How it works​

  1. The AI DLP agent creates a signing key on the Mac and registers it with Anzenna

  2. A Jamf extension attribute reports that key's fingerprint. Anzenna's Jamf sync compares the reported fingerprint with the registered key. A match confirms that the Mac Jamf manages is the Mac holding the key.

  3. Once the Mac is confirmed, Anzenna starts serving its certificate and a second extension attribute flips to READY. The agent updates Jamf inventory on its own, so the Mac lands in a smart group within about half an hour.

  4. A Jamf Blueprint scoped to that smart group points each Mac at one profile URL. Each Mac signs in with its Jamf management identity and fetches its own certificate.

  5. macOS installs the certificate as a trusted MDM profile without prompting the user

The smart group exists because macOS does not retry a failed fetch. A Mac that asks for its certificate too early gets an error and keeps it, so the Blueprint waits until the certificate is ready.

Prerequisites​

  • AI DLP deployed to the Macs, using the steps above

  • Jamf connected to Anzenna (see

    Connect Jamf to Anzenna

    ). The fingerprint reaches Anzenna through that connection.

  • macOS 15 or later on each Mac. Apple supports the declaration from macOS 13, but Anzenna has tested it only on macOS 15.

  • Blueprints available in your Jamf Pro. If Blueprints is locked, ask Jamf what your tenant needs to unlock it. On some tenants, Jamf unlocks Blueprints only after console sign-in moves to Jamf Account.

  • Macs enrolled through Automated Device Enrollment, or that passed Apple Managed Device Attestation in the last 30 days. Macs enrolled by the user are not supported.

1. Add the key fingerprint extension attribute​

  1. In Jamf Pro, go to Settings > Computer management > Extension attributes and click New

  2. Set Display Name to exactly Anzenna Agent Key Fingerprint

  3. Set Description so the next admin knows not to rename the attribute, for example:

    SHA-256 fingerprint of the Anzenna agent's signing key. Anzenna matches this attribute by name, so do not rename it or change its input type.

  4. Set Data type to String

  5. Set Inventory display to Extension attributes. General, Hardware and User and Location also work. Anzenna does not read the other categories.

  6. Set Input type to Script, paste the script below, and click Save

#!/bin/sh
agent="/Library/Application Support/Anzenna/Pharos/anzenna-pharos-agent"
req='anchor apple generic and identifier "ai.anzenna.anzenna-pharos-agent" and certificate leaf[subject.OU] = "364X5UJPJH"'
if [ ! -x "$agent" ] || ! /usr/bin/codesign --verify --strict -R="$req" "$agent" 2>/dev/null; then
echo "<result>UNREGISTERED</result>"
exit 0
fi
echo "<result>$("$agent" --print-signing-key-fingerprint 2>/dev/null)</result>"

The script checks that the agent is signed by Anzenna before asking it for the fingerprint.

Keep the name and the input type

Anzenna finds the attribute by its display name. Capitalisation does not matter, but any other change to the wording does, and Anzenna never reads a renamed attribute. Keep the input type as Script: a value typed into a text field proves nothing about the Mac, so Anzenna ignores it.

2. Check the fingerprint reaches Jamf​

When the agent registers its key, it triggers a Jamf inventory update itself, so the value arrives without waiting for the next scheduled inventory. Open a Mac under Computers and go to Inventory > Extension Attributes.

ValueMeaning
64 hexadecimal charactersHealthy. Anzenna can confirm this Mac on its next Jamf sync.
UNREGISTERED

AI DLP is not installed, has not registered its key yet, or the installed agent failed the script's Anzenna signature check

Empty

The script has not run on this Mac since you added the attribute, or the agent exited without printing a value. Run sudo jamf recon on the Mac to report again.

ERROR

The agent could not read its configuration or its key store. Contact Anzenna support.

EXPOSED

The key is readable by any local process, so Anzenna will not trust it. Contact Anzenna support.

3. Add the trust-ready extension attribute​

This attribute reports whether Anzenna is serving the Mac's certificate. Only the smart group in the next step reads the attribute, so you can give the attribute any name you like.

  1. Go to Settings > Computer management > Extension attributes and click New

  2. Set Display Name to Anzenna Pharos Trust Ready

  3. Set Description so the next admin knows the attribute controls the certificate, for example:

    READY when Anzenna serves this Mac's trust certificate. The Anzenna Pharos Trust Ready Macs smart group and the trust blueprint depend on this value. A Mac that reports anything else loses the certificate.

  4. Set Data type to String and Inventory display to Extension attributes

  5. Set Input type to Script, paste the script below, and click Save

#!/bin/sh
agent="/Library/Application Support/Anzenna/Pharos/anzenna-pharos-agent"
req='anchor apple generic and identifier "ai.anzenna.anzenna-pharos-agent" and certificate leaf[subject.OU] = "364X5UJPJH"'
if [ ! -x "$agent" ] || ! /usr/bin/codesign --verify --strict -R="$req" "$agent" 2>/dev/null; then
echo "<result>NOT_READY</result>"
exit 0
fi
out="$("$agent" --print-pharos-trust-ready 2>/dev/null)"
echo "<result>${out:-UNSUPPORTED}</result>"
ValueMeaning
READYAnzenna is serving this Mac's certificate
NOT_READY

Anzenna has not confirmed this Mac yet, or has stopped serving its certificate. Also shown when AI DLP is not installed, or the installed agent failed the script's Anzenna signature check.

UNSUPPORTED

The installed agent is too old to report this value. The Mac gets the certificate once the agent updates.

ERROR

The agent could not read its trust state or its certificate. Contact Anzenna support.

Empty

The script has not run on this Mac since you added the attribute. Run sudo jamf recon on the Mac to report again.

4. Create the smart group​

  1. Go to Computers > Smart computer groups and click New

  2. Set Display Name to Anzenna Pharos Trust Ready Macs

  3. On the Criteria tab, click Add. The criteria list includes Anzenna Pharos Trust Ready only once you have saved the attribute in step 3. If the attribute is not in the default list, click Show Advanced Criteria, then click Choose next to the attribute.

  1. Set the operator to is and the value to READY

  2. Click Save

A Mac joins the group when its attribute turns READY and leaves the group when the attribute changes to any other value. The agent updates Jamf inventory itself on each change.

5. Create the Blueprint​

  1. Go to Blueprints and create a new blueprint. Any name works. Anzenna Pharos Trust matches the profile name the Mac will show.

  2. In the Components library, search for Custom Declarations and add it to the blueprint

  1. Open Custom Declarations and add a custom configuration with these values:

FieldValue
KindConfiguration
ChannelSystem
Typecom.apple.configuration.legacy
Payload

The JSON below, with your Anzenna domain in place of the placeholder. Use the same value as the install policy's Anzenna domain parameter.

{
"ProfileURL": "https://pharos-mtls.anzenna.ai/pharos/trust/replace-with-your-domain/profile"
}
Type has its own field

Enter com.apple.configuration.legacy in the Type field. The Payload box takes only the object containing ProfileURL. Do not paste a whole declaration with its own Type into it.

  1. Click Save

  2. Scope the blueprint to the Anzenna Pharos Trust Ready Macs smart group only. Do not scope it to all Macs running AI DLP.

  1. Click Deploy right away. Jamf sends the blueprint to each Mac as the Mac joins the group.

Blueprint already scoped to a wider group

If the blueprint is scoped to all Macs running AI DLP, do not narrow the scope until every Mac that holds the certificate reports READY. A Mac that reports anything else, including UNSUPPORTED from an agent that has not updated yet, leaves the blueprint's scope when you narrow it, and Jamf removes its certificate. Once those Macs report READY, change the scope to the smart group, and add a query string to the ProfileURL once, as described in The blueprint shows "1 Error". The query string changes the declaration, and a changed declaration makes a Mac retry a fetch that already failed.

Verify the certificate​

Allow about an hour after installing AI DLP. Some Macs take up to two hours. The fingerprint reaches Jamf within about half an hour, and Anzenna's Jamf sync runs about every 30 minutes. Once Anzenna serves the certificate, the agent reports READY within about another half hour. The Mac fetches the certificate within minutes of joining the smart group.

  • In Jamf Pro: the Mac's Anzenna Pharos Trust Ready attribute shows READY, and the blueprint's status for the Mac shows the declaration as deployed

  • On the Mac: System Settings > Privacy & Security > Profiles lists Anzenna Pharos Trust. The profile holds one certificate, or two while a previous certificate is still valid. Both are normal.

Uninstalling​

Removing the install policy does not uninstall anything. Uninstalling is a second policy running the uninstall script Anzenna provided. It takes no parameters.

  1. Add the uninstall script under Settings > Computer Management > Scripts, as in step 1. No parameter labels are needed.

  2. Create a new policy, add the uninstall script, and set Execution Frequency to Once per computer

  3. Scope it to the Macs you want AI DLP removed from, and save

If you delivered the trust certificate, also select the uninstall policy's Maintenance payload and check Update Inventory. The inventory update turns the Mac's Anzenna Pharos Trust Ready attribute to NOT_READY. The Mac then leaves the smart group, and Jamf removes the certificate. Without that payload, the certificate stays until the Mac's next scheduled inventory update.

The uninstall removes the agent, its scheduled job, and its configuration. It is idempotent — running it on a Mac that never had AI DLP is a clean no-op.

Troubleshooting​

"Parameter 4 (Anzenna domain) is required"​

  • The policy's Parameter 4 field is empty. It takes your Anzenna domain.

  • Confirm you filled the field in the policy, not only labelled it on the script

"Parameter 5 (Client Token) is required"​

The portal refused the enrollment​

The log shows exit 40:

The install succeeded but no findings appear​

  • Check that Anzenna knows the device. If no connected MDM or EDR integration reports its serial number, AI DLP installs but does not register — see

    Devices must already be known to Anzenna

    . Connect the integration; the device registers on its own once it is reported.

  • For Claude Code, check the version meets the

    minimum requirement

    . Older versions produce no findings and no error.

  • For desktop AI apps, check that the Mac has the trust certificate (see

    Verify the certificate

    ). Without it, desktop apps produce no findings.

"codesign rejected or could not evaluate"​

  • Check the network path first. A Mac that cannot reach Apple's certificate servers produces this same error, so it is not automatically a security problem.

  • An inspecting proxy that rewrites downloaded bytes will also cause it

"validly signed but NOT by Anzenna"​

Stop and contact Anzenna support. This means the downloaded file is properly signed by someone other than Anzenna, and the script correctly refused to run it.

The policy succeeded but the portal shows nothing new​

  • If the log says already registered … (exit 2), the Mac was already enrolled before this run. Nothing is wrong.

  • If the log ends at install: complete with no AI DLP lines yet, the background update run has not finished. Check again shortly.

The trust-ready attribute is not READY​

  • UNSUPPORTED: the Mac's agent predates the trust-ready value. The agent updates itself in the background, and the attribute changes on the Mac's next inventory update after that.

  • ERROR: contact Anzenna support.

  • NOT_READY: check that the Mac's fingerprint shows 64 hexadecimal characters (see

    step 2

    ). Anzenna confirms the Mac only after that value reaches Jamf. Then allow two hours after AI DLP is installed (see

    Verify the certificate

    for timing). If the value is still NOT_READY after that, contact Anzenna support.

The blueprint shows "1 Error"​

A Mac tried to fetch its certificate and failed. Usually the blueprint reached the Mac before Anzenna had confirmed the Mac, which happens when the blueprint is scoped wider than the smart group. macOS does not retry promptly, and deploying an unchanged blueprint again does nothing.

  1. Check that the blueprint is scoped to the Anzenna Pharos Trust Ready Macs smart group, and that the Mac's Anzenna Pharos Trust Ready attribute shows READY

  2. Edit the declaration and add a query string to the end of ProfileURL, for example ?epoch=2. Use ?epoch=3 the next time, and so on.

  3. Click Save, then Deploy. Every Mac in scope fetches the certificate again.

Finding the error's reason

Jamf Pro's interface shows only the error count. The Jamf Pro API returns the reason: GET /api/v1/ddm/{managementId}/status-items for the Mac, which needs the Read Computers and Read Mobile Devices privileges.

If the error persists, check that the Mac runs macOS 15 or later and meets the enrollment prerequisite above.


Need help? Contact

Anzenna Support

for assistance.