Dokümanlar menüsü
Denetim kaydı (audit)
Her yetki kararını ve yönetim eylemini kaydeder; console veya journal-destekli kalıcı sink (createJournalAuditSink) ile — aktör doğrulanmış kimlikten yazılır, spoof edilemez.
Ne işe yarar / ne zaman kullanılır#
Uyumluluk (SOC2/ISO benzeri) veya sadece "kim ne zaman ne yaptı" sorusuna güvenilir cevap gerektiğinde iki ayrı denetim katmanı devreye girer. Birincisi @gnldev/auth-ee'nin AuditSink'i: her authorize çağrısının allow/deny kararını (kim, hangi path/method, hangi organizasyon) yazar — createEnterpriseAuth içine gömülüdür, elle çağırmanız gerekmez. İkincisi Studio'nun kendi yönetim-eylemi günlüğüdür: organizasyon/kullanıcı oluşturma-silme, policy güncelleme, run purge, agent promote gibi YAZMA eylemlerini GET /audit ile geriye okunabilir tutar.
Kritik garanti: aktör alanı istemcinin iddia ettiği bir şey değil, doğrulanmış kimlikten (Principal.id) türetilir — paylaşımlı bir token arkasında birden çok kişi çalışıyorsa x-gnl-actor header'ı ile kişi bazlı iz bırakılabilir, ama hiçbir istemci başka birinin kimliğini taklit edip kayda "ben yaptım değil" diyemez.
Kurulum / import#
import { createEnterpriseAuth, createJournalAuditSink, consoleAuditSink } from '@gnldev/auth-ee';
import type { AuditSink, AuditEvent } from '@gnldev/auth-ee';
import { toJournal } from '@gnldev/durable';@gnldev/auth-ee paralı/lisanslı bir pakettir — geçerli bir lisans anahtarı olmadan createEnterpriseAuth fallback'e düşer ve verilen audit sink'i devreye girmez. Journal-destekli kalıcı sink için storage'ın run journal'ı toJournal (@gnldev/durable) ile sarılır.
Adım adım kullanım#
1. Kalıcı audit istiyorsanız createJournalAuditSink ile bir sink oluşturup createEnterpriseAuth'a audit seçeneği olarak verin — verilmezse varsayılan uçucu consoleAuditSink kullanılır (yalnız konsola yazar, kalıcı değildir):
const auth = createEnterpriseAuth({
licenseKey,
userStore,
audit: createJournalAuditSink(toJournal(storage.runs)), // durable: decisions are written to the journal
fallback,
});Her authorize(principal, ctx) çağrısı artık otomatik olarak recordDecision üzerinden sink'e bir AuditEvent yazar — ayrıca kod yazmanız gerekmez.
2. Yazılan kararları geriye okumak için readJournalAudit kullanılır (en yeni önce döner):
import { readJournalAudit } from '@gnldev/auth-ee';
const events = await readJournalAudit(toJournal(storage.runs));
// [{ ts, principalId, orgId, path, method, action, allowed, reason }, ...]3. Bu, Studio'nun kendi yönetim-eylemi günlüğünden AYRIDIR. Studio, her başarılı YAZMA eylemini (ör. org.create, policy.update, run.purge, agent.promote) kendi __audit__ log'una düşürür ve organizasyon kapsamlı, filtrelenebilir bir uçtan sunar:
GET /audit?limit=200&action=policy.update&q=acme
// -> { items: [{ id, at, actor, action, target, org?, detail? }, ...] } (newest first)Kimliğe bağlı (org'lu) bir principal yalnız kendi organizasyonunun kayıtlarını görür (?org= yok sayılır); bağsız (operatör) kimlik ?org= ile isteğe bağlı süzebilir.
API referansı#
createJournalAuditSink(journal: JournalLike) => AuditSink. Her kararı __eeaudit__:<ts>-<rnd> anahtarıyla journal'a yazan kalıcı sink.
consoleAuditSink() => AuditSink. Konsola yazan uçucu varsayılan sink (audit verilmezse kullanılır).
readJournalAudit(journal: JournalLike) => Promise<AuditEvent[]>. createJournalAuditSink ile yazılmış tüm olayları en yeni önce döner (listKeys gerektirir).
recordDecision(sink, principal, ctx, decision) => sink.write(...) çağıran iç yardımcı; createEnterpriseAuth.authorize içinde otomatik çağrılır.
AuditSinkwrite(event: AuditEvent): void | Promise<void> sözleşmesi — özel sink (DB/SIEM) yazmak için implemente edilir.
AuditEvent{ ts, principalId?, orgId?, path, method, action: "read"|"write", allowed, reason? }.
AUDIT_PREjournal anahtar öneki: '__eeaudit__:' — createJournalAuditSink/readJournalAudit bunu paylaşır.
@gnldev/auth-ee içindedir ve geçerli bir lisans (licenseKey) gerektirir — lisans geçersizse createEnterpriseAuth fallback'e düşer ve verilen audit sink'i devreye hiç girmez.consoleAuditSink uçucudur (yalnız stdout) — kalıcı/geriye-okunabilir kayıt için mutlaka createJournalAuditSink kullanın. readJournalAudit, journal listKeys desteklemiyorsa (ör. bazı özel adaptörler) boş dizi döner.