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

Štrná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, 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.
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 a počet pečatí každého kľúča (na všetkých pripojeniach denníka) — nikdy nie materiál.
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.

Návratové kódy

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

Príkaz012
sentinel:installvždy (druhé spustenie neuškodí)——
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é—
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—

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.

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 ani ich id:

$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.
schedule—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ť.—

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.