创建和分配Kubernetes Pod安全策略

Kubernetes是大多数企业的必备的容器管理和服务编排工具。但是随着Kubernetes中管理的容器越来越多,安全性可能就会成为一个问题。不仅容器中的应用需要具备完善的安全控制,而且容器和Pod所在运行环境的安全性。否则,企业将面临数据被盗窃等风险。

为此,应用在部署到Kubernetes集群时,Pod安全策略是必须要考虑的一件事。所以,本文想向你介绍创建Kubernetes Pod安全策略的基础知识,进而能帮助你实现可靠而安全的部署。

Kubernetes Pod是什么?

在我们深入研究安全策略之前,你可能需要首先了解Pod是什么:Pod是构成一个容器的过程的集合。这些过程可以包括:

  • 存储资源
  • 唯一的网络IP地址
  • 容器运行需要的配置信息

以上这些,可以称之为一个部署单元。这个单元可以是单个容器的形式,也可以是多个容器一起工作的形式(例如WordPress,NGINX和MySQL)。这些容器中的每个都有自己的配选项,但它们组合一起就可以成为一个有凝聚力的整体-Pod。

但是,如果没有整体安全性的管理手段,那么你将不得不管理各个容器的安全性。这就给Kubernetes开发人员带来了很大的麻烦。所以,我们需要Pod安全策略。

Pod安全策略

Pod安全策略,指的是Pod必须满足特定安全条件的配置,以便被Kubernetes集群接受。如果不满足条件,则Pod将会被拒绝。通过使用PodSecurityPolicy对象定义Pod安全策略,可以控制以下各项:

  • Pod运行特权容器( privileged containers )的能力。
  • Pod使用特权升级( privilege escalation )的能力。
  • Pod对存储卷类型的访问。
  • Pod对主机文件系统的访问。
  • Pod对主机网络对象和配置的使用。

但是如何定义Pod安全策略?让我们开始深入……

创建Kubernetes Pod安全策略

Pod安全策略可以在YAML文件中定义。

让我们创建一个新的Pod安全策略。该策略将执行以下操作(RunAsAny规则,该规则比runAsUser选项更自由宽松):

  • 禁用Pod运行特权容器。
  • 允许使用SELinux。
  • 允许使用Linux组。
  • 允许用户运行其他用户创建的容器。
  • 允许使用fsGroup。

例如,创建以下的YAML文件,nano no-privilege.yaml:

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: no-privilege
spec:
  privileged: false
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  runAsUser:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  volumes:
  - '*'

要应用新创建的Pod安全策略,使用如下命令:

kubectl apply -f no-privelege.yaml

当输出以下内容:

Podsecurity.policy/no-privilege created

说明你的Pod安全策略已经被应用。

如果你需要修改上面的Pod安全策略,则可以编辑YAML文件并重新运行kubectl apply命令就可以了。

也可以使用以下命令验证你的策略是否生效:

kubectl get psp no-privilege

它将打印出YAML文件中定义的Pod安全策略。

Pod安全策略

现在你已经知道如何创建了Pod安全策略,但你还需要了解…

如何分配Pod安全策略

角色的访问控制(RBAC)是kubernetes标准的授权模式,并且很容应用于Pod安全策略。借助RBAC,你可以将Pod安全策略分配给应用。

为此,我们将创建一个新的YAML文件,该文件不仅会创建集群范围的角色(使用ClusterRole定义),还将创建集群绑定(使用ClusterRoleBinding定义),以向每个经过身份验证的用户授予访问权限。

使用以下命令创建新文件:

nano rbac-noprivilege.yaml

在该文件中,粘贴以下内容:

首先,一个集群角色(clusterRole)需要被授权它想要的策略(使用use动词)。

然后,把集群角色与授权的用户绑定 。

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: no-privilege:no-privilege
rules:
- apiGroups:
  - extensions
  resources:
  - Podsecuritypolicies
  resourceNames:
  - no-privilege
  verbs:
  - use
---
 
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: no-privilege:no-privilege
subjects:
- kind: Group
  name: system:authenticated
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: no-privilege:no-privilege
  apiGroup: rbac.authorization.k8s.io

保存并关闭文件。通过以下命令应用集群角色:

kubectl apply -f rbac-noprivilege.yaml

上面的命令将打印出:

clusterrole.rbac.authorization.k8s.io/no-privilege:no-privilege created
clusterrolebinding.rbac.authorization.k8s.io/no-privilege:no-privilege created

现在,你可以通过以下命令使用新策略:

kubectl auth can-i use podsecuritypolicy/no-privilege

这时候,控制台会输出“yes”。

让我们检查一下是否任何其他用户可以通过以下命令,来使用新策略:

kubectl auth can-i use podsecuritypolicy/no-privilege --as-group=system:authenticated --as=any-user

这时候,控制台会输出““ no”。

现在,你已经创建并应用了第一个Kubernetes Pod安全策略。借助此技术,你可以大大增强Kubernetes中应用的安全性。

译文链接: https://thenewstack.io/tutorial-create-a-kubernetes-Pod-security-policy/

K8S中文社区微信公众号

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址