С помощью этого руководства вы создадите политику проверки подписи образов в Container Security, проверите ее работу на примере Deployment в Managed Kubernetes и убедитесь, что образ без доверенной подписи не допускается в кластер, а подписанный образ проходит проверку.
Вы будете использовать следующие сервисы и инструменты:
Container Security — сервис управления безопасностью контейнеров.
Managed Kubernetes — сервис управления кластерами Kubernetes на вычислительных ресурсах облака.
Artifact Registry для хранения, совместного использования и управления Docker-образами, Deb-пакетами, RPM-пакетами, Helm-чартами и файлами любого типа (generic).
Cosign — инструмент подписи и проверки контейнерных образов.
Шаги:
Зарегистрируйтесь в личном кабинете Cloud.ru.
Если вы уже зарегистрированы, войдите под своей учетной записью.
Подготовьте два образа и загрузите их в Artifact Registry.
Один образ подпишем Cosign, а второй оставим без подписи.
Создайте кластер Managed Kubernetes со следующими параметрами:
Количество мастер-узлов — 1.
Гарантированная доля vCPU, % — 30.
CPU, шт. — 2.
RAM, ГБ — 4.
Остальные параметры оставьте по умолчанию.
Создайте группу узлов c параметрами:
Гарантированная доля vCPU, % — 30.
CPU, шт. — 2.
RAM, ГБ — 4.
Объем хранилища, ГБ — 40.
Количество узлов — 3.
Установите Container Security.
Выберите способ публикации плагина в интернет — LoadBalancer.
Чтобы проверить подключение к кластеру, выполните:
kubectl get node
Если отобразится список узлов, подключение настроено.
Создайте пару ключей, которая будет использоваться для подписания образа и его проверки:
cosign generate-key-pair
Cosign создаст два файла:
cosign.key — приватный ключ, используемый для подписания образов;
cosign.pub — публичный ключ, используемый для проверки подписей.
Храните приватный ключ в безопасном месте и не передавайте его в кластер или политику. В конфигурации политики используется только публичный ключ.
Чтобы подписать Docker-образ в Artifact Registry, выполните команду:
cosign sign --key cosign.key --tlog-upload=false <registry_URI>/<docker_image_name_signed>:<tag>
Где:
<registry_URI> — URI реестра, в котором находится репозиторий.
<docker_image_name_signed> — название образа, который требуется подписать.
<tag> — тег образа.
Чтобы проверить корректность подписи Docker-образа, выполните команду:
cosign verify --key cosign.pub --insecure-ignore-tlog=true <registry_URI>/<docker_image_name_signed>:<tag>
На этом шаге создадим политику, которая требует, чтобы контейнерные образы из заданного реестра были подписаны указанным публичным ключом Cosign:
В панели управления Container Security перейдите в раздел Контроль допуска → Политики допуска и выберите вкладку Проверка образов.
Нажмите Создать политику и выберите Image Validation (весь кластер).
В редакторе настройте конфигурацию политики:
apiVersion: policies.kyverno.io/v1kind: ImageValidatingPolicymetadata:name: verify-signed-imagesspec:validationActions: [Deny, Audit]matchConstraints:resourceRules:- apiGroups: [""]apiVersions: ["v1"]operations: ["CREATE", "UPDATE"]resources: ["pods"]matchImageReferences:- glob: "<registry_URI>/*"attestors:- name: corporate-cosigncosign:key:data: |-----BEGIN PUBLIC KEY-----<public_key_cosign>-----END PUBLIC KEY-----validations:- expression: >-images.containers.all(img, verifyImageSignatures(img, [attestors.corporate-cosign]) > 0)messageExpression: >-"Ошибка проверки подписи образа: образ должен быть подписан ключом corporate-cosign"
Где:
<registry_URI> — URI реестра, из которого проверяются образы.
<public_key_cosign> — публичная часть Cosign-ключа, с помощью которого подписан образ на шаге 2.
Нажмите Сохранить.
Политика проверки образов verify-signed-images автоматически применится к кластеру Managed Kubernetes.
Проверьте, что политика появилась в списке политик.
Для демонстрации работы политики попробуем создать Deployment с неподписанным образом. Такой Deployment нарушает политику verify-signed-images.
Создайте файл cloudru-unsigned-app.yaml и сохраните манифест:
apiVersion: apps/v1kind: Deploymentmetadata:name: cloudru-unsigned-appspec:replicas: 1selector:matchLabels:app: cloudru-unsigned-apptemplate:metadata:labels:app: cloudru-unsigned-appspec:containers:- name: cloudru-appimage: <registry_URI>/<docker_image_name_unsigned>:<tag>
Вместо <registry_URI>/<docker_image_name_unsigned>:<tag> укажите ссылку на ваш неподписанный образ, загруженный перед началом работы.
Примените манифест:
kubectl apply -f cloudru-unsigned-app.yaml
Ожидаемый результат: Deployment не будет создан.
В выводе появится ошибка:
Ошибка проверки подписи образа: образ должен быть подписан ключом corporate-cosign
Также ошибка зафиксируется в отчетах Container Security.
Если образ без подписи был принят, проверьте, что политика сохранена, применяется к нужному кластеру, использует действие Deny, охватывает соответствующий ресурс и включает адрес тестового образа в matchImageReferences.
На этом шаге создадим Deployment с подписанным образом.
Создайте файл cloudru-signed-app.yaml и сохраните манифест:
apiVersion: apps/v1kind: Deploymentmetadata:name: cloudru-signed-appspec:replicas: 1selector:matchLabels:app: cloudru-signed-apptemplate:metadata:labels:app: cloudru-signed-appspec:containers:- name: cloudru-appimage: <registry_URI>/<docker_image_name_signed>:<tag>
Вместо <registry_URI>/<docker_image_name_signed>:<tag> укажите ссылку на подписанный образ.
Примените манифест:
kubectl apply -f cloudru-signed-app.yaml
Ожидаемый результат: Deployment будет создан.
Если подписанный образ был отклонен, убедитесь, что в политике указан правильный публичный ключ, а образ подписан соответствующим приватным ключом. Также проверьте доступность реестра и возможность загрузки метаданных подписи.
В практической работе вы подписали образ контейнерного приложения в Artifact Registry, создали политику Image Policy Validation в Container Security и проверили ее действие на примере Deployment в Managed Kubernetes.
Сначала запрос на создание Deployment с неподписанным образом был отклонен политикой. После замены образа на подписанный доверенным ключом запрос прошел проверку, и Deployment был создан.
Таким образом, вы убедились, что политики валидации в Container Security позволяют контролировать допуск контейнерных образов в кластер и ограничивать использование образов, подпись которых не соответствует установленным требованиям безопасности.