Changelog¶
Release notes for EnforceGate vX.
2026.35.0 (EA) June 21, 2026¶
- Cert-pinned destinations are handled by policy — new
pin:attribute on.policyrules picks the SslBump peek-step verdict per destination:splice(pass through, hostname-only — for Windows Update, Apple MDM, mobile banking and other clients that break underbump),bump(inspect as normal), orterminate(refuse at the TLS handshake). Pin rules use the samematch-domain-list:shape as block / permit rules and live in the samerules.d/— pin decisions are reloaded, snapshotted, git-tracked, and visible inshow policy listalongside every other rule. Replaces the historical static bypass file outside the policy system. See Pinned destinations. [ssl_bump_acl].fail_actioncontrols engine-unreachable behaviour — new connector config knob withsplice(default; pinned apps keep working through an engine blip),bump(inspection-first), orterminate(fail-closed). See[ssl_bump_acl].- Pin rules are introspectable through the same verbs as
action:rules —show policy match <host>adds aTLS pin:line when the host matches a pin rule;show policy listshows pin rules withType: pinand the verdict in theActioncolumn;show policy summaryadds a+ N pintally and (when present) aPinned hosts: H across M pin rule(s)line. show policy listcolumn renamedMatch-kind→Type— accommodates the newpinrule kind alongside the existing match-attribute kinds. Operator scripts that parse the table header need a one-line update; column ordering and field meanings are unchanged foraction:rules.- Sub-second connector failover under engine drops — the connector now stays resident across engine restarts and policy reloads, and falls back to the configured
[ssl_bump_acl].fail_actionwithin ~1 second instead of stalling until the upstream TCP timeout. Pinned destinations continue with the configured fallback verdict during the engine-reload window; the same guarantee covers theurl_rewritepath for non-pinned traffic. Operators see no client-visible interruption during routine reloads.
2026.34.0 (EA) June 18, 2026¶
eghost versionwarns on a host-CLI ↔ stack mismatch — the hosteghostbinary's compiledrelease:line and the live per-container image versions should agree, butdocker compose pull && up -dswaps the images without touching the host binary. The verb now prints an explicit warning when they disagree and points the operator at the fix: re-run the appliance installer to refresh/usr/local/bin/eghost. See Host-CLI ↔ stack version mismatch warning.- Engine startup uses significantly less memory at scale — multi-million-rule policy deployments that could run at steady state but failed to boot due to a startup memory spike now start up cleanly on the same hardware. No operator action required; the improvement applies to every deployment automatically.
eghost toolbox shellopensbash— line editing, command history, and tab completion at the toolbox shell prompt.eghost toolbox repois quiet by default — only the human status line prints onrepo add/pull/run/remove. The machine-readable JSON event record ({"ts":…,"event":"repo-pull",…}) is now opt-in via-v/--verboseon anyreposubcommand. Operator entrypoint scripts that emit their own JSON todocker logsare unaffected. See Git-repo script delivery.- Bundled toolbox example script retired — the toolbox skel no longer ships
scripts/example-squidblacklist.py. The skelREADMEandcrontemplate still document the helper-library workflow (lists.write(...)→engine.reload()) for operators writing their own scripts; the Community page lists open-source script bundles (e.g. EGGuard) that drop in as aeghost toolbox repo addsource.
2026.33.1 (EA) June 17, 2026¶
- Toolbox now authenticates with a least-privilege reload-only service account — replaces the Administrator credential the toolbox previously read from
.env. The standalone bundle auto-provisions a level-3 Service account on first boot (enforcegate-toolbox-svc, scoped torequest policy reloadand theshow statusfamily), drops its credential into the shared volume, and the toolbox picks it up automatically. A stolen.credsnow buys an attacker a policy reload at worst — not engine admin. No operator action; against an older engine the toolbox falls back to the previousENFORCEGATE_ADMIN_*path. See Engine authentication.
2026.33.0 (EA) June 17, 2026¶
show policy summary— new one-glance overview of the loaded policy: the engine-synthesised default action, total rules with regex / domain-list split, aggregate domain-host count, the operator-vs-toolbox source split, time-gated rule count, and resolved policy directories. The first thing to look at on a fresh login to confirm the engine is enforcing what you expect. See Policy introspection.show policy listgains aFilecolumn + default-action footer — every row now reports the source.policyfile alongside id / name / action / window / source, so "which file do I edit" is one column right rather than a round-trip throughshow policy detail. The table footersDefault action (no rule matched): <verdict>so the no-match posture is visible at the bottom of the listing.- Reload-scoped service account — new least-privilege account type. Can call
request policy reloadand theshow statusfamily, and nothing else (no user management, license, neighbor, or reboot ops). Created from theR) Service account (policy-reload only)entry inrequest user add. The intended use is automation that only needs to refresh policy — notably the toolbox sidecar's reload helper — without handing it an Administrator credential. See Privilege model.
2026.32.0 (EA) June 16, 2026¶
- Default posture is a one-line config flip — new
[policy].default_actionknob inengine.confsets the no-match verdict (permitdefault;deny/warn/aupfor stricter postures). Replaces shipping a catch-all.policyrule. Flipping a deployment from default-permit to default-deny is now a single line inengine.confand a reload — no policy-file surgery. See[policy].default_actionand the default-deny recipe. - Catch-all
99-default-permit.policyretired — the shipped catch-all rule and the placeholder99-noop-placeholder.policyare gone. The no-match verdict is now engine-synthesised, so it occupies no rule id and can no longer shadow lower-precedence rules under[policy].shared_path. Operators who hand-added a catch-all permit rule should remove it and rely ondefault_action— see troubleshooting. - Toolbox / shared-path rules finally enforce on stock appliances — with the catch-all gone, a shared
denyrule actually denies (previously it was silently shadowed by the operator-side catch-all permit). No-op for deployments that never used[policy].shared_path; immediately visible for anyone running the toolbox sidecar. - CLI polish —
show policyis back in?and tab-completion (it had silently dropped out of the listing in a mid-June rename);edit policy <rule-name>in Configuration mode now opens the file that actually contains the rule instead of a stub<rule-name>.policy. - Toolbox sidecar runs Debian (glibc) — operator
pip install --useris first-class, manylinux Python wheels load directly, and third-party prebuilt binaries run without extra packaging work. No operator action required. See Toolbox. - Shared policy directory renamed to
rules.d/— the toolbox handoff path under/etc/enforcegate-shared/is nowrules.d/(waspolicies/), matching the operator-side[policy].pathconvention. The engine's[policy].shared_pathdefault reflects this, and theenforcegate_toolbox.policies.writehelper writes to the new path automatically. Operator scripts that bypass the helper and hard-code/etc/enforcegate-shared/policies/need a one-line update.
2026.31.0 (EA) June 14, 2026¶
- Time-scheduled policy rules — any rule can now carry a
time-window:attribute and only match during a recurring weekly window (time-window: weekdays 08:00-18:00,time-window: daily 22:00-06:00,time-window: mon,wed,fri 09:00-17:00). Outside the window the rule falls through to the next rule, so a time-limitedpermitplaced above a broaddenygives "allow during these hours, deny the rest of the time" with no extra rules. See Time-scheduled rules. - Operator-controlled timezone — new
[policy].time_window_tzknob picks the clock the engine evaluates windows against.local(default) follows the engine host's local time;utcevaluates against UTC for deployments with operators in multiple timezones. Confirm what "local" means on the box withshow clock. show policy listgains aWindowcolumn — rules with no schedule render as—; scheduled rules show the normalised window (weekdays 08:00-18:00,daily 22:00-06:00). Makes "which of my rules are time-limited and when do they fire" answerable at a glance.- Strict validation on operator rules — a malformed
time-window:under[policy].pathfails the reload loudly, naming the file and the rule; the previous good policy stays live. Toolbox-generated rules under[policy].shared_pathare isolated — the bad rule loads always-active with a Warning, the rest of the load proceeds.
2026.30.0 (EA) June 13, 2026¶
Maintenance release. No operator-visible changes beyond minor bug fixes and stability improvements; the operator surface is identical to 2026.29.0 (EA).
2026.29.0 (EA) June 12, 2026¶
- Policy precedence is now consistent and visible — the lowest rule id wins on every match path, controlled by the conventional two-digit filename prefix (lower prefix = lower id = wins conflicts).
show policy listgains aSourcecolumn showing whether each rule was hand-authored or generated by the toolbox sidecar, and a warning above the table when a catch-all permit rule would shadow your operator rules. - Super Administrator can create another Super Administrator —
request user add's "Available User types" menu now only lists the types the current operator is allowed to create, and adds anS) Super Administratorentry for operators authorised to use it. Previously the only Super Administrator possible was the bootstrap admin. - One-command git audit setup — new
request policy git-initenables per-rule policy audit and history from the REPL (writes the auto-managed.gitignore, baseline-commits the current rules). Replaces the previous shell-out-to-git initflow. See Policy history. - Stronger password hashing — new and changed passwords use PBKDF2; existing accounts continue to authenticate and migrate automatically the next time their password changes. No operator action required.
- Upgrade note — the engine ↔ connector wire protocol bumped at 2026.28.0. The standalone bundle rolls them together automatically; multi-image or separately-upgraded deployments need to upgrade engine and connector as a unit. See engine ↔ connector co-upgrade.
2026.26.0 (EA) June 7, 2026¶
- Per-rule policy audit and history — optional, opt-in. When the policy directory is a git repo, the engine records every reload as a commit (authored as
<user>@<engine-host>) and exposes the history throughshow policy log,show policy blame <rule>,show policy commit <N>,show policy diff rollback <N>(preview before rollback),show policy fingerprint,show policy tags, andrequest policy tagfor naming baselines. Snapshot-only deployments are unchanged. See policy audit and history. - Auto-managed
.gitignore— when git audit is enabled, the engine writes (or merges) a.gitignorethat keeps certificates, keys, license, and password files out of any commit.
2026.24.6 (EA) June 6, 2026¶
- Engine scales to 150 million rules per engine — large category-based filtering corpora, threat-intel domain feeds, and combined allow / deny lists all run on a single engine without sharding. See sizing.
- New
toolboxcontainer — sandboxed companion sidecar with bash, Python, and the standard EnforceGate CLI tooling pre-installed. Canonical use case is scheduled category-list refresh. See Toolbox. - Faster support ticketing — new
show tech-supportaggregates ten of the most-asked-forshow *outputs into one paste-into-ticket bundle. Run it first when opening a ticket — see collecting a support bundle. - Engine reboot from the CLI — new
request system reboot(Cisco aliasreload) does a graceful engine shutdown; the container orchestrator restarts it per its configured restart policy. Super-Administrator only. See Engine reboot. - CLI polish — Cisco IOS / Junos aliases (
reload,clear neighbor,show clock,show calendar),exit/quitreliable in every mode, therequest *namespace hidden from?until youenable. Old verb forms continue to dispatch as hidden aliases.
2026.24.0 (EA) June 5, 2026¶
show system *introspection family — seven new read-only verbs for engine internals:uri-engine,memory,uptime,version,threads,listeners,logs. Use when sizing container memory, performance-triaging, or assembling support context. See System introspection.- Cisco-style
show version— multi-lineshow ver-style block replaces the bare three-line format. The third row carries an inline License summary so operators get edition + active-of-cap connector count without a separateshow license. - CLI polish — the REPL prompt now carries the host name (
host>,host#,host(config)#);configureis a short alias forconfigure terminal;edit policy <name>accepts a rule name (resolves to the file containing it); bad credentials at REPL entry fail fast with a clear error instead of opening a broken shell. - Domain backend tunable — new
[policy].domain_backendknob for very-large-scale deployments. The defaultautofits every shipped sizing-table workload.
2026.21.0 (EA) June 4, 2026¶
- Cisco-style interactive CLI modes — Operational (
>), Privileged (#), and Configuration ((config)#). Raising to Privileged requires Administrator privileges. See Modes. - Staged policy editing inside the REPL —
configure terminalopens an edit session;edit policy <name>opens the file in$EDITOR;show policy diffpreviews against the entry-time baseline;commitatomically applies,revertdiscards. See Staged edits. - Policy introspection — five new
show policy *verbs (list,detail <name>,files,file <name>,domain-lists) let operators see what the engine is enforcing without dumping.policyfiles by hand. See Policy introspection.
2026.20.2 (EA) June 3, 2026¶
- Multi-million-rule blocklists just work — loading large domain-list blocklists no longer needs special tuning, tighter cgroup limits, or extra memory headroom. A reference workload that previously needed minutes now finishes in seconds under the shipped defaults. Inspect the live policy with
show policy match— see Inspecting the live policy. - No external lookups in the request path — category-based filtering against local lists stays local. No cloud-side resolver, no per-request external dependency. Important for air-gapped, regulated, and privacy-sensitive deployments.
2026.17.0 (EA) June 1, 2026¶
- User management — on a fresh deployment, the built-in admin account can now create additional administrator accounts via the documented workflow directly. Previous releases required a workaround.
- Editions — the documentation now describes the three editions (Lite, Pro, Enterprise) with feature mapping, sizing guidance, and the edition-upgrade workflow. See editions and sizing.
- Support tiers — base tier renamed from "Standard" to "Direct" — direct contact with an Exosys support engineer, not a community channel. See support tiers.
2026.14.0 (EA) May 29, 2026¶
- New operator CLI —
eghostis the single entry point for day-to-day management: starting and stopping the stack, viewing status, editing policies, managing users, and creating support bundles.egctlandegpolicyare still available through it. - Virtual appliance — ships as a single OVA / qcow2 / vhdx for VMware, KVM and Hyper-V. A console wizard guides first-boot configuration.
- Captive portal — block, warn and AUP verdicts render in-product explanation pages, with a self-service CA install page for unmanaged devices. See captive portal.
- SSL/TLS inspection — three configurable modes with an explicit operator opt-in for the full-decryption mode. See SSL inspection.
- Hardware-anchored release signing + seamless upgrades — every release image is signed by a hardware-held key; operator state (configuration, license activation, policies, audit log) is preserved across image upgrades.
Verify your version
Always check the deployment's reported version with eghost version before applying procedures from this site.