Закрытие анонимного доступа к приватным репозиториям в Nexus

Проблема

Nexus Repository Manager из коробки назначает anonymous-пользователю роль nx-anonymous с wildcard-привилегиями:

  • nx-repository-view-*-*-read
  • nx-repository-view-*-*-browse

Это даёт анонимный доступ на чтение ко всем репозиториям, включая приватные. Галка «Allow anonymous Docker pulls» на конкретном репозитории влияет только на Docker Bearer Token flow — без неё Docker CLI не пройдёт token-аутентификацию, но прямой HTTP-запрос к Registry API через nginx-прокси всё ещё вернёт данные.

На практике это означает: если Nexus стоит за nginx reverse proxy и обслуживает одновременно публичный Docker Hub proxy и приватный hosted-репозиторий — приватные образы доступны без авторизации.

Как обнаружить

# На любой машине без docker login:
docker pull private.your-registry.dev/your-image:latest

Если pull прошёл — anonymous read открыт.

Решение

Роль nx-anonymous — системная, редактировать нельзя. Нужно создать свою и назначить anonymous-пользователю.

1. Создать роль

Security → Roles → Create Role → Nexus Role

  • ID: nx-anonymous-restricted
  • Privileges — только то, что реально должно быть публичным:
ПривилегияЗачем
nx-healthcheck-readHealthcheck endpoint
nx-search-readПоиск пакетов
nx-repository-view-docker-<proxy-name>-readPull через Docker Hub proxy
nx-repository-view-docker-<proxy-name>-browseBrowse Docker Hub proxy
nx-repository-view-docker-<group-name>-readPull через Docker group
nx-repository-view-docker-<group-name>-browseBrowse Docker group
nx-repository-view-maven2-<public-repos>-readMaven public/central (если нужно)
nx-repository-view-maven2-<public-repos>-browseMaven public/central (если нужно)

Заменить <proxy-name>, <group-name>, <public-repos> на реальные имена репозиториев.

Не добавлять wildcard-привилегии nx-repository-view-*-*-*.

2. Назначить anonymous-пользователю

Security → Users → anonymous:

  • Убрать nx-anonymous
  • Добавить nx-anonymous-restricted

3. Проверить

# Приватный — должен вернуть 401:
docker pull private.your-registry.dev/your-image:latest
 
# Публичный proxy — должен работать:
docker pull hub.your-registry.dev/library/alpine:latest

Почему галка на репозитории не спасает

«Allow anonymous Docker pulls for This Repository» управляет только Docker-специфичным Bearer Token flow. Nexus также обслуживает запросы через стандартный HTTP API, где авторизация определяется ролями пользователя. Если у anonymous-пользователя есть wildcard read — он получит содержимое любого репозитория, независимо от галки.