Policy Controller comes with a default library of constraint templates that can be used with the Policy Essentials v2022 bundle to apply Google recommended best practices to your cluster resources.
This page contains instructions for manually applying a policy bundle. Alternatively, you can apply policy bundles directly.
This page is for IT administrators and Operators who want to ensure that all resources running within the cloud platform meet organizational compliance requirements by providing and maintaining automation to audit or enforce. To learn more about common roles and example tasks that we reference in Google Cloud content, see Common GKE user roles and tasks.
This bundle of constraints addresses and enforces policies in the following domains:
- RBAC and service accounts
- Pod Security Policies
- Container Network Interface (CNI)
- Secrets management
- General policies
Policy Essentials policy bundle constraints
| Constraint Name | Constraint Description | 
|---|---|
| policy-essentials-v2022-no-secrets-as-env-vars | Prefer using Secrets as files over Secrets as environment variables | 
| policy-essentials-v2022-pods-require-security-context | Apply Security Context to your Pods and containers | 
| policy-essentials-v2022-prohibit-role-wildcard-access | Minimize the use of wildcards in Roles and ClusterRoles. | 
| policy-essentials-v2022-psp-allow-privilege-escalation-container | Minimize the admission of containers with allowPrivilegeEscalation | 
| policy-essentials-v2022-psp-capabilities | Containers must drop the `NET_RAW` capability and aren't permitted to add back any capabilities. | 
| policy-essentials-v2022-psp-host-namespace | Minimize the admission of containers with `hostPID` or `hostIPC` set to `true`. | 
| policy-essentials-v2022-psp-host-network-ports | Minimize the admission of containers wanting to share the host network namespace | 
| policy-essentials-v2022-psp-privileged-container | Minimize the admission of privileged containers | 
| policy-essentials-v2022-psp-pods-must-run-as-nonroot | Minimize the admission of root containers | 
| policy-essentials-v2022-psp-seccomp-default | Ensure that the seccomp profile is set to `runtime/default` or `docker/default` in your Pod definitions | 
| policy-essentials-v2022-restrict-clusteradmin-rolebindings | Minimize the use of the cluster-admin role. | 
Before you begin
- Install and initialize the
Google Cloud CLI,
which provides the gcloudandkubectlcommands used in these instructions. If you use Cloud Shell, Google Cloud CLI comes pre-installed.
- Install Policy Controller v1.14.3 or higher on your cluster with the default library of constraint templates.
Audit Policy Essentials policy bundle
Policy Controller lets you enforce policies for your Kubernetes cluster. To help test your workloads and their compliance with regard to the Google recommended best practices outlined in the preceding table, you can deploy these constraints in "audit" mode to reveal violations and more importantly give yourself a chance to fix them before enforcing on your Kubernetes cluster.
You can apply these policies with spec.enforcementAction set to dryrun using kubectl,
kpt,
or
Config Sync.
kubectl
- (Optional) Preview the policy constraints with kubectl: - kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-v2022 
- Apply the policy constraints with kubectl: - kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-v2022 - The output is the following: - k8snoenvvarsecrets.constraints.gatekeeper.sh/policy-essentials-v2022-no-secrets-as-env-vars created k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-allow-privilege-escalation created k8spspallowedusers.constraints.gatekeeper.sh/policy-essentials-v2022-psp-pods-must-run-as-nonroot created k8spspcapabilities.constraints.gatekeeper.sh/policy-essentials-v2022-psp-capabilities created k8spsphostnamespace.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-namespace created k8spsphostnetworkingports.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-network-ports created k8spspprivilegedcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-privileged-container created k8spspseccomp.constraints.gatekeeper.sh/policy-essentials-v2022-psp-seccomp-default created k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/policy-essentials-v2022-pods-require-security-context created k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/policy-essentials-v2022-prohibit-role-wildcard-access created k8srestrictrolebindings.constraints.gatekeeper.sh/policy-essentials-v2022-restrict-clusteradmin-rolebindings created 
- Verify that policy constraints have been installed and check if violations exist across the cluster: - kubectl get -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-v2022 - The output is similar to the following: - NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8snoenvvarsecrets.constraints.gatekeeper.sh/policy-essentials-v2022-no-secrets-as-env-vars dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-allow-privilege-escalation dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspallowedusers.constraints.gatekeeper.sh/policy-essentials-v2022-psp-pods-must-run-as-nonroot dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspcapabilities.constraints.gatekeeper.sh/policy-essentials-v2022-psp-capabilities dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostnamespace.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-namespace dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostnetworkingports.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-network-ports dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspprivilegedcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-privileged-container dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspseccomp.constraints.gatekeeper.sh/policy-essentials-v2022-psp-seccomp-default dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/policy-essentials-v2022-pods-require-security-context dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/policy-essentials-v2022-prohibit-role-wildcard-access dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srestrictrolebindings.constraints.gatekeeper.sh/policy-essentials-v2022-restrict-clusteradmin-rolebindings dryrun 0 
kpt
- Install and setup kpt. kpt is used in these instructions to customize and deploy Kubernetes resources. 
- Download the Policy Essentials v2022 policy bundle from GitHub using kpt: - kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-v2022 
- Run the - set-enforcement-actionkpt function to set the policies' enforcement action to- dryrun:- kpt fn eval policy-essentials-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \ -- enforcementAction=dryrun 
- Initialize the working directory with kpt, which creates a resource to track changes: - cd policy-essentials-v2022 kpt live init 
- Apply the policy constraints with kpt: - kpt live apply - The output is the following: - k8spspseccomp.constraints.gatekeeper.sh/policy-essentials-v2022-psp-seccomp-docker-default created k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/policy-essentials-v2022-pods-require-security-context created k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/policy-essentials-v2022-prohibit-role-wildcard-access created k8snoenvvarsecrets.constraints.gatekeeper.sh/policy-essentials-v2022-no-secrets-as-env-vars created k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-allow-privilege-escalation-container created k8spspallowedusers.constraints.gatekeeper.sh/policy-essentials-v2022-psp-pods-must-run-as-nonroot created k8spsphostnetworkingports.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-network-ports created k8srestrictrolebindings.constraints.gatekeeper.sh/policy-essentials-v2022-restrict-clusteradmin-rolebindings created k8spspcapabilities.constraints.gatekeeper.sh/policy-essentials-v2022-psp-capabilities created k8spsphostnamespace.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-namespace created k8spspprivilegedcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-privileged-container created 11 resource(s) applied. 11 created, 0 unchanged, 0 configured, 0 failed 
- Verify that policy constraints have been installed and check if violations exist across the cluster: - kpt live status --output table --poll-until current - A status of - CURRENTconfirms successful installation of the constraints.
Config Sync
- Install and setup kpt. kpt is used in these instructions to customize and deploy Kubernetes resources.
Operators using Config Sync to deploy policies to their clusters can use the following instructions:
- Change into the sync directory for Config Sync: - cd SYNC_ROOT_DIR - To create or append - .gitignorewith- resourcegroup.yaml:- echo resourcegroup.yaml >> .gitignore 
- Create a dedicated - policiesdirectory:- mkdir -p policies 
- Download the Policy Essentials v2022 policy bundle from GitHub using kpt: - kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-v2022 policies/policy-essentials-v2022 
- Run the - set-enforcement-actionkpt function to set the policies' enforcement action to- dryrun:- kpt fn eval policies/policy-essentials-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun 
- (Optional) Preview the policy constraints to be created: - kpt live init policies/policy-essentials-v2022 kpt live apply --dry-run policies/policy-essentials-v2022 - The output is the following: - Dry-run strategy: client inventory update started inventory update finished apply phase started k8snoenvvarsecrets.constraints.gatekeeper.sh/policy-essentials-v2022-no-secrets-as-env-vars apply successful k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-allow-privilege-escalation apply successful k8spspallowedusers.constraints.gatekeeper.sh/policy-essentials-v2022-psp-pods-must-run-as-nonroot apply successful k8spspcapabilities.constraints.gatekeeper.sh/policy-essentials-v2022-psp-capabilities apply successful k8spsphostnamespace.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-namespace apply successful k8spsphostnetworkingports.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-network-ports apply successful k8spspprivilegedcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-privileged-container apply successful k8spspseccomp.constraints.gatekeeper.sh/policy-essentials-v2022-psp-seccomp-default apply successful k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/policy-essentials-v2022-pods-require-security-context apply successful k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/policy-essentials-v2022-prohibit-role-wildcard-access apply successful k8srestrictrolebindings.constraints.gatekeeper.sh/policy-essentials-v2022-restrict-clusteradmin-rolebindings apply successful apply phase finished inventory update started inventory update finished apply result: 11 attempted, 11 successful, 0 skipped, 0 failed 
- If your sync directory for Config Sync uses Kustomize, add - policies/policy-essentials-v2022to your root- kustomization.yaml. Otherwise remove the- policies/policy-essentials-v2022/kustomization.yamlfile:- rm SYNC_ROOT_DIR/policies/policy-essentials-v2022/kustomization.yaml 
- Push changes to the Config Sync repo: - git add SYNC_ROOT_DIR/policy-essentials-v2022 git commit -m 'Adding Policy Essentials v2022 policy audit enforcement' git push 
- Verify the status of the installation: - watch gcloud beta container fleet config-management status --project PROJECT_ID - A status of - SYNCEDconfirms the installation of the policies.
View policy violations
Once the policy constraints are installed in audit mode, violations on the cluster can be viewed in the UI using the Policy Controller Dashboard.
You can also use kubectl to view violations on the cluster using the following command:
kubectl get constraint -l policycontroller.gke.io/bundleName=policy-essentials-v2022 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'
If violations are present, a listing of the violation messages per constraint can be viewed with:
kubectl get constraint -l policycontroller.gke.io/bundleName=policy-essentials-v2022 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'
Change Policy Essentials policy bundle enforcement action
Once you've reviewed policy violations on your cluster, you can consider
changing the enforcement mode so the Admission Controller will either warn on
or even deny block non-compliant resource from getting applied to the cluster.
kubectl
- Use kubectl to set the policies' enforcement action to - warn:- kubectl get constraint -l policycontroller.gke.io/bundleName=policy-essentials-v2022 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'
- Verify that policy constraints enforcement action have been updated: - kubectl get constraint -l policycontroller.gke.io/bundleName=policy-essentials-v2022 
kpt
- Run the - set-enforcement-actionkpt function to set the policies' enforcement action to- warn:- kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn 
- Apply the policy constraints: - kpt live apply 
Config Sync
Operators using Config Sync to deploy policies to their clusters can use the following instructions:
- Change into the sync directory for Config Sync: - cd SYNC_ROOT_DIR 
- Run the - set-enforcement-actionkpt function to set the policies' enforcement action to- warn:- kpt fn eval policies/policy-essentials-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn 
- Push changes to the Config Sync repo: - git add SYNC_ROOT_DIR/policies/policy-essentials-v2022 git commit -m 'Adding Policy Essentials policy bundle warn enforcement' git push 
- Verify the status of the installation: - nomos status - The cluster should display a status of - SYNCEDwith the installed policies.
Test policy enforcement
Create a non-compliant resource on the cluster using the following command:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: wp-non-compliant
  labels:
    app: wordpress
spec:
  containers:
    - image: wordpress
      name: wordpress
      ports:
      - containerPort: 80
        name: wordpress
EOF
The admission controller should produce a warning listing out the policy violations that this resource violates, as shown in the following example:
Warning: [policy-essentials-v2022-psp-capabilities] container <wordpress> is not dropping all required capabilities. Container must drop all of ["NET_RAW"] or "ALL" pod/wp-non-compliant created
Remove Policy Essentials policy bundle
If needed, the Policy Essentials policy bundle can be removed from the cluster.
kubectl
- Use kubectl to remove the policies: - kubectl delete constraint -l policycontroller.gke.io/bundleName=policy-essentials-v2022 
kpt
- Remove the policies: - kpt live destroy 
Config Sync
Operators using Config Sync to deploy policies to their clusters can use the following instructions:
- Push changes to the Config Sync repo: - git rm -r SYNC_ROOT_DIR/policies/policy-essentials-v2022 git commit -m 'Removing Policy Essentials v2022 policies' git push 
- Verify the status: - nomos status - The cluster should display a status of - SYNCEDwith the resources removed.