この文書は自動機械翻訳技術を使用して翻訳されています。 正確な翻訳を提供するように努めておりますが、翻訳された内容の完全性、正確性、信頼性については一切保証いたしません。 相違がある場合は、元の英語版 英語 が優先され、正式なテキストとなります。

これは未公開の文書です Admission Controller 1.34-dev.

WASI

WebAssemblyシステムインターフェース(WASI)は、ブラウザの外でWebAssemblyを実行するためのインターフェースのセットを提供するWebAssembly標準です。

通常のポリシーを作成する著者は、ポリシーを書くためにプレーンなWASIシステムインターフェースを使用してはいけません。

このページは、最先端のWASMプラットフォームを試したいSUSE Security Admission Controllerメンテナや低レベルのポリシー著者のためのものです。

WASIを使用すると、STDOUT、STDERR、STDIN、環境変数などのシステムプリミティブと対話するWebAssemblyモジュールを持つことができます。

Admission Controllerポリシーをコンパイルするために使用される多くのコンパイラは、WASIインターフェースをターゲットにしたWebAssemblyモジュールを生成します。 しかし、Admission Controllerポリシーは、ポリシーとポリシーランタイム(kwctl`または`policy-server)間の双方向通信を実装するためにhttps://github.com/wapc[waPC]プロジェクトを使用します。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を使用できます。

検証

リクエストの検証は、`validate`サブコマンドを使用してポリシーCLIプログラムを呼び出すときに行われます。

STDINには、`ValidationRequest`オブジェクトを記述したJSONドキュメントが含まれている必要があります。 ポリシーは、STDOUTに`ValidationResponse`オブジェクトを含むJSONドキュメントを書き込む必要があります。

`ValidationRequest`オブジェクトと`ValidationResponse`オブジェクトの両方は、ここで説明されています。

ミューテーション

ミューテーションポリシーは、バリデーションポリシーと同様に機能します。 ポリシーCLIプログラムは、`validate`サブコマンドを使用して呼び出されます。

STDINには、`ValidationRequest`オブジェクトを記述したJSONドキュメントが含まれている必要があります。 ポリシーは、STDOUTに`ValidationResponse`オブジェクトを含むJSONドキュメントを書き込む必要があります。

`ValidationRequest`オブジェクトと`ValidationResponse`オブジェクトの両方は、ここで説明されています。

ミューテーションが必要な場合、`ValidationResponse`オブジェクトには、作成されるオブジェクトを含むキー`mutated_object`が必要です。 このプロセスはここで説明されています。

Context-aware

現時点では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リポジトリには、WASIプロトコルを利用したGoベースのポリシーのテンプレートが含まれています。