Skip to content

Security

Reporting a vulnerability

Please do not open a public GitHub issue for security vulnerabilities. Use GitHub Security Advisories instead — see SECURITY.md in the repo for what to include.

The authorization model, in one paragraph

Every Kubernetes API call the API makes on a user's behalf goes out impersonated as that user (Impersonate-User/Impersonate-Group headers), never as the API's own ServiceAccount. That means real Kubernetes RBAC is the actual, final authorization boundary — the app-level none/user/admin role (see Authentication) is a coarse UX gate on top of it, not a substitute for it. A cluster admin who wants to restrict what a team can do should do it with RoleBindings on the CRDs, the same way they'd restrict anything else in the cluster.

Namespace isolation

Every ref field between namespaced objects (an AnsibleRun's playbookRef, an AnsibleHost's sshKeyRef, and so on) is restricted to the referencing object's own namespace — see Custom resources. This matters specifically because the operator resolves those refs with its own cluster-wide-privileged identity, not the requesting user's; without the restriction, a user with only namespace-local create permissions could otherwise read another namespace's Secrets by pointing a ref at them.

Things worth knowing before you deploy

  • Sessions are a bearer token, not a cookie — deliberately, so the UI and API can run on independent origins. See Authentication for the trade-off this makes and why it's acceptable given the RBAC model above.
  • The operator's ServiceAccount can read any Secret in the cluster — it needs to, to reconcile AnsibleSSHKey/git-auth references that can live in any namespace. This is a documented, accepted trade-off (see crds/rbac/operator.yaml's own comments), not an oversight.
  • The API deployment runs a single replica by design — its session store is in-memory. Don't scale it without moving sessions to a shared store first.
  • There's no dev-mode auth bypass anywhere in the codebase — every login is a real OIDC round-trip or a real local account, in every environment.

Released under the Apache 2.0 License.