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
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
Log in to Jamf Pro and go to Settings (the gear icon) > Computer Management > Scripts
Click New
On the General tab, give the script a display name, for example
Anzenna AI DLP - InstallOpen 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.
Open the Options tab
Set the parameter labels exactly as follows, leaving Parameters 6 through 11 empty:
| Field | Label |
|---|---|
| Parameter 4 | Anzenna domain |
| Parameter 5 | Client Token |
Click Save
3. Create the install policy
Go to Computers > Policies and click New
On the General payload, set a display name, for example
Anzenna AI DLP - InstallSet Trigger to Recurring Check-in
Set Execution Frequency to Once per computer
Check Automatically re-run policy on failure, then set Retry Event to On next recurring check-in and Retry Attempts to 3
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.
"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.
Select the Scripts payload and click Configure, then add the install script
Fill in the two parameter fields with your values:
| Parameter | Value |
|---|---|
| Anzenna domain | Your Anzenna domain |
| Client Token | Your domain's Client Token — find it in the portal |
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
Open the Scope tab
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.
Click Save
Scoped Macs run the policy on their next check-in. Once you have confirmed a successful install, widen the scope.
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
Open the policy and click Logs
Find a target computer and click Details for its run
Check that Script exit code is
0, and that the script result ends withanzenna-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".
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
The AI DLP agent creates a signing key on the Mac and registers it with Anzenna
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.
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.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.
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
In Jamf Pro, go to Settings > Computer management > Extension attributes and click New
Set Display Name to exactly
Anzenna Agent Key FingerprintSet 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.
Set Data type to String
Set Inventory display to Extension attributes. General, Hardware and User and Location also work. Anzenna does not read the other categories.
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.
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.
| Value | Meaning |
|---|---|
| 64 hexadecimal characters | Healthy. 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
|
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.
Go to Settings > Computer management > Extension attributes and click New
Set Display Name to
Anzenna Pharos Trust ReadySet 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.
Set Data type to String and Inventory display to Extension attributes
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>"
| Value | Meaning |
|---|---|
READY | Anzenna 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
|
4. Create the smart group
Go to Computers > Smart computer groups and click New
Set Display Name to
Anzenna Pharos Trust Ready MacsOn 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.
Set the operator to is and the value to
READYClick 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
Go to Blueprints and create a new blueprint. Any name works.
Anzenna Pharos Trustmatches the profile name the Mac will show.In the Components library, search for Custom Declarations and add it to the blueprint
Open Custom Declarations and add a custom configuration with these values:
| Field | Value |
|---|---|
| Kind | Configuration |
| Channel | System |
| Type | com.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 |
{
"ProfileURL": "https://pharos-mtls.anzenna.ai/pharos/trust/replace-with-your-domain/profile"
}
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.
Click Save
Scope the blueprint to the Anzenna Pharos Trust Ready Macs smart group only. Do not scope it to all Macs running AI DLP.
Click Deploy right away. Jamf sends the blueprint to each Mac as the Mac joins the 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 deployedOn 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.
Add the uninstall script under Settings > Computer Management > Scripts, as in step 1. No parameter labels are needed.
Create a new policy, add the uninstall script, and set Execution Frequency to Once per computer
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 policy's Parameter 5 field is empty. It takes your domain's Client Token —
find it in the portal
The portal refused the enrollment
The Client Token is wrong — find it in the portal
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: completewith 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 (seestep 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_READYafter 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.
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
READYEdit the declaration and add a query string to the end of
ProfileURL, for example?epoch=2. Use?epoch=3the next time, and so on.Click Save, then Deploy. Every Mac in scope fetches the certificate again.
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.