Security overview

For security reviewers and the people who sign off on new tools. Everything below describes the current release and is checked by an automated end-to-end test on every build. Things we have not built yet are listed at the bottom, not hidden. Last updated 28 October 2026.

Short version. Gardience runs on your server, inside your network. It never sends data to us and loads nothing from the internet. Every change is checked against the permissions of the person who asked for it and recorded under their name in a tamper-evident log, with a live copy sent to your SIEM. Secrets go in and never come back out.

Where it runs and what talks to what

Controls

Sign-in

  • Single sign-on with SAML 2.0 or OpenID Connect, the standards Microsoft Entra ID, Okta, Google, and Ping all speak. Our automated tests run against Keycloak; we confirm your identity provider with you during onboarding. Your IdP groups map to Gardience roles; people in no mapped group cannot sign in
  • SSO responses must be signed, are single-use, and bound to the browser that started the sign-in (tested against tampering and replay)
  • Or your directory: Active Directory or LDAP
  • Or PAM / local accounts (SHA-512 crypt hashes)
  • Sessions are validated by the Salt master and re-checked at least every minute. One sign-in covers every open tab in a browser; when every console tab has been closed for a minute, the next visitor signs in again. Local accounts' sessions last 8 hours by default; directory and single sign-on sessions end after 1 hour, so someone disabled or demoted in your directory or identity provider loses access within the hour (or at once with gardience user signout). Removing someone with gardience user del, changing their role or resetting their password ends their sessions and stops their API keys at once. Someone removed in your identity provider can no longer sign in, and their API keys pause after 7 days without a sign-in

Permissions

  • Everyone, admins included, holds a read-only Salt session. Their changes go through Gardience, which checks their rights for every target machine, applies change windows and locks, and then runs the change under a service identity with their name on the record. Nobody can go around Gardience to Salt directly
  • Approvals fit the risk: everyday work such as patching runs at once. A change that cannot be undone (wiping a disk, removing the Salt agent, clearing the audit logs) always needs a second person, admins included, and nobody can approve their own request. Hardening or rebooting many machines at once needs a second person for everyone but admins, and one setting extends that to admins. Approval steps in workflows and API keys that need approval put any change you choose behind a second person
  • For emergencies, root on the server can open a time-limited break-glass account that Gardience audits, announces, and closes on time
  • Gardience carries out approved changes through its own service identity, which holds Salt rights only for the functions Gardience calls. Arbitrary command execution is off on new installs and enforced by the Salt master itself, so even a compromised web service could not run commands; an admin turns it on with one command. The identity's password is random, stored owner-only on the server, never shown to anyone, and every use is recorded with the person it acted for
  • Built-in roles: admin, operator, approver, viewer, Windows help desk. Rights can be limited to node groups and commands
  • Limits fail closed: if Gardience cannot tell which node groups a limited person may see, they see no machines, not all of them
  • Sessions: 8 hours for local accounts, 1 hour for directory and single sign-on accounts; they end at once when a person is removed or their role changes

Change safety

  • Two-person approval: the person who launches a run cannot approve it
  • Change windows per node group, for console runs, workflows, schedules, API runs, and held work alike; work outside the window is held or refused, and an admin can override with a recorded reason
  • Baseline or reboot on more than one machine at once needs a second person
  • System locks refuse changes on locked machines, enforced on the machine

Audit

  • Every action is logged with who, what, where, and when
  • Each entry is chained to the last with a keyed HMAC-SHA256. The key is kept outside the data volume, so someone who can edit the stored log cannot rewrite it to match, and entries cannot be downgraded to an unkeyed hash. The chain is re-verified every 15 minutes and on demand, and a break raises an alert in the console
  • Every entry is forwarded to your SIEM or syslog server (TCP, TLS, or UDP) within seconds. If the SIEM is unreachable, forwarding resumes from the last entry handed to the network when it returns, and an entry in flight during a failure may be sent twice. Syslog has no delivery receipt, so an entry the network accepted but your SIEM dropped is not resent; the full log and its verification stay on the server (use TCP or TLS; UDP cannot detect loss)
  • CSV export and an auditor evidence pack with checksums

Secrets vault

  • AES-256-GCM encryption at rest
  • The console and API never display a stored value. Anyone allowed to run commands on a machine a secret is scoped to can read it there, so scope secrets to the machines that need them
  • Released only to the specific machines that were in the chosen groups when the secret was saved, and a playbook can only carry a secret to those machines. Ansible group membership is fixed when a machine joins, and later changes wait for an admin, so a machine cannot add itself to an Ansible group to get a secret. Built-in operating system and ring groups follow what each machine reports, so check the member list Gardience shows before saving a secret scoped to one of them
  • Kept out of Salt job history and logs (tested on every build)

Network

  • HTTPS only, TLS 1.2 and 1.3, HSTS
  • Clickjacking and content-sniffing headers; API responses are never cached
  • Content Security Policy with a fresh nonce on every page; everything shown in the console is escaped, including machine names
  • Internal endpoints are unreachable from outside, and only the Salt API calls the console needs are allowed through
  • Agents must use Salt's newest sign-in protocol, blocking downgrade attacks

Ansible without new doors

  • Existing playbooks run over the Salt connection: no SSH keys or WinRM to open
  • Each run gets its own short-lived token and a per-node encrypted channel
  • Playbooks run in a separate sandbox container with no access to Gardience data, keys, or secrets, so a lookup or local task in a playbook cannot reach them. Each run has its own unprivileged user, so one run cannot read another's secrets, and anything a playbook leaves running is stopped when it ends
  • Only people allowed to run commands can run playbooks

API and AI assistants

  • API keys are scoped (read, operate, or configure for Terraform), expire, and pause when their owner has not signed in for 30 days
  • Configure keys are made by admins only, stop the moment their owner is no longer an admin, and never run anything on the fleet: they manage enrollments, groups, saved states, and event rules, and remove machines
  • A key can never do more than its owner is allowed to
  • Requests to make changes wait for a second person to approve by default
  • The built-in MCP server offers read tools and pre-approved runbooks only, never free-form commands, and every call is logged under the key owner with its arguments
  • A key limited to node groups can act on and read only those groups
  • The built-in AI assistant (optional, off by default) only proposes: it has no Salt access, its proposals pass the same checks as a person's input, and nothing runs until a person presses Run, under their own permissions and approvals. Each request and each run it drafted is in the audit log
  • The assistant uses the AI service you choose, including a model you host yourself; its key is stored encrypted, and it is sent only the request, page context, and the names of your groups, runbooks, and allowed commands, never secrets or audit data
  • Saved states are checked and written only by the network-less config keeper. While command execution is off, a state cannot run commands either

Disk encryption keys

  • BitLocker recovery keys leave each machine only encrypted for Gardience, so Salt's job history and logs never hold one in clear text, and are sealed in the vault
  • The recovery kit is encrypted to a certificate whose private key you keep; Gardience never has it. It opens with standard OpenSSL, without Gardience
  • A machine is encrypted only after its key is in the vault and in a kit that was emailed or downloaded, so no machine can be locked with a key that exists only on itself
  • Showing a key is for admins only and is written to the audit log

Live questions and proof links

  • Live questions are a fixed, read-only menu. Inputs must be plain names, numbers, or full paths, and answers are limited to the machines the person may see. Every question is in the audit log
  • A proof link lets HR, facilities, or IT upload a record or sign a policy without an account. It is the one page that works without signing in, so it is narrow on purpose
  • Each link's token is 256 bits, travels in the URL fragment and a request header (never in a logged URL), is stored only as a hash and sealed in the vault, and expires after 30 days
  • A link can add files to its own records and read nothing else. Uploads are size-limited, rate-limited, encrypted at rest, and audited

Hardening and patching

  • Scores every node against STIG and CIS-aligned controls, Windows and Linux
  • Fixes are checked against the permissions of the person who clicked, recorded under their name, then the node is rescanned
  • Drift from your desired state is detected and can be corrected automatically

Your data

Supply chain and updates

Not built yet, said plainly

Report a vulnerability

Email george@gardience.com with "Security" in the subject. We acknowledge within two business days and do not take action against good-faith research. Data handling on this website is covered by our privacy page.