Подписать образы контейнеров
На этой странице
Предусловия:
- Развернутый кластер;
- Установлен и работает Модуль анализа конфигураций приложений (Kyverno);
Kyverno, входящий в поставку платформы “Штурвал” умеет проверять образы контейнеров, размещенные в docker или registry (Подробнее о том, как настроить аутентификацию в приватном registry). Для подписи образов контейнеров и получения публичного ключа чаще всего используется инструмент Cosign от Sigstore.
Настроить подпись образов
Вы можете подписывать образы вручную или встроить процесс подписи образов в pipeline. Для подписи образов необходимо:
- Иметь установленный Cosign от Sigstore.
Если у вас не установлен Cosign, используйте команду для установки. (Иначе - пропустите этот шаг). Установку необходимо выполнить с устройства, которое будет осуществлять подпись (например, на машине с поднятым registry):
Команда для Linux/macOS
curl -sSL https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64 -o /usr/local/bin/cosign
chmod +x /usr/local/bin/cosign
Команда для Windows (PowerShell)
Invoke-WebRequest -URI https://github.com/sigstore/cosign/releases/latest/download/cosign-windows-amd64.exe -OutFile cosign.exe
- –key cosign.key
- –tlog-upload=false
В случае, если для registry нет валидного сертификата, вы можете воспользоваться флагом:
- –allow-insecure-registry
Команда для подписи контейнера
cosign sign --key cosign.key --tlog-upload=false $IMAGE
В процессе подписи будет отображаться информация:
Generating ephemeral keys...
Retrieving signed certificate...
By typing 'y', you attest that you grant (or have permission to grant) and agree to have this information stored permanently in transparency logs.
Are you sure you would like to continue? [y/N] y
Your browser will now be opened to:
https://oauth2.sigstore.dev/auth/auth?access_type=online&client_id=sigstore&code_challenge=OrXitVKUZm2lEWHVt1oQWR4HZvn0rSlKhLcltglYxCY&code_challenge_method=S256&nonce=2KvOWeTFxYfxyzHtssvlIXmY6Jk&redirect_uri=http%3A%2F%2Flocalhost%3A57102%2Fauth%2Fcallback&response_type=code&scope=openid+email&state=2KvOWfbQJ1caqScgjwibzK2qJmb
Successfully verified SCT...
tlog entry created with index: 12086900
Pushing signature to: $IMAGE
Подпись образов происходит приватным ключом, а проверка публичным. Подробнее на официальной странице Sigstore.
Настроить проверку подписи
- Если у вас не установлен Cosign, используйте команду для установки. (Иначе - пропустите этот шаг). Установку необходимо выполнить на своей рабочей станции:
Команда для Linux/macOS
curl -sSL https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64 -o /usr/local/bin/cosign
chmod +x /usr/local/bin/cosign
Команда для Windows (PowerShell)
Invoke-WebRequest -URI https://github.com/sigstore/cosign/releases/latest/download/cosign-windows-amd64.exe -OutFile cosign.exe
- Если у вас не создана ключевая пара для Cosign, создайте с помощью команды ниже. (Иначе - пропустите этот шаг)
Команда для геренации ключевой пары
cosign generate-key-pair
Эта команда создаст два файла:
- cosign.key - приватный ключ
- cosign.pub - публичный ключ (используется для проверки)
- Извлеките публичный ключ.
Команда для извлечения публичного ключа
cat cosign.pub
Результат должен выглядит примерно так:
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhUJv5NJ6Y5J5Z6X6X5X5X5X5X5X
5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X
-----END PUBLIC KEY-----
- В кластере Kubernetes импортируйте политику Kyverno, в манифесте которой укажите значение вашего публичного ключа:
Манифест политики проверки подписи. Не забудьте заменить значение публичного ключа!!!
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
annotations:
policies.kyverno.io/category: infosec
policies.kyverno.io/description: Проверка подписи образа позволяет
контролировать его целостность и запускать контейнеры только из
проверенных и доверенных образов
policies.kyverno.io/severity: High
policies.kyverno.io/title: Image Signature Checker
name: system-image-sign-check
spec:
admission: true
background: false
emitWarning: false
failurePolicy: Ignore
rules:
- match:
any:
- resources:
kinds:
- Pod
namespaceSelector:
matchExpressions:
- key: shturval.tech/system-namespace
operator: Exist
name: image-sign-check
skipBackgroundRequests: true
verifyImages:
- attestors:
- count: 1
entries:
- keys:
ctlog:
ignoreSCT: true
publicKeys: >-
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECp1Gvey7C3SPSsR4Xdxp3ffM55+j
ESzbBYgf71aw0P2ViS54eQ3jNJ7cKqj91hsM9XgowckvxDrRU5PSglg+7g==
-----END PUBLIC KEY-----
rekor:
ignoreTlog: true
signatureAlgorithm: sha256
signatureAlgorithm: sha256
- keys:
ctlog:
ignoreSCT: true
publicKeys: |-
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3dNylLLrn1TqigZ5gGGsG2r55pot
VnSGcEOsHXOSNwMUiBDal716IfJ1MBWrmeRrOlM0IwfWnXnuitM3Qgd0ew==
-----END PUBLIC KEY-----
rekor:
ignoreTlog: true
signatureAlgorithm: sha256
signatureAlgorithm: sha256
imageReferences:
- */*
mutateDigest: false
required: true
useCache: false
verifyDigest: true
schemaValidation: true
validationFailureAction: Audit
webhookTimeoutSeconds: 10
Загруженная политика будет доступна для просмотра в графическом интерфейсе кластера в разделе Безопасность/Менеджер политик безопасности. Обратите внимание! Политика будет блокировать запуск всех неподписанных этим ключом контейнеров, в том числе системные. В предложенном выше манифесте политики системные образы контейнеров добавлены в исключения.