实操教程丨使用Pod安全策略强化K8S安全

本文来自Rancher Labsdocker

什么是Pod安全策略?

Kubernetes Pod安全策略(PSP)是Kubernetes安全版块中极为重要的组件。Pod安全策略是集群级别的资源,用于控制Pod安全相关选项,而且仍是一种强化Kubernetes工做负载安全性的机制。Kubernetes平台团队或集群运维人员能够利用它来控制pod的建立以及限制特定的用户、组或应用程序可使用的功能。api

举个简单的例子,使用PSP你能够:安全

  • 防止特权Pod启动并控制特权升级。
  • 限制Pod能够访问的主机命名空间、网络和文件系统
  • 限制能够运行pod的用户/组。
  • 限制Pod能够访问的Volume
  • 限制其余参数,如运行时配置文件或只读根文件系统

在本文中,咱们将向你展现在Rancher中如何经过启用一个简单的Pod安全策略来强化你的Kubernetes安全。bash

Pod安全策略真的能够加强K8S的安全性吗?

是的,Pod安全策略确实能够加强Kubernetes的安全性。它提供了Kubernetes原生控制机制,能够防止威胁而不影响性能,这与agent必须拦截主机上的每一个动做有所区别。网络

若是你还没有在集群中启用PSP(或执行访问控制之类的等效方法),则Kubernetes用户可能会生成特权集群。这将会被恶意利用,例如提高特权进而突破容器隔离并访问其余Pod/服务。app

若是没有限制Pod spec特权的机制,攻击者能够经过docker命令执行任何操做,例如,运行特权容器、使用节点资源等。运维

想要快速验证以上说法,你能够执行如下脚本(千万不要在生产集群上操做):性能

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

你能够得到对Kubernetes节点的即时root访问权限。是否是有点后怕呢?ui

经过遵循最小特权的概念,你能够安全地在集群中实现PSP,并确保在Kubernetes Pod或工做负载中没有不须要的权限。除了Kubernetes安全的核心理念外,最小特权原则也是一种通用的安全最佳实践,同时仍是诸如PCI、SOC2或HIPAA等合规性标准的核心要求。spa

总结一下:

  • PSP将为Pod授予的安全功能提供默认安全约束,该pod能够是集群上任何用户建立的
  • PSP还能经过知足特定合规性基准的要求帮助你验证合规性

最小特权是一个概念,也是一个实践,能够将用户、帐号和计算过程的访问权限限制为仅执行平常合法活动所须要的资源。

在你的集群中启用Pod安全策略

在Kubernetes中Pod安全策略能够实现为Admission Controller。要在你的集群中启用PSP,确保PodSecurityPolicyenable-admission-plugins列表内,做为参数传递给你的Kubernetes API配置的参数:

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

提供托管Kubernetes集群(你没法直接访问API配置)的云提供商一般会提供高级设置,用户能够在整个集群范围内启用PSP。在其余状况下,你可能须要编辑/etc/kubernetes/manifests/kube-apiserver.yaml文件,并将其添加到相应的命令参数中。

在Rancher中,你能够在UI上编辑集群来轻松启用PSP:

你能够选择默认应用哪一个Pod安全策略。在本例中,咱们选择了restricted(受限)。

使用一个Admission controller来启用PSP的好处在于它提供了一个即时预防机制,甚至能够在调度以前中止部署过分特权的Pod。缺点就是你启用一个PSP以后,每一个pod都须要通过PSP的批准,使其部署和过渡更加困难。

Rancher中启用基本Pod安全策略demo

在这一部分中,咱们将逐步演示如何经过Rancher dashboard在集群中启用Pod安全策略,并在默认状况下使用受限策略,并了解如何防止建立特权Pod。

PSP对象自己是将要应用于pod specs的要求和约束的列表。PSP YAML以下所示:

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

以上PSP有不少容许权限,例如:

  • 它容许pod能够与其余Linux功能(如NET_ADMIN和IPC_LOCK)一块儿运行
  • 它容许从主机安装敏感路径
  • Pod能够做为特权运行

浏览Kubernetes官方文档能够获取可用的PSP控件及其默认值的完整列表:

https://kubernetes.io/docs/co...

让咱们来看一个示例,说明如何防止特权Pod在集群中运行。

在集群中启用PSP以后,请尝试部署相似的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

它能够当即使用,由于咱们告诉Rancher启用具备受限安全策略的PSP,该策略容许没有特权的pod正常运行,像上面那样。

检查默认PSP中的内容,以下所示:

$ 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

或者在Rancher的全局视角检查。选择【安全>Pod安全策略】并点击受限的选项。

该PSP应该容许任何pod,只要它以标准用户(不是root)身份运行,而且不须要任何特权和特殊功能。

有关PSP和RBAC的其余内容,咱们将在之后进行探讨。为了简单起见,加上Rancher已经为你设置了必需的绑定,所以咱们如今略过这一部分。让咱们尝试部署一个特权pod,例如来自kubectl-root-in-host.sh脚本的那个pod:

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

该pod将不会进入集群

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]

PodSecurityPolicy admission controller将不容许建立这个pod,由于现有的PSP不容许使用“hostPID”、“hostNetwork” 或 “privileged”。

总结

在本文中咱们经过在Rancher环境中启用一个简单的Pod安全策略来加强你的Kubernetes安全。经过使用默认的受限PSP,咱们确保pod只能在不须要扩展安全权限的状况下运行。最后,咱们尝试部署一个拥有众多权限的pod,而且失败了,由于现有的PSP阻止了它被调度到集群上。

Rancher Kubernetes平台拥有着超过一亿次下载量,咱们深知安全问题对于用户而言的重要性。后期咱们也将会推出更多与安全相关的内容,帮助Rancher用户安全、稳妥地落地Kubernetes。

相关文章
相关标签/搜索