Docker - это популярная контейнерная технология, которая широко применяется во всех отраслях промышленности. Он используется в производстве и в средах UAT. Однако с каждым новым уровнем в технологическом стеке может возникнуть ряд проблем безопасности либо из-за нестабильной конфигурации, небезопасного кода, либо из-за их комбинации. Поскольку докер поставляется с несколькими компонентами, часто инженеры Devops не уделяют много внимания безопасности, что может привести к катастрофическим результатам.
В этом сообщении в блоге консультант NotSoSecure Шубхам
Что такое Докер?
Docker - очень популярная платформа, используемая разработчиками для устранения проблем «работает на моей машине» при совместной работе над кодом с коллегами. Предприятия используют Docker для создания гибких конвейеров доставки программного обеспечения для быстрой, безопасной и надежной доставки новых функций для приложений.
Что такое изображения и контейнеры Docker?
Изображение - это файловая система и параметры, используемые во время выполнения. У него нет состояния и оно никогда не меняется. Образ контейнера - это легкий, автономный исполняемый пакет программного обеспечения, который включает в себя все необходимое для его запуска: код, время выполнения, системные инструменты, системные библиотеки, настройки. Контейнеры изолируют программное обеспечение от его окружения, например, различия между средой разработки и промежуточными средами, и помогают уменьшить конфликты между группами, работающими с различным программным обеспечением в одной и той же инфраструктуре.
Что такое Docker Registry?
Реестр - это масштабируемое серверное приложение без сохранения состояния, которое хранит и позволяет вам распространять образы Docker с помощью HTTP API. В более ранних версиях Docker Registry Api, т.е. v1, было несколько проблем, и, следовательно, v2 был выпущен, что значительно повышает безопасность. Однако следует отметить, что в обеих версиях Docker Registry аутентификация по умолчанию не включена.
Что такое капли?
Слои хранятся в виде BLOB-объектов в API-интерфейсе реестра v2, что определяется их
Почему Docker Registry API должен проходить проверку подлинности?
Реестр Docker позволяет любому пользователю извлечь любой из изображений контейнера и прочитать любые изменения, сделанные владельцем. Эти изменения могут включать в себя жестко закодированные учетные данные, строки подключения, изменения в правах доступа к файлам, настраиваемые сценарии и т. Д. Кроме того, пользователь может также загружать большие двоичные объекты и вносить изменения в базовые изображения, например. размещение черного хода и т. д. Поскольку этот образ будет развернут в следующий раз, черный ход также будет развернут на сервере.
Как вытащить образ Docker, используя Docker Pull?
Команда для извлечения изображений из частного реестра выглядит следующим образом:
docker pull HOSTORT/IMAGE_NAME
Во время одного из недавних пентестов мы столкнулись с сервером, предоставляющим API реестра Docker, который не требовал никакой аутентификации. Пока мы пытались извлечь изображения, мы столкнулись с ошибками сертификата, за которыми следовали ошибки, связанные с ключами. Мы предположили, что это из-за доверия к контенту или ключей сертификатов. Были опробованы несколько опций, например, -tls, -tls-check, -disable-content-trust и т. Д., Но ни один из них не работал. Тем не менее, API был легко доступен из веб-браузера. Поскольку это был ограниченный по времени тест, вместо того, чтобы больше разбираться, почему не работает Docker Pull, мы выбрали ручной подход.
Поэтому мы решили изучить API и получить системную информацию от API сервера реестра Docker.
Примечание. Для демонстрации мы установили частный реестр Docker на local.example.com (127.0.0.1), порт 30000.
Первой проверкой является проверка того, какая версия API поддерживается. Отправив запрос GET /v1и /v2подтвердите, какая версия API реестра используется, как показано на рисунке ниже:
Как только версия API подтверждена, мы можем найти список репо в реестре, используя, /_catalogкак показано на рисунке ниже:
Каталог реестра
В контексте Docker Registry репозиторий - это, в основном, коллекция связанных изображений, обычно предоставляющая разные версии (или, скажем, теги) одного и того же сервиса или приложения.
Как видно из приведенного выше изображения, эта локальная установка имеет три репозитория. Давайте рассмотрим testrepo1 и выясним теги, перечисленные для этого репо, используя /REPO_NAME/tags/listконечную точку, как показано на рисунке ниже:
Список тегов репо
Поскольку мы определили, что есть два тега, то есть v1 и v2, давайте загрузим файл манифеста для тега v2, используя /manifests/v2конечную точку, как показано на рисунке ниже:
детали манифеста
После того, как у нас есть список сгустков, мы можем загрузить каждый блоб с помощью конечной точки:
v2//blobs/sha256:/. Для этого экземпляра наш полный URL-адрес конечной точки
Это загрузит сжатый файл для каждого коммита (или, скажем, изменения конфигурации в базовом образе), назначается один большой двоичный объект).
После того, как мы загрузили все BLOB-объекты, мы можем разархивировать их и просмотреть структуру папок, чтобы найти конфигурации, которые были применены. Как показано на рисунке ниже, один из BLOB-объектов testrepo1 был разархивирован, а структура папок была доступна, как показано на рисунке ниже:
В этом примере мы преднамеренно посадили некоторую конфиденциальную информацию при загрузке большого двоичного объекта в изображение (тег v2 репозитория testrepo1). Это должно представлять тип трофея, который может быть найден в реальном сценарии.
Как мы видим, существует файл « login.py», который содержит конфиденциальную информацию.
Мы написали небольшой скрипт на python, чтобы уменьшить ручные усилия. Сценарий автоматически выполняет все эти операции (на основе URL-адреса API реестра и имени репозитория, переданного пользователем), загружая все разархивированные большие двоичные объекты в пользовательскую папку.
Вы можете загрузить / клонировать скрипт с https://github.com/NotSoSecure/docker_fetch/.
Скрипт запрашивает у пользователя несколько входных данных, исходя из которых он выбирает репозиторий и тег для загрузки, как показано на рисунке ниже:
Этот скрипт сохранит все сжатые BLOB-объекты в каталоге, определенном пользователем. Если для определенного тега загружено большое количество больших двоичных объектов, мы можем использовать следующий цикл for (работает только в * nix), чтобы разархивировать их все за один раз:
for i in *.tar.gz; do tar -xzvf $i; done
После распаковки больших двоичных объектов пользователь может вручную искать любую конфиденциальную информацию, содержащуюся в большом двоичном объекте.
Аналогичным образом злоумышленник также может отправить код в базовые образы через сервис API Docker Registry. Злоумышленник может заменить существующий образ Docker или добавить его к вредоносным файлам, и как только этот образ будет использован для настройки любого блока, это позволит злоумышленнику получить контроль над новой машиной.
Ниже приведены некоторые рекомендации, которые организации / частные лица должны выполнять при настройке Docker Private Registry.
смягчение
Ссылки:
1.
Источник:
В этом сообщении в блоге консультант NotSoSecure Шубхам
Ссылка скрыта от гостей
обсудит проблемы безопасности, возникающие из-за неаутентифицированного API реестра Docker , доступного по сети. Но перед этим давайте обсудим некоторые основы о Docker и реестре Docker.Что такое Докер?
Docker - очень популярная платформа, используемая разработчиками для устранения проблем «работает на моей машине» при совместной работе над кодом с коллегами. Предприятия используют Docker для создания гибких конвейеров доставки программного обеспечения для быстрой, безопасной и надежной доставки новых функций для приложений.
Что такое изображения и контейнеры Docker?
Изображение - это файловая система и параметры, используемые во время выполнения. У него нет состояния и оно никогда не меняется. Образ контейнера - это легкий, автономный исполняемый пакет программного обеспечения, который включает в себя все необходимое для его запуска: код, время выполнения, системные инструменты, системные библиотеки, настройки. Контейнеры изолируют программное обеспечение от его окружения, например, различия между средой разработки и промежуточными средами, и помогают уменьшить конфликты между группами, работающими с различным программным обеспечением в одной и той же инфраструктуре.
Что такое Docker Registry?
Реестр - это масштабируемое серверное приложение без сохранения состояния, которое хранит и позволяет вам распространять образы Docker с помощью HTTP API. В более ранних версиях Docker Registry Api, т.е. v1, было несколько проблем, и, следовательно, v2 был выпущен, что значительно повышает безопасность. Однако следует отметить, что в обеих версиях Docker Registry аутентификация по умолчанию не включена.
Что такое капли?
Слои хранятся в виде BLOB-объектов в API-интерфейсе реестра v2, что определяется их
Ссылка скрыта от гостей
.Почему Docker Registry API должен проходить проверку подлинности?
Реестр Docker позволяет любому пользователю извлечь любой из изображений контейнера и прочитать любые изменения, сделанные владельцем. Эти изменения могут включать в себя жестко закодированные учетные данные, строки подключения, изменения в правах доступа к файлам, настраиваемые сценарии и т. Д. Кроме того, пользователь может также загружать большие двоичные объекты и вносить изменения в базовые изображения, например. размещение черного хода и т. д. Поскольку этот образ будет развернут в следующий раз, черный ход также будет развернут на сервере.
Как вытащить образ Docker, используя Docker Pull?
Команда для извлечения изображений из частного реестра выглядит следующим образом:
docker pull HOSTORT/IMAGE_NAME
Во время одного из недавних пентестов мы столкнулись с сервером, предоставляющим API реестра Docker, который не требовал никакой аутентификации. Пока мы пытались извлечь изображения, мы столкнулись с ошибками сертификата, за которыми следовали ошибки, связанные с ключами. Мы предположили, что это из-за доверия к контенту или ключей сертификатов. Были опробованы несколько опций, например, -tls, -tls-check, -disable-content-trust и т. Д., Но ни один из них не работал. Тем не менее, API был легко доступен из веб-браузера. Поскольку это был ограниченный по времени тест, вместо того, чтобы больше разбираться, почему не работает Docker Pull, мы выбрали ручной подход.
Поэтому мы решили изучить API и получить системную информацию от API сервера реестра Docker.
Примечание. Для демонстрации мы установили частный реестр Docker на local.example.com (127.0.0.1), порт 30000.
Первой проверкой является проверка того, какая версия API поддерживается. Отправив запрос GET /v1и /v2подтвердите, какая версия API реестра используется, как показано на рисунке ниже:
Как только версия API подтверждена, мы можем найти список репо в реестре, используя, /_catalogкак показано на рисунке ниже:
Каталог реестра
В контексте Docker Registry репозиторий - это, в основном, коллекция связанных изображений, обычно предоставляющая разные версии (или, скажем, теги) одного и того же сервиса или приложения.
Как видно из приведенного выше изображения, эта локальная установка имеет три репозитория. Давайте рассмотрим testrepo1 и выясним теги, перечисленные для этого репо, используя /REPO_NAME/tags/listконечную точку, как показано на рисунке ниже:
Список тегов репо
Поскольку мы определили, что есть два тега, то есть v1 и v2, давайте загрузим файл манифеста для тега v2, используя /manifests/v2конечную точку, как показано на рисунке ниже:
детали манифеста
После того, как у нас есть список сгустков, мы можем загрузить каждый блоб с помощью конечной точки:
v2//blobs/sha256:/. Для этого экземпляра наш полный URL-адрес конечной точки
Ссылка скрыта от гостей
Это загрузит сжатый файл для каждого коммита (или, скажем, изменения конфигурации в базовом образе), назначается один большой двоичный объект).
После того, как мы загрузили все BLOB-объекты, мы можем разархивировать их и просмотреть структуру папок, чтобы найти конфигурации, которые были применены. Как показано на рисунке ниже, один из BLOB-объектов testrepo1 был разархивирован, а структура папок была доступна, как показано на рисунке ниже:
В этом примере мы преднамеренно посадили некоторую конфиденциальную информацию при загрузке большого двоичного объекта в изображение (тег v2 репозитория testrepo1). Это должно представлять тип трофея, который может быть найден в реальном сценарии.
Как мы видим, существует файл « login.py», который содержит конфиденциальную информацию.
Мы написали небольшой скрипт на python, чтобы уменьшить ручные усилия. Сценарий автоматически выполняет все эти операции (на основе URL-адреса API реестра и имени репозитория, переданного пользователем), загружая все разархивированные большие двоичные объекты в пользовательскую папку.
Вы можете загрузить / клонировать скрипт с https://github.com/NotSoSecure/docker_fetch/.
Скрипт запрашивает у пользователя несколько входных данных, исходя из которых он выбирает репозиторий и тег для загрузки, как показано на рисунке ниже:
Этот скрипт сохранит все сжатые BLOB-объекты в каталоге, определенном пользователем. Если для определенного тега загружено большое количество больших двоичных объектов, мы можем использовать следующий цикл for (работает только в * nix), чтобы разархивировать их все за один раз:
for i in *.tar.gz; do tar -xzvf $i; done
После распаковки больших двоичных объектов пользователь может вручную искать любую конфиденциальную информацию, содержащуюся в большом двоичном объекте.
Аналогичным образом злоумышленник также может отправить код в базовые образы через сервис API Docker Registry. Злоумышленник может заменить существующий образ Docker или добавить его к вредоносным файлам, и как только этот образ будет использован для настройки любого блока, это позволит злоумышленнику получить контроль над новой машиной.
Ниже приведены некоторые рекомендации, которые организации / частные лица должны выполнять при настройке Docker Private Registry.
смягчение
- Версия 2 Docker Registry API поддерживает несколько аутентификаций на основе токенов (например, однонаправленный канал, oauth и т. Д.), Которые должны быть реализованы при развертывании API реестра Docker.
- Включите Доверие к контенту, чтобы обеспечить подписывание и проверку тегов изображений на стороне клиента.
- Используйте TLS.
Ссылки:
1.
Ссылка скрыта от гостей
Источник:
Ссылка скрыта от гостей