NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Sentinel for Laravel

Príkazy a kontrola stavu

Pätnásť príkazov pokrýva inštaláciu, overovanie, údržbu a kľúče. Modely zadávate ako názov triedy alebo morph alias a príkazy volajú injektovaný SentinelManager, takže v testoch bežia aj nad Sentinel::fake().

PríkazÚčel
sentinel:install {--force}Publikuje, vygeneruje predvolený kľúč, ak chýba (algoritmom kruhu), a vypíše ďalšie kroky.
sentinel:check {--json} {--strict}Kontrola stavu inštalácie; exit 1 pri zlyhaní (--strict: aj pri varovaní).
sentinel:verify {model?*} {--seal=} {--chunk=500} {--limit=} {--ledger} {--anchor=} {--check-schema} {--json} {--fail-on=*} {--max-findings=1000} {--allow-empty} {--isolated}Skenuje zapečatené riadky (aj denník); exit 1 pri zisteniach, 2 keď nie je čo skenovať — pre cron a CI.
sentinel:checkpoint {--connection=*} {--batch=} {--isolated}Zloží čakajúce záznamy denníka do kontrolných bodov a publikuje ich do kotiev.
sentinel:reseal {model} {--seal=} {--from-key=} {--only-outdated} {--upgrade-format} {--chunk=500} {--dry-run} {--acknowledge=}Znovu zapečatí po rotácii alebo zmene definície; bez --acknowledge nikdy nič „nevyperie“.
sentinel:seal-missing {model} {--seal=} {--reason=} {--chunk=500}Baseline pre riadky, ktoré nikdy neboli zapečatené.
sentinel:inspect {model} {id} {--seal=} {--show-values} {--check-schema}Jeden riadok: riadok pečate, verdikt, manifest, história, zmenené polia (hodnoty len s --show-values).
sentinel:prune {--idempotency} {--nonces} {--dry-run}Zmaže expirované idempotenčné kľúče a nonce.
sentinel:key:generate {--ring=} {--algorithm=hmac-sha256} {--kid=} {--database} {--activate-at=} {--owner-type=} {--owner-id=} {--label=}Vygeneruje kľúč (riadky env alebo riadok v databáze).
sentinel:key:import {kid} {--ring=} {--algorithm=} {--signing} {--file=} {--activate-at=} {--owner-type=} {--owner-id=} {--label=}Importuje kľúč partnera (alebo vlastný); materiál z --file (PEM alebo base64:…) alebo zo skrytého vstupu, nikdy z argumentu.
sentinel:key:rotate {--ring=} {--algorithm=} {--activate-at=}Rotuje podpisový kľúč kruhu (kľúč vlastného drivera sa odmietne).
sentinel:key:revoke {kid} {--ring=} {--reason=}Odvolá kľúč.
sentinel:key:retire {kid} {--ring=} {--force}Vyradí kľúč (odmietne, kým ho pečate ešte používajú).
sentinel:key:list {--ring=}Inventár kľúčov — vrátane labelov, v úvodzovkách a escapovaných — a počet pečatí každého kľúča (na všetkých pripojeniach denníka); nikdy nie materiál.
sentinel:key:reseal {--ring=} {--dry-run}Znovu zapečatí kľúče v databáze do obálky 1.2, aby boli ich labely viazané — krok pri prechode z 1.1; pred zápisom vypíše každý label.
php artisan sentinel:verify                                   # every sealable model
php artisan sentinel:verify "App\Models\Invoice" --seal=financial --ledger
php artisan sentinel:verify --fail-on=tampered,missing --fail-on=backlog
php artisan sentinel:verify --ledger --anchor='<json>'           # compare a payload from a log anchor
php artisan sentinel:verify --check-schema --limit=10000         # CI against a staging snapshot
php artisan sentinel:reseal "App\Models\Invoice" --from-key=default-20250901-a1b2c3 --dry-run
php artisan sentinel:seal-missing "App\Models\Invoice" --reason="Initial baseline 2026-10"
php artisan sentinel:inspect "App\Models\Invoice" 42 --seal=financial
php artisan sentinel:prune --dry-run
php artisan sentinel:key:list --ring=http

Voľby, ktoré sa oplatí poznať

  • --fail-on berie hodnoty VerificationStatus (tampered, missing, … — aj outdated a unsealed, ktoré inak nikdy nezlyhajú) a hodnoty LedgerFindingKind, opakovane alebo oddelené čiarkou. Uvedené stavy nahradia predvolené — zlyhajú len tie; ak uvediete len druhy zistení denníka, zlyhávajúce stavy ostanú všetky. Porušenia denníka zlyhajú vždy; backlog a anchor_unreachable len vtedy, ak ich uvediete. Neznámy názov skončí kódom 2.
  • --anchor='<json>' (obsah skopírovaný z kotvy log, ktorá sa len zapisuje) sa číta len spolu s --ledger; nedekódovateľný obsah skončí kódom 2.
  • --isolated[=EXIT] (sentinel:verify, sentinel:checkpoint) beh preskočí — s kódom 0 alebo zadaným — kým zámok drží iná inštancia.
  • Rozsahy: --chunk 1–100 000, --limit ≥ 1 (riadkov spolu naprieč modelmi), --max-findings 0–1 000 000, --batch 1–100 000; dôvody 1–sealing.reason_max_length znakov, dôvod odvolania najviac 1 000.
  • --json: sentinel:verify vypíše models, unresolved_types, scanned, counts, findings, truncated a objekt ledger; sentinel:check vypíše failed a zoznam kontrol, pričom failed rešpektuje --strict.
  • sentinel:inspect ponechá hodnoty skryté, pokiaľ nezadáte --show-values (môžu obsahovať osobné údaje); sentinel:key:import číta materiál z --file alebo zo skrytého vstupu, nikdy z argumentu, ktorý by skončil v histórii shellu. Riadok pečate s poškodeným sealed_at sentinel:inspect stále zobrazí (zapečatené —, stav malformed (sealed_at), kód 1) namiesto toho, aby skončil chybou.
  • sentinel:key:reseal prejde každý kruh, ktorý ukladá kľúče v databáze (--ring pre jeden), riadok po riadku pod zámkom riadku a pred zápisom vypíše ring:kid → "label" — binding, would bind (--dry-run, ktorý nič nezapíše) alebo already bound — s riadiacimi a neviditeľnými znakmi, < a > escapovanými rovnako ako v sentinel:key:list. Je idempotentný a po úspechu bez --dry-run pripomenie nastaviť SENTINEL_REQUIRE_BOUND_LABEL=true.

Návratové kódy

0 znamená úspech, 1 zlyhanie a 2 neplatný vstup:

Príkaz012
sentinel:installnainštalované — kľúč vygenerovaný, už existujúci alebo ponechaný na po migrácii (druhé spustenie neuškodí)generovanie kľúča predvoleného kruhu zlyhalo (napr. jeho algoritmus nie je v allowliste kruhu)—
sentinel:checkžiadne zlyhanie (s --strict ani varovanie)zlyhanie (s --strict aj varovanie)—
sentinel:verifynenašlo sa nič zlyhávajúce (alebo nebolo čo skenovať, s --allow-empty)zlyhávajúci stav (pozri --fail-on) alebo porušenie denníkaneplatný vstup či konfigurácia, alebo nie je čo skenovať
sentinel:checkpointkaždé pripojenie má kontrolný bod (pripojenie držané iným behom sa s varovaním preskočí)kontrolný bod pripojenia zlyhalneplatné --batch alebo konfigurácia
sentinel:resealnič sa nepreskočilo, nič nezlyhalopreskočili sa riadky, ktoré nie sú neporušené (vypísané), alebo riadok zlyhalneznámy model či pečať, neplatná voľba či konfigurácia, potvrdenie zamietnuté politikou
sentinel:seal-missingkaždý kandidát dostal baselineriadky s históriou, no bez pečate (nahlásené, nikdy nie baseline), alebo riadok zlyhalchýba --reason, neznámy model či pečať, neplatná voľba
sentinel:inspectkaždá skontrolovaná pečať je neporušenápečať nie je neporušená alebo riadok neexistujeneznámy model či pečať, chyba konfigurácie
sentinel:prunezmazané (alebo spočítané, s --dry-run)chyba úložiska—
sentinel:key:generatevygenerovanýneznámy --algorithm, vlastník nenájdený, odmietnuté (obsadený kid, nepovolený algoritmus, neplatný kid či label)—
sentinel:key:importimportovanýodmietnuté (obsadený kid, kruh len na čítanie, neplatný materiál, súkromný materiál bez --signing)neplatný vstup (chýba --algorithm, vlastník nenájdený, nečitateľný, prázdny či > 64 KB súbor, bez terminálu aj --file)
sentinel:key:rotaterotovanýneznámy --algorithm, odmietnuté (nepovolený algoritmus, kľúč z vlastného drivera)—
sentinel:key:revokeodvolaný — pri kľúči z konfigurácie sa vypíše riadok SENTINEL_REVOKED_KEYSchýba --reason, neznámy kľúč, odmietnuté—
sentinel:key:retirevyradený — pri kľúči z konfigurácie sa vypíše postupneznámy kľúč, pečate ho stále používajú (bez --force), odmietnuté—
sentinel:key:listvypísanéneplatný kruh alebo konfigurácia—
sentinel:key:resealkaždý kľúč znovu zapečatený alebo už viazaný (s --dry-run: bol by)kľúč neprejde kontrolou integrity, starý kľúč odmietne require_bound_label alebo má label, ktorý nie je platné UTF-8 (každý sa vypíše, žiadny sa znovu nezapečatí); neznámy kruh alebo kruh bez úložiska v databáze—

Plánovanie

Provider zaregistruje údržbu v plánovači, kým je schedule.enabled zapnuté (predvolené), každú úlohu s withoutOverlapping()->onOneServer(). Plný sken je predvolene denný — hodinové skeny celých tabuliek sú pri veľkých tabuľkách tichou záťažou — kým kontrolný bod ostáva každú minútu, pretože jeho interval je okno, v ktorom návrat ostane nepovšimnutý:

ÚlohaPríkazPredvolenéEnv
checkpointsentinel:checkpoint (len pri ledger.enabled)everyMinuteSENTINEL_SCHEDULE_CHECKPOINT
verifysentinel:verify --allow-empty (+ --ledger, kým je denník zapnutý)dailySENTINEL_SCHEDULE_VERIFY
prunesentinel:prunedailySENTINEL_SCHEDULE_PRUNE

Ak ich chcete zapojiť sami, nastavte SENTINEL_SCHEDULE=false a pridajte ich do routes/console.php. Ručne zapísané riadky nenechávajte vedľa automatického plánu — withoutOverlapping() bráni súbežným behom, nie dvojitému naplánovaniu.

// routes/console.php
use Illuminate\Support\Facades\Schedule;

Schedule::command('sentinel:checkpoint')->everyMinute()->withoutOverlapping();
Schedule::command('sentinel:verify --ledger')->hourly();
Schedule::command('sentinel:verify --json')->dailyAt('03:00')->emailOutputOnFailure('[email protected]');
Schedule::command('sentinel:prune')->daily();

Sentinel::sealables() vypíše, čo sentinel:verify bez zadaného modelu skenuje: najprv sentinel.models, potom každú triedu s riadkami pečatí alebo záznamami v denníku. Ak nie je čo skenovať, skončí kódom 2, takže chybná konfigurácia nikdy nehlási zelenú. V CI zastaví pipeline pri zisteniach sentinel:verify --check-schema --limit=10000 nad snapshotom zo stagingu a sentinel:check --strict pri akejkoľvek oslabenej záruke.

Aplikácia bez tabuliek Sentinelu

Aplikácia, ktorá Sentinel dostane len ako závislosť iného balíka, nikdy nepublikuje jeho konfiguráciu ani migrácie — plán je pritom predvolene zapnutý. Preto sa každá plánovaná úloha preskočí, kým neexistuje žiadna z tabuliek, ktoré konfigurácia potrebuje (ten istý zoznam číta kontrola tables):

  • Žiadna tabuľka: checkpoint, verify a prune ostanú zaregistrované (schedule:list ich ukáže), no nikdy sa nespustia — schedule:run pre každú odošle ScheduledTaskSkipped. Nič nezlyhá, takže taká aplikácia nepotrebuje SENTINEL_SCHEDULE=false.
  • Existuje aspoň jedna tabuľka: aplikácia úložisko Sentinelu používa a každá úloha beží ako predtým — napoly zmigrovaná inštalácia zlyhá rovnako hlasno ako vždy.
  • prune sa preskočí len vtedy, keby čistil tabuľku Sentinelu: s úložiskom cache alebo s úložiskom naviazaným v aplikácii beží bez ohľadu na tabuľky.
  • Nedá sa to zistiť (pripojenie zlyhá, nastavenie sa nedá prečítať, úložisko sa nedá zostaviť): úloha sa spustí a zlyhanie nahlási sama.
  • Zisťuje sa to len pre úlohu, ktorá je na rade, raz za schedule:run: jeden hasTable pre každú potrebnú tabuľku, kým sa nájde prvá. Migrácia úlohy zapne pri najbližšom schedule:run.

Preskočenie je zámerne tiché, a preto kontrola stavu tichá nie je: kým sa úloha preskakuje, kontrola schedule zlyhá a úlohu pomenuje a php artisan about ukáže auto (checkpoint, verify, prune skipped: no tables). Príkazy, ktoré spustíte sami, a riadky, ktoré si naplánujete ručne, sa nikdy nepreskočia.

Kontrola stavu

sentinel:check (alebo Sentinel::check()) nahlási na jednom mieste každú chybnú konfiguráciu, ktorá potichu oslabuje záruky. Správy uvádzajú nastavenia, kruhy, tabuľky a triedy — nikdy materiál kľúčov, ich id ani labely:

$report = Sentinel::check();          // HealthReport
$report->failed();                    // any failure (warnings do not fail it)
$report->failures();                  // list<HealthCheck>: name, status, message
$report->warnings();
KontrolaZlyhá, keďVaruje, keď
configurationAkékoľvek nastavenie alebo profil podpisov je neplatný.—
signing_keysKruh default, kruh denníka alebo kruh niektorého sealable modelu nevie podpisovať (kým je sealing.auto zapnuté).To isté na uzle len na overovanie.
app_keyKľúče v databáze alebo idempotency.encrypt potrebujú APP_KEY a ten je prázdny.—
tablesNa svojom pripojení chýba tabuľka sentinel_*.—
modelsSealable model sa neskompiluje alebo jeho tabuľke chýba zapečatený stĺpec.Nie sú žiadne sealable modely, uložené typy sa už nedajú vyhodnotiť alebo model žije na pripojení, ktoré ledger.connections neuvádza.
anchorsNakonfigurovaná kotva je nedostupná alebo kotva cache žije v pamäti procesu či v databáze, ktorú chráni.Žiadna nie je nakonfigurovaná alebo kotva cache používa predvolený store.
checkpoints—Záznamy denníka staršie než ledger.backlog_warning_seconds nemajú kontrolný bod.
schedulePlánovanie je zapnuté, no úlohy sa pri každom behu preskočia, lebo neexistuje žiadna z tabuliek Sentinelu (vymenuje úlohy).Plánovanie je vypnuté a sentinel:checkpoint nie je naplánovaný.
retired_keys—Pečate stále používajú odvolaný, vyradený alebo neznámy kľúč (počty po kruhoch).
storesÚložisko idempotencie alebo nonce sa nedá zostaviť.—
key_envelopesrequire_bound_label je zapnuté, kým kľúče v databáze ešte používajú obálku spred 1.2 — neprejdú kontrolou integrity.Kľúče v databáze ešte používajú obálku spred 1.2 s neviazaným labelom (počty po kruhoch): spustite sentinel:key:reseal, skontrolujte labely a potom nastavte SENTINEL_REQUIRE_BOUND_LABEL=true.

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 kryptomien

Odoslaní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.