Databázová schéma
Šesť migrácií len na publikovanie a len dopredu (bez down(), časová značka sa doplní pri publikovaní, balík ich nikdy nenačítava sám). Žiadna tabuľka balíka nepoužíva soft delete a žiadny model sa nedá vymeniť — bezpečnostný stav sa ukladá len cez tieto modely a engine.
| # | Tabuľka | Pripojenie | Cudzie kľúče |
|---|---|---|---|
| 1 | sentinel_keys | sentinel.database.connection | — |
| 2 | sentinel_checkpoints | pripojenie sealable modelu | — |
| 3 | sentinel_ledger | pripojenie sealable modelu | checkpoint_id → sentinel_checkpoints (restrict) |
| 4 | sentinel_seals | pripojenie sealable modelu | ledger_entry_id → sentinel_ledger (restrict) |
| 5 | sentinel_idempotency_keys | sentinel.database.connection | — |
| 6 | sentinel_nonces | sentinel.database.connection | — |
Pečate, denník a kontrolné body žijú na pripojení každého zapečateného modelu a zdieľajú jeho transakciu. Ak máte zapečatené modely na viacerých pripojeniach, publikujte a spustite 0002–0004 na každom a uveďte ich v ledger.connections.
Prechod z predbežnej verzie
Migrácia 0004_create_sentinel_seals_table bola upravená priamo, aby pridala stĺpec attributes_mac s povolenou hodnotou null (MAC dokumentu atribútov pre pečate s vypočítanými poľami); nová migrácia neexistuje. Ak ste spustili staršiu predbežnú kópiu, migrácie znovu publikujte a 0004 spustite znova, alebo stĺpec do sentinel_seals pridajte sami — string('attributes_mac', 192)->nullable() — ešte pred ďalším zapečateným zápisom. Inštalácie z aktuálnych migrácií stĺpec už majú.
Modely
Čítajte ich na reporting (Seal::query()->where('key_id', $kid)->count()), nikdy do nich nezapisujte: každý zápis vlastní engine a úpravy zachytia MAC, reťaz aj obálky. Každá časová značka balíka sa castuje cez Casts\UtcDateTime (UTC, mikrosekundy, CarbonImmutable), takže časové pásmo aplikácie nikdy nepresiakne do uložených ani MAC-om chránených časov.
| Model | Tabuľka | Poznámky |
|---|---|---|
Key | sentinel_keys | $hidden = ['envelope']; obálka je šifrový text AES-256-GCM viazaný na nešifrované stĺpce riadku, zapisuje a otvára ju úložisko kľúčov. |
Seal | sentinel_seals | sealable(): MorphTo, sealedBy(): MorphTo, ledgerEntry(): BelongsTo; manifest / field_tags → array; event → SealEvent. |
LedgerEntry | sentinel_ledger | Bez timestamps; len pripájanie (Eloquent update a delete vyhodia výnimku, aj tiché); sealable(), actor(), checkpoint(). |
Checkpoint | sentinel_checkpoints | UPDATED_AT = null; len pripájanie. |
IdempotencyKey | sentinel_idempotency_keys | $hidden = ['response', 'owner_token']; status je processing alebo completed. |
Nonce | sentinel_nonces | UPDATED_AT = null; subject(): MorphTo; kind → NonceKind. |
Factories
- KeyFactory — ->hmac(), ->ed25519(), ->ecdsaP256(), ->verifyOnly(), ->revoked(), ->retired(), ->pending(), ->ring(), všetky s platnými obálkami.
- SealFactory — ->forSealable(Model $m, string $seal), štrukturálne platná, no nepodpísaná: pre testy Malformed a negatívne testy.
- LedgerEntryFactory — ->forSealable(Model $m, string $seal), ->tombstone(SealEvent $event = SealEvent::Deleted); plus CheckpointFactory.
- IdempotencyKeyFactory — ->processing(), ->completed(), ->expired().
- NonceFactory — ->issued(), ->seen(), ->consumed(), ->expired().
Uchovávanie
| Tabuľka | Rastie s | Čistenie |
|---|---|---|
sentinel_seals | jeden riadok na (model, pečať) | zmaže sa s tvrdo zmazanými modelmi |
sentinel_ledger | jeden riadok na udalosť pečatenia | nikdy (dôkaz) |
sentinel_checkpoints | jeden riadok na dávku kontrolného bodu | nikdy |
sentinel_keys | kľúče | nikdy (namiesto toho vyraďte alebo odvolajte) |
sentinel_idempotency_keys | idempotentné požiadavky | sentinel:prune (expirované) |
sentinel_nonces | vydané a zapamätané nonce | sentinel:prune (expirované) |
Ochrana tabuliek
Sentinel odhalí zmeny aj v týchto tabuľkách, no databázové oprávnenia manipuláciu sťažia už na začiatku. Používateľ aplikácie potrebuje INSERT a SELECT na sentinel_ledger a sentinel_checkpoints, na denníku len UPDATE (checkpoint_id) a jedno oprávnenie na zámok riadku, ktoré si vyžaduje každý engine, pretože sentinel:checkpoint zamyká koniec kontrolných bodov cez SELECT … FOR UPDATE. Nikdy nie DELETE. Prístupové údaje k úložisku kotvy držte oddelene od databázových.
-- PostgreSQL
GRANT SELECT, INSERT ON sentinel_ledger, sentinel_checkpoints TO app;
GRANT UPDATE (checkpoint_id) ON sentinel_ledger TO app;
GRANT UPDATE (seq) ON sentinel_checkpoints TO app;
-- MySQL
GRANT SELECT, INSERT ON app_db.sentinel_ledger TO 'app'@'%';
GRANT SELECT, INSERT ON app_db.sentinel_checkpoints TO 'app'@'%';
GRANT UPDATE (checkpoint_id) ON app_db.sentinel_ledger TO 'app'@'%';
GRANT LOCK TABLES ON app_db.* TO 'app'@'%';Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.