Consoles
The consoles component of the workloads controller, along with the associated
CRDs, provides the ability to spin up temporary pods that are configured
similarly to production workloads. This allows for operational tasks to be
executed in a secure and auditable fashion, without having to provide access to
the main production pods.
How it works
- A
ConsoleTemplate
object is created in the cluster, which defines the
specification for a console.
- The console users are granted the ability to create
Console
objects in a
given namespace, which allows them to create a console using any
ConsoleTemplate
in that namespace.
- The console user submits a
Console
object to the cluster, to request a
console. Using the theatre-consoles
CLI is recommended.
- The controller creates a
Job
for this console (which in turn creates a
Pod
), then once the pod is running will create the Role
and RoleBinding
to allow the owning user to exec
into this pod.
Authorised consoles
Given that console templates may be configured to provide the same environment,
including secrets and connectivity to external systems, as the primary
workloads, it may be desirable to limit which commands can be run by default in
these pods, to avoid both accidental damage and malicious use.
To facilitate this the ConsoleTemplate
resource includes fields to define
rules around when a console should be immediately provisioned and when it
requires authorisation from another party.
Configure the defaultAuthorisationRule
field to define the default behaviour
for a console: setting the authorisationsRequired
field to a value greater
than 0 means that a user defined in the subjects
list must authorise the
console for it to begin.
Optionally then also populate the authorisationRules
list with additional
rules that enforce authorisation for given commands. This effectively provides
white-listing of known safe commands that can be run without authorisation, or
require authorisation from different parties for certain commands.
A console that requires authentication to proceed will stay in a
PendingAuthorisation
state, until the necessary authorisations have been added
to the ConsoleAuthorisation
object linked to this console.
Custom resources
ConsoleTemplate
The ConsoleTemplate
resource defines the specification for how consoles of a
given class should operate, but does not trigger the creation of any further
resources by itself.
Typically it is desirable to define and deploy a ConsoleTemplate
along with
all of the other manifests that make up an application deployment.
This will ensure that users of the console are provided with an environment
that's consistent with the main web/worker deployments, i.e. it is using the
same container image and has the same environment, volumes and metadata defined.
See example ConsoleTemplate
object.
Console
Once a template is created, users can request a new console by submitting a
Console
object that references this template.
The user can supply a command, but all other properties of the resulting pod
remain as specified by the ConsoleTemplate
spec.
While the resource contains a spec.user
field, this is not controllable by the
submitting user.
An admission webhook overrides the value of this field to be the entity that
created the object, as per the API server authentication chain. This ensures
that consoles can be linked back to the user that created them, as well as
enabling the [authorised consoles][#authorised-consoles] functionality.
See example Console
object.
ConsoleAuthorisation
As part of the [authorised consoles][#authorised-consoles] functionality, any
console that is created from a template that contains authorisation rules will
automatically trigger the creation of a ConsoleAuthorisation
object, named the
same as the console.
This resource is used to capture the authorisation(s) of the console by third
parties.
Initially it will be created with an empty authorisations
field, but any user
with access to update this object can append to this list, while a validating
webhook ensures that they can only append their user identifier.
The consoles controller manages the RBAC resources to allow only those subjects
defined by the matching authorisation rule to be able to update the object.
See example ConsoleAuthorisation
object.
Access control and security considerations
Note: Consoles depend upon the DirectoryRoleBinding
resource, defined in
this project and managed by the rbac-manager
controller.
This controller must also be running in the cluster (although Google
integration can be disabled), or users will not be able to access their
consoles.
The ability to run arbitrary consoles which mimic a production environment must
come with careful security considerations.
Our recommendation is to lock-down console creation by applying cluster RBAC
rules which limit the creation of consoles only to user who absolutely require
them, and provide a break-glass procedure for elevating permissions in an
emergency.
Users must not be granted the ability to update
or patch
consoles, even
if limited to resourceNames
including only their own consoles. The workloads
controller currently depends on this constraint in order to maintain the
security of authorised consoles.
A ClusterRole that provides the right permissions is:
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: console-creator
rules:
- apiGroups:
- workloads.crd.gocardless.com
resources:
- consoletemplates
verbs:
- list
- get
- apiGroups:
- workloads.crd.gocardless.com
resources:
- consoles
verbs:
- create
- list
- get
- watch
- apiGroups:
- rbac.authorization.k8s.io
resources:
- rolebindings
verbs:
- list
- get
- watch
- apiGroups: [""]
resources:
- pods
verbs:
- watch