Инфраструктура, Новости и обновления, VPS и облачный хостинг

Подпись образов с Cosign и OVHcloud KMS: защита ключей без компромиссов

Поделиться:
Подпись образов с Cosign и OVHcloud KMS: защита ключей без компромиссов

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

Подписывая образы с помощью Cosign и защищая ключи подписи в OVHcloud KMS, команды могут хранить криптографические материалы вне локальных сред и переменных CI/CD, одновременно упрощая контроль, аудит и интеграцию подписи образов в конвейеры доставки.

В этой статье вы узнаете, как использовать плагин OVHcloud KMS для Cosign: сгенерировать ключ, подписать им образ контейнера и проверить, что OCI-образ был подписан корректно.

Cosign

Подпись образов с Cosign и OVHcloud KMS: защита ключей без компромиссов

Cosign — это инструмент из проекта Sigstore, используемый для подписи, проверки и подтверждения OCI-образов контейнеров и артефактов программного обеспечения.

Cosign поддерживает несколько режимов подписи, включая keyless-подпись через Sigstore (где краткосрочные сертификаты генерируются во время подписи на основе вашей учётной записи — GitHub, Google или другой OIDC-провайдер), а также генерацию эфемерных ключей, подпись с использованием аппаратных модулей и KMS, а также интеграцию с собственной PKI.

Cosign поддерживает множество KMS-провайдеров для генерации и подписи ключей. Поддерживаются несколько внешних KMS, включая HashiCorp Vault, AWS KMS, GCP KMS и Azure Key Vault.
Теперь Cosign также можно интегрировать с OVHcloud KMS с помощью плагина Sigstore Cosign OVHcloud KMS 💪.

OVHcloud Key Management Service (KMS)

Подпись образов с Cosign и OVHcloud KMS: защита ключей без компромиссов

OVHcloud KMS, часто называемый OKMS, — это управляемый сервис, централизующий создание, хранение и управление ключами шифрования. Его основная цель — помочь компаниям защищать данные и контролировать криптографические операции с единой платформы.

Каждый KMS привязан к региону, поэтому ключи, хранящиеся в этом регионе, гарантированно остаются в нём. Вы можете заказать несколько KMS, как в разных регионах, так и в одном регионе.

Предварительные требования

Чтобы использовать провайдер Sigstore KMS OVHcloud, необходимо выполнить следующие предварительные условия:

💡Плагин cosign для OVHcloud поддерживает аутентификацию как с помощью token, так и с помощью mTLS. В рамках этой статьи мы будем использовать режим аутентификации по токену. Если вы хотите использовать режим mTLS, следуйте руководству Sigstore Cosign KMS plugin for OVHcloud.

Генерация PAT-токена (только для аутентификации по токену)

Выведите список доменов OKMS:

$ ovhcloud okms list
┌──────────────────────────────────────┬─────────────┐
│ id │ region │
├──────────────────────────────────────┼─────────────┤
│ 305db938-1234-5678-9012-3a0a29291661 │ eu-west-par │
│ xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx │ eu-west-par │
└──────────────────────────────────────┴─────────────┘

Сохраните ID OKMS в переменную окружения:

export KMS_RESTAPI_OKMSID="305db938-1234-5678-9012-3a0a29291661"

Плагин cosign OVHcloud требует разрешения на создание и получение ключей из OVHcloud KMS.

Если вы хотите использовать аутентификацию по токену, вам понадобится токен (PAT). Вы можете сделать это с помощью ovhcloud CLI:

PAT_TOKEN=$(ovhcloud iam user token create <iam-local-user-name> --name pat-<iam-local-user-name> --description "PAT cosign for domain $KMS_RESTAPI_OKMSID" -o json  | jq .details.token |  tr -d '"')

echo $PAT_TOKEN

Результат должен выглядеть примерно так:

$ PAT_TOKEN=$(ovhcloud iam user token create cosign-305db938-1234-5678-9012-3a0a29291661 --name pat-cosign-305db938-1234-5678-9012-3a0a29291661 --description "PAT cosign for domain 305db938-1234-5678-9012-3a0a29291661" -o json  | jq .details.token |  tr -d '"')
2026/05/07 08:48:34 Final parameters:
{
"description": "PAT cosign for domain 305db938-1234-5678-9012-3a0a29291661",
"name": "pat-cosign-305db938-1234-5678-9012-3a0a29291661"
}

$ echo $PAT_TOKEN
eyJhbGciOiJFZE...ASgXy55_DDFHdy4Z5uSq8lww-Bw

Сохранение информации о KMS

Сохраните информацию о KMS в переменные окружения. Например:

export KMS_RESTAPI_ENDPOINT=$(ovhcloud okms get $KMS_RESTAPI_OKMSID -o json | jq .restEndpoint | xargs)
export KMS_RESTAPI_TYPE="token"
export KMS_RESTAPI_TOKEN=$PAT_TOKEN

Отобразите сохранённую информацию:

$ echo $KMS_RESTAPI_ENDPOINT
https://eu-west-par.okms.ovh.net

$ echo $KMS_RESTAPI_OKMSID
305db938-1234-5678-9012-3a0a29291661

$ echo $KMS_RESTAPI_TYPE
token

$ echo $KMS_RESTAPI_TOKEN
eyJ...BIoHCA

Установка плагина Cosign KMS

Установите плагин локально:

curl -fsSL https://raw.githubusercontent.com/ovh/sigstore-kms-ovhcloud/main/install.sh | sh

⚠️ По умолчанию бинарный файл устанавливается в $HOME/.local/bin (создаётся, если не существует). Убедитесь, что этот каталог есть в вашем PATH.

Или воспользуйтесь другими способами установки.

Теперь вы можете использовать плагин OVHcloud KMS непосредственно в команде cosign 🎉.

Давайте используем Cosign с OVHcloud KMS!

Генерация ключа

Сначала, чтобы подписать образ, нам нужно сгенерировать пару ключей. Для этого сгенерируем UUID и используем его в команде cosign generate-key-pair.

export KEY_ID=$(uuidgen)
cosign generate-key-pair --kms ovhcloud://$KEY_ID

Ключ подписи создаётся в OVHcloud KMS, а открытый ключ записывается локально.

Вы должны увидеть вывод примерно такого вида:

$ export KEY_ID=$(uuidgen)
$ cosign generate-key-pair --kms ovhcloud://$KEY_ID

Public key written to cosign.pub

Команда генерирует пару ключей с использованием алгоритма ECDSA и записывает открытый ключ в cosign.pub.

Проверьте, что ключи были созданы:

$ ls -l cosign.pub
-rw------- 1 avache staff 178 18 juin 16:06 cosign.pub

$ cat cosign.pub

-----BEGIN PUBLIC KEY-----
MFkw...QgwA==
-----END PUBLIC KEY-----


После того как пара ключей сгенерирована, используйте соответствующий ID ключа OVHcloud KMS в URI ovhcloud://$KEY_ID при подписи и проверке образов.

Или получите существующий открытый ключ (необязательно)

Вместо создания нового открытого ключа вы можете получить существующий с помощью следующей команды:

cosign public-key --key ovhcloud://$KEY_ID --outfile cosign-ovhcloud.pub

Подпишите образ

Замените параметр $IMAGE@sha256:$HASH на URI вашего образа и его хэш, затем выполните эту команду:

cosign sign --key ovhcloud://$KEY_ID $IMAGE@sha256:$HASH

Вы должны увидеть примерно такой вывод:

$ cosign sign --key ovhcloud://$KEY_ID 12345678.c1.de1.container-registry.ovh.net/my-project/my-image@sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Подпись образов с Cosign и OVHcloud KMS: защита ключей без компромиссов

Проверьте, что образ подписан

cosign verify --key ovhcloud://$KEY_ID $IMAGE@sha256:$HASH

Вы должны увидеть примерно такой вывод:

$ cosign verify --key ovhcloud://$KEY_ID 12345678.c1.de1.container-registry.ovh.net/my-project/my-image@sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Verification for 12345678.c1.de1.container-registry.ovh.net/my-project/my-image@sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx --
The following checks were performed on each of these signatures:
- The cosign claims were validated
- Existence of the claims in the transparency log was verified offline
- The signatures were verified against the specified public key

[{"critical":{"identity":{"docker-reference":"12345678.c1.de1.container-registry.ovh.net/my-project/my-image@sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"},"image":{"docker-manifest-digest":"sha256:b1202...2334e2"},"type":"https://sigstore.dev/cosign/sign/v1"},"optional":{}}]

Заключение

В этой записи блога мы показали, как использовать Cosign с плагином OVHcloud KMS для генерации ключевой пары, подписи контейнерного образа и проверки его подписи.

Храня ключи подписи в управляемом KMS, команды могут сократить распространение секретов, защитить конфиденциальный криптографический материал и упростить интеграцию подписи образов в безопасные CI/CD-процессы.

Подпись образов с Cosign и OVHcloud KMS: защита ключей без компромиссов