Сканирование и проверка уязвимостей
В ACP (Alauda Container Platform) вы можете использовать Tekton Pipeline для сборки и сканирования образа на наличие уязвимостей.
Конкретно, используется задача trivy для генерации результатов сканирования уязвимостей, затем cosign для загрузки аттестации результатов сканирования уязвимостей, и, наконец, kyverno для проверки аттестации результатов сканирования уязвимостей.
Обзор функции
Этот метод использует инструменты, подобные trivy, для сканирования образа на уязвимости, а затем Kyverno для проверки результатов сканирования уязвимостей:
- Используйте задачу
trivy Tekton для сканирования образа на уязвимости.
- Используйте задачу
cosign Tekton для загрузки результатов сканирования уязвимостей в образ.
- Настройте правила Kyverno для проверки результатов сканирования уязвимостей.
- Используйте образ для создания Pod, чтобы проверить результаты сканирования уязвимостей.
Сценарии использования
Следующие сценарии требуют обращения к руководству в этом документе:
- Реализация сканирования и проверки уязвимостей в Kubernetes кластерах с использованием Kyverno
- Принудительное применение политик безопасности, разрешающих развертывание только образов с приемлемым уровнем уязвимостей
- Настройка автоматического сканирования и проверки уязвимостей в CI/CD пайплайнах
- Обеспечение безопасности образов и соответствия требованиям по уязвимостям в продуктивных средах
- Реализация контроля безопасности цепочки поставок для контейнерных образов путем проверки их статуса уязвимостей
Предварительные требования
- Kubernetes кластер с установленными Tekton Pipelines, Tekton Chains и Kyverno
- Реестр с разрешением на загрузку образов
- Установленный и настроенный CLI
kubectl для доступа к вашему кластеру
- Установленный CLI инструмент
cosign
- Установленный CLI инструмент
jq
Обзор процесса
Пошаговые инструкции
Шаги 1-3: Базовая настройка
Эти шаги идентичны руководству Quick Start: Signed Provenance. Пожалуйста, следуйте инструкциям в этом руководстве для:
Шаг 4: Создание примерного пайплайна
Это ресурс Pipeline, который используется для сборки образа и генерации аттестации уязвимостей cosign.
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
name: chains-demo-4
spec:
params:
- default: |-
echo "Generate a Containerfile for building an image."
cat << 'EOF' > Containerfile
FROM ubuntu:latest
ENV TIME=1
EOF
echo -e "\nContainerfile contents:"
echo "-------------------"
cat Containerfile
echo "-------------------"
echo -e "\nContainerfile generated successfully!"
description: A script to generate a Containerfile for building an image.
name: generate-containerfile
type: string
- default: <registry>/test/chains/demo-4:latest
description: The target image address built
name: image
type: string
results:
- description: first image artifact output
name: first_image_ARTIFACT_OUTPUTS
type: object
value:
digest: $(tasks.build-image.results.IMAGE_DIGEST)
uri: $(tasks.build-image.results.IMAGE_URL)
tasks:
- name: generate-containerfile
params:
- name: script
value: $(params.generate-containerfile)
taskRef:
params:
- name: kind
value: task
- name: catalog
value: catalog
- name: name
value: run-script
- name: version
value: "0.1"
resolver: hub
timeout: 30m0s
workspaces:
- name: source
workspace: source
- name: build-image
params:
- name: IMAGES
value:
- $(params.image)
- name: TLS_VERIFY
value: "false"
runAfter:
- generate-containerfile
taskRef:
params:
- name: kind
value: task
- name: catalog
value: catalog
- name: name
value: buildah
- name: version
value: "0.9"
resolver: hub
timeout: 30m0s
workspaces:
- name: source
workspace: source
- name: registryconfig
workspace: registryconfig
- name: trivy-scanner
params:
- name: COMMAND
value: |-
set -x
mkdir -p .git
# support for insecure registry
export TRIVY_INSECURE=true
echo "generate cyclonedx sbom"
trivy image --skip-db-update --skip-java-db-update --scanners vuln --format cyclonedx --output .git/sbom-cyclonedx.json $(tasks.build-image.results.IMAGE_URL)@$(tasks.build-image.results.IMAGE_DIGEST)
cat .git/sbom-cyclonedx.json
echo "trivy scan vulnerabilities based on cyclonedx sbom"
trivy sbom --skip-db-update --skip-java-db-update --format cosign-vuln --output .git/trivy-scan-result.json .git/sbom-cyclonedx.json
cat .git/trivy-scan-result.json
echo "trivy scan vulnerabilities based on cyclonedx sbom and output in table format"
trivy sbom --skip-db-update --skip-java-db-update --format table .git/sbom-cyclonedx.json
runAfter:
- build-image
taskRef:
params:
- name: kind
value: task
- name: catalog
value: catalog
- name: name
value: trivy-scanner
- name: version
value: "0.4"
resolver: hub
timeout: 30m0s
workspaces:
- name: source
workspace: source
- name: registryconfig
workspace: registryconfig
- name: cosign-uploads
params:
- name: COMMAND
value: |-
set -x
export COSIGN_ALLOW_INSECURE_REGISTRY=true
export COSIGN_TLOG_UPLOAD=false
export COSIGN_KEY=$(workspaces.signkey.path)/cosign.key
echo "Signing image vuln"
cosign attest --type vuln --predicate .git/trivy-scan-result.json $(tasks.build-image.results.IMAGE_URL)@$(tasks.build-image.results.IMAGE_DIGEST)
echo "Signing image sbom"
cosign attest --type cyclonedx --predicate .git/sbom-cyclonedx.json $(tasks.build-image.results.IMAGE_URL)@$(tasks.build-image.results.IMAGE_DIGEST)
runAfter:
- trivy-scanner
taskRef:
params:
- name: kind
value: task
- name: catalog
value: catalog
- name: name
value: cosign
- name: version
value: "0.1"
resolver: hub
timeout: 30m0s
workspaces:
- name: source
workspace: source
- name: registryconfig
workspace: registryconfig
- name: signkey
workspace: signkey
workspaces:
- name: source
description: The workspace for source code.
- name: registryconfig
description: The workspace for distribution registry configuration.
- name: signkey
description: The workspace for private keys and passwords used for image signatures.
TIP
В этом руководстве демонстрируется упрощенный рабочий процесс, при котором Containerfile и вывод задачи git-clone генерируются непосредственно в пайплайне.
В продуктивных средах обычно:
- Используют задачу
git-clone для получения исходного кода из репозитория
- Строят образ с использованием Containerfile, который находится в исходном коде
- Такой подход обеспечивает правильное управление версиями и разделение кода и конфигурации пайплайна
Объяснение полей YAML
- Аналогично Шагу 4: Создание примерного пайплайна, но добавлено следующее:
workspaces:
signkey: Рабочее пространство для приватных ключей и паролей, используемых для подписания образов.
tasks:
trivy-scanner: Задача для сканирования образа на уязвимости.
cosign-uploads: Задача для загрузки аттестации результатов сканирования уязвимостей.
:::
Сохраните в yaml-файл с именем chains-demo-4.yaml и примените командой:
$ export NAMESPACE=<default>
# создайте пайплайн в namespace
$ kubectl create -n $NAMESPACE -f chains-demo-4.yaml
pipeline.tekton.dev/chains-demo-4 created
Шаг 5: Запуск примерного пайплайна
Это ресурс PipelineRun, который используется для запуска пайплайна.
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
generateName: chains-demo-4-
spec:
pipelineRef:
name: chains-demo-4
taskRunTemplate:
serviceAccountName: <default>
workspaces:
- name: registryconfig
secret:
secretName: <registry-credentials>
- name: signkey
secret:
secretName: <signing-secrets>
- name: source
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: <nfs>
:::details {title="Объяснение полей YAML"}
- Аналогично Шагу 5: Запуск примерного пайплайна. Ниже описаны только отличия.
workspaces
signkey: имя секрета с ключом подписи.
secret.secretName: Секрет подписи, подготовленный на предыдущем шаге Получение секрета подписи. Но необходимо создать новый секрет в том же namespace, где выполняется PipelineRun.
:::
Сохраните в yaml-файл с именем chains-demo-4.pipelinerun.yaml и примените командой:
$ export NAMESPACE=<default>
# создайте запуск пайплайна в namespace
$ kubectl create -n $NAMESPACE -f chains-demo-4.pipelinerun.yaml
Дождитесь завершения PipelineRun.
$ kubectl get pipelinerun -n $NAMESPACE -w
chains-demo-4-<xxxxx> True Succeeded 2m 2m
Шаг 6: Ожидание подписи PipelineRun
Дождитесь, пока у PipelineRun появится аннотация chains.tekton.dev/signed: "true".
$ export NAMESPACE=<default>
$ export PIPELINERUN_NAME=<chains-demo-4-xxxxx>
$ kubectl get pipelinerun -n $NAMESPACE $PIPELINERUN_NAME -o yaml | grep "chains.tekton.dev/signed"
chains.tekton.dev/signed: "true"
Когда у PipelineRun появится аннотация chains.tekton.dev/signed: "true", это означает, что образ подписан.
Шаг 7: Получение образа из PipelineRun
# Получить URI образа
$ export IMAGE_URI=$(kubectl get pipelinerun -n $NAMESPACE $PIPELINERUN_NAME -o jsonpath='{.status.results[?(@.name=="first_image_ARTIFACT_OUTPUTS")].value.uri}')
# Получить дайджест образа
$ export IMAGE_DIGEST=$(kubectl get pipelinerun -n $NAMESPACE $PIPELINERUN_NAME -o jsonpath='{.status.results[?(@.name=="first_image_ARTIFACT_OUTPUTS")].value.digest}')
# Объединить URI и дайджест для полного указания образа
$ export IMAGE=$IMAGE_URI@$IMAGE_DIGEST
# Вывести ссылку на образ
$ echo $IMAGE
<registry>/test/chains/demo-4:latest@sha256:93635f39cb31de5c6988cdf1f10435c41b3fb85570c930d51d41bbadc1a90046
Этот образ будет использоваться для проверки результатов сканирования уязвимостей.
Шаг 8: (Опционально) Получение аттестации уязвимостей cosign
Если вам интересно содержимое аттестации уязвимостей cosign, вы можете продолжить чтение.
Более подробную информацию об аттестации уязвимостей cosign смотрите в cosign vuln attestation
Получите публичный ключ подписи согласно разделу Получение публичного ключа подписи.
# Отключить загрузку tlog и включить приватную инфраструктуру
$ export COSIGN_TLOG_UPLOAD=false
$ export COSIGN_PRIVATE_INFRASTRUCTURE=true
$ export IMAGE=<<registry>/test/chains/demo-4:latest@sha256:5e7b466e266633464741b61b9746acd7d02c682d2e976b1674f924aa0dfa2047>
$ cosign verify-attestation --key cosign.pub --type vuln $IMAGE | jq -r '.payload | @base64d' | jq -s
Вывод будет похож на следующий, содержащий результаты сканирования уязвимостей.
:::details {title="Аттестация уязвимостей cosign"}
{
"_type": "https://in-toto.io/Statement/v0.1",
"predicateType": "https://cosign.sigstore.dev/attestation/vuln/v1",
"predicate": {
"scanner": {
"uri": "pkg:github/aquasecurity/trivy@dev",
"version": "dev",
"result": {
"CreatedAt": "2025-06-07T07:05:30.098889688Z",
"Metadata": {
"OS": {
"Family": "ubuntu",
"Name": "24.04"
}
},
"Results": [
{
"Class": "os-pkgs",
"Packages": [
{
"Arch": "amd64",
"ID": "coreutils@9.4-3ubuntu6",
"Identifier": {
"BOMRef": "pkg:deb/ubuntu/coreutils@9.4-3ubuntu6?arch=amd64&distro=ubuntu-24.04",
"PURL": "pkg:deb/ubuntu/coreutils@9.4-3ubuntu6?arch=amd64&distro=ubuntu-24.04",
"UID": "82bb3c93286700bc"
},
"Licenses": [
"GPL-3.0-or-later",
"BSD-4-Clause-UC",
"GPL-3.0-only",
"ISC",
"FSFULLR",
"GFDL-1.3-no-invariants-only",
"GFDL-1.3-only"
],
"Name": "coreutils"
}
],
"Vulnerabilities": [
{
"CVSS": {
"nvd": {
"V2Score": 2.1,
"V2Vector": "AV:L/AC:L/Au:N/C:N/I:P/A:N",
"V3Score": 6.5,
"V3Vector": "CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:C/C:N/I:H/A:N"
},
"redhat": {
"V2Score": 6.2,
"V2Vector": "AV:L/AC:H/Au:N/C:C/I:C/A:C",
"V3Score": 8.6,
"V3Vector": "CVSS:3.0/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H"
}
},
"InstalledVersion": "9.4-3ubuntu6",
"LastModifiedDate": "2025-04-20T01:37:25.86Z",
"PkgID": "coreutils@9.4-3ubuntu6",
"PkgName": "coreutils",
"PublishedDate": "2017-02-07T15:59:00.333Z",
"References": [
"http://seclists.org/oss-sec/2016/q1/452",
"http://www.openwall.com/lists/oss-security/2016/02/28/2",
"http://www.openwall.com/lists/oss-security/2016/02/28/3",
"https://access.redhat.com/security/cve/CVE-2016-2781",
"https://lists.apache.org/thread.html/rf9fa47ab66495c78bb4120b0754dd9531ca2ff0430f6685ac9b07772%40%3Cdev.mina.apache.org%3E",
"https://lore.kernel.org/patchwork/patch/793178/",
"https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes",
"https://nvd.nist.gov/vuln/detail/CVE-2016-2781",
"https://www.cve.org/CVERecord?id=CVE-2016-2781"
],
"Severity": "LOW",
"SeveritySource": "ubuntu",
"Status": "affected",
"VendorSeverity": {
"azure": 2,
"cbl-mariner": 2,
"nvd": 2,
"redhat": 2,
"ubuntu": 1
},
"VulnerabilityID": "CVE-2016-2781"
}
]
}
],
"SchemaVersion": 2
}
},
"metadata": {
"scanStartedOn": "2025-06-07T07:05:30.104726629Z",
"scanFinishedOn": "2025-06-07T07:05:30.104726629Z"
}
}
}
:::details {title="Описание полей"}
predicateType: Тип предиката.
predicate.scanner:
uri: URI сканера.
version: Версия сканера.
result: Результат сканирования уязвимостей.
CreatedAt: Время завершения сканирования уязвимостей.
Metadata:
OS:
Family: Семейство ОС.
Name: Название ОС.
Results: Результаты сканирования уязвимостей.
Class:
os-pkgs: Пакеты ОС.
lang-pkgs: Пакеты языка.
Packages: Пакеты образа.
Vulnerabilities: Уязвимости образа.
Severity: Уровень серьезности уязвимости.
PkgID: Идентификатор пакета уязвимости.
PkgName: Название пакета уязвимости.
CVSS: CVSS уязвимости.
nvd: NVD уязвимости.
redhat: Red Hat уязвимости.
:::
Шаг 9: Проверка результатов сканирования уязвимостей с помощью Kyverno
Шаг 9.1: Создание политики Kyverno для отклонения образов с уязвимостями высокого риска
TIP
Для этого шага требуются права администратора кластера.
Более подробную информацию о Kyverno ClusterPolicy смотрите в Kyverno ClusterPolicy
Политика выглядит следующим образом:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: reject-high-risk-image
spec:
webhookConfiguration:
failurePolicy: Fail
timeoutSeconds: 30
background: false
rules:
- name: check-image
match:
any:
- resources:
kinds:
- Pod
namespaces:
- policy
verifyImages:
- imageReferences:
- "*"
# - "<registry>/test/*"
skipImageReferences:
- "ghcr.io/trusted/*"
failureAction: Enforce
verifyDigest: false
required: false
useCache: false
imageRegistryCredentials:
allowInsecureRegistry: true
secrets:
# Учетные данные должны существовать в namespace, где развернут kyverno
- registry-credentials
attestations:
- type: https://cosign.sigstore.dev/attestation/vuln/v1
attestors:
- entries:
- attestor:
keys:
publicKeys: |- # <- Публичный ключ подписывающего
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFZNGfYwn7+b4uSdEYLKjxWi3xtP3
UkR8hQvGrG25r0Ikoq0hI3/tr0m7ecvfM75TKh5jGAlLKSZUJpmCGaTToQ==
-----END PUBLIC KEY-----
ctlog:
ignoreSCT: true
rekor:
ignoreTlog: true
conditions:
- all:
- key: "{{ scanner.result.Results[].Vulnerabilities[].Severity }}"
operator: AllNotIn
# поддерживаемые значения: UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL
value: ["HIGH", "CRITICAL"]
message: |
Образ содержит уязвимости высокого риска, пожалуйста, исправьте их перед продолжением.
Уровни серьезности: {{ scanner.result.Results[].Vulnerabilities[].Severity }}
- key: "{{ scanner.result.Results[].Vulnerabilities[?CVSS.redhat.V3Score > `1.0`][] | length(@) }}"
operator: Equals
value: 0
message: |
Образ содержит уязвимости высокого риска, пожалуйста, исправьте их перед продолжением.
Уязвимости высокого риска (CVSS > 1.0): {{ scanner.result.Results[].Vulnerabilities[?CVSS.redhat.V3Score > `1.0`].CVSS.redhat.V3Score[] }}.
Уровни серьезности: {{ scanner.result.Results[].Vulnerabilities[?CVSS.redhat.V3Score > `1.0`].Severity[] }}.
PkgIDs: {{ scanner.result.Results[].Vulnerabilities[?CVSS.redhat.V3Score > `1.0`].PkgID[] }}.
:::details {title="Объяснение полей YAML"}
- Политика в целом совпадает с политикой из Проверка подписи образа
spec.rules[0].verifyImages[].attestations[0].conditions
type: Тип аттестации уязвимостей cosign — https://cosign.sigstore.dev/attestation/vuln/v1
attestors: как указано выше.
conditions: Условия для проверки.
all: Все условия должны быть выполнены.
key: "{{ scanner.result.Results[].Vulnerabilities[].Severity }}": Уровень серьезности уязвимостей не должен быть HIGH или CRITICAL.
key: "{{ scanner.result.Results[].Vulnerabilities[?CVSS.redhat.V3Score > 1.0][] | length(@) }}": Количество уязвимостей с CVSS баллом выше 1.0 должно быть 0.
:::
Сохраните политику в yaml-файл с именем kyverno.reject-high-risk-image.yaml и примените командой:
$ kubectl apply -f kyverno.reject-high-risk-image.yaml
clusterpolicy.kyverno.io/reject-high-risk-image configured
Шаг 9.2: Проверка политики
В namespace policy, где определена политика, создайте Pod для проверки политики.
Используйте собранный образ для создания Pod.
$ export NAMESPACE=<policy>
$ export IMAGE=<<registry>/test/chains/demo-4:latest@sha256:0f123204c44969876ed12f40066ccccbfd68361f68c91eb313ac764d59428bef>
$ kubectl run -n $NAMESPACE vuln-image --image=${IMAGE} -- sleep 3600
Если ваш образ содержит уязвимости высокого риска, Pod будет заблокирован политикой.
Вы получите вывод примерно такого вида:
Error from server: admission webhook "mutate.kyverno.svc-fail" denied the request:
resource Pod/policy/high-risk was blocked due to the following policies
reject-high-risk-image:
check-image: |
image attestations verification failed, verifiedCount: 0, requiredCount: 1, error: .attestations[0].attestors[0].entries[0].keys: attestation checks failed for <registry>/test/chains/demo-4:latest and predicate https://cosign.sigstore.dev/attestation/vuln/v1: The image contains high-risk vulnerabilities, please fix them before proceeding.
High-risk vulnerabilities (CVSS > 1.0): [8.6,2.7,6.2,5.9,7.5,4.7,7.4,4.7,7.4,4.7,7.4,4.7,7.4,5.9,3.6,3.6,7.3,4.4,6.5,5.4].
Severity levels: ["LOW","MEDIUM","LOW","LOW","MEDIUM","MEDIUM","MEDIUM","MEDIUM","MEDIUM","MEDIUM","MEDIUM","MEDIUM","MEDIUM","LOW","LOW","LOW","MEDIUM","MEDIUM","MEDIUM","MEDIUM"].
PkgIDs: ["coreutils@9.4-3ubuntu6","gpgv@2.4.4-2ubuntu17","gpgv@2.4.4-2ubuntu17","libgcrypt20@1.10.3-2build1","liblzma5@5.6.1+really5.4.5-1build0.1","libpam-modules@1.5.3-5ubuntu5.1","libpam-modules@1.5.3-5ubuntu5.1","libpam-modules-bin@1.5.3-5ubuntu5.1","libpam-modules-bin@1.5.3-5ubuntu5.1","libpam-runtime@1.5.3-5ubuntu5.1","libpam-runtime@1.5.3-5ubuntu5.1","libpam0g@1.5.3-5ubuntu5.1","libpam0g@1.5.3-5ubuntu5.1","libssl3t64@3.0.13-0ubuntu3.5","login@1:4.13+dfsg1-4ubuntu3.2","passwd@1:4.13+dfsg1-4ubuntu3.2","perl-base@5.38.2-3.2build2.1","golang.org/x/net@v0.23.0","golang.org/x/net@v0.23.0","stdlib@v1.22.12"].
Измените условия в ClusterPolicy, чтобы разрешить образы с уязвимостями высокого риска, но с CVSS баллом меньше 10.0.
conditions:
- all:
- key: "{{ scanner.result.Results[].Vulnerabilities[].Severity }}"
operator: AllNotIn
value: ["CRITICAL"]
message: |
Образ содержит уязвимости высокого риска, пожалуйста, исправьте их перед продолжением.
Уровни серьезности: {{ scanner.result.Results[].Vulnerabilities[].Severity }}
- key: "{{ scanner.result.Results[].Vulnerabilities[?CVSS.redhat.V3Score > `10.0`][] | length(@) }}"
operator: Equals
value: 0
message: |
Образ содержит уязвимости высокого риска, пожалуйста, исправьте их перед продолжением.
Уязвимости высокого риска (CVSS > 10.0): {{ scanner.result.Results[].Vulnerabilities[?CVSS.redhat.V3Score > `10.0`].CVSS.redhat.V3Score[] }}.
Уровни серьезности: {{ scanner.result.Results[].Vulnerabilities[?CVSS.redhat.V3Score > `10.0`].Severity[] }}.
PkgIDs: {{ scanner.result.Results[].Vulnerabilities[?CVSS.redhat.V3Score > `10.0`].PkgID[] }}.
Затем снова создайте Pod для проверки политики.
$ kubectl run -n $NAMESPACE vuln-image --image=${IMAGE} -- sleep 3600
Pod будет успешно создан.
Шаг 10: (Опционально) Требование свежести результатов сканирования уязвимостей не старше 168 часов
TIP
Если вы хотите добавить дополнительные условия в политику, продолжайте читать.
Поскольку Cosign Vulnerability Scan Record Attestation включает поле scanFinishedOn,
а trivy соответствует спецификации, мы можем использовать это поле для проверки, что результаты сканирования уязвимостей не старше 168 часов.
Нужно лишь добавить условие в ClusterPolicy для проверки, что поле scanFinishedOn находится в пределах 168 часов.
conditions:
- all:
- key: "{{ time_since('','{{metadata.scanFinishedOn}}','') }}"
operator: LessThanOrEquals
value: "168h"
message: "Результаты сканирования уязвимостей должны быть не старше 168 часов, а не {{ metadata.scanFinishedOn }}"
Здесь это не демонстрируется, заинтересованные читатели могут попробовать самостоятельно.
Шаг 11: Очистка ресурсов
Удалите Pod, созданный на предыдущих шагах.
$ export NAMESPACE=<policy>
$ kubectl delete pod -n $NAMESPACE vuln-image
Удалите политику.
$ kubectl delete clusterpolicy reject-high-risk-image
Ожидаемые результаты
После выполнения этого руководства:
- У вас настроена работа с Tekton Chains для сканирования уязвимостей и Kyverno для их проверки
- Ваши контейнерные образы автоматически включают результаты сканирования уязвимостей в свои аттестации
- В указанном namespace разрешено развертывание только образов с приемлемым уровнем уязвимостей
- Образы с уязвимостями высокого риска автоматически блокируются политиками Kyverno
- Вы реализовали базовый контроль безопасности цепочки поставок, проверяя статус уязвимостей контейнерных образов
Это руководство предоставляет основу для реализации безопасности цепочки поставок в ваших CI/CD пайплайнах. В продуктивной среде рекомендуется:
- Настроить правильную изоляцию namespace и контроль доступа
- Реализовать безопасное управление ключами для ключей подписи
- Настроить мониторинг и оповещения о нарушениях политик
- Регулярно менять ключи подписи и обновлять политики безопасности
Ссылки