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
На этом все дорогие читатели. Ещо много интересного буду публиковать в моей телеге
Комментарии (6)
n_bogdanov
17.09.2023 16:56+1Это точно не перевод? А то http://реестра.k8s.io/etcd на это намекает.
sealatusserafim
17.09.2023 16:56И не только, одни вставки команд чего стоят с eof однострочником. Оригинал - https://medium.com/@charled.breteche/kyverno-verify-kubernetes-control-plane-images-372ea2fe1680
ALexhha
17.09.2023 16:56+2Поды плоскости управления находятся в
kube-system
пространстве именПоды плоскости управления, WTF ?! Это controlplane что ли :D
firehacker
17.09.2023 16:56Кто придумывает все эти тошнотные названия для современных технологий, инструментов, фреймворков?
Вспоминается старый прикол:
zaggy
17.09.2023 16:56Режим занудства:
Как и kubernetes, kyverno - слово греческого происхождения. Значит - управлять. А так, большинство названий, связанных с контейнерными технологий, имеют отношение либо к морской тематике, либо что то на греческом, либо и то и другое, типа кубернетиса))
firehacker
Кто придумывает все эти тошнотные названия для современных технологий, инструментов, фреймворков?
Вспоминается старый прикол: