|
この文書は自動機械翻訳技術を使用して翻訳されています。 正確な翻訳を提供するように努めておりますが、翻訳された内容の完全性、正確性、信頼性については一切保証いたしません。 相違がある場合は、元の英語版 英語 が優先され、正式なテキストとなります。 |
|
これは未公開の文書です 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通信メカニズムを使用できない場合です。
現在(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ベースのポリシーのテンプレートが含まれています。