Skip to main content

Overview

Use this runbook when your security team wants Jamf Pro to deploy Beacon on managed Macs and forward supported Anthropic, OpenAI, and Cursor endpoint telemetry to AWS S3. This guide is intentionally specific to S3. It covers local products that run on the Mac:
  • Anthropic Claude Code
  • OpenAI Codex CLI
  • Cursor
It does not configure Claude Cowork, Claude Code cloud agents, Cursor Cloud Agents, CI agents, or SDK-instrumented server applications. Those use separate collection paths.

Security Outcome

After rollout:
  • Beacon is installed under /opt/beacon.
  • The local collector runs as com.beacon.endpoint.collector.
  • The S3 forwarder runs as com.beacon.endpoint.s3-forwarder.
  • Claude Code hooks write local runtime telemetry.
  • Cursor hooks write local runtime telemetry.
  • Codex CLI sends OTLP logs and token metrics to Beacon’s local collector.
  • Runtime telemetry is written locally to /var/log/beacon-agent/runtime.jsonl.
  • Inventory telemetry is written locally to /var/log/beacon-agent/inventory_state.jsonl.
  • Vector uploads both JSONL streams to your S3 bucket.
Expected S3 prefixes:
Runtime objects contain agent activity. Inventory objects contain agent configuration inventory such as known hooks, MCP servers, and skills where Beacon can inspect them locally.

Product Coverage

Prerequisites

Prepare these before touching Jamf:
  • A signed and notarized Beacon endpoint .pkg that includes /opt/beacon/bin/vector.
  • Claude Code, Codex CLI, and Cursor installed on the target Macs where those products are in scope.
  • A pilot Jamf Smart Group.
  • A target AWS S3 bucket.
  • An S3 prefix root such as beacon-prod.
  • AWS credentials, profile, web identity, or role material available to the Jamf S3 policy at install time.
  • s3:PutObject permission for the selected bucket prefix.
  • A security decision that prompt, command, tool, file, model, and inventory telemetry may be written to customer-controlled S3.
Use a root prefix. Do not include runtime or inventory:

AWS Permission

Scope write access to the Beacon prefix:
Beacon does not store AWS credentials in endpoint configuration. The S3 helper writes only the AWS provider-chain values it receives into:
That file is owned by root and mode 0600.

Jamf Policy Plan

Create these policies in order: Keep policies 2, 3, and 4 separate during rollout. That makes failures easier to triage and avoids hiding user-context failures behind package installation success.

Step 1: Install Beacon Package

In Jamf Pro:
  1. Upload the signed Beacon endpoint .pkg.
  2. Create a policy named Beacon - Install Package.
  3. Add the package with the install action.
  4. Scope it to your pilot Smart Group.
  5. Run it before the S3, Cursor, or Codex policies.
The package installs:

Step 2: Configure S3 And Claude Code

Create a Jamf script named Beacon - Configure S3 Forwarding. Use this wrapper:
Set Jamf parameter labels: Create a policy named Beacon - Configure S3 and Claude Code:
  1. Scope it to Macs where the package has installed.
  2. Run it only when a normal interactive console user is logged in.
  3. Add the script above.
  4. Fill parameters 4-10.
  5. Deliver AWS credentials through your approved Jamf secret or identity mechanism.
The S3 helper can persist these AWS provider-chain settings for the Vector LaunchDaemon: Use Jamf parameters for non-secret values such as bucket, region, and prefix. Avoid putting long-lived access keys directly in ordinary policy parameter fields or policy logs. This policy:
  • Installs the S3 Vector forwarder.
  • Repairs the Beacon system endpoint.
  • Starts com.beacon.endpoint.collector.
  • Creates /var/log/beacon-agent/runtime.jsonl.
  • Creates /var/log/beacon-agent/inventory_state.jsonl.
  • Grants the console user append access to Beacon logs.
  • Installs Claude Code hooks for the console user.
  • Starts com.beacon.endpoint.s3-forwarder.

Optional: Enable Endpoint Self-Updates

Beacon package self-updates are off by default. To let Beacon apply future signed package updates after the Jamf install, add a Jamf Files and Processes payload or post-install policy command:
Enable automatic package self-updates
For visibility without automatic package installation, enable check-only mode instead:
Enable check-only update monitoring
Both commands require root. auto mode verifies release manifest checksums, Developer ID signature, and Gatekeeper install assessment before applying a signed package. check-only mode writes update status events to /var/log/beacon-agent/system.jsonl without downloading or applying packages.

Step 3: Configure Cursor Hooks

Create a Jamf script named Beacon - Configure Cursor Hooks. Use this wrapper:
Set Jamf parameter labels: Create a policy named Beacon - Configure Cursor Hooks:
  1. Scope it to Macs where the package has installed.
  2. Run it only when a normal interactive console user is logged in.
  3. Add the script above.
  4. Set parameter 4 to cursor.
  5. Ask users to fully restart Cursor after the policy runs.
The helper switches to the console user and runs:

Step 4: Configure Codex CLI

Codex CLI runtime telemetry is OTLP-based. It reads OTLP settings from ~/.codex/config.toml. Use your standard Jamf user-context mechanism or managed config approach to ensure each Codex user has this block:
Preserve existing non-OTel Codex settings and ensure the final file is owned by the user. This step is required for Codex runtime telemetry. Optional Codex hooks can be installed separately when you want Codex sessions to trigger inventory heartbeats.

Validate A Deployed Mac

Run these checks on a target Mac after each policy completes.

1. Confirm Services

Both services should be running.

2. Confirm Local Files

3. Confirm S3 Forwarder Config

Expected lines include:

4. Confirm Hook And Codex Config

Run as the logged-in user:
Claude and Cursor should reference beacon-hooks. Codex should include [otel], [otel.exporter."otlp-grpc"], and [otel.metrics_exporter."otlp-grpc"].

5. Generate Local Test Events

Write a synthetic endpoint event:
Write an inventory heartbeat:
Confirm both local files have events:

6. Generate Product Events

Generate a Claude Code event:
Generate a Codex CLI event:
Generate a Cursor event by starting a new Cursor session after restart and sending a prompt with a unique marker:

7. Confirm S3 Delivery

Vector batches uploads. Production configs use timeout_secs = 300, so allow up to five minutes.
Inspect an object:

Troubleshooting

No S3 Objects

Check the forwarder:
If launchctl reports Could not find service "com.beacon.endpoint.s3-forwarder", the S3 files may still be present but the optional LaunchDaemon is not loaded. When the saved S3 environment exists, rerun the packaged installer to rewrite the Vector config and plist and start the service:
Use the same command as a Jamf remediation policy for devices where this health check fails:
Then run this script on those devices, or on all Beacon devices if the original S3 env file should already exist everywhere:
Verify that the env file has non-secret settings without printing credentials:

Cursor Hooks Are Missing

Confirm the hook policy ran while a user was logged in. The helper exits when the console user is root or loginwindow. Run the hook policy again after login, then restart Cursor.

Claude Code Events Are Missing

Confirm the S3 helper ran while a user was logged in, then check Claude settings as that user:
Fully restart Claude Code after installing hooks.

Codex Events Are Missing

Confirm Codex CLI is installed and the user config includes OTel:
Codex runtime telemetry is OTLP-based. Re-run the Codex config policy for the logged-in user if the OTel block is missing.

Inventory Is Empty

Force inventory and inspect the local file:

Cloud Or Admin Products Are Missing

Claude Cowork, Claude Code cloud agents, Cursor Cloud Agents, CI agents, and SDK-instrumented OpenAI or Anthropic applications are not configured by this Mac MDM policy. Use their runtime-specific setup pages and validate those events at the collector or destination they target.

Claude with Jamf and S3

Review the Claude-specific S3 helper and validation flow.

Claude Code

Review Claude Code endpoint telemetry coverage.

Codex CLI

Review OpenAI Codex CLI endpoint telemetry coverage.

Cursor

Review Cursor hook telemetry coverage.