Управление политиками безопасности с помощью Kyverno
Kyverno — это приложение для управления политиками безопасности в кластере Managed Kubernetes. Руководство поможет вам развернуть Kyverno, а также настроить и проверить работу политик безопасности.
Чтобы начать работу с Kyverno:
Подготовьте виртуальную машину — на нее будут установлены утилиты для работы с приложением Kyverno.
Установите Kyverno в кластер Managed Kubernetes.
(опционально) Установите дополнительные компоненты Kyverno:
- Reports Server — компонент, позволяющий хранить отчеты о работе политик во внешней базе данных.
- Policy Reporter — веб-интерфейс для визуализации, фильтрации и анализа результатов работы политик.
(опционально) Изучите сценарии работы с политиками безопасности.
Перед началом работы
Заголовок раздела «Перед началом работы»Создайте сервисный аккаунт с именем
sa-k8sи рольюregistry.puller— он понадобится для работы группы узлов Managed Kubernetes, а также для авторизации в Artifact Registry.Создайте API-ключ для сервисного аккаунта
sa-k8s. Сохраните значение API-ключа.Создайте кластер Managed Kubernetes и группу узлов для него. При создании группы используйте сервисный аккаунт
sa-k8s.Создайте NAT-шлюз для подсети, в которой будет развернут кластер Managed Kubernetes.
Создайте виртуальную машину в той же сети, где развернут кластер Managed Kubernetes.
1. Подготовьте виртуальную машину
Заголовок раздела «1. Подготовьте виртуальную машину»Для работы с Kyverno установите набор утилит на виртуальную машину:
Подключитесь к ВМ по SSH.
Установите и настройте утилиту MWS CLI:
Установите утилиту командной строки
kubectl.Получите kubeconfig:
bash mws mk8s get-kubeconfig <имя кластера>Убедитесь, что кластер доступен:
bash kubectl cluster-infoЕсли конфигурация настроена правильно, вы получите такой ответ:
bash Kubernetes control plane is running at https://<IP-адрес кластера>KubeDNS is running at https://<IP-адрес кластера>/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
2. Установите Kyverno
Заголовок раздела «2. Установите Kyverno»Приложение Kyverno можно развернуть двумя способами:
- Стандартная установка — приложение и его компоненты будут развернуты в одном экземпляре. Этот вариант установки подойдет для тестовых сред.
- Режим высокой доступности — каждый компонент приложения будет развернут в нескольких экземплярах на нескольких подах. Такая установка обеспечит отказоустойчивость Kyverno.
Для тестирования установите Kyverno в режиме стандартной установки. В дальнейшем уже установленное приложение можно обновить до версии с высокой доступностью.
Чтобы установить Kyverno:
Аутентифицируйтесь в Artifact Registry:
bash helm registry login -u apikey -p <API-ключ> registry.mwsapis.ruЗначение параметра
-u apikeyпредустановлено, изменять его не нужно. Укажите только значение для API-ключа.Скачайте Helm-чарт
kyvernoна виртуальную машину:bash helm pull oci://registry.mwsapis.ru/mws-mk8s-images/customer/charts/kyverno \--version 3.7.1 \--untarУстановите приложение одним из способов:
- Стандартная установка
- Режим высокой доступности
- Обновление до версии с высокой доступностью
Установите Kyverno:
bash helm install kyverno ./kyverno/ \-n kyverno \--create-namespaceУбедитесь, что приложение успешно развернуто:
bash kubectl get pods -n kyvernoОжидаемый результат:
bash NAME READY STATUS RESTARTS AGEkyverno-admission-controller-67778dd76c-vgn5h 1/1 Running 0 28skyverno-background-controller-848b659869-vjtr5 1/1 Running 0 28skyverno-cleanup-controller-9979c9cd-b59bz 1/1 Running 0 28skyverno-reports-controller-5dff874846-pfscw 1/1 Running 0 28s
3. Создайте политики безопасности
Заголовок раздела «3. Создайте политики безопасности»Для проверки работы Kyverno создайте две политики безопасности:
- MutatingPolicy с именем
add-default-resources— политика проверяет, установлены ли запросы на ресурсы (requests) для новых приложений. Если запросы не установлены, она добавляет в параметры приложения ресурсы по умолчанию. - ValidatingPolicy с именем
block-large-images— политика запрещает создание приложений, размер которых превышает установленное значение. В примере это 50 МБ.
Чтобы установить политики:
Создайте файл
add-default-resources.yaml.Создайте файл
block-large-images.yaml.Установите политики:
bash kubectl apply -f add-default-resources.yaml && \kubectl apply -f block-large-images.yamlУбедитесь, что политики успешно созданы:
bash kubectl get validatingpolicy,mutatingpolicyОжидаемый результат:
bash NAME AGE READYvalidatingpolicy.policies.kyverno.io/block-large-images 2m37s trueNAME AGE READYmutatingpolicy.policies.kyverno.io/add-default-resources 2m43s true
4. Проверьте работу политик
Заголовок раздела «4. Проверьте работу политик»Для проверки разверните тестовые приложения, нарушающие правила политик:
Создайте файл
pod-with-no-requests.yamlс манифестом пода, для которого не указаны запросы ресурсов (requests):yaml apiVersion: v1kind: Podmetadata:name: busyboxspec:containers:- name: busyboximage: busybox:latestcommand: ["echo"]args: ["OK, requests added by kyverno"]restartPolicy: NeverСоздайте под:
bash kubectl apply -f pod-with-no-requests.yamlУбедитесь, что для пода установлены ресурсы по умолчанию:
bash kubectl get pod busybox -o yaml | grep -A 4 resourcesОжидаемый результат:
bash resources:requests:cpu: 100mmemory: 100MiПолитика
add-default-resourcesустановила для пода запросы ресурсов по умолчанию.Попытайтесь создать под, размеры которого превышают 50 МБ:
bash cat <<EOF | kubectl apply -f -apiVersion: v1kind: Podmetadata:name: large-python-podspec:containers:- name: python-appimage: python:latestcommand: ["python"]args: ["-c", "print('hello from python')"]restartPolicy: NeverEOFСоздание пода будет заблокировано политикой
block-large-images:bash Error from server: error when creating "STDIN": admission webhook "vpol.validate.kyverno.svc-fail" denied the request: Policy block-large-images failed: images with size greater than 50Mb not allowed
5. (опционально) Установите дополнительные компоненты
Заголовок раздела «5. (опционально) Установите дополнительные компоненты»Установите дополнительные компоненты Kyverno:
Reports Server — компонент, решающий проблему масштабирования при работе с большим количеством политик. По умолчанию Kyverno хранит отчеты о применении политик во внутренней базе данных кластера Kubernetes (etcd). При высокой нагрузке это может снижать производительность кластера. Reports Server выгружает отчеты во внешнюю базу данных, например в Managed PostgreSQL. Это позволяет уменьшить нагрузку на etcd и значительно повысить масштабируемость. Подробнее о Reports Server в документации Kyverno.
Policy Reporter — веб-интерфейс для визуализации, фильтрации и анализа результатов работы политик. Также Policy Reporter позволяет выгружать данные о работе политик во внешние системы, например в Grafana или ElasticSearch. Подробнее о Policy Reporter в документации Kyverno.
(опционально) Установите Reports Server
Заголовок раздела «(опционально) Установите Reports Server»Создайте кластер Managed PostgreSQL подходящей вам конфигурации в той же подсети, где расположен кластер Managed Kubernetes.
Создайте базу данных Managed PostgreSQL. При создании базы создайте нового пользователя и задайте ему пароль.
Сохраните параметры для подключения к базе данных:
- Внутренний IP-адрес Primary-эндпоинта кластера. Чтобы узнать этот IP-адрес, получите информацию о кластере.
- Имя базы данных.
- Имя и пароль пользователя.
Вернитесь в SSH-сессию виртуальной машины.
Политика, блокирующая создание больших приложений, может помешать развертыванию Reports Server. Удалите созданную ранее политику:
bash kubectl delete -f block-large-images.yamlСкачайте Helm-чарт Reports Server:
bash helm pull oci://registry.mwsapis.ru/mws-mk8s-images/customer/charts/reports-server \--version 0.1.6 \--untarСоздайте пространство имен для развертывания Reports Server:
bash kubectl create namespace reports-serverСоздайте секрет, содержащий параметры подключения к БД Managed PostgreSQL:
bash kubectl create secret generic postgres-auth-reportserver -n reports-server \--from-literal=host='<внутренний IP-адрес Primary-эндпоинта кластера Managed PostgreSQL>' \--from-literal=port='5432' \--from-literal=dbname='<имя БД Managed PostgreSQL>' \--from-literal=username='<имя пользователя Managed PostgreSQL>' \--from-literal=password='<пароль пользователя Managed PostgreSQL>'Установите Reports Server:
bash helm install reports-server ./reports-server \-n reports-server \--set config.db.secretName=postgres-auth-reportserverУбедитесь, что под приложения перешел в состояние
Running:bash kubectl get pods -n reports-serverПроверьте, что отчеты о срабатывании политик выгружаются в базу данных PostgreSQL:
Создайте новую политику
require-labels, которая будет отслеживать, есть ли у подов меткаteam:bash kubectl apply -f - <<EOFapiVersion: policies.kyverno.io/v1alpha1kind: ValidatingPolicymetadata:name: require-labelsspec:validationActions: ["Audit"]matchConstraints:resourceRules:- apiGroups: [""]apiVersions: ["v1"]operations: ["CREATE", "UPDATE"]resources: ["pods"]validations:- message: "The label 'team' is required."expression: "has(object.metadata.labels) && has(object.metadata.labels.team)"EOFСоздайте тестовый под, который не содержит метку
team:bash kubectl run test-report-pod --image=nginx --restart=NeverПодключитесь к базе данных кластера Managed PostgreSQL, используя полученные ранее параметры для подключения.
Выполните запрос, который выведет информацию о срабатывании политики
require-labels:bash SELECTreport->'scope'->>'namespace' AS namespace,report->'scope'->>'name' AS resource_name,res->>'policy' AS policy_name,res->>'result' AS result,res->>'message' AS messageFROM policyreports,jsonb_array_elements(report->'results') AS resWHERE res->>'policy' = 'require-labels'AND report->'scope'->>'name' = 'test-report-pod';Ожидаемый результат выборки:
bash namespace | resource_name | policy_name | result | message----------+-----------------+----------------+--------+-------------------------------default | test-report-pod | require-labels | fail | The label 'team' is required.(1 row)
(опционально) Установите Policy Reporter
Заголовок раздела «(опционально) Установите Policy Reporter»Скачайте Helm-чарт Policy Reporter:
bash helm pull oci://registry.mwsapis.ru/mws-mk8s-images/customer/charts/policy-reporter \--version 3.7.3 \--untarУстановите Policy Reporter:
bash helm install policy-reporter ./policy-reporter \-n policy-reporter \--create-namespaceУбедитесь, что поды приложения перешли в состояние
Running:bash kubectl get pods -n policy-reporterОжидаемый результат:
bash NAME READY STATUS RESTARTS AGEpolicy-reporter-6b7586b68c-v4vsp 1/1 Running 0 21spolicy-reporter-ui-774db9cb6b-gdmvg 1/1 Running 0 21sУзнайте внутренний и внешний IP-адреса ВМ, запросив информацию о ней.
Создайте правило файрвола — оно потребуется для подключения к веб-интерфейсу Policy Reporter. Укажите следующие параметры правила:
- Направление —
Ingress. - Действие —
Allow. - Источник трафика —
0.0.0.0/0или внешний IP-адрес вашего локального компьютера. - Назначение трафика — внутренний IP-адрес виртуальной машины в нотации CIDR, например
192.168.0.12/32. - Протокол и порт —
TCP:8081.
Создайте переадресацию порта для сервиса
policy-reporter-uiна виртуальной машине:bash kubectl port-forward service/policy-reporter-ui 8081:8080 -n policy-reporter --address 0.0.0.0В браузере на локальном компьютере откройте ссылку
http://<внешний IP-адрес ВМ>:8081. Откроется веб-интерфейс Policy Reporter.
6. Изучите сценарии работы с политиками безопасности
Заголовок раздела «6. Изучите сценарии работы с политиками безопасности»Удалите платные ресурсы
Заголовок раздела «Удалите платные ресурсы»Ресурсы, созданные в руководстве, тарифицируются. Если вы больше не планируете использовать их: