Менеджер политик безопасности
Страница “Менеджер политик безопасность” находится в разделе Кластер/Безопасность.
Страница представляет собой таблицу со списком политик безопасности, содержащую колонки:
- Название (доступна фильтрация)
- Дата создания (доступна сортировка)
Доступен просмотр и удаление политики.
На странице просмотра политики есть 3 вкладки: политика, лейблы и аннотации и события. Политику можно изменить с помощью YAML манифеста.
Подробнее о правилах составления и управления политиками можно прочитать на официальном сайте Kyverno.
Рекомендуемые политики
Для добавления политики перейдите в интерфейс импорта манифеста и вставьте необходимые политики, затем нажмите “Проверить”. После успешного прохождения проверки нажмите “Загрузить”.
absence-of-cpu-requests
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
annotations:
meta.helm.sh/release-name: shturval-policies
meta.helm.sh/release-namespace: kyverno
policies.kyverno.io/category: infosec
policies.kyverno.io/description: Kubernetes обладает возможностью установки и ограничений
на потребление ресурсов CPU запускаемыми контейнерами. В случае, если ограничения
отсутствуют, может произойти Denial of Service (DoS), обусловленный тем, что
pod (контейнер) будет использовать все ресурсы узла, которые ему доступны. Поэтому
хорошей практикой считается установка параметров Request (запрос на ресурс)
на CPU.
policies.kyverno.io/severity: High
policies.kyverno.io/title: CPU Requests checker
labels:
app.kubernetes.io/managed-by: Helm
name: absence-of-cpu-requests
spec:
admission: true
background: true
failurePolicy: Ignore
rules:
- match:
any:
- resources:
kinds:
- Pod
name: check-for-cpu-requests
skipBackgroundRequests: true
validate:
foreach:
- list: request.object.spec.[initContainers, containers][]
pattern:
resources:
requests:
cpu: ?*
message: Параметр Requests для CPU не установлен у Container/InitContainer
schemaValidation: true
validationFailureAction: Audit
webhookTimeoutSeconds: 10
absence-of-ram-requests-limits
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
annotations:
meta.helm.sh/release-name: shturval-policies
meta.helm.sh/release-namespace: kyverno
policies.kyverno.io/category: infosec
policies.kyverno.io/description: Kubernetes обладает возможностью ограничения
на потребление ресурсов RAM запускаемыми контейнерами. В случае, если такие
параметры не установлены, возможна вероятность Denial of Service (DoS), обусловленной
тем, что pod (контейнер) будет использовать все ресурсы узла, которые ему доступны.
По этому хорошей практикой считается установка параметров Request (запрос на
ресурс) и Limits (максимально допустимое количество ресурсов) на RAM.
policies.kyverno.io/severity: High
policies.kyverno.io/title: RAM Requests and Limits checker
generation: 1
labels:
app.kubernetes.io/managed-by: Helm
name: absence-of-ram-requests-limits
spec:
admission: true
background: true
failurePolicy: Ignore
rules:
- match:
any:
- resources:
kinds:
- Pod
name: check-for-ram-requests
skipBackgroundRequests: true
validate:
foreach:
- list: request.object.spec.[initContainers, containers][]
pattern:
resources:
requests:
memory: ?*
message: Параметр Requests для RAM не установлен у Container/InitContainer
- match:
any:
- resources:
kinds:
- Pod
name: check-for-ram-limits
skipBackgroundRequests: true
validate:
foreach:
- list: request.object.spec.[initContainers, containers][]
pattern:
resources:
limits:
memory: ?*
message: Параметр Limits для RAM не установлен у Container/InitContainer
schemaValidation: true
validationFailureAction: Audit
webhookTimeoutSeconds: 10
automated-satoken-mount-used
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
annotations:
meta.helm.sh/release-name: shturval-policies
meta.helm.sh/release-namespace: kyverno
policies.kyverno.io/category: infosec
policies.kyverno.io/description: 'По умолчанию Kubernetes реализует подстановку
ServiceAccount Token в pod. При помощи этого Token можно взаимодействовать с
API-сервером, что НЕ требуется большинству pods. Рекомендуется отключать эту
возможность и реализовывать ее только там, где это по-настоящему требуется. '
policies.kyverno.io/severity: High
policies.kyverno.io/title: automountServiceAccountToken is set to true
generation: 1
labels:
app.kubernetes.io/managed-by: Helm
name: automated-satoken-mount-used
spec:
admission: true
background: true
failurePolicy: Ignore
rules:
- match:
any:
- resources:
kinds:
- Pod
name: check-for-automount-serviceaccount-token
skipBackgroundRequests: true
validate:
message: Добавлена автоматическая подстановка ServiceAccount Token в Pod
pattern:
spec:
automountServiceAccountToken: "false"
schemaValidation: true
validationFailureAction: Audit
webhookTimeoutSeconds: 10
container-is-privileged
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
annotations:
meta.helm.sh/release-name: shturval-policies
meta.helm.sh/release-namespace: kyverno
policies.kyverno.io/category: infosec
policies.kyverno.io/description: 'Указанный флаг запускает контейнер в привилегированном
режиме, что может быть использовано злоумышленником. Например, для повышения
привилегий и развития атаки на кластер. Большинство контейнеров не требует использование
указанного флага, поэтому рекомендуется НЕ использовать его. '
policies.kyverno.io/severity: High
policies.kyverno.io/title: privileged flag in spec.containers is set to true
generation: 1
labels:
app.kubernetes.io/managed-by: Helm
name: container-is-privileged
spec:
admission: true
background: true
failurePolicy: Ignore
rules:
- match:
any:
- resources:
kinds:
- Pod
name: check-for-privileged
skipBackgroundRequests: true
validate:
message: Обнаружен контейнер с флагом privileged
pattern:
spec:
containers:
- =(securityContext):
=(privileged): "false"
schemaValidation: true
validationFailureAction: Audit
webhookTimeoutSeconds: 10
default-ns-is-used
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
annotations:
meta.helm.sh/release-name: shturval-policies
meta.helm.sh/release-namespace: kyverno
pod-policies.kyverno.io/autogen-controllers: none
policies.kyverno.io/category: infosec
policies.kyverno.io/description: 'Использование namespace с именем "default" не
рекомендуется. Хорошей практикой считается использование специально-созданных
namespace под нужды специалистов и/или приложений. '
policies.kyverno.io/severity: High
policies.kyverno.io/title: deployment to default namespace
generation: 1
labels:
app.kubernetes.io/managed-by: Helm
name: default-ns-is-used
spec:
admission: true
background: true
failurePolicy: Ignore
rules:
- match:
resources:
kinds:
- Pod
name: check-for-default-ns
skipBackgroundRequests: true
validate:
message: Обнаружен ресурс в неймспейсе default
pattern:
metadata:
namespace: '!default'
- match:
resources:
kinds:
- DaemonSet
- Deployment
- Job
- CronJob
- StatefulSet
name: check-for-default-ns-pod-controller
skipBackgroundRequests: true
validate:
message: Обнаружен ресурс в неймспейсе default
pattern:
metadata:
namespace: '!default'
schemaValidation: true
validationFailureAction: Audit
webhookTimeoutSeconds: 10
hostnetwork-is-used
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
annotations:
meta.helm.sh/release-name: shturval-policies
meta.helm.sh/release-namespace: kyverno
policies.kyverno.io/category: infosec
policies.kyverno.io/description: 'Использование параметра hostNetwork позволяет
обойти требования сетевых политик, т.к. с точки зрения сетевого плагина рассматриваемый
pod находится в другой сети (сеть узла). '
policies.kyverno.io/severity: medium
policies.kyverno.io/title: hostNetwork is set to `true`
generation: 1
labels:
app.kubernetes.io/managed-by: Helm
managedFields:
- apiVersion: kyverno.io/v1
name: hostnetwork-is-used
spec:
admission: true
background: true
failurePolicy: Ignore
rules:
- match:
any:
- resources:
kinds:
- Pod
name: check-for-hostnetwork
skipBackgroundRequests: true
validate:
message: 'Использована сеть узлов для Pod. Рекомендуется удалить или отключить
параметр hostNetwork '
pattern:
spec:
=(hostNetwork): "false"
schemaValidation: true
validationFailureAction: Audit
webhookTimeoutSeconds: 10
master-tolerations-are-set
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
annotations:
meta.helm.sh/release-name: shturval-policies
meta.helm.sh/release-namespace: kyverno
policies.kyverno.io/category: infosec
policies.kyverno.io/description: 'Использование tolerations позволяет запускать
Pods на узлах, которые обладают соответствующими taints. Хорошей практикой считается
НЕ запускать Pods на ControlPlane узлах, которые по умолчанию обладают taints:
node-role.kubernetes.io/master:NoSchedule '
policies.kyverno.io/severity: Medium
policies.kyverno.io/title: Tolerations for scheduling on ControlPlane Nodes
generation: 1
labels:
app.kubernetes.io/managed-by: Helm
name: master-tolerations-are-set
spec:
admission: true
background: true
failurePolicy: Ignore
rules:
- match:
resources:
kinds:
- Pod
name: check-for-tolerations
skipBackgroundRequests: true
validate:
message: Обнаружены tolerations, запустившие Pod на ControlPlane-узле с taints
`node-role.kubernetes.io/control-plane:NoSchedule`
pattern:
spec:
=(tolerations):
- key: '!node-role.kubernetes.io/control-plane'
schemaValidation: true
validationFailureAction: Audit
webhookTimeoutSeconds: 10
secrets-in-env-var
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
annotations:
meta.helm.sh/release-name: shturval-policies
meta.helm.sh/release-namespace: kyverno
policies.kyverno.io/category: infosec
policies.kyverno.io/description: 'Секреты, указываемые в качестве переменных окружения
могут быть скомпрометированы. Рекомендуется использование сторонних систем (Secret
Management) для управления секретами. '
policies.kyverno.io/severity: High
policies.kyverno.io/title: secrets are stored in env vars
generation: 1
name: secrets-in-env-var
spec:
admission: true
background: true
failurePolicy: Ignore
rules:
- match:
any:
- resources:
kinds:
- Pod
name: check-for-secrets-in-env
skipBackgroundRequests: true
validate:
foreach:
- list: request.object.spec.[initContainers, containers][]
pattern:
=(env):
- =(valueFrom):
X(secretKeyRef): "null"
message: Обнаружены секреты в переменных окружения
schemaValidation: true
validationFailureAction: Audit
webhookTimeoutSeconds: 10
service-nodeport-used
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
annotations:
meta.helm.sh/release-name: shturval-policies
meta.helm.sh/release-namespace: kyverno
policies.kyverno.io/category: infosec
policies.kyverno.io/description: 'NodePort может быть использован для предоставления
доступа извне кластера к приложениям. Однако, такой подход не является примером
хороших практик и не может контролироваться при помощи NetworkPolicy. Рекомендуется
использование альтернатив - например, Ingress, для предоставления внешнего доступа
к приложениям кластера. '
policies.kyverno.io/severity: High
policies.kyverno.io/title: service type is set to NodePort
generation: 1
labels:
app.kubernetes.io/managed-by: Helm
name: service-nodeport-used
spec:
admission: true
background: true
failurePolicy: Ignore
rules:
- match:
any:
- resources:
kinds:
- Service
name: check-for-nodeport
skipBackgroundRequests: true
validate:
message: Обнаружен Service Type NodePort. Рекомендуется использовать Ingress
pattern:
spec:
type: '!NodePort'
schemaValidation: true
validationFailureAction: Audit
webhookTimeoutSeconds: 10
sysadmin-capabilities-used
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
annotations:
meta.helm.sh/release-name: shturval-policies
meta.helm.sh/release-namespace: kyverno
policies.kyverno.io/category: infosec
policies.kyverno.io/description: 'Указанная Linux Capability обладает крайне большими
полномочиями (согласно документации на Linux Capabilities: CAP_SYS_ADMIN - this
capability is overloaded, Don''t choose CAP_SYS_ADMIN if you can possibly avoid
it!). Большинство приложений не требуют наличия этой возможности. Поэтому надо
следить за тем, чтобы указанная capability появлялась как можно реже. Использование
ее возможностей может привести к ИБ-проблемам, в том числе "побегу" (escape)
из pod (container). '
policies.kyverno.io/severity: High
policies.kyverno.io/title: SYS_ADMIN capability added to container
generation: 1
labels:
app.kubernetes.io/managed-by: Helm
name: sysadmin-capabilities-used
spec:
admission: true
background: true
failurePolicy: Ignore
rules:
- match:
any:
- resources:
kinds:
- Pod
name: check-for-sysadmin-capabilities-enabled
skipBackgroundRequests: true
validate:
foreach:
- deny:
conditions:
any:
- key: SYS_ADMIN
operator: AnyIn
value: '{{ element.securityContext.capabilities.add || '''' }}'
list: request.object.spec.[initContainers, containers][]
message: Установлен параметр SYS_ADMIN в описании Capabilities у Container/InitContainer
schemaValidation: true
validationFailureAction: Audit
webhookTimeoutSeconds: 10