Uygulamayı aç
Moonborn — Developers

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 pendingrunningready geç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çimNe için
jsonl (varsayılan)Programatik işlem; akış-dostu; karma zincirini doğrulamak için en kolay
csvTablo / BI aracı içe aktarımları
parquetVeri 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: OK

4. 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üreDurum
0–24 saatdownloadUrl aktif
24 saat – 30 günURL süresi geçmiş; yeniden imza için getDownloadUrl çağır
30+ günEser silindi; yeni dışa aktarma görevi aç

Plan gereksinimi

Team ve üzeri. Enterprise'da audit.export.scheduled ile otomatik kadanslar (cadences).

İlgili

Denetim + uyumluluk — kullanım senaryosu

Dışa aktarımların uyumluluk inceleme akışına nasıl bağlandığına dair anlatım.

Open →
Marka için denetim izi

Marka ekipleri için denetim kaydından filtrelenmiş iz çıkarma.

Open →
Webhook entegrasyonu

Denetim olaylarını gerçek zamanlı webhook üzerinden yakalama.

Open →
API anahtarı yetkileri başvurusu

read:audit yetkisinin en az yetki ilkesiyle üretim desenleri.

Open →