通过Kubernetes中的网守应用ServiceAccount特定的OPA策略

5ssjco0h  于 2022-09-20  发布在  Kubernetes
关注(0)|答案(2)|浏览(142)

我们正试图用使用GateKeeper的OPA政策取代Kubernetes中现有的PSP。我使用的是GateKeeper https://github.com/open-policy-agent/gatekeeper-library/tree/master/library/pod-security-policy提供的默认模板,并定义了相应的约束。

但是,我不知道如何将策略应用于特定的ServiceAccount。例如。如何仅为名为awsnode的ServiceAccount定义allow-privilege-escalation策略?

在PSP中,我为必需的podsecuritypolicies创建了一个角色/ClusterRole,并创建了一个RoleBinding以允许awsnode ServiceAccount使用所需的PSP。我很难理解如何使用网守OPA政策实现同样的目标?

谢谢。

zf9nrax1

zf9nrax11#

显然,PSP和网守OPA策略旨在实现不同级别的POD安全。以下是AWS支持人员对上述问题的回应。

网守约束模板(以及由模板定义的对应约束CRD)适用于更大范围的Kubernetes资源,而不仅仅是Pod。GateKeeper扩展了RBAC在此阶段无法提供的附加功能。网守本身不能由RBAC管理(通过使用动词限制对网守约束的访问),因为不存在网守策略约束的RBAC资源关键字(至少在撰写本文时是这样)。PodSecurity许可控制器可能是寻找PSP替代品的人的一个选择,如果群集在1.22或更高版本上,则需要由RBAC控制。

rggaifut

rggaifut2#

我认为将OPA网关守护策略(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-库的允许权限提升引用input.review.object.spec.containers并找到一个类似于“apache”的容器数组。同样,您可以修改策略代码以引用input.review.object.spec.serviceAccount并找到“apache-service-count”。从那时起,问题是使用这些信息来确保只有当服务帐户是您想要应用的帐户时,规则“违规”才匹配。

除此之外,还可以获取预期的服务帐户名并将其作为ConstraintTemplate参数,以使您的新策略更加灵活/可用。

希望这个能帮上忙!

相关问题