/var/log/beacon-agent/runtime.jsonl on macOS and Linux, %ProgramData%\Beacon\Endpoint\logs\runtime.jsonl on Windows. Your SIEM shipper reads that file. Restricted log access is the mode to use when no ordinary account on the machine should be able to change that file or read it.
Why the default log is shared
Agent hooks run as the person using the agent, not as root. In the default shared mode they append to the system log directly, so the file has to be writable by every account (0666). That has two consequences on a machine with more than one account, or one where a user should not be trusted with the evidence:
- Any local account can truncate, rewrite or delete events already in the log, including before your shipper has read them.
- Any local account can read every other user’s prompts, command output and diffs.
What restricted mode changes
In the restricted mode the root collector is the only process that writes the log. Hooks hand their events to it over a local Unix socket instead of opening the file.
The event format and every field stay the same, so a parser, DCR transform or SIEM rule built for the shared log needs no change. Nothing leaves the machine: the socket is a local file, and hooks still never touch the network.
Delivery while the collector is down
If the collector is stopped or restarting, a hook writes its events to a spool in that user’s home,~/.beacon/endpoint/spool (0700 directory, 0600 files), and returns at once, so the agent is never held up. The next event that user’s hooks send delivers the spooled ones first. Each spool is capped at 8 MiB; events past that are dropped and counted rather than filling the disk. beacon endpoint doctor reports a collector that is not answering on the socket and any events waiting in the caller’s spool.
Turn it on
Restricted log access applies to system-mode installs on macOS, Linux and Windows. A per-user log in
~/.beacon is already private to its owner. On Windows, hooks use a named pipe instead of a socket and the log is closed off by its ACL instead of file modes; see On Windows.Install with restricted log access
Switch an existing endpoint to restricted
BEACON_LOG_ACCESS=restricted in the environment of the package’s install script.
Switching replaces the log and its archives with fresh copies, so a file handle another account opened while the log was shared stops reaching it. Existing events are kept.
The mode is recorded in config.json as log_access and in a root-owned .beacon-log-access marker beside the log. beacon endpoint repair, package upgrades, the Jamf repair-hooks.sh policy, and a reinstall after uninstall --keep-logs all keep it, so you set it once per endpoint.
On Windows
Restricted mode works the same way on a Windows system install, with Windows mechanisms in place of the Unix ones.
The pipe is created by the SYSTEM collector, refuses connections from other machines and denies network logons, and does not let ordinary accounts add an instance of their own. Hooks send only to a pipe that SYSTEM or Administrators created, so an account that takes the name first gets nothing: hooks keep their events in their spool, and the collector keeps running and serves the pipe as soon as the name is free. Hooks run by SYSTEM or by an administrator from an elevated shell write the log directly, as root does on Unix.
Run the commands from an elevated shell:
Switch a Windows endpoint to restricted
install-endpoint.ps1, set BEACON_LOG_ACCESS=restricted in the machine environment before installing. An upgrade with the variable unset keeps whatever mode the endpoint has. The MSI’s install step runs inside the Windows Installer service, which sees a machine variable set after the service started only once it restarts, so after installing check that beacon endpoint status --system --json reports "log_access": "restricted", and if it does not, switch with beacon endpoint repair --system --log-access restricted.
Switching replaces every file in the log directory with a fresh copy and resets the security of everything in it, so a handle another account opened while the log was shared stops reaching it. Windows cannot replace a file that another process holds open without allowing deletes. If one does, the switch waits a few seconds, then fails and names the file. The log is put back to shared, so hooks keep writing. Close that process (or sign the account out) and run the command again.
Add a shipper’s account to the readers group from an elevated shell, then restart the shipper:
Add a shipper's account to beacon-log
NT SERVICE\SplunkForwarder, which must be added and the forwarder restarted:
Splunk Universal Forwarder 9.1 and later
beacon endpoint doctor --system from an elevated shell and expect runtime_log_access: ok and runtime_log_permissions: ok (restricted_acl), then check the directory:
Check the log directory's access
NT AUTHORITY\SYSTEM, BUILTIN\Administrators and beacon-log and nothing else.
Let your log shipper read the log
Install creates thebeacon-log group if it is missing and adds nobody to it. A shipper that runs as root keeps working with no change, and so does the Beacon Cloud forwarder. A shipper that runs as its own account needs to join the group, and then be restarted so it picks up the new membership:
Add a shipper's account to beacon-log
Find the account a shipper runs as
Check the shipper can read the log
Microsoft Sentinel
Azure Monitor Agent. AMA tails the file as the account its agent runs under. If that is not root, add it tobeacon-log as above and restart AMA. The DCR, transform and BeaconRuntime_CL table are unchanged.
Vector and the Logs Ingestion API. The beacon-sentinel service runs Vector as a DynamicUser, which has no fixed account to add to a group. Give the unit the group instead:
/etc/systemd/system/beacon-sentinel.service
Apply it
/var/lib/vector/beacon-sentinel, so it resumes where it stopped and does not resend the log.
Other shippers
rsyslog. When rsyslog forwards the log to your collector, it reads the file as root on RHEL, Debian and most other distributions, so nothing changes there. On Ubuntu it runs as thesyslog user: run sudo usermod -aG beacon-log syslog and restart rsyslog. See With restricted log access.
The same rule applies to Splunk Universal Forwarder, Filebeat or Elastic Agent, the Datadog Agent, Wazuh, Rapid7, Sumo Logic and any customer-managed shipper reading the local JSONL log: running as root, nothing changes; running as its own account, add that account to beacon-log and restart it. Splunk HEC and Falcon LogScale HEC are sent by the collector itself and are not affected.
Who can do what on a restricted endpoint
Add people to
beacon-log only when they should see every user’s sessions on that machine, the same as you would for a shipper.
What restricted mode does and does not protect
Restricted mode protects the log: what has been recorded cannot be altered or read by other local accounts. It does not take control of each person’s agent away from them.- A user still controls their own agent. They can still send events of their own choosing through the socket, including ones that name another session’s id, but every event is recorded under their own account, as the operating system reports it. They cannot write an event that claims to be someone else’s.
- A user can still change their own agent settings. The hooks and OpenTelemetry settings that send an agent’s activity to Beacon live in each user’s home (for example
~/.claude/settings.json), and that user can edit them, which stops capture of their future sessions. Restricted mode does not change this. Runbeacon endpoint doctor --systemfrom your MDM to catch it:console_user_configuredfails when the logged-in user’s agents no longer point at the collector, andsudo beacon endpoint user-config repair-installed --systemputs the settings back. - The OTLP ports are not attributed. The collector’s OTLP receivers on
127.0.0.1:4317and4318still accept telemetry from any local process, as in the shared mode. Agents that export over OTLP, such as Claude Code and Codex, use them, and events that arrive that way carry the user the agent reports rather than one the operating system confirmed. - Root is trusted. An administrator can read and change the log in either mode. On Windows that is SYSTEM and any elevated administrator.
Verify
Check the mode and the socket
runtime_log_access: ok with log_access_restricted, the directory as drwxr-s--- root beacon-log, and the log as -rw-r----- root beacon-log. Then confirm events still arrive from an ordinary account: as that user, send one prompt in an agent that uses hooks, such as Cursor or Claude Code, and look for it:
See which accounts recent events came from
ingest_socket_missing or ingest_socket_unresponsive, the collector is not serving the socket and hooks are spooling: restart or repair the collector. The full list of results is under runtime_log_access.
Switch back
Return to the shared log
beacon-log members keep working.
Related
Endpoint install
The
--log-access flag and install behavior.Microsoft Sentinel
Forward the runtime log with Azure Monitor Agent or Vector.
Endpoint operations
Paths, permissions, and daemon behavior.
Data flow and threat model
Trust boundaries from collection to forwarding.