如何通过开放政策拒绝 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
对象中不可用?
我正在使用
- minishift 1.24
- openshift v3.9.0+2e78773-56
- kubernetes v1.9.1+a0ce1bc657
- etcd 3.2.16
Kubernetes 中的准入控制不允许您控制 get
。它只允许您控制 create
、update
、delete
和 connect
。 validating 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 Secret
s. To use OPA for authorization you would need the authorization webhook mode。
在您 link 的 Andrew 代码中,他使用的是授权网络挂钩,而不是准入控制网络挂钩。这就是为什么他使用的来自 input
的一些数据与您从准入控制 Webhook 中看到的数据不同的原因。快速浏览一下他的文章,似乎您需要按照他的说明进行 Enable Authorization。
我们想为 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
对象中不可用?
我正在使用
- minishift 1.24
- openshift v3.9.0+2e78773-56
- kubernetes v1.9.1+a0ce1bc657
- etcd 3.2.16
Kubernetes 中的准入控制不允许您控制 get
。它只允许您控制 create
、update
、delete
和 connect
。 validating 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 Secret
s. To use OPA for authorization you would need the authorization webhook mode。
在您 link 的 Andrew 代码中,他使用的是授权网络挂钩,而不是准入控制网络挂钩。这就是为什么他使用的来自 input
的一些数据与您从准入控制 Webhook 中看到的数据不同的原因。快速浏览一下他的文章,似乎您需要按照他的说明进行 Enable Authorization。