Немного отвлекусь от повседневности и хочу рассказать про то, как нам важно иметь безопасные контейнеры. Начну с того, что Вам и так известно, недавно был найден скоуп уязвимостей Docker и runC.
Для начала что это за уязвимости:
При подготовке поста мне очень понравилось читать исследование про CVE-2024–21626, прошу всех с ним ознакомиться - ТЫК
Могу сделать отдельный перевод в teletype🚶♀️
CVE-2024-21626, в частности, привлекла внимание к уязвимостям в runC, ключевом компоненте различных систем управления контейнерами с открытым исходным кодом. Эта уязвимость, а также ее аналоги в BuildKit подчеркивают проблемы, связанные с обеспечением безопасности контейнеров и всей современной микросервисной инфраструктуре.
RunC - это стандартное время выполнения контейнеров. Это базовая технология, используемая в Docker и других платформах для запуска контейнеров. По сути, runC отвечает за порождение и запуск контейнеров в соответствии со спецификацией Open Container Initiative (OCI). Для этого он предоставляет интерфейс командной строки для управления жизненным циклом контейнеров.
Суть CVE-2024-21626 заключается в утечке дескриптора файла в пакете runC. Эта проблема возникает во время выполнения контейнерного кода. Хотя пользователи обычно устанавливают закрытие дескрипторов файлов при выполнении
(O_CLOEXEC) для предотвращения утечки, уязвимость существует в том, как runC обрабатывает системный вызов setcwd(2). Сложно, непонятно, но вот ссылки на видосы исполнения от Snyk ТЫК и на гите ТЫКНет необходимости создавать собственный образ, просто запустите контейнер с параметром -w:
docker run -w /proc/self/fd/8 --name cve-2024-21626 --rm -it debian:bookworm
~/container/runc/runc --version
docker run --name helper-ctr alpine
docker export helper-ctr --output alpine.tar
mkdir rootfs
tar xf alpine.tar -C rootfs
~/container/runc/runc spec
sed -ri 's#(\s*"cwd": )"(/)"#\1 "/proc/self/fd/7"#g' config.json
grep cwd config.json
sudo ~/container/runc/runc --log ./log.json run demo
Эксплойты имеют следующие особенности:
execve(2) со специальным рабочим каталогом, который начинается с /proc/self/fd/.symlink(2) или symlinkat(2) со специальной ссылкой на целевой каталог, который начинается с /proc/self/fd/.open(2), openat(2) или openat2(2) с именами типа /proc/\d+/cwd/.*.Правило для Falco — про него выйдет отдельный пост
- macro: container
condition: (container.id != host and container.name exists)
- rule: CVE-2024-21626 (runC escape through /proc/[PID]/cwd) exploited
desc: >
Detect CVE-2024-21626, runC escape vulerability through /proc/[PID]/cwd.
condition: >
container and ((evt.type = execve and proc.cwd startswith "/proc/self/fd") or (evt.type in (open, openat, openat2) and fd.name glob "/proc/*/cwd/*") or (evt.type in (symlink, symlinkat) and fs.path.target startswith "/proc/self/fd/")) and proc.name != "runc:[1:CHILD]"
output: CVE-2024-21626 exploited (%container.info evt_type=%evt.type process=%proc.name command=%proc.cmdline target=%fs.path.targetraw)
priority: CRITICAL
Это первая часть поста, телега не позволяет дать больше информации. Вторая часть выйдет завтра, в 15:00
Всех ждем на продолжение на уязвимости CVE-2024–23651, CVE-2024–23652, CVE-2024–23653
Please open Telegram to view this post
VIEW IN TELEGRAM
Да, как и обещал, ловите продолжение.
Docker BuildKit - это усовершенствованный механизм сборки, предназначенный для образов Docker. Он позволяет эффективно кэшировать команды Dockerfile, параллельно выполнять шаги сборки и изолировать контексты сборки. BuildKit имеет собственное промежуточное представление LLB. И там, где LLVM IR имеет такие вещи, как вызовы функций и стратегии сборки мусора, LLB имеет монтируемые файловые системы и выполнение операторов.
Что за LLVM IR и LLB ? Ты совсем уже крышей поехал?
Нет, хотяяя...
LLVM IR (Intermediate Representation) - это абстрактное представление программы, которое используется в LLVM(Low Level Virtual Machine). Оно независимо от платформы и архитектуры, содержит инструкции, операции и типы данных, и может быть легко оптимизирован и анализирован компилятором LLVM.
LLB (Low Level Backend) - это часть LLVM, которая представляет собой набор инструкций и операций для представления кода на низком уровне. Он служит как промежуточное представление, которое может быть преобразовано в машинный код для разных архитектур. LLB определяется как буфер протокола, а это означает, что внешние интерфейсы BuildKit могут делать GRPC запросы к
buildkitd для непосредственного создания контейнера.Для лучшего понимания или кто хочет с картинками ТЫК
--mount для обмана функции удаления точек монтирования. Это может привести к удалению файлов за пределами контейнера из хост-системы, что представляет значительный риск для целостности хост-окружения.Опять же, все те же ребята из snyk выпустили 2 скрипта для проверок (динамическая и статическая)
bash
git clone https://github.com/snyk/leaky-vessels-static-detector.git
cd leaky-vessels-static-detector
go build #Если вам нужен исполняемый файл
go run main.go <команда> <аргумент>
dockerfile - запустить анализ Dockerfile.
-f [DOCKERFILE_PATH] - путь к Dockerfile.
--base - включить анализ базового образа.
image - запустить анализ образа.
--name [IMAGE_NAME] - имя образа.
Общие аргументы:
--env [ENV_FILE_PATH] - путь к .env-файлу, используемому для хранения.
--disable [RULES_LIST] - список идентификаторов правил, которые нужно отключить, разделенный запятыми.
--debug - включить отладочные журналы.
Dockerfile — ТЫК
Мне хотелось бы ещё раз поблагодарить Владимира Капистку за создание такого инструмента как Public OCI-Image Security Checker —
Спасибо за внимание, скоро свидимся
#devsecops
Please open Telegram to view this post
VIEW IN TELEGRAM
Как и писал в прошлом цикле постов, нужно сделать статью про
📌
Однако, его нельзя называть универсальным инструментом для защиты, он не сможет предотвратить все угрозы.
Давай те начнем с того, как это устанавливать и пользоваться. Потому что их документация слишком нагроможденная и сложная для новичков.
При установке Falco можно выбрать несколько вариантов в зависимости от среды, в которой мы работаем. В посте будет продемонстрирован DaemonSet. Это гарантирует, что он будет развернут на всех узлах нашего кластера Kubernetes.
Один из самых простых способов установки Falco в Kubernetes - это использование Helm. Благо сообщество Falco предоставляет официальную таблицу Helm для установки и настройки.
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
helm install falco --set tty=true falcosecurity/falco --namespace falco --create-namespace
`--set tty=true` для предотвращении буферизации журналов Falco. Или же по простому При включении этой опции оповещения будут немедленно отображаться в журнале, как только они сработают.
Проверить установку можно через
kubectlkubectl get pods -n falco -o wide
Встроенный плагин Falco k8saudit управляет источниками событий и возможностями извлечения полей в системе плагинов Falco.
Чтобы установить плагин, нам нужно изменить процесс установки Helm и задать ему дополнительные параметры. Для начала мы должны удалить Falco с помощью следующей команды. Это позволит нам переустановить Falco с необходимыми параметрами для включения плагина с нужной конфигурацией с помощью пользовательского файла falco.yaml.
helm uninstall falco --namespace falco
Этот файл содержит настройки Falco, которые вы хотите переопределить во время установки. Этого можно добиться, передав файл в качестве аргумента в процессе установки Falco в Helm.
Пользовательский файл falco.yaml, который мы будем использовать, можно найти в репозитории Falco на Github. Этот yaml-файл содержит определение k8saudit в разделе плагинов, как показано ниже.
plugins:
- name: k8saudit
library_path: libk8saudit.so
init_config:
""
open_params: "http://:9765/k8s-audit"
- name: json
library_path: libjson.so
init_config: ""
load_plugins: [k8saudit, json]
Чтобы переустановить Falco с помощью этого yaml-файла, сохраните yaml из репозитория GitHub под именем values-syscall-k8saudit.yaml и выполните следующую команду.
helm install falco falcosecurity/falco --namespace falco -f ./values-syscall-k8saudit.yaml --create-namespace
Теперь перейдем к конфигурации. Чтобы журналы аудита Kubernetes могли отправляться в Falco, нам нужно перенастроить сервер API Kubernetes на пересылку событий аудита. Применяя политику аудита, вы можете выборочно фильтровать и записывать только те события, которые представляют интерес. Чтобы сделать безопасность приоритетной, мы создадим политику, направленную на запросы, связанные с подсистемами, kube-proxy, секретами, конфигурациями и другими важными компонентами. Ниже приведена политика, которую мы будем использовать.
Сохраните содержимое YAML в файл с именем policy.yaml в каталоге
/etc/kubernetes/audit/. Позже на этот файл будут ссылаться в конфигурации сервера API.Это первая часть объемной работы с данным инструментом. Да, приходится их делить, ведь у тг всего 4096 символов разрешено. Печатать в телетайп и подобных платформах, не моё. Habr стал платформой, на которой тебе пишут "не соответствует тематике платформы" или "не нашел ничего нового для себя" при любой теме статьи.
#devsecops
Please open Telegram to view this post
VIEW IN TELEGRAM
В эпоху, когда любой проект зависит от модулей (да-да, log4j тому яркий пример), концепция distroless контейнеров от Google выступает как маяк безопасности. Эти контейнеры, лишенные балласта в виде стандартных инструментов и библиотек операционных систем, представляют собой идеальное сочетание минимализма и функциональности. Но что делает их такими особенными, и почему они становятся неотъемлемой частью современной разработки и кибербезопасности?
Distroless контейнеры — это как "рюкзаки" для вашего приложения, в которые вы кладете только самое необходимое для путешествия. Если обычный контейнер — это рюкзак, в который вы упаковали не только теплую куртку, но и кучу вещей "на всякий случай", которые в итоге только занимают место и утяжеляют ваш багаж, то distroless контейнер очень легкий и содержит только то, что действительно нужно вашему приложению для работы.
Ключ к созданию distroless контейнера лежит в использовании минимального базового образа, который включает в себя только необходимые библиотеки и зависимости для запуска конкретного приложения. Google предоставляет несколько таких базовых образов через свой проект
google/distroless на Спасибо @szybnev за рекомендацию
Отсутствие shell и лишних утилит сокращает векторы атак, затрудняя эксплуатацию уязвимостей злоумышленниками.
Минимализм distroless контейнеров ведет к уменьшению их размера, что обеспечивает более быструю доставку и развертывание приложений. Да, не такой уж и важный фактор в домашних условиях, но для микросервисной архитектуры это очень хороший способ уйти от 40-минутного развёртывания одного проекта
Разберём на примере
FROM golang:1.21.4 AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /bin/app
FROM gcr.io/distroless/base-debian10
COPY --from=build /bin/app /
CMD ["/app"]
gitlab-ci.ymlstages:
- build
- deploy
variables:
# Указываем ваш registry
DOCKER_IMAGE_NAME: $CI_REGISTRY
build:
stage: build
image: docker:19.03.12
services:
- docker:19.03.12-dind
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $DOCKER_IMAGE_NAME:$CI_COMMIT_SHA .
- docker push $DOCKER_IMAGE_NAME:$CI_COMMIT_SHA
deploy:
stage: deploy
image: alpine:latest
script:
- apk add --no-cache kubectl
- kubectl config set-cluster default --server=$KUBE_SERVER --certificate-authority=/etc/deploy/ca.pem
- kubectl config set-credentials default --token=$KUBE_TOKEN
- kubectl config set-context default --cluster=default --user=default
- kubectl config use-context default
# Указываем использование нашего Distroless контейнера
- kubectl set image deployment/my-deployment my-container=$DOCKER_IMAGE_NAME:$CI_COMMIT_SHA --namespace=my-namespace
only:
- main
Distroless контейнеры от Google предлагают уникальный подход к развертыванию приложений, где безопасность и эффективность идут рука об руку с минимализмом и функциональностью. Эта технология открывает новые горизонты для разработчиков, стремящихся к созданию легковесных, безопасных и высокопроизводительных приложений.
#devsecops
Please open Telegram to view this post
VIEW IN TELEGRAM
Ещё полгода назад у меня появилась идея начать делиться знаниями и интересностями, создав телеграмм канал. Но я даже представить не мог, насколько быстро это всё случится, я в это не верю
Дальше будет только лучше...
Хах, считаю, этот ответ полностью опишет планы на канал и контент. В этом году я планирую начать освещать многие проблемы рынка и интересные проекты на различных мероприятиях (phd2, offzone или куда пригласят
🥂
Когда публика растет практически экспоненциально, значит, команда делает все правильно. Отрадно это видеть, так что поздравляю и Вас, работяги, и участников команды. Праздник сегодня общий🕺
4rchi
🦋
Спасибо тем, кто к нам присоединился, и тем, кто с нами был раньше. Для нашего канала это очень значимое событие, мы будем стараться над новым контентом и развивать канал!
devcrys
☕️
Безумно рад, что такое количество людей и правда интересуется всем, что происходит на этом канале.
Будем продолжать радовать вас интересным и полезным контентом и повышать качество работ.
Спасибо что вы есть, ведь этот юбилей значит, что всё не зря.
Редактор - подметаю пыль между строчек в статье
Спасибо Вам за наше хорошее настроение в этот день.
P.S. На следующей неделе стартует конкурс на интересные призы, не пропустите
#бредниавтора
Please open Telegram to view this post
VIEW IN TELEGRAM
Продолжаем тему защиты кубика. Не люблю так оставлять недоделанные посты, но бывает (я помню про вторую часть SBOM-ов, не нужно меня пинать
На чем мы там остановились? Точно! На конфигурации сервера API.
Как показано ниже, нам нужно создать конфигурационный файл webhook для передачи событий аудита на веб-сервер Falco. На этот файл будет сделана ссылка в конфигурации сервера API. Обязательно замените IP-адрес на кластерный IP-адрес службы Falco в вашей конфигурации. Вы можете получить этот IP-адрес, выполнив команду
kubectl get svc -n falco.apiVersion: v1
kind: Config
clusters:
- name: falco
cluster:
server: http://10.110.100.245:9765/k8s-audit
contexts:
- context:
cluster: falco
user: ""
name: default-context
current-context: default-context
preferences: {}
users: []
Последние шаги включают в себя добавление следующих аргументов в конфигурацию сервера API. Поскольку API-сервер представляет собой pod, нам также нужно смонтировать папку аудита внутри pod-а.
yaml
- --audit-policy-file=/etc/kubernetes/audit/policy.yaml
- --audit-webhook-config-file=/etc/kubernetes/audit/webhook.yaml
- --audit-log-format=json
volumeMounts:
- mountPath: /etc/kubernetes/audit
name: audit
volumes:
- hostPath:
path: /etc/kubernetes/audit
type: DirectoryOrCreate
name: audit
Переходим к самому интересному и важному - к кастомным правилам и как с ними работать.
Каждое правило Falco описывается в YAML-формате и включает в себя несколько ключевых компонентов:
-
rule: Имя правила.-
desc: Описание того, что делает правило.-
condition: Условие, при котором срабатывает правило. Это выражение, которое обычно анализирует системные вызовы и их аргументы.-
output: Сообщение, которое будет выведено, когда правило сработает. Может включать переменные из условия.-
priority: Уровень важности (INFO, WARNING, ERROR).Чтобы Falco использовал кастомные правила, вам нужно указать путь к файлу правил в конфигурационном файле Falco (
falco.yaml) или передать его напрямую при запуске Falco через аргумент командной строки. Откройте
falco.yaml и найдите раздел rules_file. Добавьте путь к вашему файлу с кастомными правилами:rules_file: - /etc/falco/falco_rules.yaml - /etc/falco/falco_rules.local.yaml - /etc/falco/custom_rules.yaml # Путь к вашему файлу с кастомными правилами
Вы также можете указать файл правил напрямую при запуске Falco, используя аргумент командной строки
-r:falco -r /path/to/your/custom_rules.yaml
Не забудьте перезапустить Falco после добавления правил😜
Falco, безусловно, является неотъемлемым инструментом в арсенале специалиста по безопасности, предоставляя глубокие возможности для наблюдения и анализа контейнеров.
#devsecops
Please open Telegram to view this post
VIEW IN TELEGRAM
Недавно Нас стало более 1000 человек. И вот, нам захотелось чем-то порадовать себя и Вас. Устроим конкурс!!!
Есть 3 темы, в каждой из которых будет свой победитель. Предвещаю вопросы и прочее — да, конкурс максимально субъективный, будем судить Я, мемолог и наша команда. Всё отправлять в комментарии под данный пост!
1. Фраза, с которой ассоциируется канал — оценивает ЖБ'
Она попадет в описание канала и будет его украшением
2. Самое мемное, что с вами было за вашу практику — оценивает 4rchi
3. Самый милый питомец подписчика — оценивает Вся команда
Допускаются не только Ваши питомцы, но и уличные. Главное правило, что Вы их фоткали и умилялись. Конечно, мы попросим доказательств этой милоты, но надеемся на Вашу честность🤗
Также, я предусмотрел вариант, если победитель окажется заграницей. В таком случае, у Вас будет выбор за
Вы оба должны быть подписаны на канал
Бустик на котиков и хорошие реакции на посты —
Конкурс проводится до 7-ого марта. Всем удачи и спасибо, что Вы с нами
#конкурс
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Blue (h/c)at Café
Проголосуйте за канал, чтобы он получил больше возможностей.
❤8 3 2🤔1
Много ребят, которые только решили для себя пойти по стопам инф беза, задаются одним вопросом - "С чего начать?". Вопрос правильный и почти всегда приводит к законному ответу - "Иди на площадки обучайся". Вот про них сегодня и поговорим.
Начну со своей истории. Мне 17 лет и я очень хочу покорить мир пентеста или, как тогда модно было — этичного хакера. Но что у нас на тот момент было? Hack the box.... и всё. И тот со своими приколами - взломай, чтобы поиграть. И вот так начался мой путь.
Всё есть. На этом можно было и закончить этот тезис, но нет. Платформ сейчас действительно много и каждая со своими отличительными качествами. Как же выбрать? С этим нам поможет исследование одного из моих знакомых (да-да, Ваш покорный кот
🌐 Обзор платформ для практического обучения: направления Offensive и Defensive
Я благодарен автору, что он смог собрать информацию и про каждую из платформ рассказать. Так что если Вы только начинаете свой путь - рекомендую к ознакомлению.
Даже среди моих знакомых нашлись ребята, которым очень пригодилось
#бредниавтора
Please open Telegram to view this post
VIEW IN TELEGRAM
securitymedia.org
Обзор платформ для практического обучения: направления Offensive и Defensive
В современном цифровом мире безопасность стала одной из наиболее приоритетных задач для организаций и частных лиц. Каждый день появляются новые угрозы, требующие постоянного повышения уровня защиты. И лучше всего это делать на практике. В этой статье сделали…
Как вы уже увидели, произошла смена логотипа канала. Именно от него я буду отталкиваться в своих презентациях и выступлениях. Кот, который был до этого, был продуктом генерации ИИ. Это делало канал не полностью человеческим. А сейчас пора сказать: "Это не просто проект, а уже часть меня". Именно поэтому пришло время перейти на новый стиль, ведь скоро PHD2 и куча других мероприятий, где мне хотелось бы выступить. Из основного больше ничего не изменяется, кроме описания. Подача, юмор и технический материал будут оставаться на той высоте, которую мы задали полгода назад.
Спасибо, что остаётесь с нами.
#бредниавтора
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Похек (Сергей Зыбнев)
#карьера #devsecops
В чате канала вчера спрашивали про roadmap для DevSecOps. Что нужно учить?
Пункт 1. Я считаю правильным ответом на данный вопрос всегда являлся и будет являться ответ: зайди на сайт с вакансиями, найди выбранную должность и прочитай 20-30 вакансий, выпиши повторяющиеся термины и изучи что это. Это применимо к любой стране и к любой должности, если вы конечно не выбираете учить то, чего ещё нет на рынке. В таком случае откуда вы об этом узнали, оттуда начинайте поиск информации о необходимых навыках.
Но мы же люди ленивые? Лично я, да. Все всегда хочется искать что-то самостоятельно, а найти готовый roadmap или mindmap, где за вас умные люди составили график, что вам нужно учить. В таком случае нашёл для Вас несколько интересных материалов:
А Вы точно уверены, что перед тем как стать DevSecOps, вы изучили инструменты DevOps и научились применять эти практики?
Управления версиями: Gitlab
Инструменты CI/CD: Jenkins, Gitlab, (набирает популярность Agro CD)
Оркестрация контейнеров: kubernetes, docker-compose (более редко необходим Docker Sward, OpenShift)
Автоматизация развертывания: Ansible, Terraform
Языки программирования: Python, Bash
Хранение секретов: Vault
Мониторинг: Prometheus, Grafana [ Zabbix пора отправить на покой ]
Логгирование: ELK
Если слова выше для вас не показались чем-то незнакомым или как говорит мой друг, "на эльфийском языке", то поздравляю, Вы DevOps инженер :)
Поиск секретов: GitGuardian, Gitleaks, truffleHog, DeepSecrets (последнее от моего знакомого Михаила из Avito Tech, у его инструмента не стандартный подход к поиску секретов)
SCA: Snyk, Syft, Cdxgen, Trivy, Dependency Track
SAST: Semgrep (много фолзит, использовать только вкупе с чем-то), Bearer, CodeQL, Spotbug, Terrascan
DAST: OWASP ZAP, nuclei, Dastardly
Container Security: Grype, Open Policy Agent, kube-hunter (активно не поддерживается), kube-bench , Falco, Tracee, Anchore (активно не поддерживается), Clair
Также отдельное спасибо @belka_e
Отмечу, что сейчас сам занимаюсь разработкой и по сути у меня нет коммерческого опыта ни в разработке, ни в DevSecOps. Так что узнаю всё по ходу выкладывания постов. Но большое спасибо коллегам, кто готов помогать мне!
Выводы:
1. У нас очень мало DAST'ов опенсоурсных, да и коммерческих качественных рабочих решений тоже мало.
2. Простор для разработки коммерческих решений огромен, как и потенциал этой области.
3. DevOps не очень сложно обучиться, а вот DevSecOps уже даёт прикурить знатно, проверено на себе.
4. Методологии и инструменты DevSecOps мало где применяются, так что рынок ждёт новых решений и подходов.
5. Когда я слышал про заоблачные ЗП devsecops инженеров, думал что ситуация как с MLщиками и Data Science в своё время, но нет. Тут реально огромный пул знаний, который включает в себя ещё по меньшей мере appsec и даже пентест.
Please open Telegram to view this post
VIEW IN TELEGRAM
Друзья, вот и подошел к завершению наш увлекательный конкурс, в котором мы отмечали рост нашего сообщества до более чем 1000 человек! Благодарим каждого из вас за участие и за то, что разделили с нами свои мемы и, конечно, фотографии ваших очаровательных питомцев.
Но, как и обещали, Мы подходим к самому интересному моменту — объявлению победителей!
Со всеми победителями спишусь в ближайшее время
Спасибо, что Вы с нами, за то, что делаете наше сообщество таким живым и вдохновляющим. До новых встреч в наших будущих постах!
#конкурс
Please open Telegram to view this post
VIEW IN TELEGRAM