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/