Облачная платформаEvolution

Проверка подписи образов контейнеров Managed Kubernetes в Container Security


С помощью этого руководства вы создадите политику проверки подписи образов в Container Security, проверите ее работу на примере Deployment в Managed Kubernetes и убедитесь, что образ без доверенной подписи не допускается в кластер, а подписанный образ проходит проверку.

Вы будете использовать следующие сервисы и инструменты:

  • Container Security — сервис управления безопасностью контейнеров.

  • Managed Kubernetes — сервис управления кластерами Kubernetes на вычислительных ресурсах облака.

  • Artifact Registry для хранения, совместного использования и управления Docker-образами, Deb-пакетами, RPM-пакетами, Helm-чартами и файлами любого типа (generic).

  • Cosign — инструмент подписи и проверки контейнерных образов.

Шаги:

  1. Разверните необходимые ресурсы в облаке.

  2. Подготовьте ключи Cosign и подпишите образ.

  3. Создайте политику проверки образа.

  4. Создайте Deployment с нарушающим политику образом.

  5. Замените образ на проходящий проверку.

Перед началом работы

  1. Зарегистрируйтесь в личном кабинете Cloud.ru.

    Если вы уже зарегистрированы, войдите под своей учетной записью.

  2. Подготовьте два образа и загрузите их в Artifact Registry.

    Один образ подпишем Cosign, а второй оставим без подписи.

  3. Установите Cosign на ваше устройство.

1. Разверните необходимые ресурсы в облаке

  1. Создайте кластер Managed Kubernetes со следующими параметрами:

    • Количество мастер-узлов — 1.

    • Гарантированная доля vCPU, % — 30.

    • CPU, шт. — 2.

    • RAM, ГБ — 4.

    Остальные параметры оставьте по умолчанию.

  2. Создайте группу узлов c параметрами:

    • Гарантированная доля vCPU, % — 30.

    • CPU, шт. — 2.

    • RAM, ГБ — 4.

    • Объем хранилища, ГБ — 40.

    • Количество узлов — 3.

  3. Установите Trivy Operator.

  4. Установите Container Security.

    Выберите способ публикации плагина в интернет — LoadBalancer.

  5. Настройте доступ к панели управления Container Security.

  6. Подключитесь к кластеру.

  7. Чтобы проверить подключение к кластеру, выполните:

    kubectl get node

    Если отобразится список узлов, подключение настроено.

  8. Настройте разрешения для генерации отчетов.

2. Подготовьте ключи Cosign и подпишите образ

  1. Создайте пару ключей, которая будет использоваться для подписания образа и его проверки:

    cosign generate-key-pair

    Cosign создаст два файла:

    • cosign.key — приватный ключ, используемый для подписания образов;

    • cosign.pub — публичный ключ, используемый для проверки подписей.

    Храните приватный ключ в безопасном месте и не передавайте его в кластер или политику. В конфигурации политики используется только публичный ключ.

  2. Чтобы подписать 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> — тег образа.

  3. Чтобы проверить корректность подписи Docker-образа, выполните команду:

    cosign verify --key cosign.pub --insecure-ignore-tlog=true <registry_URI>/<docker_image_name_signed>:<tag>

3. Создайте политику проверки образа

На этом шаге создадим политику, которая требует, чтобы контейнерные образы из заданного реестра были подписаны указанным публичным ключом Cosign:

  1. В панели управления Container Security перейдите в раздел Контроль допуска → Политики допуска и выберите вкладку Проверка образов.

  2. Нажмите Создать политику и выберите Image Validation (весь кластер).

  3. В редакторе настройте конфигурацию политики:

    apiVersion: policies.kyverno.io/v1
    kind: ImageValidatingPolicy
    metadata:
    name: verify-signed-images
    spec:
    validationActions: [Deny, Audit]
    matchConstraints:
    resourceRules:
    - apiGroups: [""]
    apiVersions: ["v1"]
    operations: ["CREATE", "UPDATE"]
    resources: ["pods"]
    matchImageReferences:
    - glob: "<registry_URI>/*"
    attestors:
    - name: corporate-cosign
    cosign:
    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.

  4. Нажмите Сохранить.

    Политика проверки образов verify-signed-images автоматически применится к кластеру Managed Kubernetes.

  5. Проверьте, что политика появилась в списке политик.

4. Создайте Deployment с нарушающим политику образом

Для демонстрации работы политики попробуем создать Deployment с неподписанным образом. Такой Deployment нарушает политику verify-signed-images.

  1. Создайте файл cloudru-unsigned-app.yaml и сохраните манифест:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: cloudru-unsigned-app
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: cloudru-unsigned-app
    template:
    metadata:
    labels:
    app: cloudru-unsigned-app
    spec:
    containers:
    - name: cloudru-app
    image: <registry_URI>/<docker_image_name_unsigned>:<tag>

    Вместо <registry_URI>/<docker_image_name_unsigned>:<tag> укажите ссылку на ваш неподписанный образ, загруженный перед началом работы.

  2. Примените манифест:

    kubectl apply -f cloudru-unsigned-app.yaml

    Ожидаемый результат: Deployment не будет создан.

    В выводе появится ошибка:

    Ошибка проверки подписи образа: образ должен быть подписан ключом corporate-cosign

    Также ошибка зафиксируется в отчетах Container Security.

  3. Проверьте отчет Container Security.

Если образ без подписи был принят, проверьте, что политика сохранена, применяется к нужному кластеру, использует действие Deny, охватывает соответствующий ресурс и включает адрес тестового образа в matchImageReferences.

5. Замените образ на проходящий проверку

На этом шаге создадим Deployment с подписанным образом.

  1. Создайте файл cloudru-signed-app.yaml и сохраните манифест:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: cloudru-signed-app
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: cloudru-signed-app
    template:
    metadata:
    labels:
    app: cloudru-signed-app
    spec:
    containers:
    - name: cloudru-app
    image: <registry_URI>/<docker_image_name_signed>:<tag>

    Вместо <registry_URI>/<docker_image_name_signed>:<tag> укажите ссылку на подписанный образ.

  2. Примените манифест:

    kubectl apply -f cloudru-signed-app.yaml

    Ожидаемый результат: Deployment будет создан.

Если подписанный образ был отклонен, убедитесь, что в политике указан правильный публичный ключ, а образ подписан соответствующим приватным ключом. Также проверьте доступность реестра и возможность загрузки метаданных подписи.

Результат

В практической работе вы подписали образ контейнерного приложения в Artifact Registry, создали политику Image Policy Validation в Container Security и проверили ее действие на примере Deployment в Managed Kubernetes.

Сначала запрос на создание Deployment с неподписанным образом был отклонен политикой. После замены образа на подписанный доверенным ключом запрос прошел проверку, и Deployment был создан.

Таким образом, вы убедились, что политики валидации в Container Security позволяют контролировать допуск контейнерных образов в кластер и ограничивать использование образов, подпись которых не соответствует установленным требованиям безопасности.