|
この文書は自動機械翻訳技術を使用して翻訳されています。 正確な翻訳を提供するように努めておりますが、翻訳された内容の完全性、正確性、信頼性については一切保証いたしません。 相違がある場合は、元の英語版 英語 が優先され、正式なテキストとなります。 |
|
これは未公開の文書です Admission Controller 1.34-dev. |
生のポリシー
v1.9.0`以降、SUSE Security Admission ControllerはKubernetesクラスターの外部で、一般的なポリシー評価エンジンとしてポリシーを記述および実行する機能をサポートします。
ポリシーサーバーは、任意のJSONドキュメントをAdmission Controllerポリシーに対して検証するために使用できる/validate_raw`エンドポイントを公開します。
このガイドでは、次の生ポリシーを使用します:
|
ポリシーの著者がメタデータでポリシーを`policyType: raw`としてマークしていることを確認してください。 `kwctl`を使用してメタデータを確認できます。
|
Kubernetesの外部でポリシーサーバーを実行する
ポリシーサーバーは、Kubernetesの外部でスタンドアロンコンテナとして実行できます。
次の内容が含まれる`policies.yml`ファイルを作成します:
raw-validation:
module: ghcr.io/kubewarden/tests/raw-validation-policy:v0.1.0
settings:
validUsers:
- alice
- bob
validActions:
- read
- write
validResources:
- orders
- products
raw-mutation:
module: ghcr.io/kubewarden/tests/raw-mutation-policy:v0.1.0
allowedToMutate: true
settings:
forbiddenResources:
- privateResource
- secretResource
defaultResource: publicResource
ポリシーサーバーを起動するには:
# Create a docker volume to store the policies
docker volume create --driver local \
--opt type=tmpfs \
--opt device=tmpfs \
--opt o=ui=65533 \
policy-store
# Start the policy server
docker run --rm -it \
-p 3000:3000 \
-v $(pwd)/policies.yml:/policies.yml \
-v policy-store:/registry \
ghcr.io/kubewarden/policy-server:1.9.0 \
--ignore-kubernetes-connection-failure=true
| Kubernetesなしでポリシーサーバーを起動するには、フラグ`--ignore-kubernetes-connection-failure=true`が必要です。 ただし、Kubernetes内でポリシーサーバーを起動し、生の検証エンドポイントを使用することも可能です。 生ポリシーは、標準ポリシーと同様に、コンテキストに応じた機能にアクセスできます。 |
Admission ControllerコントローラーなしでKubernetes内でポリシーサーバーを実行する
Admission Controllerコントローラーによって管理されているポリシーサーバーインスタンスを使用して生ポリシーをホストすることはできません。 コントローラーは、ユーザーが生ポリシーを追加するためにPolicy Server ConfigMapを変更することを許可しません。なぜなら、変更を元に戻すように調整を試みるからです。 そのため、専用のPolicy Serverを起動する必要があります。
次の内容が含まれる`policy-server.yaml`ファイルを作成します:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: policy-server-deployment
spec:
replicas: 1
selector:
matchLabels:
app: policy-server
template:
metadata:
labels:
app: policy-server
spec:
containers:
- name: policy-server
image: ghcr.io/kubewarden/policy-server:v1.9.0
ports:
- containerPort: 3000
volumeMounts:
- name: policy-store
mountPath: /registry
- name: policies-config
mountPath: /policies.yml
subPath: policies.yml
volumes:
- name: policy-store
emptyDir: {}
- name: policies-config
configMap:
name: policies-configmap
---
apiVersion: v1
kind: Service
metadata:
name: policy-server-service
spec:
selector:
app: policy-server
ports:
- protocol: TCP
port: 3000
targetPort: 3000
---
apiVersion: v1
kind: ConfigMap
metadata:
name: policies-configmap
data:
policies.yml: |
raw-validation:
module: ghcr.io/kubewarden/tests/raw-validation-policy:v0.1.0
settings:
validUsers:
- alice
- bob
validActions:
- read
- write
validResources:
- orders
- products
raw-mutation:
module: ghcr.io/kubewarden/tests/raw-mutation-policy:v0.1.0
allowedToMutate: true
settings:
forbiddenResources:
- privateResource
- secretResource
defaultResource: publicResource
設定を適用します。
kubectl apply -f policy-server.yaml
|
デプロイされたPolicy Serverインスタンスは、コンテキストに応じたポリシーで使用されるKubernetesリソースにアクセスできます。 Kubernetesリソースへのアクセスレベルは、Policy Serverワークロードを実行するために使用されるService Accountによって決まります。 前の例では、デプロイメント仕様内にService Accountが定義されていないため、 |
validate_rawエンドポイントを使用する
検証
生の検証エンドポイントは`/validate_raw`で公開され、`POST`リクエストを受け入れます。 サービスをデプロイしたので、`kubectl port-forward service/policy-server-service 3000:3000 -n default`を使ってポートフォワードを設定できます。
`raw-validation`ポリシーに従ってJSONドキュメントを検証してみましょう:
curl -X POST \
http://localhost:3000/validate_raw/raw-validation \
-H 'Content-Type: application/json' \
-d '{
"request": {
"user": "alice",
"action": "read",
"resource": "customers"
}
}'
リクエストは受け入れられません。なぜなら、`alice`に`customers`リソースへのアクセスが付与されていないからです:
{
"response": {
"uid": "",
"allowed": false,
"auditAnnotations": null,
"warnings": null
}
}
有効なリソースで再試行してみましょう:
curl -X POST \
http://localhost:3000/validate_raw/raw-validation \
-H 'Content-Type: application/json' \
-d '{
"request": {
"user": "alice",
"action": "read",
"resource": "orders"
}
}'
今回は、リクエストが受け入れられます:
{
"response": {
"uid": "",
"allowed": true,
"auditAnnotations": null,
"warnings": null
}
}
|
リクエストペイロードに`uid`フィールドが提供されている場合、それはレスポンスの一部として返されます。 |
ミューテーション
では、`raw-mutation`ポリシーに従ってJSONドキュメントを変更してみましょう:
curl -X POST \
http://localhost:3000/validate_raw/raw-mutation \
-H 'Content-Type: application/json' \
-d '{
"request": {
"user": "alice",
"action": "read",
"resource": "privateResource"
}
}'
リクエストは変更され、レスポンスにはJSONPatchが含まれます:
{
"response": {
"uid": "",
"allowed": true,
"patchType": "JSONPatch",
"patch": "W3sib3AiOiJyZXBsYWNlIiwicGF0aCI6Ii9yZXNvdXJjZSIsInZhbHVlIjoicHVibGljUmVzb3VyY2UifV0=",
"auditAnnotations": null,
"warnings": null
}
}