Este documento foi traduzido usando tecnologia de tradução automática de máquina. Sempre trabalhamos para apresentar traduções precisas, mas não oferecemos nenhuma garantia em relação à integridade, precisão ou confiabilidade do conteúdo traduzido. Em caso de qualquer discrepância, a versão original em inglês prevalecerá e constituirá o texto official.

Esta é uma documentação não divulgada para Admission Controller 1.34-dev.

WASI

A Interface de Sistema WebAssembly (WASI) é um padrão WebAssembly que fornece um conjunto de interfaces permitindo a execução de WebAssembly fora do navegador.

Autores que escrevem políticas regulares nunca devem usar interfaces de sistema WASI simples para escrever políticas.

Esta página é para SUSE Security Admission Controller mantenedores ou autores de políticas de baixo nível que desejam experimentar plataformas WASM de ponta.

Usando WASI, você pode ter um módulo WebAssembly que interage com primitivos do sistema como STDOUT, STDERR, STDIN, variáveis de ambiente e mais.

Muitos dos compiladores usados para compilar políticas do Admission Controller produzem módulos WebAssembly que visam interfaces WASI. No entanto, Admission Controller políticas usam o projeto waPC para implementar comunicação bidirecional entre a política e o tempo de execução da política (kwctl ou policy-server). Admission Controller O uso do protocolo de comunicação é descrito aqui.

Existem casos especiais quando o projeto waPC não pode ser usado ainda. Nessas circunstâncias, você pode escrever uma política usando as interfaces fornecidas pelo WASI.

Admission Controller suporta políticas WASI a partir do lançamento Admission Controller 1.7.0 em diante.

Limitações

Você não deve usar políticas WASI em circunstâncias regulares porque elas têm desempenho inferior no tempo de avaliação em comparação com as de waPC/Rego.

A comunicação bidirecional entre a política e o host pode ser alcançada, mas requer mudanças a serem feitas dentro do SDK da linguagem. Isso é necessário para usar capacidades do host e para escrever políticas conscientes do contexto.

Atualmente, apenas os SDKs Admission Controller Go e JavaScript/TypeScript os expõem para políticas WASI.

Se isso for do seu interesse, entre em contato. Podemos então priorizar o esforço.

Casos de uso

A única razão para escrever uma política WASI simples é quando você não pode usar o mecanismo de comunicação waPC.

Atualmente, (em junho de 2023), a única boa razão para fazer isso é ao usar o compilador Go oficial para produzir um módulo WebAssembly.

A partir da versão 1.21, o compilador oficial Go é capaz de produzir módulos WebAssembly direcionados à interface WASI. No entanto, esses módulos ainda não podem exportar funções para o tempo de execução WebAssembly. Essa limitação, rastreada por este problema dedicado, impede a adoção do protocolo waPC.

A equipe do projeto Admission Controller recomenda que você escreva Admission Controller políticas Go usando o compilador TinyGo, conforme descrito aqui.

No entanto, determinadas bases de código Go complexas não podem ser compiladas usando o compilador TinyGo. Isso inclui, por exemplo, bases de código como CEL-go ou Kyverno. Nessas circunstâncias, o uso do compilador Go oficial pode ajudar.

Protocolo de comunicação

Esta seção descreve procedimentos para escrever uma política WASI simples.

Você precisa escrever o código como um programa CLI comum. O programa deve aceitar os seguintes comandos secundários:

  • validate: este comando é invocado pelo mecanismo de política para avaliar uma solicitação de admissão

  • validate-settings: este comando é invocado pelo mecanismo de política para validar as configurações da política

Em ambos os casos, os dados a serem validados são fornecidos via STDIN. A política deve fornecer a resposta via STDOUT. Você pode usar STDERR para mensagens de depuração ou erro.

Validação

A validação de uma solicitação ocorre ao invocar o programa CLI da política usando o subcomando validate.

STDIN deve conter um documento JSON descrevendo um objeto ValidationRequest. A política deve escrever no STDOUT um documento JSON contendo um objeto ValidationResponse.

Tanto os objetos ValidationRequest quanto ValidationResponse são descritos aqui.

Mutação

As políticas de mutação funcionam da mesma forma que as de validação. O programa CLI da política é invocado usando o subcomando validate.

STDIN deve conter um documento JSON descrevendo um objeto ValidationRequest. A política deve escrever no STDOUT um documento JSON contendo um objeto ValidationResponse.

Tanto os objetos ValidationRequest quanto ValidationResponse são descritos aqui.

Quando uma mutação é necessária, o objeto ValidationResponse deve ter uma chave, mutated_object, contendo o objeto a ser criado. Este processo é descrito aqui.

Context-aware

Apenas suportado via SDK Go por enquanto. O SDK Go expõe as capacidades conscientes do contexto como de costume, para mais informações veja aqui.

Como exemplo de uma política consciente do contexto WASI Go, veja a go-wasi-context-aware-test-policy.

Validação de configurações

A política deve fornecer um subcomando chamado validate-settings. Este comando é usado para validar as configurações fornecidas pelo usuário.

O programa deve receber no STDIN um objeto JSON que contém as configurações fornecidas pelo usuário. Em seguida, valida-as e escreve um objeto SettingsValidationResponse no STDOUT.

O formato do SettingsValidationResponse e o processo de validação de configurações são descritos aqui.

Metadados da política

Cada política Admission Controller deve ser anotada via o comando kwctl annotate. Os metadados da política de uma política WASI simples devem ter este valor:

executionMode: wasi

Projeto modelo

Este repositório do GitHub contém um modelo de uma política baseada em Go usando o protocolo WASI.