Ito ang mga kontrol sa 21-compliance.md seksiyon 14 na hinihingi ng pangalan ng auditor. Pamamaraan ang pahinang ito; ebidensiya ang mga rekord na nalilikha nito.
Mga key
Sinaselyuhan ang bawat nakaimbak na credential gamit ang bagong data encryption
key (DEK). Binabalot ito ng master key (KEK) at iniimbak sa tabi nito ang
reference ng master key (key_ref o reference sa loob ng naka-pack na value).
Muling ibinabalot ng pagpapalit ng master key ang DEK; hindi nito dine-decrypt o
muling ine-encrypt ang credential.
| Setting | Kahulugan |
|---|---|
QUIRE_MASTER_KEY |
Kasalukuyang master key: 32 byte, base64. Dito ibinabalot ang bawat bagong secret |
QUIRE_MASTER_KEY_VERSION |
Label ng bersiyon nito; v1 kapag hindi itinakda. Itaas ito tuwing papalitan ang key |
QUIRE_MASTER_KEY_RETIRED |
Mga lumang key na maaaring gumamit sa pag-seal ng secret, gaya ng v1=<base64>,v0=<base64>. Binabasa, hindi sinusulatan |
Binabasa ng web tier, worker, at command na bun run kek:rotate ang parehong tatlong
setting. Dapat magkapareho ang mga value ng lahat; kung hindi, hindi mabubuksan ng
isa ang sinelyuhan ng iba.
Kapag walang QUIRE_MASTER_KEY, pinananatili ng bawat subsystem ang key na
hinango nito mula sa QUIRE_SECRET_KEY. Gumagana ito, ipinapakita ng System
health page na degraded ang kondisyon, at nananatiling nababasa pagkaraang
magtakda ng master key; sa ganitong paraan inililipat ng unang rotation ang lahat
mula rito. Kayang i-decrypt ng sinumang nakakabasa sa environment ng proseso ang
lahat ng nakaimbak na credential, kaya dapat magtaglay ng master key ang production
installation, nasa secret store ito at hindi kasama ng database sa iisang backup.
Pagpapalit
Ipinapakita ang edad ng key sa Platform console, Security, Master key at metric
na quire.secrets.master_key.age (araw). Naglalagay ng paalala ang araw-araw na
platform.key_age schedule (03:41 UTC) sa platform audit chain kapag 365 araw
na ang key at kada 30 araw pagkatapos nito hanggang mapalitan. Magpalit sa oras
ng paalala at kapag posibleng nalantad ang key.
- Gumawa ng bagong key:
openssl rand -base64 32. - Itakda rito ang
QUIRE_MASTER_KEYat itakda angQUIRE_MASTER_KEY_VERSIONsa susunod na label (v2). Ilagay ang lumang key saQUIRE_MASTER_KEY_RETIREDbilangv1=<old base64>. Magtago ng kopya ng dalawa sa labas ng host na ito. - I-deploy ang web tier at worker gamit ang bagong setting. Ibabalot na sa
env:QUIRE_MASTER_KEY:v2ang mga bagong secret; mabubuksan pa rin ang luma gamit ang retired key. - Humiling ng rotation na may dahilang itatala sa audit trail:
- sa console: Security, Master key, Rotate the master key; o
- sa shell na may parehong environment:
bun run kek:rotate request --reason "Annual rotation, ticket SEC-114".
- Muling magbabalot ang worker ng isang bahagi bawat minuto (schedule ng
scheduler na
platform.key_rotation) at magpapatuloy pagkaraang mag-restart. Para tapusin nang isang upuan:bun run kek:rotate run. Bantayan gamit angbun run kek:rotate status. - Kapag nakasaad sa record na tapos na ang rotation at zero unresolved at
zero failed, alisin sa
QUIRE_MASTER_KEY_RETIREDang retired key at muling i-deploy. Panatilihin ito hanggang noon: maaaring nakabalot pa rin rito ang hindi nailipat na value.
Aling data ang sinusuri ng job
Bawat store na may naka-pack na DEK: ang nasa SEALED_STORES
(apps/worker/src/key-rotation.ts). Sinusuri sa control database ang mga store
nito; iniisa-isa naman ang store ng organisasyon sa ilalim ng row-level security
bawat organisasyon, sa database na kinaroroonan nito. Kaya sa database na iyon
iniikot ang key ng tenant na naka-pin sa dedicated database. Pumapalya ang isang
test kapag nadagdagan ang schema ng column na may naka-wrap na key na wala sa
listahan, gayundin kapag may sealed column sa pagsusuri ng credential na hindi
nasasaklaw ng listahan.
Ang rekord
ops.key_rotation: isang row bawat rotation, kasama ang dahilan, humiling, estado, at kabuuan (muling binalot, napapanahon na, unresolved, failed).ops.key_rotation_progress: isang row bawat store at scope na nasuri, kasama ang mga reference ng key na hindi mabasa at bilang ng value sa ilalim ng bawat isa. Nilalaktawan ng ipinagpatuloy na rotation ang mga ito.- Platform audit chain:
platform/key_rotation_request(kasama ang dahilan), isangplatform/key_rotation_storebawat store kasama ang bilang, atplatform/key_rotation_completeoplatform/key_rotation_fail;platform/key_age_reminderpara sa paalala. - Mga metric:
quire.secrets.master_key.ageatquire.secrets.rewrap.outstanding(mga value na hindi nailipat ng huling rotation).
Kapag unresolved ang mga value
Naka-wrap ang unresolved na value gamit ang key reference na wala sa installation
mo o hindi ito ayon sa hugis na inaasahan ng column. Ipinapakita ng progress
record ang reference, halimbawa env:QUIRE_MASTER_KEY:v0 (unreadable). Ibalik
ang key na iyon sa QUIRE_MASTER_KEY_RETIRED at magpatakbo muli ng rotation; o,
kung tuluyan nang nawala ang key, hilingin sa administrador ng organisasyon na
muling ilagay ang credential upang maiselyo ito gamit ang kasalukuyang key.
Ipinapakita ng record ang error ng failed rotation; itama ang sanhi at humiling muli.
Mga signing key
Bukod sa master key, pumipirma ang bawat organisasyon ng OpenID Connect token at
LTI message gamit ang sarili nitong RSA key, na inilalathala sa
/.well-known/jwks.json. Walang kailangang gawin dito ang operator. Inilalathala
ng oras-oras na platform.signing_keys schedule ang kapalit pitong araw bago
mag-90 araw ang kasalukuyang key; makalipas ang isang linggo magsisimulang pumirma
ang kapalit at magiging retiring ang luma; 90 araw pa ang lilipas bago burahin
ang luma sa key set. Itinatala ang bawat hakbang sa platform audit chain bilang
platform/signing_key_advance.
Para maagang palitan ang key ng organisasyon, halimbawa kapag nalantad ito:
- sa console: Security, Master key, Publish a new signing key (kailangan ang
platform/keys_manage); o - sa shell na may environment ng worker:
bun run kek:rotate signing-keys rotate --tenant <slug or id> --reason "Key exposed, INC-3310". Inililista ngbun run kek:rotate signing-keys statusang mga key ng bawat organisasyon ayon sa yugto.
Agad na inilalathala ang bagong key at magsisimulang pumirma pagkaraan ng pitong
araw, kapag nagretiro na ang kasalukuyan. Sadyang isang linggo ang pagitan dahil
naka-cache ang key set ng relying party at mabibigo ang lahat ng tool nang sabay
kung mas maikli ito. Mananatili sa key set ang retiring na key sa loob ng 90 araw
pa para patuloy na ma-verify ang mga pinirmahan na nitong token. Kung kailangang
huwag na itong pagkatiwalaan agad dahil sa exposure, burahin ang row nito gamit
ang sariling database access ng operator sa ilalim ng change record (read-only ang
break-glass access); mabibigo na ang pag-verify sa token na nilagdaan nito.
platform/signing_key_rotate ang forced rotation sa audit chain, kasama ang
rason. Kailangan ng worker ang parehong QUIRE_MASTER_KEY setting ng web tier
para ibalot ang bagong key; muling binabalot ng bun run kek:rotate para sa master
key ang mga signing key kasama ng iba (oauth_signing_key ay nasa SEALED_STORES).
Emergency access sa production
Walang may permanenteng access sa production. Kapag hindi makapaghintay ang problema, nagbibigay ang may-ari ng break-glass grant: Platform console, Security, Break-glass access.
- May scope ang grant (isang organisasyon o platform registry), dahilan na hindi bababa sa 20 character at tumutukoy sa incident o ticket, at tagal na 5 hanggang 240 minuto. Kusang mag-e-expire ito; sinusuri ang oras sa bawat statement.
- Maaaring ibigay ang grant sa nagbigay na may-ari o sa ibang may-ari (two-person
process). Tanging pinagbigyan nito ang makagagamit. Kailangan ang
platform/break_glass_issuesa pagbibigay atplatform/break_glass_usesa paggamit; default na may-ari lang ang parehong pahintulot. - Dumaraan sa gateway, hindi database login, ang mga statement: read-only, paisa-isa, limitado sa organisasyon o control registry, may limang segundong timeout at hanggang 500 row. Ipinapakita ang binary value ayon sa laki.
- Itinatala ng platform audit chain ang pagbibigay (kasama ang dahilan), pagbawi,
bawat statement bago patakbuhin (
platform/break_glass_statement;deniedang resulta ng tinanggihan), at bawat resulta (platform/break_glass_result). Nasaops.break_glass_statementang ID ng audit entry kaya naiuugnay ang grant sa mga audit entry nito. - Hindi pinapayagan ang pagsusulat. Kung hindi makapaghintay ng release ang pagbabago, gamitin ang sariling database access ng operator sa ilalim ng sarili nitong change record, sa labas ng produktong ito; dapat tukuyin ng record ang incident reference na ginamit dito.
Bakit hindi maglabas ng database credential? Higit na matagal ang Postgres login kaysa sa session na humiling nito, lumalampas ito sa row-level security na inaasahan ng application, at hindi ito nakapagsusulat sa audit chain ng produktong ito; kaya ang server log lang ang magtatala sa statement kapag nailabas ito. Ginagawang katangian ng access ng gateway ang audit trail sa halip na dagdag na gawain.
Para sagutin ang audit request: ilista ang mga grant sa panahong hinihingi
(Break-glass access), buksan ang history ng grant para sa statement at ID ng audit
entry, at basahin ang mga entry sa platform audit chain (bun run audit:verify --platform ang nagpapatunay na buo ang chain).