Files and ports¶
This page lists every file, directory, port, systemd unit and user that the Bor server and agent use, including the files the agent manages on desktops for each policy type. Paths are the defaults; where a setting can change a path, the setting is named.
Server¶
Files and directories¶
| Path | Owner / mode | Purpose | Setting |
|---|---|---|---|
/usr/bin/bor-server |
root, 0755 |
Server binary. | - |
/etc/bor/server.yaml |
root:bor, 0640 |
Main configuration. Contains the JWT secret, possibly the database password and the initial admin password. Preserved on upgrade. | BOR_CONFIG (environment) |
/etc/bor/server.env |
root, 0600 recommended |
Optional environment file read by the systemd unit. Environment variables override server.yaml. Not created by the package. |
- |
/lib/systemd/system/bor-server.service |
root, 0644 |
systemd unit. | - |
/var/lib/bor/pki/ |
bor:bor, 0750 |
PKI root directory. | - |
/var/lib/bor/pki/ca/ca.crt |
bor |
Internal CA certificate (ECDSA P-384, valid 10 years). Also served at /agent/ca.crt. |
ca.autogen_dir, ca.cert_file |
/var/lib/bor/pki/ca/ca.key |
bor |
Internal CA private key. Signs agent certificates. Protect and back up. | ca.autogen_dir, ca.key_file |
/var/lib/bor/pki/ui/ui.crt, ui.key |
bor |
Auto-generated server TLS certificate (ECDSA P-256, valid 1 year, signed by the internal CA). Used on both ports unless you configure your own certificate. | tls.autogen_dir, tls.cert_file, tls.key_file |
/var/lib/bor/acme/ |
bor:bor, 0750 |
ACME account and certificate cache. | acme.cache_dir |
/var/lib/bor/initial_admin_password |
bor, 0600 |
Only written when no users exist and no initial admin password is configured. Delete after use. | - |
/usr/share/bor/agent-repo/ |
root | Agent packages, apt/dnf repositories and manifest.json, served at /agent/. Replaced on every server upgrade. |
agent_repo.dir |
/etc/bor/escrow.kek (example) |
bor, 0600 |
Key-encryption key for disk-encryption recovery-key escrow. Only if configured. | disk_encryption.escrow_kek_file |
/etc/bor/krb5.keytab (example) |
bor, readable |
Service keytab for Kerberos agent enrollment. Only if configured. | kerberos.keytab_file |
The packaged systemd unit runs with ProtectSystem=strict and allows writes
only to /var/lib/bor/pki and /var/lib/bor/acme.
Database¶
All other state lives in the PostgreSQL database (default database and role
bor): policies, bindings, nodes, node groups, users, roles, settings,
compliance results, audit logs, enrollment tokens, the policy revision
counter and escrowed disk-encryption recovery keys.
Ports¶
| Port | Bind address | Protocol | Clients | Setting |
|---|---|---|---|---|
| 8443 (default); 443 recommended for production | all interfaces | HTTPS (TLS 1.2+, HTTP/2) and gRPC; with ACME also the TLS-ALPN-01 challenge (only useful on 443) | Browsers, REST API clients, enrolling agents, package managers | server.enrollment_port / BOR_ENROLLMENT_PORT. See Choose the web port. |
| 8444 | all interfaces | gRPC over TLS 1.3 with mandatory client certificates | Enrolled agents | server.policy_port / BOR_POLICY_PORT |
| 9090 | 127.0.0.1 |
HTTP (HTTPS if a certificate is set) | Prometheus | metrics.listen_addr / BOR_METRICS_ADDR |
| 80 | all interfaces | HTTP | ACME CA (HTTP-01 challenge) | acme.http_port, only when acme.enabled |
server.address (BOR_ADDRESS) restricts the UI and policy ports to one
address; empty means all interfaces.
Outbound connections depend on configuration: PostgreSQL (5432 when remote), LDAP (389 / 636), syslog audit forwarding, the ACME CA, and HTTPS downloads of Flatpak repository catalogs.
Service and user¶
| Item | Value |
|---|---|
| systemd unit | bor-server.service |
| Runs as | user bor, group bor (system account, home /var/lib/bor, no login shell) |
| Capabilities | CAP_NET_BIND_SERVICE only |
| Log | journald, identifier bor-server |
| Depends on | postgresql.service (ordering and Wants=) |
Agent¶
Files and directories¶
| Path | Owner / mode | Purpose | Setting |
|---|---|---|---|
/usr/bin/bor-agent |
root, 0755 |
Agent binary. | - |
/etc/bor/config.yaml |
root, 0600 |
Agent configuration. Preserved on upgrade. | --config |
/lib/systemd/system/bor-agent.service |
root, 0644 |
systemd unit. | - |
/var/lib/bor/agent/ |
root, 0750 |
Enrollment data directory. | enrollment.data_dir |
/var/lib/bor/agent/agent.crt |
root, 0644 |
Agent client certificate (valid 90 days, renewed at startup within 30 days of expiry). | - |
/var/lib/bor/agent/agent.key |
root, 0600 |
Agent private key. | - |
/var/lib/bor/agent/ca.crt |
root, 0644 |
Server CA certificate received during enrollment; used to verify the policy port. | - |
/var/lib/bor/agent/flatpak-state.json |
root | Remotes Bor created or adopted, used to undo changes. | flatpak.state_file |
/var/lib/bor/agent/luks-state.json |
root | Disk-encryption rotation progress (never contains keys). | disk_encryption.state_file |
/etc/bor/luks-bootstrap/ |
root | One-time LUKS provisioning credentials placed by an installer; wiped after adoption. | disk_encryption.bootstrap_dir |
/run/bor/luks/ |
root, 0700 |
Work directory and lock file for disk-encryption operations. | disk_encryption.run_dir |
/etc/bor/enroll-token |
root, 0600 |
Temporary token file used by the deploy script; deleted after enrollment. | --token-file |
Service and user¶
| Item | Value |
|---|---|
| systemd unit | bor-agent.service |
| Runs as | root |
| Restart | on-failure, after 30 seconds; stop timeout 120 seconds |
| Log | journald, identifier bor-agent |
Network¶
The agent only makes outbound connections:
| Destination | Purpose | Setting |
|---|---|---|
| Server web port (default 8443, 443 recommended) | Enrollment (token or Kerberos), agent package repository | server.address, server.enrollment_port (must equal the server's) |
| Server port 8444 | Policy stream, compliance reports, certificate renewal | server.address, server.policy_port |
| KDC (88) | Kerberos enrollment only | kerberos.kdc or /etc/krb5.conf |
Package and Flatpak policies make the endpoint's package tools contact the repositories defined in those policies.
Managed files on endpoints¶
These are the files the agent writes for each policy type. "Watched" means the file watcher restores the file immediately when it is modified or deleted outside Bor, and reports a tamper event.
When the agent replaces an existing file, it first saves the original as
<file>.bor-backup (an empty backup means no original existed). When the
last policy of that type is removed from the node, the original is restored
or the file deleted.
| Policy type | Path | Watched | Setting |
|---|---|---|---|
| Firefox | /etc/firefox/policies/policies.json |
Yes | firefox.policies_path |
| Firefox (Flatpak) | /var/lib/flatpak/extension/org.mozilla.firefox.systemconfig/<arch>/stable/policies/policies.json |
Yes | firefox.flatpak_policies_path |
| Thunderbird | /etc/thunderbird/policies/policies.json |
Yes | thunderbird.policies_path |
| Thunderbird (Flatpak) | /var/lib/flatpak/extension/net.thunderbird.Thunderbird.systemconfig/<arch>/stable/policies/policies.json |
Yes | thunderbird.flatpak_policies_path |
| Chrome | /etc/opt/chrome/policies/managed/bor_managed.json |
Yes | chrome.chrome_policies_path |
| Chromium | /etc/chromium/policies/managed/bor_managed.json |
Yes | chrome.chromium_policies_path |
| Chromium (Debian/Ubuntu) | /etc/chromium-browser/policies/managed/bor_managed.json |
Yes | chrome.chromium_browser_policies_path |
| Chromium (Flatpak) | /var/lib/flatpak/extension/org.chromium.Chromium.Extension.system-policies/<arch>/1/policies/managed/bor_managed.json |
Yes | chrome.flatpak_chromium_policies_path |
| Microsoft Edge | /etc/opt/edge/policies/managed/bor_managed.json |
Yes | edge.edge_policies_path |
| KDE Plasma (KConfig) | Configuration files under /etc/bor/xdg/ |
Yes | kconfig.config_path |
| KDE Plasma (KConfig) | /etc/kde5rc, /etc/kde6rc (only with KCM restrictions) |
Yes | - |
| KDE Plasma (KConfig) | /etc/profile.d/99-bor.sh (adds /etc/bor/xdg to XDG_CONFIG_DIRS) |
No | - |
| Dconf | /etc/dconf/db/<db>.d/00-bor and /etc/dconf/db/<db>.d/locks/bor (<db> defaults to local) |
Yes | policy setting |
| Dconf | /etc/dconf/profile/user (ensures a system-db:<db> line) |
No | - |
| Polkit | /etc/polkit-1/rules.d/<priority>-bor-<id>.rules |
Yes | - |
| Firewall | Zone files /etc/firewalld/zones/<zone>.xml |
Yes | firewalld.zones_dir |
| Package (apt) | /etc/apt/sources.list.d/bor-<id>.sources, /etc/apt/trusted.gpg.d/bor-<id>.gpg |
Yes | - |
| Package (dnf) | /etc/yum.repos.d/bor-<id>.repo, /etc/pki/rpm-gpg/bor-<id>.gpg |
Yes | - |
| Package (zypper) | /etc/zypp/repos.d/bor-<id>.repo, /etc/pki/rpm-gpg/bor-<id>.gpg |
Yes | - |
| Flatpak apps | /etc/bor/flatpak/*.flatpakrepo, *.filter, *.gpg |
Yes | flatpak.state_dir |
| Session Access | Bor-managed block in /etc/security/time.conf |
Yes | - |
| Session Access (Debian/Ubuntu) | /usr/share/pam-configs/bor-session-access (enabled with pam-auth-update) |
No | - |
| Disk encryption | /etc/dracut.conf.d/90-bor-disk-encryption.conf, /etc/crypttab (Bor's options) |
Yes | - |
<arch> is the Flatpak architecture name (x86_64, aarch64, ...). Set
a Chrome/Chromium path or a Flatpak browser path to "" in
/etc/bor/config.yaml to stop writing that variant. Flatpak's own /var/lib/flatpak/repo/config is changed through the
flatpak command and is deliberately not watched.