Закрытие анонимного доступа к приватным репозиториям в Nexus
Проблема
Nexus Repository Manager из коробки назначает anonymous-пользователю роль nx-anonymous с wildcard-привилегиями:
nx-repository-view-*-*-readnx-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-read | Healthcheck endpoint |
nx-search-read | Поиск пакетов |
nx-repository-view-docker-<proxy-name>-read | Pull через Docker Hub proxy |
nx-repository-view-docker-<proxy-name>-browse | Browse Docker Hub proxy |
nx-repository-view-docker-<group-name>-read | Pull через Docker group |
nx-repository-view-docker-<group-name>-browse | Browse Docker group |
nx-repository-view-maven2-<public-repos>-read | Maven public/central (если нужно) |
nx-repository-view-maven2-<public-repos>-browse | Maven 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 — он получит содержимое любого репозитория, независимо от галки.