如何通过开放政策拒绝 openshift 中的 view/get 操作?

How to deny view/get operation in openshift via open policy?

我们想为 secrets 禁用 oc get/describe 以防止令牌登录

当前策略禁止创建、更新、删除但不禁止查看机密

package admission

import data.k8s.matches

# Deny all user for doing secret ops except policyadmin

deny[query] {
    matches[[resource]]

    not "policyadmin" == resource.userInfo.username
    "Secret" == resource.kind.kind

    msg := sprintf("Custom Unauthorized user: %v", [resource.userInfo.username])

    query = {
        "id": "policy-admin-for-secret-only",
        "resource": {
            "kind": kind,
            "namespace": namespace,
            "name": name
        },
        "resolution": {
            "message": msg
        },
    }
}

资源对象中的数据就是:

{\"kind\": {\"group\": \"\", \"kind\": \"Secret\", \"version\": \"v1\"}, \"name\": \"s5-token-n6v6q\", \"namespace\": \"demo\", \"operation\": \"DELETE\", \"resource\": {\"group\": \"\", \"resource\": \"secrets\", \"version\": \"v1\"}, \"uid\": \"748cdab2-1c1d-11ea-8b11-080027f8814d\", \"userInfo\": {\"groups\": [\"system:cluster-admins\", \"system:masters\", \"system:authenticated\"], \"username\": \"system:admin\"}

https://github.com/raffaelespazzoli/openshift-opa/blob/master/examples/authorization-webhooks/unreadable_secrets.rego中的示例使用了resource.spec对象,但我认为它在我的input/AdmissionReview对象中不可用?

我正在使用

Kubernetes 中的准入控制不允许您控制 get。它只允许您控制 createupdatedeleteconnectvalidating webhook and its descendent RuleWithOperations (no handy link) don't make this clear, but the docs introducing API access 的 API 文档明确说明了这一点。

要控制get,您需要使用authorization. You could use RBAC to restrict who can get any of the Secrets. To use OPA for authorization you would need the authorization webhook mode

在您 link 的 Andrew 代码中,他使用的是授权网络挂钩,而不是准入控制网络挂钩。这就是为什么他使用的来自 input 的一些数据与您从准入控制 Webhook 中看到的数据不同的原因。快速浏览一下他的文章,似乎您需要按照他的说明进行 Enable Authorization