Процедура аудита (Kubernetes auditing) позволяет отслеживать обращения к API-серверу и анализировать события, происходящие в кластере. Аудит может быть полезен для отладки неожиданных сценариев поведения, а также для соблюдения требований безопасности.
Kubernetes поддерживает настройку аудита через механизм Audit policy,
который позволяет задавать правила логирования интересующих операций.
Результаты аудита по умолчанию записываются в лог-файл /var/log/kube-audit/audit.log.
Встроенные политики аудита
В Deckhouse Kubernetes Platform (DKP) по умолчанию создается базовый набор политик аудита, которые записывают:
- операции по созданию, изменению и удалению ресурсов;
- запросы от имени сервисных аккаунтов из системных пространств имен
kube-systemиd8-*; - обращения к ресурсам в системных пространствах имен
kube-systemиd8-*.
Эти политики активны по умолчанию.
Чтобы отключить их, установите параметр basicAuditPolicyEnabled в значение false.
Пример:
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: control-plane-manager
spec:
version: 1
settings:
apiserver:
auditPolicyEnabled: true
basicAuditPolicyEnabled: false
Настройка собственной политики аудита
Чтобы создать расширенную политику аудита API Kubernetes, выполните следующие шаги:
-
Включите параметр
auditPolicyEnabledв настройках модуляcontrol-plane-manager:apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: control-plane-manager spec: version: 1 settings: apiserver: auditPolicyEnabled: true -
Создайте Secret
kube-system/audit-policy, содержащий YAML-файл политики в формате Base64:apiVersion: v1 kind: Secret metadata: name: audit-policy namespace: kube-system data: audit-policy.yaml: <Base64>Пример содержимого файла
audit-policy.yamlс минимальной рабочей конфигурацией:apiVersion: audit.k8s.io/v1 kind: Policy rules: - level: Metadata omitStages: - RequestReceivedИсточники с подробной информацией по настройке возможного содержимого файла
audit-policy.yaml:
Как формировать содержимое файла audit-policy.yaml
Документация Kubernetes Структура полей ресурса Policy
Политика аудита в Kubernetes задается в файле формата YAML и состоит из набора правил, определяющих какие события и с каким уровнем детализации будут зафиксированы в журнале. Файл имеет следующую структуру:
apiVersion: audit.k8s.io/v1 # Версия API, используемая для политики аудита
kind: Policy # Тип ресурса — постоянно Policy
rules: # Набор правил для аудита
- level: # Уровень детализации логов. Обязательное поле
users: # Список пользователей, чьи действия логируются
userGroups: # Группы пользователей (например, system:serviceaccounts)
verbs: # Действия/операции, которые логируются (create, update, delete и т.д.)
resources: # Ресурсы Kubernetes для которых применяется правило
namespaces: # Пространства имен (namespaces), которые охватывает правило
Массив rules описывает правила аудита.
Каждое правило содержит следующие поля:
level— уровень детализации логируемого события. Возможные значения (от наиболее детализированного к наименее):None— не логировать вообще,Metadata— только метаданные запроса (кто, когда, что, откуда; без содержимого объекта),Request— также сохраняет тело запроса (только для запросов на изменение),RequestResponse— сохраняет и тело запроса и содержимое ответа.
-
users— перечень имен пользователей, на которых действует правило (например,["admin"]). Если это сервисные аккаунты, то имя обычно выглядит какsystem:serviceaccount:<namespace>:<serviceaccount-name>. Для обычных пользователей имя зависит от настроек системы аутентификации. Для объектовdeckhouse.io/v1Usersв качестве имени используетсяemail. -
userGroups— группы пользователей (например,["system:authenticated"]). После аутентификации kube-apiserver присваивает каждому пользователю список групп (например, все аутентифицированные пользователи — частьsystem:authenticated, сервисные аккаунты — в дополнительных группах). Если запрос пришёл от пользователя, который состоит хотя бы в одной из групп, указанных вuserGroups, то правило применяется к этому запросу.Встроенные группы Kubernetes:
system:authenticated— все, кто прошёл аутентификацию.system:unauthenticated— запросы от анонимных пользователей.system:serviceaccounts— все сервисные аккаунты всех namespaces.system:serviceaccounts:<namespace>— сервисные аккаунты в конкретном namespace.
-
verbs— список операций API (get,list,create,deleteи т.д.). resources— массив целевых ресурсов:group— API-группа (например,"apps","batch",""для core),resources— виды ресурсов (например,["pods", "deployments"]). Полный перечень ресурсов и их групп может быть получен с помощью командыkubectl api-resources.
-
namespaces— массив пространств имен (namespaces), в которых применяется правило. nonResourceURLs—— набор URL-путей, подлежащих аудиту. Символ*разрешен, но только в качестве полного, последнего шага пути. Примеры:/metrics— регистрировать запросы к метрикам apiserver,/healthz*— регистрировать все health-запросы.
Примеры
Логирование всех запросов от всех аутентифицированных пользователей
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
userGroups: ["system:authenticated"]
Внимание! Не рекомендуется в production-средах. При большом потоке событий возможна повышенная нагрузка да дисковую подсистему control-plane узлов кластера.
Пример log-записи (фрагмент):
{
"stage": "ResponseComplete",
"requestURI": "/healthz",
"verb": "get",
"user": {
"username": "kube-apiserver-kubelet-client",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated" // <- все, кто прошел аутентификацию
]
},
...
}
Логирование всех запросов не от сервисных аккаунтов
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
userGroups: ["system:authenticated"]
users: []
omitStages: []
# Исключаем сервисные аккаунты через deny-правило
- level: None
userGroups: ["system:serviceaccounts"]
Пример log-записи (фрагмент):
{
"user": {
"username": "user@example.com",
"groups": ["admins","system:authenticated"]
},
...
}
Логирование всех операций с типовыми ресурсами
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: "apps"
resources: ["deployments", "daemonsets", "statefulsets", "replicasets"]
- group: "batch"
resources: ["jobs", "cronjobs"]
- group: ""
resources: ["*"]
Работа с лог-файлом аудита
Предполагается, что на master-узлах кластера Deckhouse Kubernetes Platform установлен инструмент для отслеживания лог-файла /var/log/kube-audit/audit.log: log-shipper, promtail или filebeat.
Параметры ротации логов в файле предустановлены и не подлежат изменению:
- максимальный размер файла: 1000 МБ,
- максимальная глубина записи: 30 дней.
В зависимости от настроек политики и объема запросов к API-серверу количество записей может быть очень большим. В таких условиях глубина хранения может составлять менее 30 минут.
Наличие неподдерживаемых опций или опечаток в конфигурационном файле может привести к ошибкам при запуске API-сервера.
В случае возникновения проблем с запуском API-сервера выполните следующие шаги:
- Вручную удалите параметры
--audit-log-*из манифеста/etc/kubernetes/manifests/kube-apiserver.yaml; -
Перезапустите API-сервер с помощью следующей команды:
crictl stop $(crictl pods --name=kube-apiserver -q) # Альтернативный вариант (в зависимости от используемого CRI). docker stop $(docker ps | grep kube-apiserver- | awk '{print $1}') -
После перезапуска исправьте Secret или удалите его с помощью следующей команды:
d8 k -n kube-system delete secret audit-policy
Перенаправление лог-файла аудита в stdout
По умолчанию лог аудита сохраняется в файл /var/log/kube-audit/audit.log на master-узлах.
При необходимости вы можете перенаправить его вывод в stdout процесса kube-apiserver вместо файла,
установив параметр apiserver.auditLog.output модуля control-plane-manager в значение Stdout:
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: control-plane-manager
spec:
version: 1
settings:
apiserver:
auditPolicyEnabled: true
auditLog:
output: Stdout
В этом случае лог будет доступен в stdout контейнера kube-apiserver.
Далее, используя встроенный механизм логирования в DKP, вы можете настроить сбор и отправку логов в собственную систему безопасности.