• Твой профиль заполнен на 0%. Заполни за 1 минуту, чтобы тебя нашли единомышленники и работодатели. Заполнить →

Статья KubeBench vs Kubescape: Сравнение инструментов для аудита конфигурации K8s (CIS Benchmarks)

1776282664907.webp

Запускаешь kube-bench на свежем кластере kubeadm - и получаешь длинный список FAIL: права на файлы, флаги API server, настройки kubelet, отсутствие журнала аудита. Запускаешь на том же кластере Kubescape по CIS - и видишь уже другой набор проблем: RBAC, securityContext, NetworkPolicy, сервисные аккаунты, манифесты. Оба инструмента вроде бы проверяют Kubernetes по CIS Benchmark. Но отвечают на разные вопросы и смотрят на кластер с разных сторон.

Из-за этого их постоянно ставят в один ряд и ждут от них одинакового результата. Дальше начинается разочарование: один не показывает то, что команда ждала увидеть в манифестах, второй не даёт той точности, которую хотелось бы получить по control plane и worker node. Проблема не в инструментах. Проблема в ожиданиях. kube-bench и Kubescape не дублируют друг друга. Они работают на разных слоях.

Аудит Kubernetes по CIS Benchmark​

CIS Kubernetes Benchmark​

CIS Kubernetes Benchmark - это базовый набор рекомендаций по безопасной конфигурации кластера. Без пафоса и без лишней теории: документ нужен, чтобы быстро пройтись по типовым ошибкам, которые в Kubernetes всплывают снова и снова. Флаги запуска, права на файлы, настройки kubelet, RBAC, сетевые политики, ограничения безопасности для pod'ов, работа с секретами - всё это уже давно описано, и именно это чаще всего остаётся в кластере недокрученным.

Проверки там разбиты на несколько крупных блоков:
  • управляющие компоненты - API server, controller manager, scheduler, etcd;
  • рабочие узлы - kubelet, kubeconfig, права на системные файлы;
  • политики - RBAC, ограничения безопасности, NetworkPolicy, управление секретами.
У рекомендаций есть уровни. Level 1 обычно можно включать без серьёзного риска для рабочих нагрузок. Level 2 уже жёстче и иногда начинает конфликтовать с тем, как кластер реально используется. Часть проверок автоматизируется, часть нет.

С управляемыми кластерами отдельная история. В EKS, AKS и GKE управляющая плоскость принадлежит провайдеру, и обычный аудит control plane там невозможен. Это важная оговорка, потому что без неё сравнивать инструменты становится бессмысленно: часть проверок просто неприменима.

Зачем вообще сравнивать kube-bench и Kubescape​

Оба инструмента фигурируют в разговорах про CIS, оба выдают отчёты, оба давно стоят в чеклистах Kubernetes-аудита. Отсюда и путаница. Kube-bench проверяет то, что живёт на узле: процессы, флаги, системные файлы, права доступа, локальную конфигурацию. Kubescape работает через Kubernetes API, манифесты и наборы политик. Его сильная сторона - не узел, а сами объекты кластера. На одном и том же кластере они закономерно покажут разные проблемы. И это как раз нормально.

kube-bench: аудит конфигурации на уровне узла​

Как устроен kube-bench​

kube-bench - инструмент от Aqua Security. Его логика очень простая: взять проверку из CIS Benchmark и воспроизвести её на узле. Если в бенчмарке сказано проверить флаг kube-apiserver, kube-bench ищет процесс и разбирает параметры запуска. Если сказано проверить права на файл, он делает stat. Если нужно найти конфигурацию в конкретном месте, он идёт в этот путь и смотрит, что там реально лежит.

Проверки описаны в YAML. За счёт этого сам инструмент остаётся довольно прямым, а набор правил можно обновлять под новые редакции бенчмарка и разные дистрибутивы Kubernetes.

Типичная проверка выглядит так:
YAML:
- id: 1.2.1
  text: "Ensure that the --anonymous-auth argument is set to false"
  audit: "/bin/ps -ef | grep kube-apiserver | grep -v grep"
  tests:
    test_items:
    - flag: "--anonymous-auth"
      compare:
        op: eq
        value: "false"
  remediation: |
    Edit the API server pod specification file
    /etc/kubernetes/manifests/kube-apiserver.yaml
    and set the below parameter.
    --anonymous-auth=false
  scored: true
Это и есть нормальная зона kube-bench: буквальный аудит узла без попытки натянуть сверху ещё один уровень абстракции.

Установка: Job, DaemonSet, выбор целей​

Самый привычный запуск - через Job в самом кластере:
Bash:
kubectl apply -f https://raw.githubusercontent.com/aquasecurity/kube-bench/main/job.yaml
kubectl logs job/kube-bench
Такой pod получает доступ к пространству процессов хоста и к системным каталогам. Иначе kube-bench не увидит ни манифесты управляющих компонентов, ни конфигурацию kubelet, ни права на нужные файлы.

Если нужен не полный прогон, а точечная проверка, можно запускать аудит по целям:
Bash:
# Только control plane
kube-bench run --targets master

# Только worker node
kube-bench run --targets node

# Конкретный профиль бенчмарка
kube-bench run --benchmark cis-1.24
Для кластеров, где нужен охват всех узлов, вместо одиночного Job обычно используют DaemonSet. Это уже не про разовый аудит, а про регулярный прогон по всей среде.

Проверки: control plane, worker node, policies​

Именно здесь хорошо видно, где kube-bench силён, а где уже нет.

Сильная сторона:
  • флаги запуска API server, controller manager, scheduler, etcd;
  • права на файлы;
  • конфигурация kubelet;
  • локальные параметры на узле;
  • всё, что видно через процессы и файловую систему.
Слабая сторона:
  • RBAC как система ролей и привязок;
  • pod'ы и их securityContext;
  • NetworkPolicy;
  • манифесты до развёртывания;
  • связки между объектами через API.
Формально в CIS есть разделы, связанные с политиками, но модель kube-bench всё равно остаётся хостовой. Он не был сделан как глубокий анализатор объектов Kubernetes.

Форматы вывода: JSON и JUnit​

С выводом у kube-bench всё прямолинейно. По умолчанию это человекочитаемый текст. Для автоматизации есть JSON и JUnit.

Текстовый вывод выглядит так:
Код:
[FAIL] 1.2.6 Ensure that the --kubelet-certificate-authority argument is set (Automated)
[PASS] 1.2.7 Ensure that the --authorization-mode argument is not set to AlwaysAllow (Automated)
[WARN] 1.2.8 Ensure that the --authorization-mode argument includes Node (Manual)
Такой формат удобен, когда результат смотрит человек, который знает, где лежит файл и какой флаг ему надо менять. Для CI/CD обычно удобнее JSON или JUnit.

Kubescape: аудит через API, политики и манифесты​

Как устроен Kubescape​

Kubescape смотрит на кластер иначе. Не через процессы и файлы на узле, а через Kubernetes API, манифесты и наборы политик. Это уже другой тип аудита.

Если kube-bench отвечает на вопрос “что реально настроено на хосте”, то Kubescape отвечает на вопрос “какие объекты в кластере и в манифестах уже создают риск”.

Базовый запуск выглядит так:
Bash:
# Полное сканирование
kubescape scan

# Только CIS
kubescape scan framework cis-v1.23-t1.0.1

# Только NSA
kubescape scan framework nsa

# Конкретный контрол
kubescape scan control C-0005 -v

Фреймворки: CIS, NSA, MITRE​

CIS для Kubescape - только один из наборов проверок. Помимо него есть NSA-CISA, MITRE ATT&CK for Containers и другие профили.

Это не косметика. Один и тот же кластер можно смотреть как на среду, которая должна соответствовать базовым рекомендациям CIS, как на инфраструктуру, которую надо усиливать по NSA, и как на атакуемую систему, где полезно видеть риск через MITRE ATT&CK. Kubescape закрывает эти сценарии в одном инструменте.

Расширенные проверки​

Kubescape заметно сильнее там, где проблема живёт не в файле на узле, а в самом объекте Kubernetes.

Он глубже работает с тем, что видно через API:
  • RBAC и избыточные привилегии;
  • ServiceAccount и автомонтирование токенов;
  • securityContext;
  • запуск от root;
  • privileged, hostNetwork, hostPID;
  • NetworkPolicy;
  • проверка YAML до развёртывания;
  • анализ образов.
Именно поэтому его так часто используют в связке с CI/CD. Он полезен ещё до появления ресурса в кластере.

Когда аудит уже показывает, что в кластере живут pod'ы без securityContext, слишком широкие роли и манифесты с плохими настройками, следующий вопрос обычно не “как это найти”, а “как это больше не пропускать”. Углубиться в эту тему вам поможет статья: Kubernetes Admission Controllers: Использование Kyverno для enforcement security policies.

Head-to-Head Comparison​

Coverage: кто что реально покрывает​

Если говорить про control plane и worker node, kube-bench обычно точнее. Он лучше чувствует флаги, права на файлы, системную конфигурацию и всё, что живёт на уровне узла.

Если говорить про RBAC, pod'ы, securityContext, NetworkPolicy, сервисные аккаунты и YAML до деплоя, сильнее выглядит Kubescape.

Поэтому вопрос “кто лучше проверяет CIS” без уточнения слоя бесполезен. Они покрывают один и тот же бенчмарк, но разными способами и на разной глубине.

Скорость выполнения​

kube-bench почти всегда быстрее. Это набор локальных проверок: процессы, файлы, права доступа.

Kubescape тяжелее, потому что у него больше контекста: API, объекты, политики, иногда ещё и образы. Цена охвата здесь выше.

Формат отчётов​

У kube-bench отчёт сухой и прямой: PASS, FAIL, WARN, INFO, рекомендация по исправлению.

У Kubescape отчёт удобнее для тех, кто чинит манифесты и объекты кластера. Он группирует замечания по контролам и ресурсам, лучше привязывает проблему к конкретному объекту, а не только к номеру проверки.

Если проблему исправляет инженер, работающий с узлом, kube-bench часто понятнее. Если проблему чинит команда, работающая с YAML и объектами через Git, удобнее Kubescape.

Extensibility​

kube-bench расширяется через YAML-описания проверок. Это удобно, когда нужно добавить ещё одну проверку файла, флага или режима доступа. Порог входа невысокий, но и возможности на этом уровне заканчиваются быстро.

Kubescape расширяется через политики. Порог входа выше, но и логика проверок может быть заметно сложнее: связи между объектами, собственные требования к конфигурации, внутренние правила платформы.

Интеграция в CI/CD​

kube-bench в GitHub Actions​

kube-bench в конвейере обычно нужен не на каждый pull request, а как периодический аудит уже работающего кластера.
YAML:
name: CIS Benchmark
on:
  schedule:
    - cron: '0 6 * * 1'
jobs:
  kube-bench:
    runs-on: self-hosted
    steps:
      - name: Run kube-bench
        run: |
          kubectl apply -f https://raw.githubusercontent.com/aquasecurity/kube-bench/main/job.yaml
          kubectl wait --for=condition=complete job/kube-bench --timeout=120s
          kubectl logs job/kube-bench > results.txt
          kubectl delete job kube-bench
      - name: Upload results
        uses: actions/upload-artifact@v4
        with:
          name: cis-benchmark
          path: results.txt
Такой сценарий хорошо работает для регулярной проверки среды, но бесполезен на этапе анализа манифестов до развёртывания. kube-bench просто не про это.

Kubescape в GitLab CI​

Kubescape как раз хорошо ложится на раннюю проверку:
YAML:
cis_scan:
  stage: security
  image: quay.io/kubescape/kubescape-cli:latest
  script:
    - kubescape scan framework cis
        --format junit
        --output results.xml
        --compliance-threshold 80
  artifacts:
    reports:
      junit: results.xml
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
Для сканирования манифестов:
YAML:
manifest_scan:
  stage: lint
  image: quay.io/kubescape/kubescape-cli:latest
  script:
    - kubescape scan $CI_PROJECT_DIR/k8s/
        --format sarif
        --output results.sarif
Здесь разница между инструментами проявляется максимально чётко. Один проверяет уже работающий узел. Второй может остановить плохую конфигурацию до деплоя.

Пороги качества​

У Kubescape порог качества встроен в сам запуск. Можно задать минимальный уровень соответствия и уронить конвейер, если он не достигнут.

У kube-bench такой логики нет. Там придётся парсить JSON, считать количество FAIL или WARN и уже отдельно решать, что считать проходным результатом.

Исправление типовых недочетов​

Пять самых частых находок

Ниже - пять замечаний, которые всплывают почти в каждом аудите.

1. В API server не отключён anonymous-auth
Это одна из самых частых проблем из отчётов kube-bench. Сам по себе system:anonymous ещё не гарантирует беду, но в сочетании со слишком широкой RBAC-привязкой быстро превращается в реальный риск.

2. У kubelet слабый режим авторизации
Тут регулярно всплывает authorization-mode, который должен быть жёстче.
YAML:
authorization:
  mode: Webhook
3. Поды живут без securityContext
Это уже типовая территория Kubescape: запуск от root, корневая файловая система на запись, не отключено повышение привилегий, capabilities не сброшены.
YAML:
securityContext:
  runAsNonRoot: true
  readOnlyRootFilesystem: true
  allowPrivilegeEscalation: false
  capabilities:
    drop:
      - ALL
4. Нет журнала аудита
Пока инцидента не было, это выглядит как скучная рекомендация. После инцидента выясняется, что расследовать почти нечего.
YAML:
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
  - level: Metadata
    resources:
      - group: ""
        resources: ["secrets", "configmaps"]
  - level: RequestResponse
    resources:
      - group: "rbac.authorization.k8s.io"
        resources: ["clusterroles", "clusterrolebindings"]
  - level: Metadata
    omitStages:
      - RequestReceived
5. Namespace без NetworkPolicy
Без NetworkPolicy трафик между pod'ами часто разрешён по умолчанию. Один скомпрометированный pod быстро превращается в точку движения по кластеру.
YAML:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
  namespace: production
spec:
  podSelector: {}
  policyTypes:
    - Ingress

С NetworkPolicy всё быстро упирается не в сам YAML, а в устройство сетевого слоя кластера: как применяются политики, что видно на L3/L4, где появляется L7, и насколько вообще удобно сопровождать сегментацию в живой среде. Подробнее об этом узнаете в статье: "Cilium vs Calico: Сравнение CNI-плагинов с точки зрения безопасности и eBPF".

Что в итоге​

kube-bench и Kubescape не конкурируют напрямую. Один полезен там, где надо быстро и точно пройтись по узлу, control plane, флагам запуска и правам на файлы. Второй сильнее там, где проблема живёт в объектах Kubernetes: RBAC, securityContext, NetworkPolicy, сервисные аккаунты и манифесты до деплоя.

Если нужен один практический вывод, он простой: kube-bench закрывает хостовый слой, Kubescape - слой API и декларативной конфигурации. В живом кластере этого почти всегда хватает, чтобы не спорить, какой инструмент “лучше”, а выбрать нормальную комбинацию под свою среду.

CIS Benchmark на этом не заканчивает разговор о безопасности, а только убирает самые типовые ошибки. Дальше всё упирается в то, что реально запущено в кластере, кто имеет доступ, как устроены сетевые границы и насколько быстро команда вообще увидит, что один pod однажды получил больше, чем должен.
 
Последнее редактирование:
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab