55 lines
2.1 KiB
YAML
55 lines
2.1 KiB
YAML
apiVersion: kyverno.io/v1
|
|
kind: ClusterPolicy
|
|
metadata:
|
|
name: check-image-vulnerabilities
|
|
annotations:
|
|
policies.kyverno.io/title: "Проверка уязвимостей образов через внешний API"
|
|
policies.kyverno.io/category: Security
|
|
policies.kyverno.io/severity: critical
|
|
policies.kyverno.io/subject: Pod
|
|
policies.kyverno.io/description: >-
|
|
Проверяет образ контейнера через внешний vulnerability scanning API
|
|
перед деплоем в production. Блокирует деплой если найдены
|
|
критические уязвимости.
|
|
НАСТРОЙТЕ URL вашего сканера (Trivy, Snyk, Grype и т.д.)
|
|
Требует: admissionController.extraArgs: [--enableExternalDataCall=true]
|
|
spec:
|
|
validationFailureAction: Enforce
|
|
background: false # только для живых запросов, не background scan
|
|
rules:
|
|
- name: check-critical-vulnerabilities
|
|
match:
|
|
resources:
|
|
kinds:
|
|
- Pod
|
|
namespaces:
|
|
- production
|
|
preconditions:
|
|
any:
|
|
- key: "{{ request.operation }}"
|
|
operator: In
|
|
value: [CREATE, UPDATE]
|
|
context:
|
|
- name: scanResult
|
|
apiCall:
|
|
# Замените на URL вашего vulnerability API
|
|
urlPath: "https://vuln-api.company.com/v1/scan"
|
|
method: POST
|
|
data:
|
|
- key: image
|
|
value: "{{ request.object.spec.containers[0].image }}"
|
|
- key: severity
|
|
value: CRITICAL
|
|
jmesPath: "critical_count || `0`"
|
|
validate:
|
|
message: >-
|
|
Образ '{{ request.object.spec.containers[0].image }}'
|
|
содержит {{ scanResult }} критических уязвимостей.
|
|
Деплой в production запрещён.
|
|
Обновите базовый образ и пересоберите: https://vuln-api.company.com/report
|
|
deny:
|
|
conditions:
|
|
- key: "{{ scanResult }}"
|
|
operator: GreaterThan
|
|
value: "0"
|