Кантролі, названыя ў раздзеле 14 дакумента 21-compliance.md, правяраюцца аўдытарам. Гэтая старонка апісвае працэдуру; доказы — запісы, якія яна стварае.
Ключы
Кожныя захаваныя ўліковыя даныя запячатваюцца новым ключом шыфравання даных (DEK). Галоўны ключ (KEK) абгортвае DEK, а спасылка на галоўны ключ захоўваецца побач (key_ref або ўнутры запакаванай велічыні). Ратацыя галоўнага ключа паўторна абгортвае DEK. Уліковыя даныя ніколі не расшыфроўваюцца і не шыфруюцца нанова.
| Параметр | Значэнне |
|---|---|
QUIRE_MASTER_KEY |
Бягучы галоўны ключ: 32 байты, base64. Ім абгортваецца кожны новы сакрэт |
QUIRE_MASTER_KEY_VERSION |
Пазнака версіі. Калі не зададзена — v1. Павялічвайце яе пры кожнай змене ключа |
QUIRE_MASTER_KEY_RETIRED |
Старыя ключы, якімі яшчэ могуць быць запячатаны сакрэты, у фармаце v1=<base64>,v0=<base64>. Толькі чытанне, запісваць нельга |
Вэб-узровень, worker і каманда bun run kek:rotate чытаюць адны і тыя ж тры налады. Іх значэнні павінны супадаць, інакш адзін з кампанентаў не зможа адкрыць тое, што запячатаў іншы.
Без QUIRE_MASTER_KEY кожная падсістэма працягвае выкарыстоўваць ключ, вытворны ад QUIRE_SECRET_KEY. Гэта працуе, але старонка стану сістэмы паказвае пагаршэнне; пасля задання галоўнага ключа даныя па-ранейшаму чытаюцца, каб першая ратацыя магла перанесці ўсё пад яго. Любы, хто можа чытаць асяроддзе працэсу, здольны расшыфраваць усе захаваныя ўліковыя даныя; таму вытворчае ўсталяванне павінна мець галоўны ключ у сховішчы сакрэтаў, асобна ад рэзервовай копіі базы.
Ратацыя
Узрост ключа паказваецца ў кансолі платформы, у раздзеле Security, Master key, і метрыцы quire.secrets.master_key.age (дні). Штодзённы расклад platform.key_age (03:41 UTC) запісвае напамін у ланцуг аўдыту платформы, калі ключу спаўняецца 365 дзён, а затым кожныя 30 дзён да ратацыі. Ратуйце ключ пасля напаміну і кожны раз, калі ён мог быць раскрыты.
- Стварыце новы ключ:
openssl rand -base64 32. - Задайце для яго
QUIRE_MASTER_KEY, а дляQUIRE_MASTER_KEY_VERSION— наступную пазнаку (v2). Перанясіце стары ключ уQUIRE_MASTER_KEY_RETIREDякv1=<old base64>. Захоўвайце абедзве копіі ў месцы па-за гэтым хостам. - Разгарніце вэб-узровень і worker з новымі наладамі. Новыя сакрэты будуць абгортвацца пад
env:QUIRE_MASTER_KEY:v2; старыя па-ранейшаму адкрываюцца праз выведзены ключ. - Запытайце ратацыю і пакажыце прычыну, якая застанецца ў аўдыце:
- у кансолі: Security, Master key, Rotate the master key; або
- у абалонцы з тым жа асяроддзем:
bun run kek:rotate request --reason "Annual rotation, ticket SEC-114".
- Worker абгортвае нанова частку даных раз у хвіліну (расклад планавальніка
platform.key_rotation) і працягвае пасля перазапуску. Каб завяршыць за адзін запуск:bun run kek:rotate run. Сачыце за працэсам празbun run kek:rotate status. - Калі запіс паказвае завершаную ратацыю з нулявымі нявырашанымі і няўдалымі, выдаліце стары ключ з
QUIRE_MASTER_KEY_RETIREDі разгарніце зноў. Да гэтага часу захоўвайце яго: значэнне, якое не ўдалося перанесці, па-ранейшаму зашыфравана старым ключом.
Што апрацоўвае заданне
Кожнае сховішча з абгорнутым DEK: пералік знаходзіцца ў SEALED_STORES (apps/worker/src/key-rotation.ts). Сховішчы базы кіравання апрацоўваюцца ў ёй; сховішчы арганізацый — па адной арганізацыі пад абаронай на ўзроўні радкоў, у той базе, дзе яна захоўваецца, таму кліент з выдзеленай базай ратуецца ў сваёй базе. Тэст падае, калі ў схеме з’яўляецца слупок з абгорнутым ключом, якога няма ў пераліку; яшчэ адзін тэст выяўляе, калі праверка ўліковых даных знаходзіць запячатаны слупок, прапушчаны пералікам.
Запіс
ops.key_rotation: адзін радок на ратацыю з прычынай, аўтарам запыту, станам і агульнымі вынікамі (пераабгорнута, ужо актуальнае, не вырашана, няўдала).ops.key_rotation_progress: радок на сховішча і абсяг пасля апрацоўкі з ключавымі спасылкамі, якія не ўдалося прачытаць, і колькасцю значэнняў пад кожнай. Працягнутая ратацыя прапускае іх.- Ланцуг аўдыту платформы:
platform/key_rotation_requestз прычынай,platform/key_rotation_storeдля кожнага сховішча з вынікамі, іplatform/key_rotation_completeабоplatform/key_rotation_fail;platform/key_age_reminderдля напамінаў. - Метрыкі:
quire.secrets.master_key.ageіquire.secrets.rewrap.outstanding(значэнні, якія апошняя ратацыя не змагла перанесці).
Калі засталіся нявырашаныя значэнні
Нявырашанае значэнне зашыфравана ключом, якога няма ў гэтым усталяванні, або не адпавядае форме, абяцанай яго слупком. Запіс прагрэсу паказвае спасылку (напрыклад, env:QUIRE_MASTER_KEY:v0 (unreadable)). Вярніце гэты ключ у QUIRE_MASTER_KEY_RETIRED і паўтарыце ратацыю або, калі ключ страчаны назаўсёды, папрасіце адміністратара арганізацыі ўвесці ўліковыя даныя зноў; яны будуць запячатаны бягучым ключом. У запісе няўдалай ратацыі паказваецца памылка: выпраўце прычыну і паўтарыце запыт.
Ключы подпісу
Асобна ад галоўнага ключа: кожная арганізацыя падпісвае свае токены OpenID Connect і паведамленні LTI ўласным RSA-ключом, апублікаваным па адрасе /.well-known/jwks.json. Умяшанне аператара не патрабуецца. Штогадзінны расклад platform.signing_keys публікуе наступны ключ за сем дзён да заканчэння 90-дзённага тэрміну бягучага; праз тыдзень наступны ключ пачынае падпісваць, а стары становіцца папярэднім; праз яшчэ 90 дзён стары ключ выдаляецца з набору. Кожны крок запісваецца ў ланцуг аўдыту платформы пад platform/signing_key_advance.
Каб раней замяніць ключ арганізацыі, напрыклад пасля яго раскрыцця:
- у кансолі: Security, Master key, Publish a new signing key (патрэбна
platform/keys_manage); або - у абалонцы з асяроддзем worker:
bun run kek:rotate signing-keys rotate --tenant <slug or id> --reason "Key exposed, INC-3310".bun run kek:rotate signing-keys statusпералічвае стадыі ключоў кожнай арганізацыі.
Новы ключ публікуецца адразу і пачынае падпісваць праз сем дзён, калі стары пераходзіць у стан папярэдняга. Гэты тыдзень патрэбны, бо атрымальнікі кэшуюць набор ключоў; карацейшае перакрыццё парушыла б усе інтэграцыі адначасова. Стары ключ застаецца ў наборы яшчэ 90 дзён, каб токены, якія ён ужо падпісаў, можна было правяраць. Калі праз раскрыццё яму трэба хутчэй перастаць давяраць, аператар можа выдаліць яго радок уласным доступам да базы ў межах запісанай змены (аварыйны доступ толькі для чытання); тады праверка токенаў, падпісаных гэтым ключом, не пройдзе. Прымусовая ратацыя запісваецца ў аўдыце як platform/signing_key_rotate з указаннем прычыны. Worker павінен мець тыя ж налады QUIRE_MASTER_KEY, што і вэб-узровень, каб абгарнуць новы ключ; bun run kek:rotate для галоўнага ключа пераабгортвае ключы подпісу разам з астатнімі (oauth_signing_key знаходзіцца ў SEALED_STORES).
Аварыйны вытворчы доступ
Ніхто не мае сталага доступу да вытворчага асяроддзя. Калі нельга чакаць, уладальнік выдае аварыйны дазвол: кансоль платформы, Security, Break-glass access.
- Дазвол мае абсяг (адна арганізацыя або рэестр платформы), прычыну даўжынёй не менш за 20 сімвалаў з пазначэннем інцыдэнту або заяўкі і тэрмін ад 5 да 240 хвілін. Ён заканчваецца аўтаматычна; праверка выконваецца паводле гадзінніка для кожнага запыту.
- Дазвол можна выдаць сабе або іншаму ўладальніку (працэдура з удзелам двух людзей). Карыстацца ім можа толькі атрымальнік. Выдача патрабуе
platform/break_glass_issue, выкарыстанне —platform/break_glass_use; па змаўчанні абодва дазволы толькі для ўладальнікаў. - Запыты выконваюцца праз шлюз, а не праз злучэнне з базай: толькі чытанне, па адным, з абмежаваннем адной арганізацыяй або рэестрам кіравання, з тайм-аўтам 5 секунд і максімумам 500 радкоў. Двайковыя значэнні паказваюцца памерам.
- Ланцуг аўдыту платформы запісвае выдачу (з прычынай), адкліканне, кожны запыт перад выкананнем (
platform/break_glass_statement, адхіленыя — з вынікамdenied) і кожны адказ (platform/break_glass_result). Уops.break_glass_statementзахоўваюцца ID запісаў аўдыту, таму запіс выдачы звязваецца з імі. - Запіс прапаноўваць нельга. Калі змена не можа чакаць выпуску, аператар выкарыстоўвае ўласны доступ да базы ў межах асобнага запісу аб змене па-за гэтым прадуктам; у ім варта спаслацца на інцыдэнт, пазначаны тут.
Навошта не выдаваць уліковыя даныя базы: доступ Postgres перажывае сеанс, які запатрабаваў яго, абыходзіць бяспеку на ўзроўні радкоў, на якую абапіраецца праграма, і не можа запісаць у журнал аўдыту прадукта. Таму запыты аўдытуюцца толькі ў той ступені, у якой захаваны серверны журнал. Шлюз робіць аўдыт уласцівасцю самога доступу, а не працэдурай вакол яго.
Каб адказаць на запыт аўдыту: пералічыце дазволы за перыяд (Break-glass access), адкрыйце гісторыю дазволу з запытамі і ID запісаў аўдыту, а затым прачытайце гэтыя запісы ў ланцугу аўдыту платформы (bun run audit:verify --platform пацвярджае яго цэласнасць).