Подписать образы контейнеров

Предусловия:

Kyverno, входящий в поставку платформы “Штурвал” умеет проверять образы контейнеров, размещенные в docker или registry (Подробнее о том, как настроить аутентификацию в приватном registry). Для подписи образов контейнеров и получения публичного ключа чаще всего используется инструмент Cosign от Sigstore.

Настроить подпись образов

Вы можете подписывать образы вручную или встроить процесс подписи образов в pipeline. Для подписи образов необходимо:

  1. Иметь установленный 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
2. Для каждого образа выполнить команду подписи. По умолчанию, cosign регистрирует подпись во внешних сервисах. В закрытом контуре, или нежелании хранить информацию о подписи во внешних источниках используйте команду с флагами:
  • –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.

Настроить проверку подписи

  1. Если у вас не установлен 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
  1. Если у вас не создана ключевая пара для Cosign, создайте с помощью команды ниже. (Иначе - пропустите этот шаг)
Команда для геренации ключевой пары
cosign generate-key-pair

Эта команда создаст два файла:

  • cosign.key - приватный ключ
  • cosign.pub - публичный ключ (используется для проверки)
  1. Извлеките публичный ключ.
Команда для извлечения публичного ключа
cat cosign.pub

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

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhUJv5NJ6Y5J5Z6X6X5X5X5X5X5X
5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X
-----END PUBLIC KEY-----
  1. В кластере 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

Загруженная политика будет доступна для просмотра в графическом интерфейсе кластера в разделе Безопасность/Менеджер политик безопасности. Обратите внимание! Политика будет блокировать запуск всех неподписанных этим ключом контейнеров, в том числе системные. В предложенном выше манифесте политики системные образы контейнеров добавлены в исключения.

×