Журнал аудита
NORA записывает операции реестра в структурированный журнал аудита. Каждая запись представляет собой JSON-объект, записанный в одну строку (формат JSONL).
Конфигурация
Заголовок раздела «Конфигурация»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_AUDIT_LOG | file | Режим вывода: file, stdout, both или off |
[audit]mode = "file" # "file", "stdout", "both", "off"Режимы:
| Режим | Поведение |
|---|---|
file | Запись в {storage_path}/audit.jsonl |
stdout | Запись в stderr (совместимо с 12-factor, работает с агрегаторами логов) |
both | Запись и в файл, и в stderr |
off | Отключить журналирование аудита |
Формат записи
Заголовок раздела «Формат записи»Каждая строка представляет собой JSON-объект со следующими полями:
| Поле | Тип | Описание |
|---|---|---|
ts | string | Временная метка в формате ISO 8601 (UTC) |
action | string | Что произошло — см. Типы действий |
actor | string | Кто вызвал операцию — см. Значения actor |
artifact | string | Пакет, путь или ссылка на образ; пусто для pull, cache_hit и proxy_fetch |
registry | string | Тип реестра: docker, npm, pypi, maven, raw и т. д.; admin для выпуска токенов, область переиндексации для reindex, * для политик хранения |
detail | string | Дополнительный контекст: blob/manifest для Docker, правило и причина для curation_block, роль и срок для admin_token_mint, счётчики для retention-apply |
Примеры записей
Заголовок раздела «Примеры записей»{"ts":"2026-10-13T07:46:45.283Z","action":"push","actor":"ci","artifact":"team/a.txt","registry":"raw","detail":""}{"ts":"2026-10-13T07:46:47.990Z","action":"pull","actor":"proxy","artifact":"","registry":"raw","detail":""}{"ts":"2026-10-13T07:46:52.149Z","action":"push","actor":"api","artifact":"team/tiny:1.0","registry":"docker","detail":"manifest"}{"ts":"2026-10-13T07:46:53.645Z","action":"delete","actor":"ci","artifact":"team/b.txt","registry":"raw","detail":""}{"ts":"2026-10-13T07:47:03.543Z","action":"push","actor":"anonymous","artifact":"team/c.txt","registry":"raw","detail":""}{"ts":"2026-10-13T08:00:00.000Z","action":"retention-apply","actor":"scheduler","artifact":"12 versions","registry":"*","detail":"keys=36 bytes_freed=104857600 duration=1.2s"}Типы действий
Заголовок раздела «Типы действий»| Действие | Описание |
|---|---|
push | Клиент загрузил артефакт |
pull | Скачивание Cargo, pub или Raw из локального хранилища |
delete | Клиент удалил артефакт |
overwrite | Существующий артефакт Raw заменён |
mount | Монтирование блоба Docker из другого репозитория |
cache_hit | Запрос обслужен из кэша прокси без обращения к вышестоящему реестру |
proxy_fetch | Артефакт получен из вышестоящего реестра |
curation_block | Скачивание отклонено курацией |
reindex | Перестроение индекса через POST /api/v1/admin/reindex или переиндексация репозитория RPM/Debian |
admin_token_mint | Администратор выпустил API-токен для пользователя через POST /api/v1/admin/tokens (artifact — пользователь; сам токен не пишется) |
retention-apply | Прогон политик хранения удалил версии (одна сводная запись на прогон) |
Значения actor
Заголовок раздела «Значения actor»| Actor | Когда |
|---|---|
| имя пользователя | Аутентифицированный пользователь для push, delete, overwrite и reindex RPM/Debian в Cargo, Maven, npm, PyPI, Raw, RPM и Debian; также для curation_block, административного reindex и admin_token_mint. API-токен записывается именем его владельца |
anonymous | Те же операции, когда у запроса нет идентичности (аутентификация выключена или анонимный доступ) |
api | push, delete и mount в Docker — записи Docker не содержат имени пользователя |
proxy | pull, cache_hit и proxy_fetch |
scheduler | retention-apply от встроенного планировщика политик хранения |
cli | retention-apply из nora retention-apply |
Расположение файла
Заголовок раздела «Расположение файла»При использовании режима file или both журнал аудита записывается в:
{NORA_STORAGE_PATH}/audit.jsonlПо умолчанию: data/audit.jsonl (относительно рабочей директории).
Файл создаётся автоматически. Родительские директории создаются, если они не существуют.
Пример для Docker Compose
Заголовок раздела «Пример для Docker Compose»services: nora: image: ghcr.io/getnora-io/nora:latest environment: NORA_AUDIT_LOG: both NORA_STORAGE_PATH: /data volumes: - nora-data:/dataЗатем следите за журналом:
docker exec nora tail -f /data/audit.jsonl | jq .Пересылка в агрегатор логов
Заголовок раздела «Пересылка в агрегатор логов»В режиме stdout записи аудита отправляются в stderr вместе с обычными логами. Используйте драйвер логов вашего оркестратора контейнеров для их пересылки:
# Filter audit entries from container logsdocker logs nora 2>&1 | grep '"action":' | jq .Для выделенной пересылки на основе файлов (Filebeat, Promtail, Vector):
filebeat.inputs: - type: log paths: - /data/audit.jsonl json.keys_under_root: true json.add_error_key: trueЗапросы к журналу аудита
Заголовок раздела «Запросы к журналу аудита»# All pushes todaygrep '"action":"push"' /data/audit.jsonl | jq .
# Everything user "ci" pushed, overwrote or deleted# (Docker writes are recorded with actor "api", not the username)jq -c 'select(.actor == "ci")' /data/audit.jsonl
# Downloads refused by curationjq -c 'select(.action == "curation_block")' /data/audit.jsonl
# Count operations per registryjq -r '.registry' /data/audit.jsonl | sort | uniq -c | sort -rnСмотрите также
Заголовок раздела «Смотрите также»- Справочник по конфигурации — переменная окружения
NORA_AUDIT_LOG - Метрики Prometheus — количественный мониторинг