Denetim kaydını dışa aktar ve zinciri doğrula
Karma-zincirli (hash-chained) denetim kaydını imzalı bir arşive dışa aktar, zinciri çevrimdışı doğrula, kendi saklama (retention) sisteminde arşivle.
Moonborn denetim kaydı değiştirilemez (immutable) ve karma-zincirlidir (hash-chained) — her olayın hash'i bir öncekinin hash'iyle bağlanır, böylece tek bir satırın değiştirilmesi tüm zinciri kırar. Bu yapıyı uyumluluk incelemeleri için kendi depolamanda tutmak istersen kaydı dışa aktarıp arşivlersin.
Bu rehber dışa aktarma görevinin nasıl başlatılacağını, hazır olduğunda imzalı bir indirme URL'inin nasıl alınacağını ve zinciri çevrimdışı doğrulayarak verinin Moonborn'dan çıktıktan sonra da değiştirilmediğini nasıl ispatlayacağını anlatır.
Bu rehberi bitirdiğinde
- Tarih aralığı + biçim ile bir dışa aktarma görevi (export job) başlatabileceksin.
- Görevin
pending→running→readygeçişini takip edebileceksin. - İmzalı indirme URL'inden arşivi çekip sağlama toplamıyla (checksum) doğrulayabileceksin.
- Karma zincirini Node.js / Python ile çevrimdışı doğrulayabileceksin.
- Çalışma alanı kapsamlı ile organizasyon-geneli dışa aktarma farklarını bileceksin.
- Dışa aktarma eserlerinin (artifacts) 30 günlük saklama penceresini yönetebileceksin.
Ön koşul: API anahtarı + read:audit yetkisi, Team veya üzeri plan. Uyumluluk inceleme akışını arıyorsan önce Denetim + uyumluluk — kullanım senaryosu.
1. Dışa aktarma görevini başlat
const job = await client.audit.exports.create({
workspaceId: 'ws_...',
range: { from: '2026-01-01', to: '2026-12-31' },
format: 'jsonl',
});
console.log(job.id, job.status); // job.status === 'pending'Desteklenen biçimler
| Biçim | Ne için |
|---|---|
jsonl (varsayılan) | Programatik işlem; akış-dostu; karma zincirini doğrulamak için en kolay |
csv | Tablo / BI aracı içe aktarımları |
parquet | Veri ambarı (data warehouse) yüklemeleri (Snowflake, BigQuery, Athena) |
2. Tamamlanmayı yokla (poll)
Dışa aktarma görevi arka planda eşzamansız çalışır. Görev kimliğiyle durumunu sorgula:
let status = job.status;
let ready: typeof job | undefined;
while (status === 'pending' || status === 'running') {
await new Promise((r) => setTimeout(r, 5000));
const fresh = await client.audit.exports.get({ id: job.id });
status = fresh.status;
if (status === 'ready') {
ready = fresh;
} else if (status === 'failed') {
throw new Error(`Export failed: ${fresh.error}`);
}
}
console.log({
downloadUrl: ready!.downloadUrl, // imzalı S3 URL, 24 saat geçerli
sha256: ready!.sha256, // arşiv sağlama toplamı
chainSeed: ready!.chainSeed, // karma zinciri kökü
eventCount: ready!.eventCount,
});Hazır olduğunda yanıt üç kritik alan döner:
downloadUrl— imzalı S3 URL, 24 saat geçerli.sha256— arşiv dosyasının sağlama toplamı; indirme sonrası karşılaştır.chainSeed— karma zincirinin kök hash'i; çevrimdışı doğrulamada kullanacaksın.
3. Arşivi indir ve sağlama toplamını kontrol et
curl -o audit-2026.jsonl.gz "${DOWNLOAD_URL}"
# Sağlama toplamı doğrulama
echo "${EXPECTED_SHA256} audit-2026.jsonl.gz" | shasum -a 256 -c
# audit-2026.jsonl.gz: OK4. Karma zincirini çevrimdışı doğrula
Her olayın hash alanı sha256(JSON.stringify(payload) + önceki_hash) formülüyle hesaplanır. İlk olayın "önceki hash"'i görevin chainSeed değeridir.
import { createHash } from 'node:crypto';
import { createReadStream } from 'node:fs';
import { createInterface } from 'node:readline';
async function verifyChain(filePath: string, chainSeed: string): Promise<void> {
const stream = createReadStream(filePath);
const reader = createInterface({ input: stream });
let expected = chainSeed;
let count = 0;
for await (const line of reader) {
if (!line.trim()) continue;
const event = JSON.parse(line);
const computed = createHash('sha256')
.update(JSON.stringify(event.payload) + expected)
.digest('hex');
if (computed !== event.hash) {
throw new Error(`Tamper at event ${event.id} (#${count}): expected ${computed}, got ${event.hash}`);
}
expected = event.hash;
count++;
}
console.log(`Chain verified across ${count} events.`);
}
await verifyChain('audit-2026.jsonl', chainSeed);5. Çalışma alanı kapsamlı ile organizasyon-geneli dışa aktarma
Varsayılan olarak dışa aktarımlar çalışma alanı kapsamlıdır — yalnızca çağrıdaki workspaceId'nin olaylarını içerir. Tüm organizasyon için tek bir dışa aktarım istiyorsan:
const job = await client.audit.exports.create({
orgId: 'org_...',
orgWide: true,
range: { from: '2026-01-01', to: '2026-12-31' },
format: 'jsonl',
});6. Saklama ve temizleme
Dışa aktarma eserleri Moonborn tarafında depolamada 30 gün tutulur, sonra otomatik silinir. Bu pencere içinde kendi sistemine indirmen gerekir.
| Süre | Durum |
|---|---|
| 0–24 saat | downloadUrl aktif |
| 24 saat – 30 gün | URL süresi geçmiş; yeniden imza için getDownloadUrl çağır |
| 30+ gün | Eser silindi; yeni dışa aktarma görevi aç |
Plan gereksinimi
Team ve üzeri. Enterprise'da audit.export.scheduled ile otomatik kadanslar (cadences).
İlgili
Dışa aktarımların uyumluluk inceleme akışına nasıl bağlandığına dair anlatım.
Marka ekipleri için denetim kaydından filtrelenmiş iz çıkarma.
Denetim olaylarını gerçek zamanlı webhook üzerinden yakalama.
read:audit yetkisinin en az yetki ilkesiyle üretim desenleri.