Головна/Адміністрування/Reveal ENУКРРУС API-довідник (ReDoc) ↗

Reveal

Plaintext для названого оператора — власний scope, обов'язкова атрибуція, audit до відповіді.

Оператори, які редагують credentials через Internal Admin API, бачать лише маски — і це правильно аж до дня, коли ключ можливо хибний, а єдиними ліками був би сліпий перезапис. POST /internal/v1/admin/credentials/{credential_id}/reveal — свідомий виняток: розшифрувати один запис і показати його людині.

curl -s -X POST "$CREDS_BASE/internal/v1/admin/credentials/$CRED_ID/reveal" \
  -H "Authorization: Bearer $REVEAL_TOKEN" \
  -H "X-Admin-Actor: panel:alice"

Відповідь несе розшифровані credentials, відкриту configuration, координати власника й revealed_at.

Чотири навмисні обмеження

  1. Власний scope. provider-credentials.reveal — його не мають на увазі ні admin (редагувати ≠ бачити), ні invoke (машини роблять resolve, люди — reveal). Реєстр auth-сервера видає його окремо, лише панелі; див. Service Plane Tokens.
  2. Названий оператор, обов'язково. На відміну від інших адмін-викликів, відсутній X-Admin-Actor — це 400. Після reveal не лишається нічого, крім його audit-події; анонімною вона казала б лише «якийсь клієнт прочитав секрет» — марно. Анонімне розкриття plaintext відкинуте самою конструкцією.
  3. Спершу audit, потім відповідь. Подія credential.revealed (лише імена полів, ніколи значення) комітиться в окремій транзакції до відправлення відповіді — слід існує, навіть якщо відповідь так і не дійшла. Подія також виключена з purge ретенції audit: reveal-и рідкісні, людські й варті зберігання.
  4. Власний дефіцитний бюджет. За замовчуванням 10/min на оператора (Rate Limits) — значно нижче за адмінські 60/min, тож украдена сесія панелі не обійде все сховище зі швидкістю пагінації.

Семантика, яку варто знати

  • Працює на записах будь-якого рівня та будь-якого статусу, включно з disabled — підозріло зламаний ключ інспектують саме тоді, коли він вимкнений. М'яко видалені записи — 404: видалено означає зникло.
  • Це POST, а не GET: reveal — дія з audit-записом, а не кешовний ресурс. Id лишається в шляху; значення їдуть лише в тілі, тож жоден секрет ніколи не потрапляє в access-лог.
  • Шифротекст, який не розшифровується, — це 500 CREDENTIAL_DECRYPTION_FAILED, сам зафіксований в audit як credential.decryption_failed — така відповідь є пожежною тривогою щодо keyring, а не кандидатом на retry.

Розібраний приклад, включно з audit-подією, яку він лишає: сценарій cookbook 08.