Docker-сокеты — это канал связи, который Docker-клиенты могут использовать для взаимодействия с системой. Сокеты обычно предназначены для машинного взаимодействия (machine-to-machine communication) и плохо подходят для чтения или использования человеком, однако они очень мощные.
Docker Daemon (dockerd) и Docker Client — это два основных компонента архитектуры Docker. Docker daemon управляет всеми контейнерами хоста. Он получает запросы от Docker Client через CLI или REST API. Для связи daemon-клиент можно использовать Docker-сокеты.
Учитывая их мощную природу, сокеты не предназначены для публичного доступа. Однако неопытные сотрудники операционных команд могут случайно открыть сокеты для внутренних сетей или даже для интернета.
В этой теме (Topic) мы рассмотрим шаги, которые администратор должен выполнить, чтобы создать открытый сокет, а также то, как мы можем обнаружить такой сокет в условиях blackbox. Эксплуатация этой уязвимости, выходящая за пределы простого раскрытия информации (information disclosure), будет рассмотрена в другой теме.
Мы рассмотрим следующие учебные блоки (Learning Units):
Каждый ученик двигается в своём темпе, но на прохождение этой темы должно уйти примерно 4 часа.
Этот учебный блок (Learning Unit) охватывает следующие цели обучения (Learning Objectives):
В общем случае пользователи управляют Docker-контейнерами, запущенными в системе, с помощью CLI-инструмента docker. Однако Docker CLI — это всего лишь клиент для Docker engine, который на практике запускает, останавливает и выводит список контейнеров. Отношения между Docker CLI и Docker engine можно представить аналогично отношениям между веб-браузером и веб-сервером. Инструмент Docker CLI (веб-браузер) отправляет запросы к engine (веб-серверу), а тот отвечает контентом, который отображается пользователю.
Каналы связи как для веб-приложений, так и для Docker, работают поверх сокетов. Однако способы доступа к этим сокетам могут сильно различаться.
Сокеты могут иметь разные формы: например, TCP socket1 может использоваться для открытия порта 80 и обеспечения HTTP-связи, тогда как UDP socket на порту 53 может обеспечивать DNS-коммуникацию. Реже обсуждаются сокеты межпроцессного взаимодействия (Inter-process communication, IPC),2 также известные как Unix sockets. Unix-сокеты во многом похожи на сетевые сокеты; однако если сетевые сокеты используют IP-адрес и порт для коммуникации, Unix-сокет использует файл в локальной системе. Unix-сокеты настолько похожи на сетевые сокеты, что такие инструменты, как cURL,3 socat,4 и Netcat (версия OpenBSD)5 также поддерживают взаимодействие с Unix-сокетами.
По умолчанию dockerd слушает Unix-сокет /var/run/docker.sock