MVP
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)
Osquery - инструмент, который позволяет получать информацию об ОС в формате SQL запросов. Решаемые задачи:
- Query configs, OS/device settings, proccess, open ports, packets
- File Integrity Monitoring with osquery
- Reading syslog with osquery
- Anomaly detection with osquery
- Process and socket auditing with osquery (включая eBPF)
- Сбор Информации о containers на хосте)
- др.
Kubequery - инструмент от создателей osquery, который позволяет получать информацию из кластера k8s о действующей конфигурации:
- api ресурсы
- назначенные роли RBAC
- инфо о политиках
- инфо о секретах
- др.
Подробнее с default sql запросами можно ознакомиться по ссылке
- osquery не имеет примеров установки в k8s в виде daemonset в публичном доступе
- инструменты не имеют встроенной возможности отправки результатов в SIEM (ELK, Splunk)
source of image - https://github.com/Uptycs/kubequery
Особенности установки в 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"
Прериквизиты:
- развернутый кластер Managed Service for Kubernetes
Установка с помощью 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 выполняется по схеме Using a node logging agent
Развернуть для просмотра..........⬇️
Для отправки в ELK используется filebeat. Filebeat имеет встроенный модуль osquery. Устанавливается с помощью helm-chart.
Прериквизиты:
- развернутый кластер Managed Service for Elasticsearch
- credentials от кластера
Установка компонентов в 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 используется 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
Особенности установки в 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
Развернуть для просмотра..........⬇️
- перейдите в папку
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 **
Развернуть для просмотра..........⬇️
- перейдите в папку
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 **