k8s (in)security – Telegram
k8s (in)security
12.1K subscribers
1.01K photos
38 files
1.56K links
Канал о (не)безопасности Kubernetes + микросервисных, контейнеризированных приложений.

Ведет команда www.luntry.ru

Вопросы, идеи, предложения => @Qu3b3c

https://knd.gov.ru/license?id=673ddbc21039886b1d03b7ce&registryType=bloggersPermission
Download Telegram
Интересный доклад "Keeping Up with the CVEs! How to Find a Needle in a Haystack?" с Kubecon North America 2021 о том как Kubernetes в distroless образы переезжал и что вышло.

Что можно там полезного найти для себя:
- Понять крутость distroless образов
- Ознакомиться с опросом коммунити на тему Cloud Native Security (все результаты тут)
- Уловить четкую мысль "Zero Trust == Secure in spite of CVEs"
- Узнать как разработчики k8s подошли к задаче "Rebase Kubernetes Main Master and Node Images to Distroless/static"
- Получить Software Bill of Materials (SBOM) для Kubernetes 1.22.1 (прямая ссылка)
- Как быть если distroless для вас не вариант ...

В общем будет интересно и полезно всем, кто устал от бесконечного вывода CVE от Trivy/Clair/Anchore! И не забываем про мой прошлый цикл постов о сканировании образов ;)
Пентестерам (на самом деле и не только) на заметку статья "Как открыть TCP-/UDP-сокет средствами командной оболочки bash". Может быть полезно, когда попали в контейнер и нужно поработать с сетью, а любимых netcat, curl и wget нет и поставить нельзя ...

На помощь идут файловые устройства /dev/tcp и /dev/udp ;)

А если вы хотите не оставлять такую лазейку в своих контейнерах с bash внутри, то надо собрать его без флага --enable-net-redirections.
Интересно, а многие еще собирают образы в Kubernetes через проброс docker.sock unix socket внутрь контейнера или все уже перешли на Kaniko?)

А если вас удивляет сама постановка такого вопроса и что в этом плохого, то рекомендую почитать статью "Building Docker Images in Kubernetes Using Kaniko".

P.S. Или вам ближе buildah, BuildKit, BuildPacks, Img, PouchContainer?

P.S.S. Удобный скрипт kubectl-build
Если вы планировали провести эти выходные с пользой, то как раз для вас CNCF выложил записи докладов с недавно прошедших своих сессий KubeCon + CloudNativeCon North America 2021:

- KubeCon + CloudNativeCon North America 2021
- Cloud Native Security Conference North America 2021
- EnvoyCon North America 2021
- SupplyChainSecurityCon hosted by CNCF + CDF 2021
- Production Identity Day: SPIFFE + SPIRE North America 2021
- Cloud Native eBPF Day North America 2021
- GitOpsCon North America 2021
- Cloud Native DevX Day North America 2021
- ServiceMeshCon North America 2021
- Kubernetes AI Day North America 2021
- Cloud Native Wasm Day North America 2021
- FluentCon North America 2021

Всем хороших выходных!


P.S. Такой же playlist с KubeCon + CloudNativeCon Europe 2021
Так как я занимаюсь не только темой security, но и observability, которая позволяет и ту же security строить от себя (а не от возможностей атакующих) и повышать realibility, и упрощать troubleshooting - тема организации приложений (applications) в Kubernetes кластере мне очень интересна.

Разработчик пишет код, который далее упаковывается в контейнер и обворачивается в Kubernetes ресурс. Для разработчика может быть workload минимальной единицей приложения и его зоной ответственности. Когда для SRE это может быть набор workloads с определенными метками.

Две статьи на эту тему “The Guide to Kubernetes Labels” и “Recommended Labels”.

При этом, общаясь с разными компаниями, я вижу очень разные картины (двух одинаковых компаний не встретить). У кого-то для выделения приложений используются отдельные namespaces, у кого-то это специальная annotations или labels.

Как вы у себя выделяете и управляете приложениями?
Неожиданно для себя обнаружил, что 4 дня назад закончилась поддержка Kubernetes 1.19 (как летит время) и сейчас поддерживаются только 1.20, 1.21 и 1.22.

Чтобы это не было неожиданностью, можно использовать проект endoflife.date, который отслеживает актуальность версий более 60 проектов, включая Kubernetes.

Старайтесь использовать только последние версии из поддерживаемых, чтобы вы всегда могли получить применить последние исправления и улучшения.
Все чаще сталкиваюсь с вопросом у клиентов: "Как сделать Kubernetes кластер, чтобы он соответствовал PCI DSS?"

Я уже эту тему немного поднимал [1,2,3], но со временем понял, что лучше всего это знают большие компании с большим количеством клиентов, а следовательно, и опытом в этой области. А кто под это подходят? Конечно, облачные провайдеры с managed Kubernetes! По сути, можно не ломать голову и не придумывать ничего с нуля, а подсмотреть как они к этому подходят и перенять к себе.

Так вы можете с этим ознакомится в их мануалах и документах:
- "PCI DSS compliance on GKE"
- "Architecting Amazon EKS for PCI DSS Compliance"
- "Introduction of an AKS regulated cluster for PCI-DSS 3.2.1"

P.S. И не забываем также о классном проекте Compliance Operator ;)
Интересный плагин argocd-vault-plugin для ArgoCD был представлен на последнем Kubecon.

Его идея в том, что чтобы полностью соответствовать принципам GitOps, необходимо чтобы и секреты находилось в репозитории. Но у классических ресурсов Secret есть проблема, что они содержат данные в base64 (считай в открытом виде), что естественно очень плохо для безопасности.

В итоге, плагин позволяет в классическом ресурсе Secret разместить не данные а placeholder для секретных данных, а уже при выкатки данного Secret ваш GitOps оператор в лице ArgoCD, возьмет соответствующие данные для заявленного placeholder из Secret Management tools и подставит их туда, таким образом, что Kubernetes и не заметит подмены ;)

Подробнее можно посмотреть в видео или в слайдах данного выступления "Shh, It’s a Secret: Managing Your Secrets in a GitOps Way".
Коротенькая блоговая запись с говорящим названием "Fun with CRDs - Overwriting core types".

Вы, наверное, уже поняли автор задался вопросом что будет если создать с помощью CRD тип ресурса из Core API. В качестве пример автор берет ресурс NetworkPolicy из networking.k8s.io.

Как по мне хорошая и легкая тема для этой пятницы ;)

P.S. Спойлер: Core API нашего любимого Kubernetes вы не сломаете, но вот часть инструментов, работающих с ним вывести из строя можно =) Так что следите за тем кому вы даете в RBAC возможность создавать CRD.
Нашел очень достойную подборку разных техник побега из контейнера с примерами и описанием, среди которых:
- CVE (уязвимости container runtime и linux kernel)
- Exposed Docker Socket
- Excessive Capabilities
- Host Networking Driver
- Sensitive Mounts

Это актуально и для Kubernetes. Для пентестеров будет полезно знать, как можно нарушить изоляцию контейнеров, а для security team, что надо харденить.
Совсем недавно пришлось немного поработать с таким Container Runtime для Kubernetes как kata-containers. Если кто не слышал о таком, то его отличительной чертой является то, что вместо классического Linux контейнера, он запускает microVM и базируется на Kernel-based Virtual Machine (KVM).

Что важно о нем знать:
1) На выбор он предлагает аж 4 hypervisor: ACRN, Cloud Hypervisor, Firecracker и QEMU.
2) Если хотите с этим работать в VM (касается сразу всех managed Kubernetes), то должна быть активирована nested virtualization. И этого я не нашел ни у кого в managed k8s услугах.

Как можно поиграться с этим дома на VM или на bare metal в AWS или GCP можно посмотреть в статье "Setting up a Development Environment for Firecracker".

Так что будьте внимательны если засматриваетесь на данный Container Runtime и помните что можно работать сразу с несколькими рантаймами.

P.S. Напомню про пост про побег из Kata ;)
Это прошло как-то мимо меня, но у Falco появился конкурент в лице инструмента Tracee, который также базируется на eBPF и на правилах. Правила только пишутся на языке Rego (тот же что используется и в OPA).

О запуске в Kubernetes можно почитать в серии статей [1,2]. Правил пока немного и по мне они пока более простые, но при этом смапленные на "MITRE ATT&CK".

Хотя правила такие же бестолковые и требуют хорошей ручной доработки (которую все равно можно легко обойти). На пример, правило про K8S Service Account Token, требует, чтобы вы прописали все имена процессов, которым это разрешено. Для обхода достаточно залить свой файл с именем kube-proxy или coredns =) Есть правила которые почти как под копирку взяты из Falco - на пример про shell [1,2].

Также есть собственная утилита для алертинга Postee, аналог Falcosidekick. При этом можно сообщения слать сразу на второй, что может упростить использование этих двух решений одновременно, если кто-то так захочет.
На просторах GitHub нашел наиинтереснейший проект с Jupyter notebooks для Kubernetes Security trainings!

Описание самого тренинга можно посмотреть в этом файле и состоит он из трех частей:
- Introduction
- Networks
- Hardening Kubernetes

Все происходит в Jupyter notebooks (это бомба) и крутиться на minikube. Несколько сценариев можно посмотреть в вебинаре автора "Kubernetes Security: Hacking Containers". Там он, на пример, показывает (достаточно своеобразно) как можно обойти ограничения Istio Egress Control, через переопределение iptables (как тут).

В общем, если хотите дома просто попрактиковаться в безопасности Kubernetes это хороший старт!
Как всегда, по пятницам в преддверии выходных я стараюсь сделать максимально легкий, развлекательный пост или устроить какой-нибудь опрос.

И в этот раз хочется узнать почему некоторые люди говорят: "Kubernetes дырявый", "Kubernetes не безопасный" и т.д. Лично я так не считаю, и хотел бы понять какие мысли, факты в это вкладываются.

Можете написать почему (не вы а) ваш друг/товарищ так считает или где-то слышали такое мнение ;)

Всем хороших выходных!
В официальной документации Kubernetes появилось 3 новых раздела посвящённых PodSecurity Admission Controller (замена PSP для тех, кто запамятовал):
1) "Enforce Pod Security Standards by Configuring the Built-in Admission Controller" - про настройку этого Admission Controller
2) "Enforce Pod Security Standards with Namespace Labels" - о том как правильно работать с labels для namespaces для работы данного механизма
3) "Migrate from PodSecurityPolicy to the Built-In PodSecurity Admission Controller" - как правильно перейти с PSP (если вы его сейчас используете) к PSA

Ознакомившись с ними, я как-то даже более сдержаннее начал относится к данной замене (раньше вообще ее не понимал). Возможно это действительно неплохой механизм, который прямо автоматом можно накручивать на только что созданный кем-то namespaces в каком-нибудь dev/test/stage кластере, не переживая во всех (в каких?) ли Rego и YAML правилах от Policy Engines нужно вносить какие-то правки/уточнения. Но все также это не отменяет и не заменяет использование Policy Engines.
У Policy Engine под названием Kyverno появился новый тип правил под названием "Verify Images" - как не трудно догадаться из названия данный тип правил нужен для проверки сигнатур образов, а также что менее очевидно заменять tag на digest образа (зачем это - я писал тут).

Под капотом для верификации сигнатур образов контейнеров используется крутой проект Cosign.

По мне очень простая и удобная реализация получилась у ребят:
0) Генерируете ключи с помощью cosign
1) В pipeline с помощью cosign подписываете образа
2) Создаете Kyverno ресурс ClusterPolicy (YAML) с правилом внутри verifyImages, указав к каким образам контейнеров, какой ключ при проверки применять.
3) Применяете созданный ресурс в кластере

Можно ли проще?)
На днях обновился популярный инструмент для проведения пентеста Kubernetes инфраструктуры - речь идет о Peirates (его и злоумышленники любят).

Основные нововведения этого релиза возможность автоматизировано собрать Secrets с файловой системы Nodes. А именно он лезет в /var/lib/kubelet/pods/. Вручную это делать - достаточно муторная и неприятная задачка ... Естественно так или иначе сначала нужно попасть на эту Node ;)

Также вторая это фича "Enumerate services via DNS" - реализуется через запрос SRV записи any.any.svc.cluster.local (об этом мы уже писали). Мы уже с вами знаем как DNS всемогущ в Kubernetes =)

Все написано на Go сами собираете называете как-то в духе "nginx", "kubelet", "runc" и передаете горячий привет сигнатурным движкам ;)
На днях CNCF опубликовала очередной [1,2,3,4,5,6,7,...] сторонний security аудит для одного из своих проектов - на этот раз для Flux (вторая версия).

В итоге по результат работы в отчет попало 22 найденные проблема:
- 1 high severity
- 3 medium severity
- 13 low severity
- 5 informational

На High проблему завели CVE-2021-41254: Privilege escalation to cluster admin on multi-tenant Flux. Почитайте тикет на данную CVE - там достаточно забавный, классический command injection =)

Интересно что для тестирования проекта использовали OSS-fuzz для фазинга проекта!
И опять сегодня про PodSecurity Admission Controller.

Стало известно, что он переходит в стадию beta и будет включен по умолчанию с версии Kubernetes 1.23 (то есть уже в следующей новой версии).

При этом его уже можно спокойно поставить и на более старые версии хоть сейчас! Он красиво оформлен в виде отдельного Admission Webhook - берем и ставим =)