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

    В 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-средах
    • Реализация средств контроля безопасности supply chain для container images путём проверки лицензий их компонентов

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

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

    ШагОперацияОписание
    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: Проверьте политику

    В namespace 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: (Необязательно) Проверка образа на 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 images автоматически включают информацию SBOM в своих аттестациях
    • В указанном namespace можно развернуть только образы с допустимыми лицензиями
    • Образы с несоответствующими лицензиями автоматически блокируются политиками Kyverno
    • Вы реализовали базовый контроль безопасности supply chain, проверяя сведения о лицензиях компонентов в своих container images

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

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

    Ссылки