Çoğu Laravel uygulaması önemli olayları kaydeder:
- kullanıcı girişleri
- oluşturulan siparişler
- işlem gören ödemeler
- değiştirilen ayarlar
Bu olaylar genellikle bir activity log table‘da saklanır.
Örnek bir yapı:
id | action | user_id | created_at
İlk bakışta, bu yeterli görünüyor.
Ancak ciddi bir sorun var.
Denetim Kayıtları Değiştirilebilir
Denetim Kayıtları Değiştirilebilir
Çoğu uygulamada, denetim kayıtları sadece veritabanı kayıtlarıdır.
Bu da genellikle onların:
- değiştirilebileceği
- silinebileceği
- sıralanabileceği
Eğer veritabanı erişimi olan biri bir kaydı değiştirirse, genellikle güvenilir bir şekilde tespit etmenin yolu yoktur.
Birçok sistem için bu kabul edilemezdir.
Özellikle:
- finansal sistemler
- sağlık platformları
- güvenlik açısından hassas uygulamalar
- uyum raporlamaları
Bu sistemlerin değiştirilmesi tespit edilebilir denetim izlerine ihtiyacı vardır.
Fikir: Kayıtları Bir Deftere Dönüştürmek
Fikir: Kayıtları Bir Deftere Dönüştürmek
Olayları basit veritabanı kayıtları olarak kaydetmek yerine, onları kriptografik olarak doğrulanabilir bir defterde kaydeden bir sistem geliştirdim.
Ona Chronicle adını verdim.
Chronicle, Laravel için yalnızca ekleme yapılabilen bir denetim defteridir.
Her kayıt, bir hash zinciri kullanarak bir öncekine bağlıdır.
Eğer herhangi bir kayıt değiştirilir veya silinirse, defter doğrulaması başarısız olur.
Bir Olayı Kaydetmek
Bir Olayı Kaydetmek
Chronicle kullanımı şöyle görünür:
use Chronicle\Facades\Chronicle;
Chronicle::record()
->actor($user)
->action('order.created')
->subject($order)
->metadata([
'amount' => 5000,
'currency' => 'USD',
])
->commit();Her kayıt aşağıdakileri kaydeder:
- hareket eden kişi
- ne olduğunu
- hangi varlığın etkilendiğini
Kayıtlar kaydedildikten sonra değiştirilemez.
Hash Zinciri
Hash Zinciri
Chronicle, defteri bir hash zinciri kullanarak korur.
Her kayıt, bir önceki kaydı referans alır:
chain_hash(n) = SHA256(chain_hash(n-1) + payload_hash(n))
Bu, tüm denetim geçmişinde kriptografik bir zincir oluşturur.
Eğer herhangi bir kayıt:
- değiştirilirse
- silinirse
- sıralanırsa
zincir doğrulaması başarısız olur.
Değiştirme Tespiti
Değiştirme Tespiti
Chronicle, bir doğrulama komutu içerir:
php artisan chronicle:verify
Eğer defterle ilgili bir değişiklik yapılmışsa, doğrulama başarısız olur.
Bu, sistemlerin denetim kayıtlarına izinsiz yapılan değişiklikleri tespit etmesini sağlar.
Doğrulanabilir Bir Veri Kümesini Dışa Aktarmak
Doğrulanabilir Bir Veri Kümesini Dışa Aktarmak
Chronicle, defteri doğrulanabilir bir veri kümesi olarak dışa aktarabilir.
php artisan chronicle:exportDışa aktarımlar şunları içerir:
entries.ndjson
manifest.json
signature.jsonVeri kümesi şunları içerir:
- bir veri kümesi hash’i
- biri dijital imza
- defter sınırları
Bu, dışa aktarılan denetim kaydının bağımsız olarak doğrulanmasını sağlar.
Defteri Sorgulamak
Defteri Sorgulamak
Chronicle, girişleri almak için sorgu yardımcıları içerir:
use Chronicle\Models\Entry;
Entry::forActor($user);
Entry::forSubject($order);
Entry::action('order.created');Ayrıca şunları destekler:
- imleç sayfalamayı
- büyük defterleri akıtmayı
- indekslenmiş sorguları
Bunlar, gerçek sistemlerde kullanım için pratik hale getirir.
Neden Bunu Yaptım
Neden Bunu Yaptım
Pek çok uygulama, denetim kayıtlarına dayanarak şu soruları yanıtlar:
Neler oldu?
Ancak geleneksel kayıtlar her zaman daha önemli bir soruyu yanıtlayamaz:
Bunu kanıtlayabilir miyiz?
Chronicle, bu sorunu çözmeye çalışır.
Olayları düzenlenebilir kayıtlar olarak saklamak yerine, uygulama geçmişini bir defter olarak kaydeder.
Açık Kaynak
Açık Kaynak
Chronicle açık kaynaklıdır ve GitHub’da bulunmaktadır:
https://github.com/laravel-chronicle/core
Eğer fikir ilginç geliyorsa, kontrol edebilirsiniz.
Geribildirim ve katkılar değerlidir.
Kaynak: Orijinal Makale


