Гайнуллина Екатерина, инженер по информационной безопасности отдела развития Security Vision

Введение

Контейнеры Docker давно стали неотъемлемой частью современных IT-инфраструктур благодаря своей легкости и гибкости. Однако, несмотря на все их преимущества, они обладают и серьезными недостатками в плане безопасности. Одним из таких недостатков является отсутствие надежной изоляции между хостом и контейнером. Security Vision, понимая критическую важность защиты контейнерных сред, внедряет строгие меры безопасности для минимизации рисков. Комплексные меры позволяют Security Vision эффективно защищать контейнерные среды, обеспечивая высокий уровень безопасности для своих клиентов и минимизируя потенциальные риски.

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

Эксплуатация Docker Socket для Повышения Привилегий: Подробный Обзор

Злоумышленник осуществляет доступ к Docker Socket (/var/run/docker.sock). Этот сокет является интерфейсом для управления Docker API, что позволяет выполнять различные операции с контейнерами и образами Docker. Это все равно что дать им пульт дистанционного управления, с которым они могут запускать и останавливать контейнеры, изменять их конфигурации и даже запускать контейнеры с root-доступом. Такой доступ позволяет злоумышленникам перехватить контроль над всей системой, включая возможность выполнения произвольного кода на хосте. Используя возможность монтирования файловой системы хоста в контейнер с помощью опции -v /:/host, атакующий получает доступ к файлам и директориям хоста прямо из контейнера. Это важный шаг для изучения и манипулирования файлами, которые могут содержать конфиденциальную информацию или данные, включая /etc/shadow для возможности поднятия привилегий.

Далее для устранения ограничений, накладываемых на контейнеры, используются различные опции и флаги:

  • --privileged: Этот флаг удаляет все изоляционные меры и ограничения, предоставляя контейнеру полный доступ к хост-системе. Это очень опасная практика, так как контейнер теряет все преимущества изоляции и безопасности, предоставляемые Docker.

  • --cap-add=ALL: Добавление всех возможностей Linux к контейнеру, что может позволить атакующему выполнять привилегированные операции.

  • --security-opt apparmor=unconfined и --security-opt seccomp=unconfined: Отключение профилей безопасности AppArmor и Seccomp для контейнера, что уменьшает уровень защиты, предоставляемый Docker. Часто атакующие пытаются получить доступ к файловой системе хоста, монтируя устройства диска напрямую в контейнер. Например, с помощью комбинации опций --device=/dev/sda1 --cap-add=SYS_ADMIN --security-opt apparmor=unconfined можно монтировать конкретное устройство диска в контейнер. После этого атакующий может использовать команду mount /dev/sda1 /mnt в контейнере для доступа к содержимому диска хоста через точку монтирования /mnt.

Часто атакующие находят writable директории на хосте, которые можно монтировать в контейнер. Например, с помощью -v /tmp:/host можно монтировать директорию /tmp хоста в контейнер. Затем атакующий может создать исполняемый файл с SUID в смонтированной директории, что позволит ему выполнить его с повышенными привилегиями на хосте. В случае получения root-прав в контейнере, атакующий может изменять конфигурационные файлы хост-системы, например, /etc, что может привести к серьезному повышению привилегий на хосте. Например, изменение /etc/shadow может открыть доступ к аккаунтам пользователей хост-системы. Для побега из контейнера атакующие используют флаг -- privileged или добавление соответствующих возможностей с отключением других защитных мер. Это позволяет атакующему выйти из изоляции контейнера и получить полный доступ к хост-системе.

Краткое руководство по безопасности Docker от OWASP

Обновляйте хост и Docker
Для защиты от известных уязвимостей, таких как "Leaky Vessels", которые обычно позволяют злоумышленнику получить root-доступ к хосту, критически важно регулярно обновлять как сам хост, так и Docker. Это включает в себя регулярное обновление ядра хоста и движка Docker.

Не выставляйте сокет Docker daemon
Сокет Docker /var/run/docker.sock — это UNIX-сокет, на который Docker подписывается и через который доступна Docker API. Владелец этого сокета - root. Предоставление доступа к нему эквивалентно предоставлению неограниченного root-доступа к вашему хосту. Если вы запускаете свой Docker образ с параметром -v /var/run/docker.sock:/var/run/docker.sock или аналогичным, вам следует изменить это. Помните, что монтирование сокета только для чтения не является решением, а лишь усложняет его эксплуатацию. Эквивалентное объявление в файле docker-compose может выглядеть так:

volumes:

- "/var/run/docker.sock:/var/run/docker.sock"

Установите пользователя
Настройка контейнера для использования непривилегированным пользователем - лучший способ предотвратить атаки с повышением привилегий. В Kubernetes это можно настроить в контексте безопасности, используя поле runAsUser с идентификатором пользователя, например:

apiVersion: v1

kind: Pod

metadata:

name: example

spec:

containers:

- name: example

image: gcr.io/google-samples/node-hello:1.0

securityContext:

runAsUser: 4000 # <-- Это идентификатор пользователя пода

Как администратор кластера Kubernetes, вы можете настроить усиленную конфигурацию, используя уровень Restricted с встроенным контроллером допуска безопасности Pod, и, если требуется большая настройка, рассмотрите использование Admission Webhooks или альтернативных решений от сторонних поставщиков.

Ограничьте возможности
Ограничьте привилегии контейнера, предоставляя только необходимые возможности.

Не запускайте контейнеры с флагом --privileged!!! В Kubernetes это можно настроить в контексте безопасности, используя поле возможностей, например:

apiVersion: v1

kind: Pod

metadata:

name: example

spec:

containers:

- name: example

image: gcr.io/google-samples/node-hello:1.0

securityContext:

capabilities:

drop:

- ALL

add: ["CHOWN"]

Предотвратите эскалацию привилегий внутри контейнера Запускайте ваши образы Docker с флагом --security-opt=no-new-privileges, чтобы предотвратить эскалацию привилегий.

В Kubernetes это можно настроить в контексте безопасности, используя поле разрешить повышение привилегий, например:

apiVersion: v1

kind: Pod

metadata:

name: example

spec:

containers:

- name: example

image: gcr.io/google-samples/node-hello:1.0

securityContext:

allowPrivilegeEscalation: false

Ограничьте ресурсы (память, CPU, файловые дескрипторы, процессы, перезапуски) Лучший способ избежать DoS-атак — это ограничение ресурсов.

Установите файловую систему и тома в режим только для чтения
Запускайте контейнеры с файловой системой в режиме только для чтения.

Интегрируйте инструменты сканирования контейнеров в свой CI/CD пайплайн
CI/CD пайплайны являются важной частью жизненного цикла разработки ПО и должны включать различные проверки безопасности, такие как сканирование контейнеров.

Вывод

Контроль доступа к Docker Socket критически важен, так как он может стать инструментом в руках злоумышленников. В Security Vision строго ограничивают доступ к нему, предотвращая несанкционированное управление контейнерами и хостами. Запуск контейнеров от имени непривилегированных пользователей помогает минимизировать риск повышения привилегий. Для предотвращения DoS-атак вводятся ограничения на ресурсы контейнеров, такие как память и CPU. Контейнеры запускаются с файловой системой в режиме только для чтения, что ограничивает возможности злоумышленников по изменению данных. Security Vision интегрирует инструменты сканирования контейнеров в свои CI/CD пайплайны, обеспечивая безопасность на всех этапах разработки. Эти меры позволяют Security Vision эффективно защищать контейнерные среды, минимизируя риски и обеспечивая высокий уровень безопасности для своих клиентов.

Комментарии (3)


  1. VoodooCat
    06.09.2024 09:53
    +2

    Наверное стоило хотя бы упомянуть о podman rootless контейнерах, как мэйнстримовое решение по улучшению безопасности контейнеров.

    Хотя мне podman rootful больше заходят.

    Так или иначе все сводится к тому, что надо скурпулезно раздавать и разрешения и понимать, что вообще происходит в каждом случае.


    1. spectrumi Автор
      06.09.2024 09:53

      Спасибо, что подметили по podman, действительно нужно было упомянуть.


  1. isumix
    06.09.2024 09:53

    Еще открывайте порты на 127.0.0.1 если не хотите открывать их всему миру. Фаервол тут не поможет.
    И таки да, используйте podman.