REST API
Эта страница — систематический перечень HTTP-эндпоинтов сервера Alatyr:
метод, путь и одна строка назначения. За ролевой матрицей доступа и
подробным разбором ключевых потоков (approve/reject/revoke, сервисные
аккаунты, сети) — в Администрирование; за SSH Key
Registry и Keyholder API отдельно — в Реестре ключей.
Базовый префикс — /api/v1. Вне его живут три служебных пути: GET /health,
GET /metrics и интерактивная спецификация GET /swagger/.
Формат ответа — JSON, кроме четырёх мест:
| Путь |
Что отдаёт |
GET /api/v1/ssh/krl |
двоичный файл OpenSSH KRL |
GET /api/v1/keyholder/krl |
то же, для целевого сервера |
GET /api/v1/certificates/{serial}/bundle |
ZIP |
GET /metrics |
текстовая экспозиция Prometheus |
Аутентификация
Большинство эндпоинтов требуют Authorization: Bearer <token> — либо JWT
(Keycloak или локальная аутентификация), либо токен сервисного аккаунта
(wca_*). Ролевая модель (cert-admin/cert-approver/cert-viewer/
cert-auto-approver) описана в Администрирование,
раздел «Роли».
Отдельная, не-Bearer схема авторизации — у эндпоинтов, которыми пользуется
агент, а не человек или UI:
POST /api/v1/enroll и остальные /enroll/* — сессии администратора не
требуют, но подчиняются собственным проверкам: nonce, enrollment_token
устройства, source-auth, corp-verify, ограничение частоты.
GET /api/v1/requests/{id}/status, /bundle-version, /certificate и
POST /api/v1/requests/{id}/checkin, /logs — заголовок
X-Agent-Secret, выданный при /enroll.
/api/v1/keyholder/* — разрешённые сети (CIDR) плюс ограничение частоты
плюс необязательный серверный токен. Разбор — в
Реестре ключей.
POST /api/v1/k8s/credential — взаимный TLS на отдельном слушателе, см.
раздел «Выдача credential для Kubernetes» ниже.
Аутентификация и сессия (auth)
| Метод и путь |
Назначение |
POST /api/v1/auth/callback |
Обмен PKCE authorization code на access/refresh токены (Keycloak) |
POST /api/v1/auth/refresh |
Обновление access-токена по refresh-токену |
POST /api/v1/auth/logout |
Выход (инвалидация сессии) |
GET /api/v1/auth/me |
Текущий пользователь (email, роль) |
GET /api/v1/auth/config |
Публичная конфигурация аутентификации |
POST /api/v1/auth/local/login |
Локальный логин по email+паролю |
POST /api/v1/auth/change-password |
Смена собственного пароля (локальная аутентификация) |
Enrollment и агент (agent)
| Метод и путь |
Назначение |
POST /api/v1/enroll |
Регистрация устройства и отправка CSR (машинная цель wifi) |
POST /api/v1/enroll/nonce |
Выдача одноразового nonce (и, для первого TPM-аттестованного enroll, challenge Credential Activation) |
POST /api/v1/enroll/source-nonce |
Выдача nonce для подписи источника заявки (source-auth) |
POST /api/v1/enroll/user |
Регистрация пользовательской заявки для уже существующего устройства (user_mtls/ad_logon) |
POST /api/v1/enroll/ssh |
Регистрация SSH-заявки для уже существующего устройства |
POST /api/v1/enroll/ssh-key |
Регистрация «сырого» hardware-backed SSH публичного ключа |
POST /api/v1/enroll/ssh-key/status |
Текущий статус SSH-ключей этого устройства (агент показывает его в своём окне) |
POST /api/v1/enroll/token-recover |
Восстановление enrollment_token устройства по доказательству владения закреплённым аппаратным ключом |
POST /api/v1/enroll/app-attest/challenge |
Challenge для Apple App Attest |
POST /api/v1/enroll/app-attest |
Приём аттестации Apple App Attest |
POST /api/v1/enroll/identity-sid |
Поиск SID пользователя по UPN — для машин вне домена, см. Настройка входа по карте |
POST /api/v1/enroll/purposes |
Какие цели назначены этому устройству |
POST /api/v1/enroll/purpose-request |
Запрос цели с самого устройства (сотрудник просит, администратор решает) |
POST /api/v1/enroll/crl |
Списки отзыва для клиента вне домена, см. Вход по RDP |
POST /api/v1/enroll/issuance-directives/{id}/report |
Отчёт устройства об исходе адресного предписания на выдачу |
GET /api/v1/requests/{id}/status |
Статус заявки на выпуск |
POST /api/v1/requests/{id}/checkin |
Check-in агента (подтверждение установки сертификата) |
POST /api/v1/requests/{id}/logs |
Загрузка снапшота лога агента |
GET /api/v1/requests/{id}/bundle-version |
Лёгкий probe версии бандла для steady-state синхронизации SSID — агент вызывает его почти на каждой итерации; тяжёлый .../certificate вызывается только при расхождении версии |
GET /api/v1/requests/{id}/certificate |
Скачивание подписанного сертификата + CA bundle (поддерживает ETag/If-None-Match для steady-state поллинга) |
SSH (ssh)
| Метод и путь |
Назначение |
GET /api/v1/ssh/ca-public-key |
Публичный ключ SSH CA в формате authorized-keys (для директивы TrustedUserCAKeys в sshd) |
GET /api/v1/ssh/krl |
Текущий SSH Key Revocation List (для директивы RevokedKeys в sshd) |
SSH-ключи (ssh-keys)
Подробности модели — в Реестре ключей.
| Метод и путь |
Назначение |
GET /api/v1/admin/ssh-keys |
Список всех зарегистрированных SSH-ключей по флоту |
POST /api/v1/admin/ssh-keys/{id}/approve |
Одобрение ожидающего SSH-ключа |
POST /api/v1/admin/ssh-keys/{id}/reject |
Отклонение ожидающего SSH-ключа |
POST /api/v1/admin/ssh-keys/{id}/revoke |
Отзыв активного (или отклонение ожидающего) SSH-ключа |
GET /api/v1/devices/{serial}/ssh-keys |
SSH-ключи, зарегистрированные одним устройством |
Общие учётные записи (principal-aliases)
Псевдоним — одна учётная запись на сервере (deploy, svc-backup), за
которой стоит несколько людей. Он отвечает на вопрос «кто на самом деле вошёл
под общим логином».
| Метод и путь |
Назначение |
GET /api/v1/admin/principal-aliases |
Список псевдонимов общих учётных записей |
POST /api/v1/admin/principal-aliases |
Создать псевдоним |
DELETE /api/v1/admin/principal-aliases/{alias} |
Удалить псевдоним |
PUT /api/v1/admin/principal-aliases/{alias}/enabled |
Включить/выключить псевдоним |
GET /api/v1/admin/principal-aliases/{alias}/keys |
Кто стоит за псевдонимом: ключи и их владельцы |
POST /api/v1/admin/principal-aliases/{alias}/members |
Добавить участника |
DELETE /api/v1/admin/principal-aliases/{alias}/members/{member} |
Убрать участника |
Keyholder API (keyholder)
Группа маршрутов для целевых серверов, а не для людей. Доступ к ней
определяется разрешёнными сетями, а не ролями; подробности и порядок
проверок — в Реестре ключей.
| Метод и путь |
Назначение |
GET /api/v1/keyholder/keys |
Список активных SSH публичных ключей для логина (для AuthorizedKeysCommand) |
GET /api/v1/keyholder/krl |
Список отзыва для директивы RevokedKeys на целевом сервере |
GET /api/v1/keyholder/principals |
Какими именами учётных записей сертификат ещё вправе пользоваться — онлайновая проверка вместо файла KRL |
GET /api/v1/keyholder/revocations |
Лента отзывов для сторожа сессий на целевом хосте: sshd проверяет право на вход один раз, и уже открытую сессию закрывает сам хост |
Управление серверными токенами — обычные админские маршруты:
| Метод и путь |
Назначение |
GET /api/v1/admin/keyholder-token-gate |
Текущая ступень требования токена (выключен / наблюдение / обязателен) |
GET /api/v1/admin/keyholder-tokens |
Список токенов keyholder-серверов (без значений) |
POST /api/v1/admin/keyholder-tokens |
Создание нового токена keyholder-сервера |
PUT /api/v1/admin/keyholder-tokens/{id}/principals |
Ограничить токен списком имён учётных записей |
DELETE /api/v1/admin/keyholder-tokens/{id} |
Отзыв токена keyholder-сервера |
Admin — заявки и устройства
| Метод и путь |
Назначение |
GET /api/v1/requests |
Список заявок на выпуск (с фильтрами) |
GET /api/v1/requests.csv |
То же, экспорт CSV |
POST /api/v1/requests/approve |
Массовое одобрение заявок |
POST /api/v1/requests/check-conflicts |
Проверка конфликтов серийников перед массовым одобрением |
POST /api/v1/requests/reject |
Массовое отклонение заявок |
GET /api/v1/devices |
Список зарегистрированных устройств |
GET /api/v1/devices.csv |
То же, экспорт CSV |
GET /api/v1/devices/agent-versions |
Список встречающихся версий агента |
GET /api/v1/devices/{serial}/purposes |
Какие цели назначены устройству |
PUT /api/v1/devices/{serial}/purposes |
Назначить устройству цели |
POST /api/v1/devices/{serial}/purposes/{purpose}/decision |
Решение по цели, запрошенной с самого устройства |
GET /api/v1/admin/purpose-requests |
Очередь целей, запрошенных с устройств и ждущих решения |
PUT /api/v1/devices/{serial}/owner |
Сменить владельца устройства |
PUT /api/v1/devices/{serial}/purpose-overrides |
Переопределить системную политику выдачи для устройства, по каждой цели отдельно (наследовать/разрешить/запретить) |
GET /api/v1/admin/purpose-overrides/{purpose}/cost |
Сколько устройств и переопределений затронет массовый сброс переопределений цели |
DELETE /api/v1/admin/purpose-overrides/{purpose} |
Сбросить переопределения цели у всего парка |
GET /api/v1/devices/{serial}/logs |
Список снапшотов логов устройства |
GET /api/v1/devices/{serial}/logs/{logId} |
Один снапшот лога (с содержимым) |
DELETE /api/v1/devices/{serial}/logs/{logId} |
Удалить снапшот лога |
POST /api/v1/devices/{serial}/request-logs |
Запросить свежий снапшот логов с устройства |
DELETE /api/v1/devices/{serial}/request-logs |
Отменить ожидающий запрос логов |
POST /api/v1/devices/{serial}/rotate-enrollment-token |
Ротация enrollment-токена устройства |
POST /api/v1/devices/{serial}/revoke |
Отозвать все активные сертификаты устройства и, если это удалось для каждого из них, освободить license-слот (decommission) — подробнее в Лицензировании |
POST /api/v1/devices/{serial}/unblock |
Снять блокировку устройства (device-block-on-revoke) |
POST /api/v1/users/{identity}/revoke-certs |
Отозвать все активные сертификаты пользователя (по identity) |
Отвязка аппаратных ключей устройства
Четыре разные привязки, и каждая снимается отдельно. Снятие означает «Alatyr
забывает закреплённый ключ», после чего устройство закрепляет новый на
следующем обращении.
| Метод и путь |
Назначение |
POST /api/v1/devices/{serial}/unbind-tpm |
Снять привязку к TPM, чтобы устройство могло закрепиться заново |
POST /api/v1/devices/{serial}/release-tpm-pin |
Забыть AK, подтверждённый Credential Activation, чтобы устройство аттестовалось заново |
POST /api/v1/devices/{serial}/release-enroll-key |
Забыть ключ заявки, закреплённый за устройством |
POST /api/v1/devices/{serial}/release-continuity-key |
Сбросить ключ непрерывности устройства |
Адресные предписания на выдачу (issuance-directives)
Предписание адресует цель конкретному человеку на конкретном устройстве —
чтобы заявка ушла от того, от кого ожидается, а не от того, кто первым сел за
машину.
| Метод и путь |
Назначение |
GET /api/v1/admin/issuance-directives |
Очередь предписаний по всему флоту |
POST /api/v1/devices/{serial}/issuance-directives |
Адресовать цель человеку на этом устройстве |
GET /api/v1/devices/{serial}/issuance-directives |
Предписания одного устройства |
DELETE /api/v1/admin/issuance-directives/{id} |
Отменить предписание |
Admin — сертификаты и аудит
| Метод и путь |
Назначение |
GET /api/v1/certificates/{serial}/bundle |
Скачать бандл сертификата как ZIP |
POST /api/v1/certificates/{serial}/revoke |
Отозвать сертификат |
PUT /api/v1/certificates/{serial}/key-protection |
Назначить конкретному сертификату ступень подтверждения владельца |
GET /api/v1/audit |
Список записей аудит-лога |
GET /api/v1/audit.csv |
То же, экспорт CSV |
GET /api/v1/admin/stats |
Статистика дашборда |
Отзыв там, где издатель отзыва не умеет
У SCEP операции отзыва нет вовсе. Запрос всё равно выполняется: строка в
Alatyr помечается отозванной, а в ответе приходит
ca_revoke_unsupported=true и предупреждение — на стороне внешнего УЦ
сертификат остаётся действительным, и снять его там нужно руками.
Отказом (404) отвечает только случай, когда серийник неизвестен ни
издателю, ни базе: сообщать об отзыве, которого не было, продукт не
станет. Подробнее — Известные ограничения.
Admin — сети
| Метод и путь |
Назначение |
GET /api/v1/admin/networks |
Список корпоративных сетей (Wi-Fi + проводные) |
GET /api/v1/admin/networks.csv |
То же, экспорт CSV |
POST /api/v1/admin/networks |
Создать сеть (Wi-Fi или проводную) |
DELETE /api/v1/admin/networks/{id} |
Полностью удалить сеть |
POST /api/v1/admin/networks/{id}/disable |
Отключить сеть (soft delete) |
POST /api/v1/admin/networks/{id}/restore |
Восстановить ранее отключённую сеть |
PUT /api/v1/admin/networks/{id}/agent-profile-disabled |
Переключатель opt-out агентского профиля для Windows/Linux |
PUT /api/v1/admin/networks/{id}/macos-agent-profile-disabled |
Переключатель opt-out MDM-профиля агента для macOS |
PUT /api/v1/admin/networks/{id}/radius-server-names |
Имена RADIUS-сервера для этой сети; пустой массив означает, что имя не проверяется |
Что означают эти настройки и как их задают в админке — Wi-Fi и проводной
802.1X.
Admin — доступ к Kubernetes
Реестр кластеров: что именно поедет на устройство, к какому кластеру и под
каким субъектом. Как это настраивается — Доступ к
Kubernetes.
| Метод и путь |
Назначение |
GET /api/v1/admin/k8s-clusters |
Реестр кластеров Kubernetes |
POST /api/v1/admin/k8s-clusters |
Завести кластер |
PUT /api/v1/admin/k8s-clusters/{id} |
Изменить кластер |
DELETE /api/v1/admin/k8s-clusters/{id} |
Удалить кластер |
Выдача credential для Kubernetes
| Метод и путь |
Назначение |
POST /api/v1/k8s/credential |
Выдать эфемерный клиентский сертификат для кластера (10 минут) |
Этот маршрут не входит в общий HTTP-слушатель сервера: у него свой
слушатель со взаимным TLS, адрес которого задаёт ALATYR_K8S_BROKER_URL.
Поэтому ни Bearer-токен, ни разрешённые сети Keyholder к нему не относятся:
клиент предъявляет сертификат, и им же определяется, кто просит. Настройка —
Доступ к Kubernetes.
Admin — пользователи
| Метод и путь |
Назначение |
GET /api/v1/users |
Список пользователей с ролями |
GET /api/v1/users.csv |
То же, экспорт CSV |
POST /api/v1/users/local |
Создать локального (пароль) пользователя |
PUT /api/v1/users/{email}/roles |
Назначить роли пользователю |
PUT /api/v1/users/{email}/enabled |
Включить/выключить пользователя |
PUT /api/v1/users/{email}/password |
Сброс пароля локального пользователя администратором |
Сервисные аккаунты (service-accounts)
| Метод и путь |
Назначение |
GET /api/v1/service-accounts |
Список сервисных аккаунтов |
POST /api/v1/service-accounts |
Создать сервисный аккаунт |
PUT /api/v1/service-accounts/{id}/enabled |
Включить/выключить сервисный аккаунт |
PUT /api/v1/service-accounts/{id}/allowed-purposes |
Какие цели этому токену разрешено одобрять автоматически |
DELETE /api/v1/service-accounts/{id} |
Удалить сервисный аккаунт |
Вебхуки (webhooks)
| Метод и путь |
Назначение |
GET /api/v1/admin/webhooks |
Список webhook-эндпоинтов |
POST /api/v1/admin/webhooks |
Создать webhook-эндпоинт |
PUT /api/v1/admin/webhooks/{id} |
Обновить webhook-эндпоинт |
DELETE /api/v1/admin/webhooks/{id} |
Удалить webhook-эндпоинт |
PUT /api/v1/admin/webhooks/{id}/enabled |
Включить/выключить webhook-эндпоинт |
POST /api/v1/admin/webhooks/{id}/test |
Отправить тестовую доставку |
GET /api/v1/admin/webhooks/{id}/deliveries |
Постраничный журнал доставок webhook-эндпоинта — см. Эксплуатация |
Settings (settings)
| Метод и путь |
Назначение |
GET /api/v1/settings/system |
Получить системные настройки |
PUT /api/v1/settings/system |
Обновить системные настройки |
GET /api/v1/settings/issuers |
Список issuer-профилей (по purpose) |
GET /api/v1/settings/issuers/{purpose} |
Получить один issuer-профиль |
PUT /api/v1/settings/issuers/{purpose} |
Создать/обновить issuer-профиль |
POST /api/v1/settings/issuers/{purpose}/test-connection |
Проверить связность issuer-профиля |
GET /api/v1/settings/agent-update/stuck |
Служебный список устройств, застрявших посреди принудительного обновления агента |
GET /api/v1/settings/platform-update |
Уведомление об обновлении платформы (сервер + фронтенд) |
Corp-ownership verification (corp-verify)
| Метод и путь |
Назначение |
GET /api/v1/admin/corp-allowlist |
Список записей corp-ownership allowlist |
POST /api/v1/admin/corp-allowlist |
Добавить устройство в corp-ownership allowlist |
DELETE /api/v1/admin/corp-allowlist/{serial} |
Удалить устройство из corp-ownership allowlist |
GET /api/v1/settings/sa-auto-approve |
Получить политику corp-ownership verification для SA auto-approve |
PUT /api/v1/settings/sa-auto-approve |
Обновить политику corp-ownership verification для SA auto-approve |
Enroll source-auth (enroll-source-auth)
| Метод и путь |
Назначение |
GET /api/v1/settings/enroll-source-auth |
Получить политику enroll source-auth |
PUT /api/v1/settings/enroll-source-auth |
Обновить политику enroll source-auth |
Nonce для подписи источника выдаёт POST /api/v1/enroll/source-nonce — он в
таблице агентских маршрутов выше.
Лицензия (license)
Подробное описание лимита, статусов, decommission и восстановления журнала
учёта — в Лицензировании.
| Метод и путь |
Назначение |
GET /api/v1/license/status |
Статус лицензии |
POST /api/v1/license/activate |
Активировать лицензию |
POST /api/v1/license/attest |
Аттестация лицензии |
POST /api/v1/license/decommission |
Списать устройство (decommission) из лицензионного учёта |
POST /api/v1/license/reanchor |
Re-anchor usage ledger |
Публичные и служебные
| Метод и путь |
Назначение |
GET /health |
Health check |
GET /metrics |
Метрики Prometheus — см. Эксплуатация |
GET /swagger/ |
Интерактивная спецификация OpenAPI этого же сервера |
GET /api/v1/version |
Версия сервиса (для корреляции с логами, см. Логирование) |
GET /api/v1/features |
Публичные feature-флаги |
GET /api/v1/issuer |
Возможности активного issuer'а |
/metrics не аутентифицируется
Это сделано намеренно: у сборщика Prometheus нет учётных данных, а
эндпоинт за аутентификацией тихо перестают собирать. Идентификаторов
устройств и людей там нет по построению, но объём запросов и доля ошибок
— тоже сведения о развёртывании. Закрывайте его на уровне ingress, как
любой внутренний адрес: сам обработчик этого сделать не может.