Перейти к содержимому

Аутентификация

NORA поддерживает базовую аутентификацию (htpasswd с bcrypt) и отзываемые токены с управлением доступом на основе ролей.

Окно терминала
# Создание файла с первым пользователем
htpasswd -cbB users.htpasswd admin yourpassword
# Добавление пользователей
htpasswd -bB users.htpasswd ci-user ci-secret
htpasswd -bB users.htpasswd developer dev-pass

Примечание: Флаг -B включает хеширование bcrypt — обязательное требование NORA. Утилита htpasswd входит в пакет apache2-utils (Debian/Ubuntu) или httpd-tools (RHEL/CentOS/Astra/РЕД ОС).

Окно терминала
docker run -d -p 4000:4000 \
-v nora-data:/data \
-v ./users.htpasswd:/data/users.htpasswd:ro \
-e NORA_AUTH_ENABLED=true \
ghcr.io/getnora-io/nora:latest

Docker Compose:

services:
nora:
image: ghcr.io/getnora-io/nora:latest
ports:
- 4000:4000
volumes:
- nora-data:/data
- ./users.htpasswd:/data/users.htpasswd:ro
environment:
NORA_AUTH_ENABLED: true
restart: unless-stopped
volumes:
nora-data:
Окно терминала
# Ожидается ответ 401
curl -s http://localhost:4000/v2/_catalog
# {error:Authentication required}
# Ожидается ответ 200
curl -s -u admin:yourpassword http://localhost:4000/v2/_catalog

Токены обеспечивают программный доступ без раскрытия учётных данных htpasswd. Каждый токен имеет роль, срок действия и необязательное описание.

Окно терминала
curl -s -X POST http://localhost:4000/api/tokens \
-H Content-Type: application/json \
-d '{
username: admin,
password: yourpassword,
role: write,
ttl_days: 90,
description: Конвейер сборки
}'

Ответ:

{
token: nra_a1b2c3d4e5f6...,
expires_in_days: 90
}

Сохраните токен сразу — он отображается только один раз.

Окно терминала
docker login localhost:4000 -u token -p nra_a1b2c3d4e5f6...
docker push localhost:4000/myapp:latest
Окно терминала
curl -H Authorization: Bearer nra_a1b2c3d4e5f6... \
http://localhost:4000/v2/_catalog
Окно терминала
curl -s -X POST http://localhost:4000/api/tokens/list \
-H Content-Type: application/json \
-d '{username: admin, password: yourpassword}'
Окно терминала
curl -s -X POST http://localhost:4000/api/tokens/revoke \
-H Content-Type: application/json \
-d '{
username: admin,
password: yourpassword,
hash_prefix: a1b2c3d4e5f6g7h8
}'

Значение hash_prefix — первые 16 символов хеша из списка токенов.


Токены поддерживают три роли:

РольЧтениеЗаписьУдаление/Администрирование
readДаНетНет
writeДаДаНет
adminДаДаДа

Роль по умолчанию для новых токенов: read.


Следующие адреса не требуют аутентификации, даже если она включена:

АдресНазначение
/healthПроверка работоспособности (балансировщики, Kubernetes)
/readyПроверка готовности
/metricsСбор метрик Prometheus
/v2/Проверка версии Docker Registry v2
/ui/*Веб-интерфейс
/api-docs/*Документация Swagger
/api/tokensСоздание токена (требует Basic Auth в теле запроса)
/api/tokens/listСписок токенов (требует Basic Auth в теле запроса)
/api/tokens/revokeОтзыв токена (требует Basic Auth в теле запроса)

ПеременнаяПо умолчаниюОписание
NORA_AUTH_ENABLEDfalseВключить аутентификацию
NORA_AUTH_HTPASSWD_FILEusers.htpasswdПуть к файлу htpasswd
NORA_AUTH_TOKEN_STORAGEdata/tokensКаталог хранения токенов

config.toml:

[auth]
enabled = true
htpasswd_file = users.htpasswd
token_storage = data/tokens