• Русский
  • Проверка соответствия лицензий

    В ACP (Alauda Container Platform) можно использовать задачу trivy или syft в Tekton Pipeline для генерации SBOM для образа.

    SBOM содержит информацию о лицензиях для каждого компонента в образе.
    Можно использовать политики Kyverno, чтобы отклонять образы, содержащие определенные лицензии.

    Поскольку SBOM уже был сгенерирован для образа в Base Image and SBOM Verification, мы не будем создавать pipeline здесь, а вместо этого напрямую используем существующий образ для проверки этой возможности.

    TIP

    Эта глава основана на Base Image and SBOM Verification и лишь добавляет логику проверки информации о лицензиях образа.

    Обзор функции

    Этот метод аналогичен Base Image and SBOM Verification; изменяются только правила Kyverno для проверки соответствия лицензий.

    1. Настроить правила Kyverno для проверки SBOM.
    2. Использовать образ для создания Pod, чтобы проверить соответствие лицензий.

    Сценарии использования

    Следующие сценарии требуют обращения к инструкциям в этом документе:

    • Реализация проверки соответствия лицензий в кластерах Kubernetes с использованием Kyverno
    • Применение политик безопасности для блокировки образов, содержащих определенные лицензии (например, GPL)
    • Настройка автоматической проверки лицензий в CI/CD pipeline
    • Обеспечение соответствия лицензий в production-среде
    • Реализация средств контроля безопасности цепочки поставок для container-образов путем проверки лицензий их компонентов

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

    Обзор процесса

    ШагОперацияОписание
    1Проверка информации о лицензияхСоздать и применить политику Kyverno для проверки лицензий компонентов
    2(Опционально) Проверка CVEДобавить в политику условия для проверки конкретных уязвимостей
    3ОчисткаУдалить тестовые ресурсы и политики

    Пошаговые инструкции

    Шаг 1: Проверка информации о лицензиях образа

    Шаг 1.1: Создание политики Kyverno для проверки информации об основном образе

    TIP

    Для выполнения этого шага требуются права администратора кластера.

    Подробнее о Kyverno ClusterPolicy см. Kyverno ClusterPolicy

    Политика выглядит следующим образом:

    apiVersion: kyverno.io/v1
    kind: ClusterPolicy
    metadata:
      name: verify-component-licenses
    spec:
      webhookConfiguration:
        failurePolicy: Fail
        timeoutSeconds: 30
      background: false
      rules:
        - name: check-image
          match:
            any:
              - resources:
                  kinds:
                    - Pod
                  namespaces:
                    - policy
          verifyImages:
            - imageReferences:
                - "*"
                # - "<registry>/test/*"
              skipImageReferences:
                - "ghcr.io/trusted/*"
              failureAction: Enforce
              verifyDigest: false
              required: false
              useCache: false
              imageRegistryCredentials:
                allowInsecureRegistry: true
                secrets:
                  # The credential needs to exist in the namespace where kyverno is deployed
                  - registry-credentials
    
              attestations:
                - type: https://cyclonedx.org/bom
                  attestors:
                    - entries:
                        - attestor:
                          keys:
                            publicKeys: |- # <- The public key of the signer
                              -----BEGIN PUBLIC KEY-----
                              MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFZNGfYwn7+b4uSdEYLKjxWi3xtP3
                              UkR8hQvGrG25r0Ikoq0hI3/tr0m7ecvfM75TKh5jGAlLKSZUJpmCGaTToQ==
                              -----END PUBLIC KEY-----
    
                            ctlog:
                              ignoreSCT: true
    
                            rekor:
                              ignoreTlog: true
    
                  conditions:
                    - any:
                        # Check if the image contains specific licenses
                        - key: "{{ components[].licenses[].license.id }}"
                          operator: AllNotIn
                          value: ["GPL-3.0-only", "GPL-3.0-or-later"]
                          message: |
                            The image contains GPL licenses which are not allowed.
                            Found licenses: {{ components[].licenses[].license.id }}
    
                        # Check if the image contains specific license names
                        - key: "{{ components[].licenses[].license.name }}"
                          operator: AllNotIn
                          value: ["GPL"]
                          message: |
                            The image contains Expat license which is not allowed.
                            Found licenses: {{ components[].licenses[].license.name }}
    Пояснение полей YAML
    • Политика в целом соответствует политике из Image Signature Verification
    • spec.rules[0].verifyImages[].attestations[0].conditions
      • type: Тип аттестации CycloneDX SBOM — https://cyclonedx.org/bom
      • attestors: то же самое, что и выше.
      • conditions: условия, которые нужно проверить.
        • any: должно выполняться любое из условий.
          • key: "{{ components[].licenses[].license.id }}": образ содержит лицензии GPL, которые не разрешены.
          • key: "{{ components[].licenses[].license.name }}": образ содержит лицензию Expat, которая не разрешена.

    Сохраните политику в yaml-файл с именем kyverno.verify-component-licenses.yaml и примените ее:

    $ kubectl create -f kyverno.verify-component-licenses.yaml
    
    clusterpolicy.kyverno.io/verify-component-licenses created

    Шаг 1.2: Проверка политики

    В пространстве имен policy, где определена политика, создайте Pod для проверки политики.

    Используйте собранный образ для создания Pod.

    $ export NAMESPACE=<policy>
    $ export IMAGE=<<registry>/test/chains/demo-5:latest@sha256:a6c727554be7f9496e413a789663060cd2e62b3be083954188470a94b66239c7>
    
    $ kubectl run -n $NAMESPACE component-licenses --image=${IMAGE} -- sleep 3600

    Если в вашем образе содержатся лицензии GPL, Pod не будет создан.

    Вы получите такой вывод:

    Error from server: admission webhook "mutate.kyverno.svc-fail" denied the request:
    
    resource Pod/policy/high-risk was blocked due to the following policies
    
    verify-component-licenses:
      check-image: |
        image attestations verification failed, verifiedCount: 0, requiredCount: 1, error: .attestations[0].attestors[0].entries[0].keys: attestation checks failed for <registry>/test/chains/demo-5:latest and predicate https://cyclonedx.org/bom: The image contains GPL licenses which are not allowed.
        Found licenses: ["GPL-3.0-only","GPL-3.0-or-later","Latex2e"]
        ; The image contains Expat license which is not allowed.
        Found licenses: [,"GPL","LGPL","public-domain"]

    Измените ограничение на лицензии в ClusterPolicy, чтобы разрешить лицензии GPL.

    conditions:
      - any:
        - key: "{{ components[].licenses[].license.id }}"
          operator: AllNotIn
          value: ["GPL-8.0-only"]
          message: |
            The image contains GPL licenses which are not allowed.
            Found licenses: {{ components[].licenses[].license.id }}
    
        - key: "{{ components[].licenses[].license.name }}"
          operator: AllNotIn
          value: ["GPL-x"]
          message: |
            The image contains Expat license which is not allowed.
            Found licenses: {{ components[].licenses[].license.name }}

    Затем создайте Pod для проверки политики.

    $ kubectl run -n $NAMESPACE component-licenses --image=${IMAGE} -- sleep 3600
    
    pod/component-licenses created

    Pod будет создан успешно.

    Шаг 2: (Опционально) Проверка Image Check CVE-2022-42889

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

    CVE-2022-42889 — это критическая уязвимость в библиотеке Apache Commons Text, которая может привести к выполнению произвольного кода и возникает в версиях с 1.5 по 1.9. Обнаружить затронутый пакет можно в SBOM, определив пакет "commons-text" с одной из затронутых версий. Эта политика проверяет подтвержденные SBOM в формате CycloneDX для образа, указанного в imageReferences, и отклоняет его, если он содержит версии 1.5–1.9 пакета commons-text.

    Нам нужно лишь добавить в ClusterPolicy условие, проверяющее, есть ли в образе пакет commons-text.

    conditions:
      - all:
        - key: "{{ components[?name=='commons-text'].version || 'none' }}"
          operator: AllNotIn
          value: ["1.5","1.6","1.7","1.8","1.9"]

    Здесь это не демонстрируется; заинтересованные читатели могут попробовать сделать это самостоятельно.

    Шаг 3: Очистка ресурсов

    Удалите Pod, созданные на предыдущих шагах.

    $ export NAMESPACE=<policy>
    $ kubectl delete pod -n $NAMESPACE component-licenses

    Удалите политику.

    $ kubectl delete clusterpolicy verify-component-licenses

    Ожидаемые результаты

    После выполнения этого руководства:

    • У вас будет рабочая конфигурация Kyverno для проверки соответствия лицензий
    • Ваши container-образы будут автоматически включать информацию SBOM в своих аттестациях
    • В указанном пространстве имен можно будет развертывать только образы с допустимыми лицензиями
    • Образы с несоответствующими лицензиями будут автоматически блокироваться политиками Kyverno
    • Вы реализуете базовый контроль безопасности цепочки поставок путем проверки информации о лицензиях компонентов в ваших container-образах

    Это руководство служит основой для внедрения проверки соответствия лицензий в ваших CI/CD pipeline. В production-среде рекомендуется:

    1. Настроить правильную изоляцию пространств имен и контроль доступа
    2. Реализовать безопасное управление ключами для ключей подписи
    3. Настроить мониторинг и оповещения о нарушениях политики
    4. Регулярно обновлять политики безопасности с учетом ваших требований к лицензиям

    Ссылки