Зачем нам Kyverno?

от автора

Kyverno  — это  механизм политики с открытым исходным кодом  для  Kubernetes  , который позволяет вам определять, проверять и применять политики для вашего кластера.

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

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

Создать локальный кластер

Сначала нам нужен  локальный кластер , запустите приведенный ниже скрипт, чтобы создать его с  типом .
Обратите внимание, что мы собираемся создать  Kubernetes  , используя версию  1.26.0.

kind create cluster --image "kindest/node:v1.26.0" --config - <<EOFkind: ClusterapiVersion: kind.x-k8s.io/v1alpha4nodes:  - role: control-plane  - role: worker  - role: worker  - role: workerEOF

Поды плоскости управления  находятся в  kube-system пространстве имен, и вы можете перечислить поды с помощью  kubectl get pods -n kube-system.

NAME                                         READY   STATUS    RESTARTS       AGEcoredns-787d4945fb-bdvsk                     1/1     Running   0              149mcoredns-787d4945fb-j4qs9                     1/1     Running   0              149metcd-kind-control-plane                      1/1     Running   0              149mkindnet-666x4                                1/1     Running   0              149mkindnet-bw2jb                                1/1     Running   0              149mkindnet-rlqkb                                1/1     Running   0              149mkindnet-s49tp                                1/1     Running   0              149mkube-apiserver-kind-control-plane            1/1     Running   0              149mkube-controller-manager-kind-control-plane   1/1     Running   0              149mkube-proxy-5snpj                             1/1     Running   0              149mkube-proxy-h2mfn                             1/1     Running   0              149mkube-proxy-tcmf5                             1/1     Running   0              149mkube-proxy-w9qjw                             1/1     Running   0              149mkube-scheduler-kind-control-plane            1/1     Running   0              149m

Развертывание Киверно

Теперь у нас есть работающий локальный кластер, и мы можем  развернуть  Kyverno  с помощью  Helm  , используя приведенный ниже скрипт (это установит   версию  Kyverno1.10.0-alpha.1 ).

helm upgrade --install --wait --timeout 15m --atomic <br style="box-sizing: border-box; max-width: 900px;">  --version 3.0.0-alpha.1 <br style="box-sizing: border-box; max-width: 900px;">  --namespace kyverno --create-namespace <br style="box-sizing: border-box; max-width: 900px;">  --repo https://kyverno.github.io/kyverno kyverno kyverno

После  завершения установки Helm  Chart вы можете убедиться,  что Kyverno  работает с  kubectl get pods -n kyverno.

NAME                                             READY   STATUS    RESTARTS   AGEkyverno-admission-controller-5b478d89db-gswnl    1/1     Running   0          98skyverno-background-controller-7478c9c5cc-9ldgx   1/1     Running   0          98skyverno-cleanup-controller-6c84b74fc8-6k9p8      1/1     Running   0          98skyverno-reports-controller-7565cff47b-kfnbc      1/1     Running   0          98s

Что такое Сигстор?

Sigstore  — это проект с открытым исходным кодом, цель которого —  повысить безопасность цепочки поставок программного обеспечения  , предоставляя прозрачный и безопасный способ  подписи, проверки и распространения артефактов программного обеспечения .

Проект был инициирован Red Hat, Google и другими лидерами отрасли, и в настоящее время его поддерживает Linux Foundation.

Используя  Sigstore , разработчики могут гарантировать, что программное обеспечение, которое они распространяют, является  подлинным  и  не было подделано . Это может помочь предотвратить широкий спектр угроз безопасности, таких как атаки на цепочки поставок, распространение вредоносного ПО и утечки данных.

В целом,  Sigstore  стремится предоставить простое, безопасное и масштабируемое решение  для подписи и проверки программного обеспечения , а также способствовать прозрачности и доверию в цепочке поставок программного обеспечения.

Политика Kyverno для проверки образов Kubernetes

Все образы, обеспечивающие работу  модулей плоскости управления Kubernetes  , берутся из реестра.k8s.io .

Начиная с версии  1.24,  Kubernetes  внедряет  бесплатный сервис подписи программного обеспечения Sigstore  для  подписи артефактов , изображений и проверки подписей.

У нас должна быть возможность создать  политику Kyverno для проверки  правильности подписи  изображений, используемых модулями плоскости управления .

Запустите приведенный ниже скрипт, чтобы создать такую ​​политику:

kubectl apply -f - <<EOFapiVersion: kyverno.io/v1kind: Policymetadata:  name: verify-k8s-images  # policy lives in the same namespace as control plane pods  namespace: kube-systemspec:  # don't reject pod creation but create a report entry  validationFailureAction: Audit  # run policy evaluation in the background  background: true  rules:    - name: verify-k8s-images      match:        any:          - resources:              kinds:                - Pod      verifyImages:      - imageReferences:        # applies to all containers running an image from the k8s registry        - registry.k8s.io/        verifyDigest: false        required: false        mutateDigest: false        attestors:        - entries:          - keyless:              # verifies issuer and subject are correct              issuer: https://accounts.google.com              subject: krel-trust@k8s-releng-prod.iam.gserviceaccount.com              rekor:                url: https://rekor.sigstore.devEOF

Что следует отметить из приведенной выше политики:

  • Политика находится в том  же пространстве имен, что и модули плоскости управления  ( kube-system), и применяется только к модулям в этом пространстве имен.

  • Политика применяется только к контейнерам, использующим образ,  полученный из   реестра Kubernetes  ( ).registry.k8s.io/

  • Политика проверяет  issuer подпись  subject .

Просмотр результатов

Как только вышеуказанная политика будет создана,  Kyverno  начнет  проверять изображения и создавать отчеты .

Вы можете  перечислить отчеты  в  kube-system пространстве имен с помощью:

kubectl get policyreports.wgpolicyk8s.io -n kube-systemNAME                    PASS   FAIL   WARN   ERROR   SKIP   AGEpol-verify-k8s-images   12     1      0      0       0      14m

Это показывает, что у нас есть один отчет для  verify-k8s-images, отчет содержит  12 записей, которые удовлетворяют требованиям политики  , и  1 запись, которая не соответствует требованиям политики .

Мы можем просмотреть  детали отчета  с помощью:

kubectl describe policyreports.wgpolicyk8s.io -n kube-system pol-verify-k8s-imagesName:         pol-verify-k8s-imagesNamespace:    kube-system# ...Results:  # ...  Message:    failed to verify image registry.k8s.io/etcd:3.5.6-0: .attestors[0].entries[0].keyless: subject mismatch: expected krel-trust@k8s-releng-prod.iam.gserviceaccount.com, received k8s-infra-gcr-promoter@k8s-artifacts-prod.iam.gserviceaccount.com  Policy:     kube-system/verify-k8s-images  Resources:    API Version:  v1    Kind:         Pod    Name:         etcd-kind-control-plane    Namespace:    kube-system    UID:          4be45338-7d30-4cac-a536-34165ba84fba  Result:         fail  Rule:           verify-k8s-images  Scored:         true  Source:         kyverno  Timestamp:    Nanos:    0    Seconds:  1681461047  # ...

Образ с именем  Registry.k8s.io/etcd:3.5.6–0  не соответствует ожидаемому объекту.

Улучшение политики

Чтобы исправить несоответствие субъекта с  образом реестра.k8s.io/etcd  , нам необходимо изменить политику, чтобы применить следующую стратегию:

  • Если изображение соответствует шаблону  registry.k8s.io/kube- или  registry.k8s.io/coredns/, используйте то же самое  issuer ,  subject что и в исходной политике.

  • Если изображение соответствует шаблону,  registry.k8s.io/etcd используйте другой  issuer и  subject.

Мы можем легко настроить  Kyverno  для применения новой стратегии, добавив новую запись в  verifyImages строфу:

kubectl apply -f - <<EOFapiVersion: kyverno.io/v1kind: Policymetadata:  name: verify-k8s-images  namespace: kube-systemspec:  validationFailureAction: Audit  background: true  rules:    - name: verify-k8s-images      match:        any:          - resources:              kinds:                - Pod      verifyImages:      # verify kube-* and coredns/* images       - imageReferences:        - registry.k8s.io/kube-        - registry.k8s.io/coredns/        verifyDigest: false        required: false        mutateDigest: false        attestors:        - entries:          - keyless:              issuer: https://accounts.google.com              subject: krel-trust@k8s-releng-prod.iam.gserviceaccount.com              rekor:                url: https://rekor.sigstore.dev      # verify etcd:* images      - imageReferences:        - registry.k8s.io/etcd:*        verifyDigest: false        required: false        mutateDigest: false        attestors:        - entries:          - keyless:              issuer: https://accounts.google.com              subject: k8s-infra-gcr-promoter@k8s-artifacts-prod.iam.gserviceaccount.com              rekor:                url: https://rekor.sigstore.devEOF

Киверно  должен вскоре обновить отчет, и теперь  все изображения должны пройти проверку подписи изображения  ?

kubectl get policyreports.wgpolicyk8s.io -n kube-systemNAME                    PASS   FAIL   WARN   ERROR   SKIP   AGEpol-verify-k8s-images   13     0      0      0       0      44m

На этом все дорогие читатели. Ещо много интересного буду публиковать в моей телеге


ссылка на оригинал статьи https://habr.com/ru/articles/761476/