本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。

这是尚未发布的文档。 Admission Controller 1.34-dev.

WASI

WebAssembly系统接口(WASI)是一个WebAssembly标准,提供一组接口,允许在浏览器外执行WebAssembly。

编写常规策略的作者不应使用普通的WASI系统接口来编写策略。

此页面适用于SUSE Security Admission Controller维护者或希望在前沿WASM平台上进行实验的低级策略作者。

使用WASI,您可以拥有一个与系统原语交互的WebAssembly模块,如STDOUT、STDERR、STDIN、环境变量等。

许多用于编译Admission Controller策略的编译器生成针对WASI接口的WebAssembly模块。 然而,Admission Controller策略使用https://github.com/wapc[waPC]项目在策略与策略运行时(kwctl`或`policy-server)之间实现双向通信。Admission Controller通信协议的使用在这里进行了描述。

在某些特殊情况下,waPC项目尚不可用。 在这些情况下,您可以使用WASI提供的接口编写策略。

Admission Controller支持从Admission Controller 1.7.0版本开始的WASI策略。

局限性

在正常情况下,您不应使用WASI策略,因为它们在评估时的性能低于waPC/Rego策略。

策略与主机之间的双向通信可以实现,但需要在语言SDK内部进行更改。这对于使用主机能力和编写上下文感知策略是必需的。

目前,只有Admission Controller Go 和 JavaScript/TypeScript SDK 将其暴露给 WASI 策略。

如果您对此感兴趣,请与我们联系。然后我们可以优先考虑这项工作。

使用案例

编写"普通WASI"策略的唯一原因是当您无法使用waPC通信机制时。

目前(截至2023年6月),这样做的唯一好理由是使用官方的Go编译器生成WebAssembly模块。

从1.21版本开始,官方的Go编译器能够生成针对WASI接口的WebAssembly模块。 然而,这些模块尚不能向WebAssembly运行时导出函数。 这个限制,由https://github.com/golang/go/issues/42372[这个专门的问题]跟踪,阻碍了waPC协议的采用。

Admission Controller项目团队建议您使用TinyGo编译器编写Admission Controller Go策略,如这里所述。

然而,某些复杂的Go代码库无法使用TinyGo编译器进行编译。 这包括例如像https://github.com/google/cel-go[CEL-go]或https://github.com/kyverno/kyverno/[Kyverno]这样的代码库。 在这种情况下,使用官方的Go编译器可以提供帮助。

通信协议

本节描述如何编写一个普通的WASI策略。

您需要将代码编写为常规CLI程序。 该程序必须接受以下子命令:

  • validate:此命令由策略引擎调用以评估入场请求。

  • validate-settings:此命令由策略引擎调用以验证策略设置。

在这两种情况下,要验证的数据通过STDIN提供。 策略必须通过STDOUT提供答案。 您可以使用STDERR进行调试或错误消息。

Validation

请求的验证发生在使用`validate`子命令调用策略CLI程序时。

STDIN必须包含描述`ValidationRequest`对象的JSON文档。 策略必须向STDOUT写入包含`ValidationResponse`对象的JSON文档。

`ValidationRequest`和`ValidationResponse`对象的描述见这里

变异

变异策略的工作方式与验证策略相同。 策略CLI程序使用`validate`子命令调用。

STDIN必须包含描述`ValidationRequest`对象的JSON文档。 该策略必须向STDOUT写入一个包含`ValidationResponse`对象的JSON文档。

`ValidationRequest`和`ValidationResponse`对象的描述见这里

当需要变异时,ValidationResponse`对象必须有一个键`mutated_object,包含要创建的对象。 该过程的描述见这里

上下文感知

目前仅通过Go SDK支持。Go SDK像往常一样公开上下文感知能力,更多信息请见这里

作为WASI Go上下文感知策略的示例,请参见https://github.com/kubewarden/go-wasi-context-aware-test-policy[go-wasi-context-aware-test-policy]。

设置验证

该策略必须提供一个名为`validate-settings`的子命令。 该命令用于验证用户提供的设置。

程序必须在STDIN接收一个包含用户提供的设置的JSON对象。 然后它验证这些设置并向STDOUT写入一个`SettingsValidationResponse`对象。

`SettingsValidationResponse`的格式和设置验证过程的描述见这里

策略元数据

每个Admission Controller策略必须通过`kwctl annotate`命令进行注释。 普通WASI策略的策略元数据必须具有此值:

executionMode: wasi

模板项目

这个 GitHub 储存库 包含一个基于 Go 的使用 WASI 协议的策略模板。