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.
Чотири навмисні обмеження
- Власний scope.
provider-credentials.reveal— його не мають на увазі ніadmin(редагувати ≠ бачити), ніinvoke(машини роблять resolve, люди — reveal). Реєстр auth-сервера видає його окремо, лише панелі; див. Service Plane Tokens. - Названий оператор, обов'язково. На відміну від інших адмін-викликів, відсутній
X-Admin-Actor— це400. Після reveal не лишається нічого, крім його audit-події; анонімною вона казала б лише «якийсь клієнт прочитав секрет» — марно. Анонімне розкриття plaintext відкинуте самою конструкцією. - Спершу audit, потім відповідь. Подія
credential.revealed(лише імена полів, ніколи значення) комітиться в окремій транзакції до відправлення відповіді — слід існує, навіть якщо відповідь так і не дійшла. Подія також виключена з purge ретенції audit: reveal-и рідкісні, людські й варті зберігання. - Власний дефіцитний бюджет. За замовчуванням 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.