- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 K8sPSPCapabilities 约束模板中将一个容器列入白名单,但我在使用 rego 语言时遇到了一些困难。我想禁止除特定容器之外的所有容器的 NET_RAW 功能。如果有人能指出我正确的方向,我将不胜感激。
最佳答案
我相信您指的是 this template来自 Gatekeeper ConstraintTemplate 库,这是令人生畏的。不幸的是,如所写,ConstraintTemplate 不允许拒绝列出特定的 allowedCapabilities
。让我们构建它。
如果您只是在寻找 Rego,here's it in the Rego Playground .
验证容器
我们将从内到外开始。首先,假设我们有一个 Container 并希望确保它在 .securityContext.capabilities.add
中没有 NET_RAW
。首先,我们会将此列表的值收集到一个集合中。
capabilities := {c | c := container.securityContext.capabilities.add[_]}
这叫做 set comprehension .
由于您很可能希望拒绝多项功能,因此我们假设您希望将其设置为列表参数,而不是将其硬编码到您的 ConstraintTemplate 中。我们还需要将此列表从 input.parameters
转换为一个集合。
denied := {c | c := input.parameters.deniedCapabilities[_]}
我们现在要做的是构建 set intersection Container 中的 capabilities
和 denied
中的 capabilities
之间。
count(capabilities & denied) > 0
如果容器和拒绝功能列表中都有任何功能,则返回 true
。
我们必须考虑容器指定 '*'
的情况,这将隐式包含 NET_RAW
但与我们上面的逻辑不匹配。我们检查这种情况:
capabilities['*']
请注意,Rego 函数中的每个真值语句都隐含地进行了 AND 运算。所以下面会检查这两个条件,但我们想匹配其中一个:
count(capabilities & denied) > 0
capabilities['*']
我们可以通过为 has_disallowed_capabilities
提供两个定义来做到这一点:
has_disallowed_capabilities(container) {
capabilities := {c | c := container.securityContext.capabilities.add[_]}
denied := {c | c := input.parameters.deniedCapabilities[_]}
count(capabilities & denied) > 0
}
has_disallowed_capabilities(container) {
capabilities := {c | c := container.securityContext.capabilities.add[_]}
capabilities["*"]
}
如果我们在 Container 上调用 has_disallowed_capabilities
,Rego 将自动检查两个定义并在至少一个返回 true 时返回 true。
验证 Pod
现在我们将实际编写 Gatekeeper 惯用的 violation
函数。
violation[{"msg": msg}] {
container := input.review.object.spec.containers[_]
has_disallowed_capabilities(container)
msg := sprintf("container <%v> has a disallowed capability. Denied capabilities are %v", [container.name, input.parameters.deniedCapabilities])
}
此违规行为首先创建一个 iterator , container
,它将遍历 Pod 中的所有 Container。通过在迭代器上调用函数,我们隐式地在迭代器中的每个容器上调用该函数。
我们还必须检查 initContainers
,因为它们也可能具有 NET_RAW
功能。它看起来与上面几乎相同:
violation[{"msg": msg}] {
container := input.review.object.spec.initContainers[_]
has_disallowed_capabilities(container)
msg := sprintf("initContainer <%v> has a disallowed capability. Denied capabilities are %v", [container.name, input.parameters.deniedCapabilities])
}
将容器列入白名单
快完成了。正如您上面所说,我们想要将特定容器列入白名单。回想一下,Rego 函数中的所有语句都是通过与运算组合在一起的,violation
函数必须返回 true
才能使 Container 验证失败。因此,如果我们创建一个语句,如果它与我们想要的容器匹配,则计算结果为 false
,我们就完成了!
假设我们要忽略具有name: abc
的容器。我们可以匹配所有其他容器:
container.name != "abc"
这只需要进入我们的两个 violation
函数,我们就准备好了!
将一切放在一起
最后,我们将上面创建的所有内容放入 ConstraintTemplate 中:
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
name: k8spspdeniedcapabilities
annotations:
description: Denies Pod capabilities.
spec:
crd:
spec:
names:
kind: K8sPSPDeniedCapabilities
validation:
# Schema for the `parameters` field
openAPIV3Schema:
properties:
deniedCapabilities:
type: array
items:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package capabilities
violation[{"msg": msg}] {
container := input.review.object.spec.containers[_]
container.name != "abc"
has_disallowed_capabilities(container)
msg := sprintf("container <%v> has a disallowed capability. Denied capabilities are %v", [container.name, input.parameters.deniedCapabilities])
}
violation[{"msg": msg}] {
container := input.review.object.spec.initContainers[_]
container.name != "abc"
has_disallowed_capabilities(container)
msg := sprintf("initContainer <%v> has a disallowed capability. Denied capabilities are %v", [container.name, input.parameters.deniedCapabilities])
}
has_disallowed_capabilities(container) {
capabilities := {c | c := container.securityContext.capabilities.add[_]}
denied := {c | c := input.parameters.deniedCapabilities[_]}
count(capabilities & denied) > 0
}
has_disallowed_capabilities(container) {
capabilities := {c | c := container.securityContext.capabilities.add[_]}
capabilities["*"]
}
以及实例化它的约束:
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPDeniedCapabilities
metadata:
name: denied-capabilities
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
parameters:
deniedCapabilities: ["NET_RAW"]
相反,如果您希望白名单容器是可配置的,您将遵循与我们用来制作 deniedCapabilities
的过程类似的过程。
关于open-policy-agent - 如何使用 Open Policy Agent Gatekeeper K8sPSPCapabilities 约束模板将容器列入白名单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67059926/
我们有一套多平台的命令行可执行文件和库,可以移植到 Mac。文件布局是 /应用程序/ (公司文件夹)/ (我们的用户界面).app (产品名称)/ 仓/ ...执行... 库/ ...dylibs..
我正在尝试将 ProxyInjector 设置为自动将 keycloak-gateway 注入(inject)任何具有如下注释的容器中,这些容器用于我在 kubernetes 上部署的服务: "ann
我正在为 iPhone 开发一个应用程序。有时我会收到此日志: Named service 'com.apple.PersistentURLTranslator.Gatekeeper' not fou
我在 Xcode 中有一个被 Gatekeeper 阻止的“命令行工具”目标(不是应用程序包)。多年来,我一直将此工具用作 PostCheck 地址簿插件的简单安装程序。 2012 年,我使用我的 A
目标 :当 nginx 入口具有事件重写目标功能时,Keycloak 网守部署。 Ingress 根据以下内容重写目标: rewrite.bar.com/something/重写为 rewrite.b
我将我的 Mac 操作系统更新到 Catalina beta 版本,并在卸载 DMG 时收到 Gatekeeper 警告,提示为“MyApp.app 无法打开,因为苹果无法检查它是否存在恶意内容”。但
设置 aud 的正确方法是什么?声称避免以下错误? unable to verify the id token {"error": "oidc: JWT claims invalid: inval
我想知道控制与某些事件监听器关联的逻辑是否处于事件状态的最佳方法。 我自然而然地遇到了三种控制事件监听器内部逻辑的方法。 使用一个可由所有连接的套接字访问的变量,充当看门人。如果一个套接字将该变量设置
我观察到,一旦我的签名应用程序从 Internet 下载并通过了 GateKeeper 接受(即我在警告对话框中单击“确定”),它就永远不会再次被隔离。也就是说后续的下载不会收到任何警告。即使它是应用
在 MacOS Mojave 10.14.5 上,依赖 TCP 连接的本地服务会随机中止连接,从而导致“Mysql 已消失”和 Nginx 连接重置等错误。 似乎 Mojave 操作系统正在监视并阻止
来自苹果最近的一篇文章: With the release of OS X Mavericks 10.9.5, the way that OS X recognizes signed apps wil
当前流量: incoming request (/sso-kibana) --> Envoy proxy --> /sso-kibana 预计流量: incoming request (/sso-ki
我正在尝试向 OS X 用户分发 Java 应用程序。我没有使用 Mac 商店——它将通过我自己的网站进行分发。无论我尝试什么,OS X 的 Gatekeeper 都会拒绝该应用程序。 这是我的方法:
我是否需要 99 美元的 Apple 开发者帐户才能使我的应用程序避免“ [此应用程序] 无法打开,因为它来自身份不明的开发者”警告,或者我可以通过免费的开发者帐户?我知道我的客户可以通过更改他们的
自从我将我的 MacBook 升级到 macOS Catalina。尽管我禁用了“spctl”,但我还是收到了永久消息(“ideviceinfo”无法打开,因为开发人员未经过验证)。有人可以帮忙吗?我
在 OS X 10.8 的新版本中,当您尝试启动已签名的 Java 小程序时,Gatekeeper 将弹出以下警告: 小程序已使用有效的代码签名证书进行签名,并且可以在其他平台以及以前版本的 OS X
我的公司为服务器生产 Java 应用程序并提供 JNLP 文件以启动本地应用程序。从 OSX 10.8.4 开始,需要使用 Developer ID 对 JNLP 文件进行签名才能让 Gatekeep
我想在 K8sPSPCapabilities 约束模板中将一个容器列入白名单,但我在使用 rego 语言时遇到了一些困难。我想禁止除特定容器之外的所有容器的 NET_RAW 功能。如果有人能指出我正确
我正在构建我的应用程序并使用有效的代码签名证书(开发人员 ID 应用程序...)进行签名: codesign --force --verify --verbose --sign "Developer
场景 我想发布一个适用于 Mac OS X 的应用程序,但不在 AppStore 上。该应用程序在 10.6 - 10.8 及更高版本上运行。 问题 Apple 要求 Mac OS X 10.8+ 的
我是一名优秀的程序员,十分优秀!