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

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

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

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

    ШагОперацияОписание
    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:
                  # Учетные данные должны существовать в namespace, где развернут kyverno
                  - registry-credentials
    
              attestations:
                - type: https://cyclonedx.org/bom
                  attestors:
                    - entries:
                        - attestor:
                          keys:
                            publicKeys: |- # <- Публичный ключ подписанта
                              -----BEGIN PUBLIC KEY-----
                              MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFZNGfYwn7+b4uSdEYLKjxWi3xtP3
                              UkR8hQvGrG25r0Ikoq0hI3/tr0m7ecvfM75TKh5jGAlLKSZUJpmCGaTToQ==
                              -----END PUBLIC KEY-----
    
                            ctlog:
                              ignoreSCT: true
    
                            rekor:
                              ignoreTlog: true
    
                  conditions:
                    - any:
                        # Проверка, содержит ли образ определённые лицензии
                        - key: "{{ components[].licenses[].license.id }}"
                          operator: AllNotIn
                          value: ["GPL-3.0-only", "GPL-3.0-or-later"]
                          message: |
                            Образ содержит лицензии GPL, которые не разрешены.
                            Найдены лицензии: {{ components[].licenses[].license.id }}
    
                        # Проверка, содержит ли образ определённые имена лицензий
                        - key: "{{ components[].licenses[].license.name }}"
                          operator: AllNotIn
                          value: ["GPL"]
                          message: |
                            Образ содержит лицензию Expat, которая не разрешена.
                            Найдены лицензии: {{ components[].licenses[].license.name }}
    Объяснение полей YAML
    • Политика в целом совпадает с той, что описана в Image Signature Verification
    • spec.rules[0].verifyImages[].attestations[0].conditions
      • type: тип аттестации SBOM в формате cyclonedx — 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: |
            Образ содержит лицензии GPL, которые не разрешены.
            Найдены лицензии: {{ components[].licenses[].license.id }}
    
        - key: "{{ components[].licenses[].license.name }}"
          operator: AllNotIn
          value: ["GPL-x"]
          message: |
            Образ содержит лицензию Expat, которая не разрешена.
            Найдены лицензии: {{ 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 для проверки соответствия лицензий
    • Ваши контейнерные образы автоматически включают информацию SBOM в свои аттестации
    • В указанном namespace разрешено развертывание только образов с допустимыми лицензиями
    • Образы с несоответствующими лицензиями автоматически блокируются политиками Kyverno
    • Вы реализовали базовый контроль безопасности цепочки поставок, проверяя информацию о лицензиях компонентов в контейнерных образах

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

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

    Ссылки