我们正在尝试使用Gatekeeper将kubernetes中现有的psp替换为OPA策略。我使用Gatekeeper https://github.com/open-policy-agent/gatekeeper-library/tree/master/library/pod-security-policy提供的默认模板,并定义了相应的约束。
然而,我不知道如何将策略应用于特定的ServiceAccount
。如。如何定义allow-privilege-escalation
策略只到一个名为awsnode的ServiceAccount ?
在PSP中,我为所需的podsecuritypolicies
创建了一个Role/ClusterRole,并创建了一个RoleBinding以允许awsnode ServiceAccount使用所需的PSP。我正在努力理解如何使用Gatekeeper OPA策略实现相同的目标?
谢谢。
显然psp和Gatekeeper OPA策略旨在实现不同级别的pod安全。以下是AWS技术支持对上述问题的回应。
Gatekeeper约束模板(以及从模板中定义的相应约束crd)适用于更大范围的Kubernetes资源,而不仅仅是pod。Gatekeeper扩展了RBAC在此阶段无法提供的附加功能。Gatekeeper本身不能由RBAC管理(通过使用动词来限制对Gatekeeper约束的访问),因为Gatekeeper策略约束不存在RBAC资源关键字(至少在撰写本文时是这样)。如果集群是1.22或更高版本,那么对于需要由RBAC控制的psp的替代品来说,PodSecurity Admission Controller可能是一个选择。
我认为将OPA Gatekeeper策略(ConstraintTemplate)应用于特定ServiceAccount的可能解决方案是使OPA/Rego策略代码反映过滤器/选择逻辑。由于您说使用的是看门人库中已有的策略,因此更改策略代码可能不是您的选择。但是如果改变它是一个选项,我认为你的OPA/Rego策略可以考虑pod的serviceAccount字段。请记住OPA Gatekeeper, Rego策略代码的输入是整个准入请求,包括pod的规格(假设它是您试图检查的pod创建)。
所以Rego策略代码的部分输入可能像
"spec": {
"volumes": [... ],
"containers": [
{
"name": "apache",
"image": "docker.io/apache:latest",
"ports": [... ],
"env": [... ],
"resources": {},
"volumeMounts": [... ],
"imagePullPolicy": "IfNotPresent",
"securityContext": {... }
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 30,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "apache-service-account",
"serviceAccount": "apache-service-account",
因此gatekeeper-library的allow-privilege-escalation引用input.review.object.spec.containers
并找到一个容器数组,如"apache"。类似地,您可以修改策略代码以引用input.review.object.spec.serviceAccount
并找到"apache-service-account"。从那里开始,就是使用这些信息来确保规则被"违反"的问题了。只有当服务帐户是您要应用的帐户时才匹配。
除此之外,还可以使用预期的服务帐户名并将其作为ConstraintTemplate参数,以使您的新策略更灵活/更可用。
希望这对你有帮助!