Repository navigation
Release v0.10.0 #203
eniac111
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Release v0.10.0
Licensing
Contributions require a signed Contributor License Agreement, handled on
the pull request. Vute Tech LTD also distributes Bor Enterprise under a
commercial license.
New Features
Disk Encryption Policy Type
DiskEncryption, shown as LUKS) is a new policy typethat manages LUKS2 full-disk encryption across the fleet. A policy names
the volumes in scope, requires them to be encrypted, enrolls unattended
unlocking through the TPM 2.0 chip (
systemd-cryptenroll, explicitPCR profiles) and/or Tang network servers (
clevis, pinned signingkeys the administrator confirmed), and escrows a per-volume recovery
key on the Bor server. Bor never converts a disk: an unencrypted volume
is reported as non-compliant.
initramfs (TPM, Tang or a typed recovery key); a server outage never stops
a machine from booting. The agent runs
cryptsetup,systemd-cryptenrolland
cleviswith fixed arguments and passes key material on stdin or adedicated pipe, never on a command line or in a file, and zeroes it after
use.
AES-256-GCM under a key-encryption key (KEK) read from a file outside the
database (
BOR_ESCROW_KEK_FILE), with the volume, LUKS UUID, record andKEK id bound as additional data. Escrow is a two-phase commit (escrow
first, confirm after the keyslot exists), rotation is crash-resumable, and
the KEK rotates through
BOR_ESCROW_KEK_PREVIOUS_FILESwith a backgroundrewrap. Without a KEK the feature stays off (fail closed).
summary, a volume search and the per-node detail. Revealing a recovery key
needs the
disk_encryption:revealpermission (Super Admin only bydefault), a reason or ticket number, and a fresh re-authentication with
the password and an authenticator code (step-up; the code is mandatory
while
BOR_ESCROW_REQUIRE_MFAis on, the default). Every reveal and everyrefusal is audited (
recoverykey.reveal,recoverykey.reveal_denied). Retired keys stayrevealable for
BOR_ESCROW_RETIRED_RETENTION_DAYS(30) and the keys ofdeleted nodes for
BOR_ESCROW_ORPHAN_RETENTION_DAYS(90), then they arecrypto-shredded.
server fetches and verifies the advertisement (JWS over ES512), pins the
RFC 7638 SHA-256 thumbprints, probes the servers periodically and reports a
key change (
tangserver.check).and tokens every 15 minutes; keyslot fingerprints detect drift and cloned
disks (
luks.drift,luks.clone_suspected,luks.tpm_reseal). The nodedrawer gains a disk encryption section and the Compliance page labels the
LUKS items.
bor-agent luks statusandbor-agent luks adopt, which inspect the volumes and enroll the Bor protectors withan existing passphrase, interactively and under a lock file. New machines
are provisioned through a one-time bootstrap credential directory.
disk_encryption:view(granted to every role that viewsnodes),
disk_encryption:revealanddisk_encryption:rotate(SuperAdmin) and
tang_server:*(roles withsettings:manage). New Prometheusgauges
bor_luks_volumes_total,bor_luks_escrow_operations_total,bor_luks_recovery_key_reveals_totalandbor_luks_recovery_keys_overdue_total; the CEF and OCSF exporters map thenew audit events and
recovery_keyis redacted everywhere.Services & Timers Policy Type
Systemd) is a new policy type for systemd unitson nodes. A policy sets, per unit, the enablement (enabled, disabled or
masked), the activity (running or stopped), overrides for a timer's
schedule and a service's restart, timeout, environment, resource and
sandboxing settings through a
90-bor.confdrop-in, raw directives foranything else, and a last-run check for timers and services. Several
bound policies are merged per unit by binding priority; on equal
priority the more restrictive value wins. The agent drives systemd over
D-Bus, records each unit's original state and restores it when the unit
leaves every policy, re-asserts states on a reconcile pass and within
seconds of a manual change through systemd's signals, and guards every
file it writes with the tamper watcher.
bor-<name>.servicewith a timer schedule or a boot trigger, sandboxedby default, optionally as an unprivileged user. Failed runs are
non-compliant with the exit status and the tail of the task's journal.
The
bor-prefix is mandatory, so a task can never replace a vendorunit.
in every user's
systemd --userinstance: enablement on the file systemunder
/etc/systemd/userexactly assystemctl --globaldoes, drop-insand tasks in the user manager, and the state applied to the sessions that
are logged in.
/etc/systemd/system-preset/10-bor.preset, so the policy's enablementdecisions also apply to units installed later.
it reported and offers Start, Stop and Restart to holders of
the new
systemd:operatepermission. The request goes to the agent overits policy stream, the row updates with the result, and the server records
a
systemd.unit_actionaudit event. Protected units are refused and riskyones ask for a confirmation.
picker shows what the chosen node does now. Schedule presets, a
next-runs preview computed by the server's
systemd-analyze, twotemplates (desktop hardening, maintenance window), a confirmation for
units whose stop can cut users off (network, SSH, display managers,
firewall, time sync, audit, cron) and a protected list the server
refuses (D-Bus, logind, journald, udev, polkit, the boot targets, the
agent itself).
SELinux and AppArmor Policy Types
Selinux) is a new policy type for nodes that run SELinux(Fedora, RHEL, SLES 16). A policy sets the enforcement mode (runtime and
/etc/selinux/config), boolean values, per-domain permissive exceptions,the enabled state of policy modules, Bor-deployed CIL modules installed
as
bor-<name>at semodule priority 450, file contexts with an optionalrelabel, and login mappings to confined SELinux users. Nodes without
SELinux report the policy inapplicable, or non-compliant when the policy
requires SELinux; a switch prepares disabled nodes for the next reboot.
The agent batches every module change of a sync into one
semodulerun, records every original value and restores it when the key leaves
every policy, re-asserts the state on a reconcile pass and within
seconds of a manual
setenforce,setseboolorsemoduleby followingthe audit records, and guards its files with the tamper watcher.
Apparmor) is a new policy type for nodes that runAppArmor (Ubuntu, Debian, SLES 15). A policy keeps AppArmor and its
service on, controls the user namespace restriction of Ubuntu kernels,
sets profile modes (enforce, complain, disabled) by file name or pattern
through the parser's
disable/andforce-complain/links withouttouching vendor files, deploys custom profiles as
bor-<name>after aparser syntax check, adds site-local rules to vendor profiles inside a
managed block of their
local/file, and adds home directory roots.Profiles that would share an executable with an existing profile are
refused, because the kernel would run it unconfined.
booleans, modules and profiles agents reported, with the server's
curated list of the switches that matter on desktops and their hardened
values, one-click templates (process hardening, network homes, kiosk
accounts, developer workstation; enforce all vendor profiles, user
namespace stub for an application, confine an application in complain
mode first, deny network) and confirmations before a permissive mode,
a disabled profile or a relaxed restriction.
policy can run under an AppArmor profile (
apparmorProfile, rendered asAppArmorProfile=) or an SELinux context (selinuxContext, rendered asSELinuxContext=), so a task can use a profile or type that an AppArmoror SELinux policy deploys; both editors point at the other.
benchmark control (the SELinux mode and active items, the AppArmor
enabled and profile items) carry the control's number and title in the
compliance API and as a label on the Compliance page.
runs (the kernel security module and its mode, the policy or parser
version, counts per mode), its booleans or profiles, and a summary of
the recent denials grouped by domain or profile with one redacted
example. A
userns_createdenial offers the ready stub profile. Holdersof the new
mac:operatepermission can ask the node for a proposal(
audit2allowoutput and its CIL translation, or AppArmor rulesderived from the denials) to review and paste into a policy; nothing is
applied by a proposal. The nodes list gains a MAC column and filter.
Software Updates Policy Type
Updates) is a new policy type that manages thedistribution's unattended update mechanism and the reboot after
updates. A policy sets what the node installs on its own (nothing,
check only, security updates, all updates), the schedule as a drop-in
of the engine's timer, packages held back, and the reboot rule: never,
when an update needs it, or after every run, within a daily window,
only when nobody is logged in unless the reboot has been pending for a
number of days, with a desktop warning before a reboot that affects
users. The agent drives
dnf-automatic(DNF 4 and 5),unattended-upgrades,os-updateand rpm-ostree's automatic updatepolicy, installs the engine package when it is missing, switches every
engine's own reboot off and decides reboots itself, records every
original state and restores it when the node leaves every policy.
effective mode, who configured it, the last check and run, the running
and newest installed kernel, whether a reboot is pending and why, and
the pending updates with their advisories, severities and CVE ids,
searchable and filterable to security updates.
reboot rule, each hold and the engine's last run. A policy's Limits
add three age items: a security update pending on the node longer than
the limit, a reboot pending longer than the limit, and package metadata
older than the limit (
updates:security-age,updates:reboot-age,updates:check-age), evaluated after every inventory scan. The modeand the age items carry the CIS control Ensure updates, patches, and
additional security software are installed (1.2.2.1 in CIS RHEL 9
v2.0.0 and CIS Ubuntu 24.04 v1.0.0) on the Compliance page.
for updates (refresh the metadata and report again), Install
updates now (run the engine once with the policy's mode and show the
tail of its output) and Reboot (at once without sessions; forced,
with a desktop warning and a one-minute delay, with users logged in).
They need the new
updates:operatepermission and are audited asupdates.action.(security updates pending, reboot pending, no update engine, not
reported) and the dashboard's fleet overview counts the nodes with
security updates pending, with a reboot pending and without an engine,
from a new
GET /api/v1/updates/summary.the inventory; a policy can enable or disable
fwupd-refresh.timerandreport pending firmware as non-compliant (
updates:firmware). Firmwareis never installed by policy. Snap packages are out of scope.
the engine's timer only downloads; the agent stores a dnf5 offline
transaction and the policy's reboot runs it before the desktop comes
up. A stored transaction counts as a pending reboot and is removed when
the policy leaves (
updates:offlineitem).are driven through
transactional-update(/etc/transactional-update.conf,its timer, zypper locks for holds,
/run/reboot-neededas the rebootsignal);
updates.enginein the agent configuration forces an engine.updates as CSV (node, groups, engine, package, version, advisory,
severity, CVE ids) from
GET /api/v1/updates/export, and dnf nodes nowreport the CVE ids of their security advisories.
timer schedule as
<timer>.d/90-bor-updates.conf(it was90-bor.conf, which the Services & timers type removed as one of itsown stale drop-ins); an agent upgrade replaces the old file.
KDE Plasma Policy Type Rebuilt
Plasma (
Kconfig) type is replaced by generic KConfig entries: anyconfiguration file, group path, key and value, with KDE's immutable
(
[$i]), shell-expansion ([$e]), default ([$d]) and locale markers.A built-in catalogue of curated settings (session and shell
restrictions, Plasma desktop, application menu actions, Dolphin, Konsole,
KRunner, Okular, Ark, KWallet, Kate, Spectacle, KDE PIM, screen lock,
session, power, appearance, launcher favourites, input and locale,
privacy, devices, KIO proxy, System Settings and URL rules) documents
each entry with the file, group and key it writes and the closest Windows
Group Policy setting. The editor offers a searchable catalogue tree,
typed value widgets, enforce and expand switches, custom entries, INI
import, presets (security baseline, shared lab, public kiosk, branding)
and a rendered-file preview. Policies written by older editors are
converted when opened and keep working.
described by the installed KConfigXT schemas and the System Settings
modules they have, so a node picker in the editor shows what a given node
actually offers (
GET /api/v1/kconfig/catalogue,/api/v1/kconfig/kcms).With
kconfig.probe_effectivethe agent reads the written settings backinside a logged-in session and reports user overrides of non-enforced
defaults as non-compliant.
Plasma panel layout script and an optional base global theme as a
generated look-and-feel package, applied once to existing users, live to
logged-in sessions, or enforced as the global theme so that panels and
wallpaper return to the policy at every login.
locked through Kiosk restrictions), and a list of applications hidden
from menus and launchers.
only: the agent writes a directory per group, a login hook resolves
membership by GID and puts the matching directories first in
XDG_CONFIG_DIRS, highest priority first. Group-scoped policies can carrytheir own desktop layout, Konsole profile and hidden applications.
system-wide Flatpak override (
kconfig.flatpak_override, on bydefault). Show-only module restrictions hide every System Settings
module that is not listed, based on the modules installed on the node.
Sign-in and MFA
Enter the user name, then the security key or authenticator code, then
the password. A security key completes the sign-in on its own. Users
without a second factor go straight from the user name to the password.
The API behind it is the multi-step flow
POST /api/v1/auth/beginand/api/v1/auth/step; the formerPOST /api/v1/auth/loginis stillserved for API clients.
user without a second factor can now be guided to set up an authenticator
app or a security key right after entering the password and only then
gets a session (Set up MFA while signing in, allowed by default; the
alternative refuses the sign-in).
actions, starting with revealing a recovery key: the user gives a reason
or ticket number (stored in the audit log), the password (checked against
the directory for LDAP accounts) and an authenticator code, and receives
a single-use token valid for five minutes and for that one action
(
/api/v1/auth/step-up,/step-up/method,/step-up/collect).disabling a user, changing their password or revoking their sessions
invalidates exactly the tokens issued before that moment.
external identity provider: such accounts have no password in Bor, are
matched by the provider's stable subject and never by email, and their
groups can be synchronized from the provider. Linking an
administrator account to a single sign-on identity by email needs a
prior, expiring approval by another administrator (Allow SSO link on
the Users tab, shown once a sign-in connection exists). OIDC and SAML
sign-in and SCIM provisioning are Bor Enterprise features on top of this
release.
user.create,user.update,user.delete,user.link_identity,user_group.create,user_group.update,user_group.delete,user_group.member_add,user_group.member_removeandsso.login_failedcomplement the genericrequest log.
Compliance Reports (Bor Enterprise)
community server carries only the web UI pages, which show the Reports
page on a Bor Enterprise server and a Bor Enterprise notice otherwise;
it has no report tables, permissions or API. Moving
from the community server to Bor Enterprise of the same version is an
installation of the Bor Enterprise server and its license; the report
tables are created on its first start.
Fleet -> Reports) are point-in-time snapshots of thefleet's compliance: the nodes in scope with their posture (disk
encryption, pending security updates, mandatory access control, agent
version, connection state), the policies in force with their versions,
the agent's last result per node and policy with the per-setting items
and their benchmark control labels, the age of every result, stale and
unreachable markers, and a compliance score. A report never changes
after it is generated. Generate one for all nodes or for node groups,
optionally limited to policy types, with a label and notes.
JSON bundle (
bor.report.v1) whose SHA-256 is recorded with thereport and in the
report.generateaudit event, so a forwarded auditlog anchors it outside the database. The hash is re-checked whenever
the report is opened; a mismatch is shown and audited
(
report.integrity_failure). Downloads: the JSON bundle and CSV filesfor results, items, nodes and controls; every download is audited.
report:view,report:create,report:manage(delete,pin, schedules) and
report:attest(sign-off, waivers), created by theBor Enterprise server. Viewing goes to every built-in role that can view
compliance; Org Admin and Auditor can generate; Super Admin can delete;
Super Admin and Auditor can sign off.
reports.retention_days(1095 bydefault) and purged hourly (
report.purge);reports.stale_after(168h) sets the stale and unreachable thresholds;
reports.max_resultsand
reports.generate_timeoutbound one generation.NIS2 Art. 21(2) and the CIS RHEL 9 v2.0.0 and Ubuntu 24.04 v1.0.0
benchmarks; CIS controls apply only on their distribution and only
where the policy's desired state is evidence for them. A Controls
tab lists them per framework with the results behind each control.
Every report records the mapping version it was built with.
re-check and wait for them (
reports.refresh_wait, 60s); the reportrecords how many answered.
and of every node group (
reports.daily_summary); the Reports page andthe dashboard show the compliance score over 30 days. A Compare tab
lists new failures, fixes and scope changes since an earlier report.
zone, delivered by signed webhook (HMAC-SHA256) or by email with the
documents attached, through a persistent queue with retries (
reportsconfiguration section or
BOR_REPORT_*variables; read-only settingspanel with a test email).
expiry are recorded in the reports they cover; a person other than the
generator approves or rejects a report with a signed statement over its
hash (new permission
report:attest, granted to Super Admin andAuditor); pinned reports are kept until unpinned.
time-stamped by an RFC 3161 authority), an OCSF 1.3.0 Compliance Finding
export, and live forwarding of compliance status changes as OCSF
findings when the audit log is forwarded in OCSF.
bor-verifyalsoverifies the exported sign-offs.
bor_compliance_*metrics for stored reports,the newest report per trigger, the fleet score, schedule states and
overdue schedules, the delivery queue and the signing certificate's
expiry, with suggested alerts in the monitoring guide.
Documentation Site
doc/as an MkDocs site, published at docs.getbor.dev:installation, configuration, a page per policy type, operations,
security and compliance, a permissions reference and developer
documentation (architecture, building, adding a policy type,
contributing). The README is slimmed down and points there.
Security
dedicated permission, a fresh re-authentication with MFA, and leave an
audit trail; the reveal endpoint bypasses the generic request log in
favour of explicit events and sets
Cache-Control: no-store. Tangregistry URLs are validated with a strict pattern (http or https, host
name or IPv4 literal, no credentials, query or fragment) and probes dial
only approved addresses, refusing loopback, unspecified, link-local,
multicast and broadcast targets (CodeQL
go/request-forgery). LUKS2header integers are parsed with explicit bit sizes and clamped before
narrowing.
mac:authorandmac:operate. Creating, saving,importing or releasing an SELinux or AppArmor policy that carries
administrator-authored policy text (custom modules, file contexts, login
mappings, permissive domains, custom profiles, local overrides) requires
mac:authoron top of the policy permissions; refusals areaccess_deniedevents and every such save and release is audited aspolicy.mac_customwith the names and a SHA-256 of each text. Asking anode for an SELinux module proposal or an AppArmor rule proposal from
the node page requires
mac:operate; every request is audited asmac.action. Super Admin holds both on upgrade. Nodes can refuse customtext with
selinux.allow_custom_modules: falseandapparmor.allow_custom_profiles: false, mode changes withselinux.allow_mode_change: false, and vendor profile edits stay offunless
apparmor.allow_vendor_flag_edits: true. Denial records areaggregated and redacted on the node (no user ids or names, home
directories collapsed) and only the latest summary per node is kept.
policy that holds packages back from updates is audited as
policy.updates_holdwith the patterns, since a hold keeps a vulnerablepackage on every node of a group. Forced reboots and reboots with users
logged in are off by default, confirmed in the editor, always preceded
by a warning, and can be refused per node with
updates.allow_reboot: false.systemd:execandsystemd:operate. Creating,saving, importing or releasing a Services & timers policy that runs
commands on nodes (tasks or raw
Exec*directives) requiressystemd:execon top of the policy permissions; a draft released bysomeone other than its author is checked too. Every such save and
release is audited as
policy.systemd_execwith the task names and aSHA-256 of each script; refusals are
access_deniedevents. Starting,stopping or restarting a unit from the node page requires
systemd:operateand is audited assystemd.unit_action. Super Adminholds both on upgrade; grant them to other roles explicitly. Nodes can
refuse tasks altogether with
systemd.allow_tasks: falseand actionswith
systemd.allow_actions: false.guarded. Roles assigned to user groups, which the UI has always offered,
now grant their permissions to the group's members; previously they had no
effect. Review your user-group role assignments before upgrading.
Assigning a role to a user group and adding a member to a user group are
privilege-escalation-guarded like direct role assignments: membership
confers every role of the group, so the caller must already hold all of
those roles' permissions. A user allowed to manage user groups can no
longer put themselves, or anyone else, into a group carrying permissions
they do not have.
accepted "organization" and "group" scoped role assignments but never
enforced them. The upgrade deletes those rows (they granted nothing) so
they can never turn into live grants; the API now rejects scoped
assignments with HTTP 400 and the scope selector is gone from the UI.
privilege-escalation refusals, are recorded as
access_deniedauditevents with the actor, the permission or guard involved and the reason.
Removing a user or user-group role assignment writes a
revoke_roleeventnaming the user or group and the role. Both honor the audit
IP-anonymization setting.
pquerna/otplibrarythe server already used for the codes themselves; the separate
go-qrcodedependency and its image stack are gone.that cannot backtrack, so a crafted value in a policy cannot stall the
agent.
golang.org/x/net(HTML parser advisories, now v0.62.0),
golang.org/x/crypto,fast-uri(four host-confusion and scheme advisories, 3.1.9),serialize-javascript(7.1.4) and the npm advisories of October; Go1.26 is now the minimum toolchain. The web bundle's third-party license
notices are tracked in the repository.
Reliability
a group, or removing it, now sends that agent a fresh policy snapshot:
the group's policies apply (or are withdrawn and their changes undone)
within seconds instead of at the agent's next reconnect.
stream revision counter are stored in PostgreSQL, so a restart or upgrade
no longer invalidates outstanding enrollment tokens, and an agent that
reconnects after a server restart can no longer be served an incomplete
policy delta. Only a SHA-256 hash of each enrollment token is stored.
packages stopped and disabled
bor-agenton every upgrade (thepreremove script ran unconditionally), so an upgraded node stayed
without an agent after its next reboot. The scripts now disable the
unit only on removal and restart an enrolled agent on the new binary
after an upgrade; upgrading from an earlier package re-enables the unit
once on nodes that hold an agent certificate.
Bug Fixes
writes the keys Plasma 5 and 6 actually read (Kiosk action, control
module and URL restrictions included), merges several bound policies by
binding priority instead of last-writer-wins, and installs a Plasma
environment hook (
zz-bor.sh, ordered after the distribution's ownscripts so Fedora's defaults survive) that puts the managed directory
into
XDG_CONFIG_DIRSof every session. An enforced desktop layoutsticks at every login, and a wallpaper file that is missing or not
world-readable on the node is reported instead of silently ignored.
Catalogue entries that Plasma 6 no longer reads are marked as Plasma 5 or
KDE 4 only.
ensureEnabledfield ofa Firewall policy, present since 0.8.0 but inert, now makes the agent
enable and start
firewalld.servicewhen it is installed but inactive.-tags pkcs11answers aPKCS#11 CA configuration with a clear "not compiled in" error instead of
a generic failure, and the HSM support itself moved to the maintained
community fork of
crypto11.Platform & Dependency Updates
google.golang.org/grpc1.83.2 -> 1.84.0,golang.org/x/crypto0.55.0 -> 0.58.0,
golang.org/x/net0.58.0 -> 0.62.0,golang.org/x/sys0.47.0 -> 0.49.0,
golang.org/x/text0.41.0 -> 0.43.0,google.golang.org/protobuf1.36.11 -> 1.36.12,go-webauthn/webauthn0.16.3 -> 0.18.2,
go-ldap/ldap3.4.14 -> 3.4.15,lib/pq1.11.2 ->1.12.3,
prometheus/client_golang1.23.2 -> 1.25.0. New:eclipse-keypont/crypto11(PKCS#11, build tagpkcs11only). Removed:yeqown/go-qrcode,fogleman/gg,golang/freetype,golang.org/x/image.godbus/dbus5.2.2 -> 5.2.4,google.golang.org/grpc1.83.2 ->1.84.0 and the shared
golang.org/x/*modules as above.react-router8.3.1 -> 8.5.0,
@simplewebauthn/browser13.3 -> 14.0, webpack 5.106 ->5.112,
webpack-cli7.0.1 -> 7.2.3,globals15 -> 17, plus thetransitive
fast-uriandserialize-javascriptfixes. The KDE catalogueis bundled into the UI by a generator (
make kconfig-catalogue).actions/download-artifactv8, nfpm installed from its releasetarball, a GitHub Pages pipeline for the documentation site; Dependabot
ignores TypeScript major updates.
bor_luks_volumes_total,bor_luks_escrow_operations_total,bor_luks_recovery_key_reveals_totalandbor_luks_recovery_keys_overdue_total; see the monitoring guide.Upgrade Notes
Services & timers, SELinux, AppArmor and Software updates policy types
and the rebuilt KDE Plasma type; older agents ignore policy types they do
not understand and report no MAC, updates or LUKS inventory. The deploy
wizard rolls the upgrade out from the server itself.
000030 the disk encryption tables (
luks_volumes,node_disk_encryption,luks_recovery_keys,tang_servers) and thedisk_encryption:*andtang_server:*permissions; 000031 thepersisted enrollment tokens and policy hub revision; 000032 removes the
inert scoped role bindings and forbids new ones; 000033 the policy owner
column (existing policies get their creator recorded where the account
still exists); 000034 federated identities; 000035 externally managed
user groups; 000036 SSO link approvals; 000037 and 000038 the KDE catalogue, node-reported
settings and look-and-feel inventory; 000039 the systemd unit inventory;
000040 and 000041 the
systemd:execandsystemd:operatepermissions;000042 the mandatory access control inventory (
node_mac_status,node_mac_items,lsmcolumns on nodes); 000043 and 000044 themac:operateandmac:authorpermissions; 000045 the Software updatesinventory (
node_updates_status,node_updates_pending); 000046 theupdates:operatepermission. The compliance report tables andpermissions belong to the Bor Enterprise server and are created by it.
BOR_ESCROW_KEK_FILE,BOR_ESCROW_KEK_ID,BOR_ESCROW_KEK_PREVIOUS_FILES,BOR_ESCROW_REQUIRE_MFA,BOR_ESCROW_RETIRED_RETENTION_DAYSandBOR_ESCROW_ORPHAN_RETENTION_DAYS. Disk encryption escrow stays offuntil a KEK file is configured. See
.env.exampleand the serverconfiguration reference.
disk_encryptionsection (state_file,bootstrap_dir,run_dir, tool paths), newkconfigkeys(
data_path,probe_effective,flatpak_override,write_kde5rc),the
systemdsection (system_dir,preset_dir,scripts_dir,state_path,job_timeout,reconcile_interval,watch_signals,allow_tasks,analyze_binary,user_dir,user_preset_dir,allow_actions), theselinuxsection (config_path,modules_dir,module_priority,state_path,reconcile_interval,allow_mode_change,allow_custom_modules,follow_audit,tool_timeout), theapparmorsection (profiles_dir,parser_binary,sysctl_path,state_path,backup_dir,reconcile_interval,allow_custom_profiles,allow_vendor_flag_edits,follow_audit,tool_timeout), the sharedmacsection (inventory_interval,denial_window,collect_denials,allow_actions) and theupdatessection (engine,state_path,backup_dir,reconcile_interval,inventory_interval,reboot_check_interval,tool_timeout,allow_install,allow_reboot); every key has a working default.lsm,lsm_mode) inthe heartbeat; nodes running an older agent show no MAC value until
they are upgraded.
needrestart, the rpmpackage recommends
dnf5-pluginsandpython3-dnf-plugins-core, so anode can always tell whether an update needs a reboot; both recommend
cryptsetupand suggestclevis-luks,clevis-dracutandtpm2-toolsfor disk encryption.
disk_encryption.proto,systemd.proto,selinux.proto,mac.protoandupdates.proto(policyfields 22 to 26), new stream event types for disk encryption tasks,
systemd, MAC and updates actions, the
lsmheartbeat fields and a muchlarger
kconfig.proto; regenerate any external tooling built againstproto/.go build ./cmd/server, with-X main.Version=...), but needs Go 1.26.make server-pkcs11buildsthe HSM variant with cgo.
POST /api/v1/auth/beginand/api/v1/auth/step;POST /api/v1/auth/loginkeeps working. Role-bindingrequests without
scope_type(or with"global") behave as before; anyother scope type is rejected with 400. Adding a role or a
member to a user group answers 403 when it would grant permissions the
caller does not hold. Deleting a policy binding that does not exist now
answers 404 instead of 409.
This discussion was created from the release Release v0.10.0.
All reactions