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
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.
Product Coverage
| Product surface | Jamf step | What security receives |
|---|---|---|
| Claude Code | S3 helper installs Claude Code hooks for the console user | Prompt, lifecycle, tool, permission, command, file, and inventory telemetry where Claude Code exposes it |
| Cursor | Separate user hook policy installs Cursor hooks | Prompt, tool, shell command, MCP-like, approval, file edit, and inventory telemetry where Cursor exposes it |
| Codex CLI | Separate user config policy writes ~/.codex/config.toml | Codex semantic logs and token usage metrics emitted through local OTLP |
| Claude Cowork, cloud agents, CI, SDK apps | Out of scope for this Mac MDM runbook | Configure those from their runtime-specific pages |
Prerequisites
Prepare these before touching Jamf:- A signed and notarized Beacon endpoint
.pkgthat 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:PutObjectpermission for the selected bucket prefix.- A security decision that prompt, command, tool, file, model, and inventory telemetry may be written to customer-controlled S3.
runtime or inventory:
AWS Permission
Scope write access to the Beacon prefix:0600.
Jamf Policy Plan
Create these policies in order:| Order | Policy | Runs as | Purpose |
|---|---|---|---|
| 1 | Install Beacon package | root | Installs Beacon binaries, Vector, and packaged Jamf helpers |
| 2 | Configure S3 and Claude Code | root, with console user present | Repairs the endpoint, installs Claude Code hooks, prepares local logs, and starts S3 forwarding |
| 3 | Configure Cursor hooks | root wrapper, switches to console user | Installs Cursor hooks for the logged-in user and points them at the system runtime log |
| 4 | Configure Codex CLI | user-aware policy or managed config | Writes Codex OTLP settings for each user |
Step 1: Install Beacon Package
In Jamf Pro:- Upload the signed Beacon endpoint
.pkg. - Create a policy named
Beacon - Install Package. - Add the package with the install action.
- Scope it to your pilot Smart Group.
- Run it before the S3, Cursor, or Codex policies.
Step 2: Configure S3 And Claude Code
Create a Jamf script namedBeacon - Configure S3 Forwarding.
Use this wrapper:
| Parameter | Label | Example |
|---|---|---|
| 4 | S3 bucket | example-security-logs |
| 5 | AWS region | us-west-2 |
| 6 | S3 prefix root | beacon-prod |
| 7 | S3 storage class | STANDARD |
| 8 | Vector read position | end |
| 9 | OTLP gRPC port | 4317 |
| 10 | OTLP HTTP port | 4318 |
Beacon - Configure S3 and Claude Code:
- Scope it to Macs where the package has installed.
- Run it only when a normal interactive console user is logged in.
- Add the script above.
- Fill parameters 4-10.
- Deliver AWS credentials through your approved Jamf secret or identity mechanism.
| Credential pattern | Variables to provide |
|---|---|
| Access key | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, optional AWS_SESSION_TOKEN |
| AWS profile | AWS_PROFILE, optional AWS_SHARED_CREDENTIALS_FILE, AWS_CONFIG_FILE |
| Web identity | AWS_WEB_IDENTITY_TOKEN_FILE, AWS_ROLE_ARN |
- 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.
Step 3: Configure Cursor Hooks
Create a Jamf script namedBeacon - Configure Cursor Hooks.
Use this wrapper:
| Parameter | Label | Example |
|---|---|---|
| 4 | Hook harnesses | cursor |
| 5 | Hook level | user |
| 6 | Runtime log path | /var/log/beacon-agent/runtime.jsonl |
Beacon - Configure Cursor Hooks:
- Scope it to Macs where the package has installed.
- Run it only when a normal interactive console user is logged in.
- Add the script above.
- Set parameter 4 to
cursor. - Ask users to fully restart Cursor after the policy runs.
Step 4: Configure Codex CLI
Codex CLI is not hook-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:
Validate A Deployed Mac
Run these checks on a target Mac after each policy completes.1. Confirm Services
running.
2. Confirm Local Files
3. Confirm S3 Forwarder Config
4. Confirm Hook And Codex Config
Run as the logged-in user: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:6. Generate Product Events
Generate a Claude Code event:7. Confirm S3 Delivery
Vector batches uploads. Production configs usetimeout_secs = 300, so allow up to five minutes.
Troubleshooting
No S3 Objects
Check the forwarder:Cursor Hooks Are Missing
Confirm the hook policy ran while a user was logged in. The helper exits when the console user isroot 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:Codex Events Are Missing
Confirm Codex CLI is installed and the user config includes OTel: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.Related
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.

