TG Telegram Group & Channel
Четыре луча | United States America (US)
Create: Update:

Безопасность локальных docker-реестров через механизм нотификаций

Тем, кто смотрел наш доклад на PhD «Охота на Kubernetes: угрозы в джунглях оркестрации», может быть интересно, как можно отслеживать подозрительную активность в локальных docker-реестрах?

В docker-реестрах существует механизм notifications. Он позволяет отправлять web-хуки в ответ на события происходящие в реестре:

• Push и Pull образов реестра;
• Push и Pull слоёв образа.

Эти события отправляются очередью на эндпоинты, которые указаны в конфиге по HTTP(S) в качестве POST запросов. Поэтому важно, чтобы эндпоинт, принимающий события, умел обрабатывать именно POST запросы. Иначе нотификатор, видя ошибку, будет пытаться послать одно и тоже событие на эндпоит, и до следующего события в очереди она не доедет.

Настраиваются нотификаторы в конфиге самого docker-registry. По умолчанию файл конфигурации лежит по пути, как на основном хосте, так и в поде k8s:

/etc/docker/registry/config.yml


Пример конфигурации нотификаторов в docker-registry:

endpoints: # Список endpoint'ов для отправки уведомлений
- name: alistener # Произвольное имя endpoint'а (для идентификации в логах)
url: https://10.244.0.1:6666 # URL получателя уведомлений (должен поддерживать HTTPS POST)
timeout: 500ms # Максимальное время ожидания ответа от endpoint'а
threshold: 5 # Максимальное количество попыток отправки уведомления
backoff: 1s # Пауза между повторными попытками отправки


Пример сервера на python, который может принимать POST запросы от реестра:

from http.server import BaseHTTPRequestHandler, HTTPServer

class Handler(BaseHTTPRequestHandler):
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
print("New event:", post_data.decode())
self.send_response(200)
self.end_headers()

HTTPServer(('0.0.0.0', 6666), Handler).serve_forever()


Запускаем наш эндпоинт и начинаем получать события.

python3 pythonlog.py

Пример события pull в docker-registry:

"events": [
{
"id": "92373dbb-a1b3-420e-9008-83b93362cbcb",
"timestamp": "2025-05-20T10:08:19.010407248Z",
"action": "pull",
"target": {
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 1778,
"digest": "sha256:056c8ad1921514a2fc810a792b5bd18a02d003a99d6b716508bf11bc98c413c3",
"length": 1778,
"repository": "nginx",
"url": "https://docker-registry:5000/v2/nginx/manifests/sha256:056c8ad1921514a2fc810a792b5bd18a02d003a99d6b716508bf11bc98c413c3",
"tag": "v1"
},
"request": {
"id": "7ab6ff81-3187-44ce-aa0f-4d0e7d77071f",
"addr": "10.244.0.1:27862",
"host": "docker-registry:5000",
"method": "HEAD",
"useragent": "curl/8.5.0"
},
"actor": {
"name": "admin"
},
"source": {
"addr": "docker-registry-pod:5000",
"instanceID": "9419304c-421c-4837-ae87-d5c9ab9be670"
}
}
]
}


Здесь произошло обращение от клиента с User-Agent — curl к образу контейнера nginx. Эту активность можно считать подозрительной, так как утилита curl не является стандартной для взаимодействия с образами контейнеров.

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

Безопасность локальных docker-реестров через механизм нотификаций

Тем, кто смотрел наш доклад на PhD «Охота на Kubernetes: угрозы в джунглях оркестрации», может быть интересно, как можно отслеживать подозрительную активность в локальных docker-реестрах?

В docker-реестрах существует механизм notifications. Он позволяет отправлять web-хуки в ответ на события происходящие в реестре:

• Push и Pull образов реестра;
• Push и Pull слоёв образа.

Эти события отправляются очередью на эндпоинты, которые указаны в конфиге по HTTP(S) в качестве POST запросов. Поэтому важно, чтобы эндпоинт, принимающий события, умел обрабатывать именно POST запросы. Иначе нотификатор, видя ошибку, будет пытаться послать одно и тоже событие на эндпоит, и до следующего события в очереди она не доедет.

Настраиваются нотификаторы в конфиге самого docker-registry. По умолчанию файл конфигурации лежит по пути, как на основном хосте, так и в поде k8s:
/etc/docker/registry/config.yml


Пример конфигурации нотификаторов в docker-registry:

endpoints: # Список endpoint'ов для отправки уведомлений
- name: alistener # Произвольное имя endpoint'а (для идентификации в логах)
url: https://10.244.0.1:6666 # URL получателя уведомлений (должен поддерживать HTTPS POST)
timeout: 500ms # Максимальное время ожидания ответа от endpoint'а
threshold: 5 # Максимальное количество попыток отправки уведомления
backoff: 1s # Пауза между повторными попытками отправки


Пример сервера на python, который может принимать POST запросы от реестра:

from http.server import BaseHTTPRequestHandler, HTTPServer

class Handler(BaseHTTPRequestHandler):
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
print("New event:", post_data.decode())
self.send_response(200)
self.end_headers()

HTTPServer(('0.0.0.0', 6666), Handler).serve_forever()


Запускаем наш эндпоинт и начинаем получать события.

python3 pythonlog.py

Пример события pull в docker-registry:

"events": [
{
"id": "92373dbb-a1b3-420e-9008-83b93362cbcb",
"timestamp": "2025-05-20T10:08:19.010407248Z",
"action": "pull",
"target": {
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 1778,
"digest": "sha256:056c8ad1921514a2fc810a792b5bd18a02d003a99d6b716508bf11bc98c413c3",
"length": 1778,
"repository": "nginx",
"url": "https://docker-registry:5000/v2/nginx/manifests/sha256:056c8ad1921514a2fc810a792b5bd18a02d003a99d6b716508bf11bc98c413c3",
"tag": "v1"
},
"request": {
"id": "7ab6ff81-3187-44ce-aa0f-4d0e7d77071f",
"addr": "10.244.0.1:27862",
"host": "docker-registry:5000",
"method": "HEAD",
"useragent": "curl/8.5.0"
},
"actor": {
"name": "admin"
},
"source": {
"addr": "docker-registry-pod:5000",
"instanceID": "9419304c-421c-4837-ae87-d5c9ab9be670"
}
}
]
}


Здесь произошло обращение от клиента с User-Agent — curl к образу контейнера nginx. Эту активность можно считать подозрительной, так как утилита curl не является стандартной для взаимодействия с образами контейнеров.

На основе данных событий можно вывести профиль критичных образов в вашей инфраструктуре и отслеживать, какие обращения происходят к ним.
🔥20👍11💯42👾1


>>Click here to continue<<

Четыре луча




Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)