Practice tutorial: using Pod security strategy to strengthen K8S security

Keywords: Kubernetes network SELinux Docker

This article comes from Rancher Labs

 

What is Pod security policy?

 

Kubernetes Pod security policy (PSP) is an important component of kubernetes security section. Pod security policy is a cluster level resource, used to control pod security related options, and also a mechanism to enhance kubernetes workload security. Kubernetes platform team or cluster operation and maintenance personnel can use it to control the creation of pod and limit the functions available to specific users, groups or applications.

 

For a simple example, with PSP you can:

 

  • Prevent privileged Pod from starting and control privilege escalation.

  • Restrict the host namespace, network, and file system that Pod can access

  • Limit the users / groups that can run the pod.

  • Limit the volumes that Pod can access

  • Restrict other parameters, such as runtime profiles or read-only root file systems

 

In this article, we will show you how to enhance your Kubernetes security in Rancher by enabling a simple Pod security policy.
 

Can Pod security policy really enhance K8S security?

 

Yes, the Pod security policy does enhance the security of Kubernetes. It provides Kubernetes native control mechanism, which can prevent threats without affecting performance, which is different from the agent must intercept every action on the host.

 

If you have not enabled PSP in the cluster (or perform an equivalent method such as access control), Kubernetes users may generate a privileged cluster. This can be exploited maliciously, such as promoting privileges to break through container isolation and access other Pod / services.

 

If there is no mechanism to restrict the privilege of Pod spec, * * * person can perform any operation through the docker command, such as running privilege container, using node resources, etc.

 

To quickly verify the above statement, you can execute the following script (never operate on the production cluster):
 

❯ ./kubectl-root-in-host.sh
bash-4.4# whoami
root
bash-4.4# hostname
sudo--alvaro-rancher-rancheragent-0-all

 
You can get immediate root access to the Kubernetes node. Is it a little afraid?
 

By following the concept of minimum privileges, you can safely implement PSP in a cluster and make sure that you don't have unnecessary permissions in the Kubernetes Pod or workload. In addition to the core concept of Kubernetes security, the principle of minimum privilege is a common security best practice, and also the core requirement of compliance standards such as PCI, SOC2 or HIPAA.

 
To summarize:
 

  • PSP will provide default security constraints for the security functions granted by pod, which can be created by any user on the cluster

  • PSP can also help you verify compliance by meeting specific compliance benchmarks
     
    Minimum privilege is a concept as well as a practice, which can restrict the access rights of users, accounts and calculation processes to only the resources needed for daily legal activities.
     

    Enable Pod security policy in your cluster

     

In Kubernetes, the Pod security policy can be implemented as the permission controller. To enable PSP in your cluster, make sure that PodSecurityPolicy is in the enable admission plugins list and passed as a parameter to your Kubernetes API configuration parameter:
 

--enable-admission-plugins=...,PodSecurityPolicy

 
Cloud providers that host Kubernetes clusters (you can't directly access the API configuration) usually provide advanced settings that allow users to enable PSP across the entire cluster. In other cases, you may need to edit the / etc / kubernets / manifests / kube-apiserver.yaml file and add it to the corresponding command parameters.
 

In Rancher, you can edit the cluster on the UI to enable PSP easily:
 

 
You can choose which Pod security policy to apply by default. In this case, we chose restricted.
 

The advantage of using an access controller to enable PSP is that it provides an immediate prevention mechanism, and even stops deploying overly privileged pods before scheduling. The disadvantage is that after you enable a PSP, each pod needs to be approved by the PSP, making its deployment and transition more difficult.
 

Enable basic Pod security policy demo in Rancher

 

In this section, we will step-by-step demonstrate how to enable the Pod security policy in the cluster through the Rancher dashboard, use the restricted policy by default, and learn how to prevent the creation of privileged pods.

 

The PSP object itself is a list of requirements and constraints to be applied to the pod specs. PSP YAML is as follows:
 

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: example
spec:
  allowedCapabilities:
    - NET_ADMIN
    - IPC_LOCK
  allowedHostPaths:
    - pathPrefix: /dev
    - pathPrefix: /run
    - pathPrefix: /
  fsGroup:
    rule: RunAsAny
  hostNetwork: true
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  privileged: true
  runAsUser:
    rule: RunAsAny
  volumes:
    - hostPath
    - secret

 
The above PSP S have many permissions, such as:
 

  • It allows pod to run with other Linux features such as net admin and IPC lock

  • It allows sensitive paths to be installed from the host

  • Pod can run as privilege

 

Browse the official Kubernetes documentation for a complete list of available PSP controls and their default values:

https://kubernetes.io/docs/concepts/policy/pod-security-policy/

 

Let's look at an example of how to prevent privileged Pod from running in a cluster.

 

After enabling PSP in the cluster, try to deploy a similar pod:

 

deploy-not-privileged.yaml
 

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: not-privileged-deploy
  name: not-privileged-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: not-privileged-deploy
  template:
    metadata:
      labels:
        app: not-privileged-deploy
    spec:
      containers:
        - image: alpine
          name: alpine
          stdin: true
          tty: true
          securityContext:
            runAsUser: 1000
            runAsGroup: 1000

 
It can be used immediately because we told Rancher to enable PSP with restricted security policy, which allows unprivileged pod to operate normally, as above.
 

Check the contents of the default PSP as follows:

 

$ kubectl get psp restricted-psp -o yaml
 

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  annotations:
    serviceaccount.cluster.cattle.io/pod-security: restricted
    serviceaccount.cluster.cattle.io/pod-security-version: "1960"
  creationTimestamp: "2020-03-04T19:56:10Z"
  labels:
    cattle.io/creator: norman
  name: restricted-psp
  resourceVersion: "2686"
  selfLink: /apis/policy/v1beta1/podsecuritypolicies/restricted-psp
  uid: 40957380-1d44-4e43-9333-91610e3fc079
spec:
  allowPrivilegeEscalation: false
  fsGroup:
    ranges:
      - max: 65535
        min: 1
    rule: MustRunAs
  requiredDropCapabilities:
    - ALL
  runAsUser:
    rule: RunAsAny
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    ranges:
      - max: 65535
        min: 1
    rule: MustRunAs
  volumes:
    - configMap
    - emptyDir
    - projected
    - secret
    - downwardAPI
    - persistentVolumeClaim

 
Or in Rancher's global perspective. Select [Security > pod security policy] and click the restricted option.
 

 
The PSP should allow any pod as long as it is running as a standard user (not root) and does not require any privileges or special features.
 

Other content about PSP and RBAC will be discussed later. For the sake of simplicity, add that Rancher has set up the necessary bindings for you, so let's skip this section now. Let's try to deploy a privileged pod, such as the one from the kubectl root in host.sh script:

 

deploy-privileged.yaml
 

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: privileged-deploy
  name: privileged-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: privileged-deploy
  template:
    metadata:
      labels:
        app: privileged-deploy
    spec:
      containers:
        - image: alpine
          name: alpine
          stdin: true
          tty: true
          securityContext:
            privileged: true
      hostPID: true
      hostNetwork: true

 
The pod will not enter the cluster
 

 Warning  FailedCreate  2s (x12 over 13s)  replicaset-controller  Error creating: pods "privileged-deploy-7569b9969d-" is forbidden: unable to validate against any pod security policy: [spec.securityContext.hostNetwork: Invalid value: true: Host network is not allowed to be used spec.securityContext.hostPID: Invalid value: true: Host PID is not allowed to be used spec.containers[0].securityContext.privileged: Invalid value: true: Privileged containers are not allowed]

 
The PodSecurityPolicy admission controller will not allow this pod to be created because the existing PSP does not allow the use of 'hostPID', 'hostNetwork', or 'privileged'.
 

summary

 
In this article, we enhance your Kubernetes security by enabling a simple pod security policy in the Rancher environment. By using the default restricted PSP, we ensure that the pod can only run without the need to extend security permissions. Finally, we tried to deploy a pod with many permissions and failed because the existing PSP prevented it from being scheduled to the cluster.

The Rancher Kubernetes platform has more than 100 million downloads, and we know the importance of security issues for users. Later, we will also launch more security related content to help Rancher users land in Kubernetes safely and safely.

Posted by ld0121 on Tue, 17 Mar 2020 03:26:27 -0700