Skip to content

Deploy Osquery and Kubequery in Managed Service for Kubernetes (MK8S) in Yandex Cloud.

License

Notifications You must be signed in to change notification settings

yandex-cloud-examples/yc-mk8s-osquery-kubequery

Repository files navigation

osquery и kubequery в k8s

MVP

Version

Version-1.0

  • Changelog:
    • First version
  • Docker images:
    • cr.yandex/sol/osquery-ds:mvp
  • Helm chart:
    • cr.yandex/sol/osquery-ds-yc:0.1.0

Задача

Использовать osquery и kubequery в k8s кластере и отправлять результаты в SIEM (ELK, Splunk)

Вводная

Kubernetes logo

Osquery - инструмент, который позволяет получать информацию об ОС в формате SQL запросов. Решаемые задачи:

Kubernetes logo

Kubequery - инструмент от создателей osquery, который позволяет получать информацию из кластера k8s о действующей конфигурации:

  • api ресурсы
  • назначенные роли RBAC
  • инфо о политиках
  • инфо о секретах
  • др.

Подробнее с default sql запросами можно ознакомиться по ссылке

Проблемы

  • osquery не имеет примеров установки в k8s в виде daemonset в публичном доступе
  • инструменты не имеют встроенной возможности отправки результатов в SIEM (ELK, Splunk)

Схема решения

image source of image - https://github.com/Uptycs/kubequery

Развертывание

Osquery

Kubernetes logo

Установка osquery в k8s

Особенности установки в k8s:

  • Устанавливать osquery на k8s ноды логично в виде daemonset
  • osquery для корректной работы необходимо иметь доступ к директории k8s ноды "/proc" и иметь установленный флаг [hostPID=true] (https://github.com/BishopFox/badPods/tree/main/manifests/hostpid), но как выяснилось в результате теста этого недостаточно и при обращении изнутри контейнера к хостовой директории /proc контейнер все равно имеет доступ только к своим процессам. Это связано с особенностями /proc директории
  • По причине выше и результатам тестов было найдено решение: устанавливать контейнеру параметры: hostNetwork: true, hostPID: true, hostIPC: true, "hostPath:path: /" и выполнять из него chroot в хостовый namespace. Это влечет за собой риски связанные с привелигированным подом и выходом за пределы контейнера, которые могут быть минимизированы отдельным namespace с данным контейнером и правильным RBAC + policy engine, network policy, и др.
    Существуют 2 способа понизить привилегии контейнера:
    • устанавливать агент osquery не через k8s, а напрямую на ноды (трудности в администрировании)
    • одна команда в статье упоминает, что справилась с этой задачей разработав свой кастомный extension используя osquery-go и в нем изменили default folder с /proc на /host/proc тем самым требуется лишь монтирование данного фолдера без привелегий Необходим research

Установка компонентов osquery в k8s

Развернуть для просмотра..........⬇️

Подготовленная конфигурация включает:

  • основной конфиг osquery с включенным:
    • контролем целостности критичных k8s nodes файлов (согласно CIS Benchmark)
    • включенными osquery packs: "incident response", "vuln-management"
    • включенным proccess events
  • конфиг со скриптом, который проверяет наличие osquery бинарника на k8s ноде и при необходимости копирует его и запускает
  • network policy, которые по умолчанию запрещают весь входящий и исходящший траффик namespace "osquery"

Прериквизиты:

Установка с помощью helm:

  • скачайте values.yaml:
helm inspect values oci://cr.yandex/sol/osquery-ds-yc --version 0.1.0 > values.yaml
  • при необходимости кастомизируйте конфигурацию в файле либо задайте параметры при установке
  • выполгните установку с параметрами:
helm install osquery-ds-yc \
oci://cr.yandex/sol/osquery-ds-yc --version 0.1.0 \
 --namespace osquery \
--create-namespace \
-f values.yaml \
--set osqueryArgs="--verbose --disable_events=false --enable_file_events=true --disable_audit=false --audit_allow_config=true --audit_persist=true --audit_allow_process_events=true"
    • для включения eBPF proccess events добавьте флаг "--enable_bpf_events=true" и обращайтесь к таблице "bpf_process_events". Подробнее в док

Установка с помощью kubectl apply:

  • скачайте файлы репозитория
git clone https://github.com/yandex-cloud/yc-solution-library-for-security.git 
  • перейдите в папку
cd /yc-solution-library-for-security/kubernetes-security/osquery-kubequery/osquery-install-daemonset/ 
  • при необходимости кастомизируйте файлы: configmap-config.yaml, configmap-pack_conf.yaml
  • выполните команду
kubectl apply -f ./ns.yaml 
kubectl apply -f ./
  • TBD: создание helm chart

Отправка результатов в SIEM

Отправка результатов в SIEM выполняется по схеме Using a node logging agent

Отправка результатов в ELK
Kubernetes logo
Развернуть для просмотра..........⬇️

image

Для отправки в ELK используется filebeat. Filebeat имеет встроенный модуль osquery. Устанавливается с помощью helm-chart.

Прериквизиты:

Установка компонентов в k8s

  • перейдите в папку
cd /yc-solution-library-for-security/kubernetes-security/osquery-kubequery/filebeat-helm/
  • скачайте сертификат Managed Elastic сервиса (общий для всех)
mkdir ~/.elasticsearch && \
wget  "https://storage.yandexcloud.net/cloud-certs/CA.pem" -O ~/.elasticsearch/root.crt && \
chmod 0600 ~/.elasticsearch/root.crt
cp ~/.elasticsearch/root.crt ./elastic-certificate.pem
  • создать секрет с сертификатом ELK в кластере k8s
kubectl create secret generic elastic-certificate-pem --from-file=./elastic-certificate.pem
  • создать секрет с credentials ELK в кластере k8s (заменить на свои)
kubectl create secret generic security-master-credentials --from-literal=username=admin --from-literal=password=P@ssword
  • подготовить существующий в папке файл ./values.yaml (отредактикровать)
задать имя elk хоста
extraEnvs:
    - name: "ELASTICSEARCH_HOSTS"
      value: "c-c9qfrs7u8i6g59dkb0vj.rw.mdb.yandexcloud.net:9200"
при необходимости поменять конфигурационный файл
  • установить helm chart с указанием модифицированного helm файла values
helm repo add elastic https://helm.elastic.co

helm install filebeat elastic/filebeat -f values.yaml
  • проверить наличие записей в базе ELK в индексе filebeat-osquery (создать index pattern)
  • в elastic появится index "filebeat-osquery"
  • TBD: создание отделього dashboard в ELK для osquery (установленные пакеты, шел команды, открытые порты, версии ос и нод и т.д.)
Отправка результатов в Splunk
Kubernetes logo
Развернуть для просмотра..........⬇️

image

Для отправки в Splunk используется fluentd splunk hec plugin. Устанавливается с помощью helm-chart.

Прериквизиты:

  • развернутый Splunk
  • настроенный HTTP Event Collector
  • HEC Токен для отправки событий

Установка компонентов в k8s

  • перейдите в папку
cd /yc-solution-library-for-security/kubernetes-security/osquery-kubequery/fluentsplunk-helm/
  • подготовить существующий в папке файл ./values.yaml (отредактикровать) либо скачать исходный
задать имя splunk хоста
splunk:
  hec:
    host: 51.250.7.127 (укажите ваше значение)
  • установить helm chart с указанием файла ./values.yaml , вашего HEC Token и настройками SSL
helm install my-splunk-logging -f values.yaml --set splunk.hec.insecureSSL=true --set splunk.hec.token=<your token> --set splunk-kubernetes-logging.fullnameOverride=splunk-logging https://github.com/splunk/splunk-connect-for-kubernetes/releases/download/1.4.5/splunk-kubernetes-logging-1.4.5.tgz

Kubequery

Kubernetes logo

Установка kubequery в k8s

Особенности установки в k8s: Kubequery устанавливается в k8s в виде Deployment с помощью helm chart.
Результаты kubequery записываются в папку пода: "/opt/uptycs/logs/osqueryd.results.log*".

Для отправки результатов работы kubequery в SIEM необходимо изменить конфигурацию helm chart путем добавления дополнительного sidecar container с агентом SIEM. Схема Sidecar container with a logging agent

Установка kubequery с filebeat sidecar для отправки в ELK
Развернуть для просмотра..........⬇️

image

  • перейдите в папку
cd /yc-solution-library-for-security/kubernetes-security/osquery-kubequery/kubequery/kubequery-with-elastic-filebeat/
  • создайте namespace
kubectl create ns kubequery
  • скачайте сертификат Managed Elastic сервиса (общий для всех)
mkdir ~/.elasticsearch && \
wget  "https://storage.yandexcloud.net/cloud-certs/CA.pem" -O ~/.elasticsearch/root.crt && \
chmod 0600 ~/.elasticsearch/root.crt
cp ~/.elasticsearch/root.crt ./elastic-certificate.pem
  • создать секрет с сертификатом ELK в кластере k8s
kubectl create secret generic elastic-certificate-pem --from-file=./elastic-certificate.pem -n kubequery
  • создать секрет с credentials ELK в кластере k8s (заменить на свои)
kubectl create secret generic security-master-credentials --from-literal=username=admin --from-literal=password=P@ssword -n kubequery
  • указать в файле ./configmap-filebeat.yaml значение output.elasticsearch: hosts: "c-c9qfrs7u8i6g59dkb0vj.rw.mdb.yandexcloud.net:9200" (ваше значение)
  • скачать файлы helm-chart командой
git clone https://github.com/Uptycs/kubequery.git
  • копируем заготовленные файлы в папку чарта
cp ./*.yaml ./kubequery/charts/kubequery/templates/
  • удаляем файл создания ns из папки чарта
rm ./kubequery/charts/kubequery/templates/namespace.yaml
  • в файле ./kubequery/charts/kubequery/values.yaml указать значение имени кластера cluster: mycluster
  • установить helm chart из локальной рабочей папки
helm install my-kubequery ./kubequery/charts/kubequery/ 
  • в elastic появится index "filebeat-kubequery"
  • ** TBD: создание helm chart для удобства и contribute его в kubequery **
Установка kubequery с fluentd sidecar для отправки в Splunk
Развернуть для просмотра..........⬇️

image

  • перейдите в папку
cd /yc-solution-library-for-security/kubernetes-security/osquery-kubequery/kubequery/kubequery-with-splunk/
  • создайте namespace
kubectl create ns kubequery
  • создаем секрет для хранения HEC токена
kubectl create secret generic splunk-hec-secret --from-literal=splunk_hec_token=<your token> -n kubequery
  • указать в файле ./configmap-fluentd.yaml значение hec_host "51.250.7.127" (ваш адрес) и host "my-cluster" (имя кластера)
  • скачать helm-chart командой
git clone https://github.com/Uptycs/kubequery.git
  • копируем заготовленные файлы в папку чарта
cp ./*.yaml ./kubequery/charts/kubequery/templates/
  • удаляем файл создания ns из папки чарта
rm ./kubequery/charts/kubequery/templates/namespace.yaml
  • установить helm chart из локальной рабочей папки
helm install my-kubequery ./kubequery/charts/kubequery/ 
  • ** TBD: создание helm chart для удобства и contribute его в kubequery **

About

Deploy Osquery and Kubequery in Managed Service for Kubernetes (MK8S) in Yandex Cloud.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published