Audit Trail, Evidence, Lineage, and Non-Repudiation
Learn Java Core Banking System - Part 024
Audit trail, evidence, lineage, tamper evidence, non-repudiation limits, forensic query, retention, privacy, and Java architecture for defensible banking systems.
Part 024 — Audit Trail, Evidence, Lineage, and Non-Repudiation
Audit trail yang baik bukan hanya kumpulan log. Dalam core banking, audit trail adalah sistem evidence yang mampu menjelaskan keputusan, perubahan, otoritas, dampak finansial, dan lineage angka secara defensible.
Sistem biasa bertanya:
What happened?
Sistem banking harus bisa menjawab:
What happened, who caused it, under what authority, based on what data, with what business reason, producing which financial records, visible in which reports, and how do we know the evidence was not silently rewritten?
Part ini membahas audit trail sebagai first-class architecture. Kita akan membedakan application log, audit event, domain event, ledger journal, evidence record, lineage, dan non-repudiation. Kita juga akan membahas batas klaim non-repudiation: log membantu non-repudiation, tetapi non-repudiation kuat membutuhkan identity, key custody, signing, timestamping, access control, operational audit, dan governance yang benar.
1. Mengapa Audit Trail dalam Core Banking Berbeda?
Di banyak aplikasi, audit trail adalah fitur pendukung. Di core banking, audit trail adalah bagian dari sistem kontrol.
Tanpa audit trail yang baik:
- manual posting tidak bisa dijelaskan;
- reversal terlihat seperti penghapusan;
- fee waiver tidak punya approval evidence;
- GL mismatch tidak bisa ditelusuri;
- regulator tidak bisa memverifikasi angka;
- fraud investigation lambat;
- incident tidak bisa direkonstruksi;
- customer dispute sulit diselesaikan;
- privileged access abuse tidak terlihat;
- migration defect sulit dibuktikan.
Audit trail bukan hanya untuk compliance. Ia membantu engineering correctness.
2. Bedakan Log, Event, Journal, dan Evidence
Jangan semua disebut log.
| Artefak | Tujuan | Contoh |
|---|---|---|
| Application log | debugging dan observability | Posting completed in 42ms |
| Security log | mendeteksi security-relevant activity | failed login, privilege change |
| Audit event | bukti actor/action/decision | checker approved manual debit |
| Domain event | fakta domain yang terjadi | account closed, fee charged |
| Ledger journal | financial accounting record | debit liability, credit income |
| Evidence record | snapshot pendukung keputusan | policy snapshot, approval view |
| Lineage record | hubungan source -> transformation -> output | payment file -> posting -> GL extract |
Application log boleh sampling dan rotating. Audit event tidak boleh diperlakukan seperti log sementara.
3. Audit Trail Minimum
Minimal audit event harus punya:
| Field | Mengapa penting |
|---|---|
| event id | unique evidence identity |
| event type | klasifikasi action |
| actor | siapa melakukan/menyebabkan |
| actor authority | berdasarkan role/permission apa |
| subject | object yang terkena dampak |
| action | aksi spesifik |
| reason | business reason |
| timestamp | kapan terjadi |
| business date | relevansi banking date |
| source channel | teller/mobile/batch/system |
| correlation id | chain across systems |
| causation id | event/command penyebab langsung |
| before/after atau diff | perubahan material |
| evidence hash | integrity check |
| result | success/rejected/failed |
Tetapi minimum bukan cukup untuk semua operasi. Operasi finansial butuh lebih banyak.
4. Mental Model: Evidence Graph
Pikirkan audit bukan sebagai flat table, tetapi graph.
Pertanyaan audit:
Why does report RPT-800 contain this amount?
Jawaban harus bisa berjalan mundur:
RPT-800 <- GLX-700 <- JRN-500 <- CMD-400 <- APR-300 <- BRK-200 <- CASE-100
Inilah lineage.
5. Audit Event Taxonomy
Gunakan taxonomy eksplisit.
| Kategori | Event |
|---|---|
| Identity/access | login, MFA failure, role assignment, privilege escalation |
| Customer/party | customer created, KYC updated, risk rating changed |
| Account | account opened, restricted, dormant, reactivated, closed |
| Product/config | product parameter proposed, approved, released |
| Ledger/posting | posting accepted, journal committed, reversal posted |
| Payment | payment submitted, accepted, rejected, returned, settled |
| Approval/control | approval requested, approved, rejected, overridden |
| Reconciliation | break created, matched, assigned, cleared |
| Operations | EOD started, failed, restarted, completed |
| Data/reporting | extract generated, report certified, correction submitted |
| Security | suspicious access, policy violation, export performed |
Taxonomy membantu query, retention, alerting, dan audit review.
6. Audit Event Schema
Contoh schema konseptual:
public record AuditEvent(
AuditEventId id,
AuditEventType type,
AuditSeverity severity,
ActorContext actor,
AuthorityContext authority,
SubjectRef subject,
ActionContext action,
ReasonContext reason,
BusinessContext business,
EvidenceContext evidence,
CorrelationContext correlation,
IntegrityContext integrity,
AuditResult result,
Instant occurredAt,
Instant recordedAt
) {
}
Sub-context:
public record ActorContext(
String actorId,
String personId,
String actorType,
String sessionId,
String sourceIp,
String userAgent,
String authenticationStrength
) {
}
public record AuthorityContext(
List<String> roleCodes,
List<String> permissionCodes,
String organizationScope,
String authoritySnapshotHash,
Optional<String> delegationId
) {
}
public record SubjectRef(
String subjectType,
String subjectId,
Optional<String> customerId,
Optional<String> accountId,
Optional<String> productCode
) {
}
Audit schema harus fleksibel, tetapi jangan menjadi dumping ground JSON tanpa standar.
7. Event Time vs Recorded Time
Gunakan dua timestamp:
| Timestamp | Makna |
|---|---|
| occurredAt | kapan event terjadi secara domain/security |
| recordedAt | kapan audit event dicatat |
Untuk batch/import/offline integration, keduanya bisa berbeda.
Contoh:
External clearing event occurred at 2026-06-28T09:00:00Z
System recorded it at 2026-06-28T09:03:12Z
Jangan hanya punya created_at.
8. Business Date vs System Date
Core banking butuh business date.
postingDate = date journal recorded in core
valueDate = date economic value applies
businessDate = operational banking date
systemTime = technical timestamp
Audit event harus menyimpan konteks tanggal yang relevan. Backdated posting tanpa audit business date akan sulit dijelaskan.
9. Before/After State vs Delta
Untuk perubahan data, simpan before/after atau delta material.
Contoh audit untuk rate override:
{
"field": "interestRate",
"before": "7.25",
"after": "6.75",
"unit": "PERCENT_PER_YEAR",
"effectiveDate": "2026-07-01"
}
Jangan simpan hanya:
Updated product configuration
Itu tidak menjawab apa yang berubah.
Namun hati-hati dengan PII/secret. Jangan simpan full sensitive data jika tidak perlu. Untuk data sensitif, gunakan masked value atau hash.
10. Audit Event vs Domain Event
Domain event:
FeeWaived
Audit event:
User X with authority Y approved fee waiver request Z, seeing payload hash H, reason R, resulting in domain event FeeWaived and journal J.
Keduanya bisa saling menaut, tetapi bukan hal yang sama.
Domain event berfokus pada fakta bisnis. Audit event berfokus pada evidence.
11. Audit Event vs Ledger Journal
Ledger journal adalah bukti finansial, tetapi bukan seluruh audit trail.
Journal menjawab:
What accounting entry was posted?
Audit trail menjawab:
Why was it posted, by whom, through what process, with what approval and evidence?
Manual debit yang hanya punya journal tidak cukup. Ia harus menaut ke request, approval, reason, dan case.
12. Correlation dan Causation
Gunakan dua id:
| ID | Makna |
|---|---|
| correlationId | satu end-to-end business flow |
| causationId | event/command langsung yang menyebabkan event ini |
Contoh:
correlationId = payment instruction P-100
causationId = checker approval decision DEC-200
Tanpa causation, graph sulit dibangun.
13. Actor Semantics
Actor tidak selalu manusia.
| Actor type | Contoh |
|---|---|
| HUMAN_USER | teller, operations user |
| SYSTEM | EOD scheduler, interest engine |
| SERVICE | payment worker, reconciliation worker |
| EXTERNAL_PARTY | clearing house, partner API |
| MIGRATION_TOOL | migration batch |
Untuk SYSTEM, simpan job id, service identity, deployment version, dan trigger.
Contoh:
{
"actorType": "SYSTEM",
"serviceName": "interest-accrual-worker",
"jobRunId": "EOD-2026-06-28-INT-001",
"deploymentVersion": "core-banking-2.18.4"
}
14. Authority Snapshot
Saat user melakukan action, role/permission bisa berubah di masa depan. Audit harus menyimpan snapshot authority saat action.
{
"roles": ["BRANCH_MANAGER"],
"permissions": ["APPROVE_MANUAL_DEBIT"],
"limit": "10000.00 USD",
"organizationScope": "BRANCH-001",
"evaluatedAt": "2026-06-28T10:00:00Z",
"policyVersion": "access-policy-2026-06"
}
Kalau audit hanya query role saat ini, investigasi masa lalu bisa salah.
15. Reason Code
Reason harus structured, bukan hanya free text.
public record ReasonContext(
String reasonCode,
String reasonCategory,
String freeText,
Optional<String> caseId,
Optional<String> regulatoryBasis
) {
}
Free text membantu, tetapi tidak cukup untuk analytics dan control reporting.
Contoh reason code:
| Reason code | Makna |
|---|---|
| CUSTOMER_DISPUTE_RESOLUTION | koreksi karena dispute |
| RECON_BREAK_CLEARING | koreksi reconciliation break |
| DUPLICATE_FEE_CORRECTION | koreksi fee duplikat |
| REGULATORY_HOLD_RELEASE | release atas dasar clearance |
| PRODUCT_CONFIG_RELEASE | perubahan konfigurasi produk |
| OPERATIONAL_ERROR_CORRECTION | kesalahan operasional internal |
16. Evidence Attachment dan Reference
Audit event tidak harus menyimpan file binary. Simpan reference yang kuat.
public record EvidenceRef(
String evidenceType,
String evidenceId,
String storageLocation,
String contentHash,
String classification,
Instant capturedAt
) {
}
Contoh:
- approval screenshot/rendered summary hash;
- recon statement file hash;
- signed customer instruction hash;
- case document reference;
- batch file hash;
- report extract hash.
Jangan simpan PII berlebih di audit table hanya karena mudah.
17. Tamper Evidence
Audit trail harus minimal tamper-evident.
Ada beberapa level:
| Level | Teknik | Catatan |
|---|---|---|
| Append-only DB table | no update/delete path | basic |
| DB privilege separation | app cannot mutate old events | kuat secara operational |
| Hash per event | detect content change | butuh canonicalization |
| Hash chain | detect reorder/delete | lebih kuat |
| External anchoring | anchor root hash ke store lain | lebih defensible |
| Digital signature | signer identity/key | butuh key governance |
| WORM/object lock | retention enforceable | berguna untuk evidence |
Hash chain sederhana:
eventHash = sha256(canonicalEventPayload)
chainHash = sha256(previousChainHash + eventHash)
Diagram:
Jika event 2 diubah, C2 dan C3 tidak cocok.
18. Batas Non-Repudiation
Hati-hati mengklaim non-repudiation.
Log biasa tidak otomatis membuktikan seseorang tidak bisa menyangkal. Non-repudiation kuat membutuhkan kombinasi:
- identity proofing;
- strong authentication;
- session integrity;
- authorization evidence;
- tamper-evident logging;
- clock synchronization;
- cryptographic signing jika relevan;
- private key custody;
- secure device/process;
- operational audit dan governance.
Maka istilah yang lebih aman untuk banyak sistem:
audit evidence supporting non-repudiation controls
Bukan:
perfect non-repudiation
19. Canonicalization untuk Hash
Jika hash digunakan untuk evidence, canonicalization wajib.
Rules:
- field ordering deterministic;
- timestamp format konsisten;
- numeric scale normal;
- currency uppercase ISO code;
- exclude volatile fields;
- include material fields;
- normalize Unicode jika perlu;
- explicit schema version.
Contoh:
public interface AuditCanonicalizer {
String canonicalize(AuditEvent event);
}
public interface AuditIntegrityService {
IntegrityContext seal(AuditEvent event, Optional<String> previousChainHash);
}
20. Append-Only Persistence
Audit event sebaiknya append-only.
create table audit_event (
id uuid primary key,
event_type varchar(120) not null,
severity varchar(40) not null,
actor_id varchar(120),
actor_type varchar(40) not null,
subject_type varchar(120),
subject_id varchar(200),
action varchar(120) not null,
reason_code varchar(120),
business_date date,
correlation_id varchar(160),
causation_id varchar(160),
occurred_at timestamptz not null,
recorded_at timestamptz not null,
payload jsonb not null,
event_hash varchar(128) not null,
previous_chain_hash varchar(128),
chain_hash varchar(128) not null,
schema_version varchar(40) not null
);
Restrict update/delete:
Application role: INSERT only
Audit reader role: SELECT only
DBA break-glass: monitored and separately logged
21. Update Correction Bukan Update Audit
Jika audit event salah tercatat, jangan update baris lama diam-diam. Tambahkan correction event.
AUD-100 recorded with wrong subject display name
AUD-101 corrects AUD-100 metadata typo
Prinsip sama seperti ledger: correction over mutation.
22. Audit Outbox
Jangan kirim audit event hanya ke log async tanpa jaminan.
Untuk action penting, audit event harus committed dalam transaction yang sama atau dalam pola outbox yang recoverable.
Pattern:
Jika SIEM down, audit event tidak hilang. Ia tertahan di outbox.
23. Synchronous vs Asynchronous Audit
| Mode | Cocok untuk | Risiko |
|---|---|---|
| Synchronous insert | critical domain action | tambah latency |
| Transactional outbox | reliable async delivery | perlu worker/retry |
| Best-effort app log | debug telemetry | tidak cukup untuk audit |
| Stream-only audit | high throughput | dual-write/loss risk jika tidak hati-hati |
Untuk core banking financial actions, jangan hanya best-effort log.
24. Audit Storage Architecture
Operational DB menyimpan evidence lokal. Central audit store memudahkan cross-system investigation. Object storage menyimpan file/evidence besar dengan hash.
25. Lineage Model
Lineage merekam hubungan antar artefak.
public record LineageLink(
String fromType,
String fromId,
String toType,
String toId,
String relationType,
Instant linkedAt
) {
}
Contoh relation:
| Relation | Makna |
|---|---|
| CAUSED_BY | event disebabkan event/command lain |
| DERIVED_FROM | output dihitung dari input |
| APPROVED_BY | request disetujui decision |
| EXECUTED_AS | approval dieksekusi sebagai command |
| POSTED_AS | command menghasilkan journal |
| EXTRACTED_TO | journal masuk extract/report |
| CORRECTS | record mengoreksi record lain |
| SUPERSEDES | versi baru menggantikan versi lama |
Lineage bisa disimpan eksplisit atau direkonstruksi dari correlation/causation. Untuk audit penting, lebih baik simpan eksplisit.
26. Forensic Query
Desain audit agar bisa menjawab pertanyaan investigasi.
Contoh query:
Show all manual debits over 10,000 USD approved by branch managers in the last 30 business days.
Show all actions taken by actor X during incident window.
For journal JRN-123, show the originating command, approval request, maker, checker, case, and evidence.
Show all fee waivers for customer CUST-123, grouped by reason and approver.
Show all updates to product parameter P before release version V.
Jika audit payload hanya blob tanpa indexed fields, forensic query akan lambat dan mahal. Index material fields.
27. Audit Query Table vs Search Index
Gunakan dua layer:
| Layer | Tujuan |
|---|---|
| immutable source table | authoritative audit evidence |
| search/index/projection | fast query dan dashboards |
Search index boleh rebuild. Source audit table tidak boleh mudah dimutasi.
28. Retention
Retention bergantung pada regulasi lokal, policy bank, product, dan jenis record. Jangan hardcode satu angka.
Model retention:
public record RetentionPolicy(
String recordType,
String jurisdiction,
Period minimumRetention,
Optional<Period> maximumRetention,
boolean legalHoldSupported,
String destructionProcedure
) {
}
Pertimbangan:
- customer/account records;
- transaction records;
- AML/sanctions records;
- audit/security logs;
- consent/privacy records;
- complaint/dispute evidence;
- regulatory reports;
- legal hold.
Retention bukan hanya storage lifecycle. Retention adalah governance.
29. Privacy dan Data Minimization
Audit trail sering menjadi tempat kebocoran data karena engineer memasukkan full request/response.
Prinsip:
- simpan material facts, bukan semua data;
- mask PAN/account/card data jika tidak perlu;
- hash atau tokenize sensitive identifier jika cukup;
- jangan log secrets, token, password, CVV, private key;
- batasi akses audit berdasarkan need-to-know;
- pisahkan evidence sensitif ke storage dengan kontrol lebih kuat;
- dukung redaction legal jika diperbolehkan tanpa merusak financial evidence.
Contoh buruk:
{
"requestBody": "full mobile banking transfer request including auth token and device fingerprint"
}
Contoh lebih baik:
{
"operation": "TRANSFER_SUBMIT",
"customerId": "CUST-123",
"fromAccountId": "ACC-001",
"amount": "100.00 USD",
"beneficiaryRefHash": "sha256:...",
"authStrength": "MFA",
"requestHash": "sha256:..."
}
30. Access Control untuk Audit Data
Audit data sensitif. Jangan semua engineer/operator bisa melihat semuanya.
Access control perlu mempertimbangkan:
- role;
- investigation assignment;
- jurisdiction;
- customer segment;
- data classification;
- break-glass access;
- approval untuk export;
- immutable logging of audit access.
Meta-audit:
Who accessed the audit trail?
What did they search?
What did they export?
Why?
Audit store juga harus diaudit.
31. Audit Export
Audit export berisiko karena data keluar dari kontrol aplikasi.
Control:
- export approval;
- watermark;
- scope limitation;
- redaction;
- encryption;
- recipient tracking;
- expiry;
- export hash;
- export audit event.
32. Clock Synchronization
Audit timeline bergantung pada clock.
Jika service clock drift, forensic reconstruction sulit.
Praktik:
- semua service pakai UTC technical timestamp;
- business date disimpan terpisah;
- clock sync dimonitor;
- recordedAt dari trusted server side;
- jangan percaya client timestamp untuk audit authoritative;
- external event time disimpan sebagai externalOccurredAt.
33. Multi-System Evidence
Core banking jarang single system.
Flow pembayaran dapat menyentuh:
- mobile banking;
- API gateway;
- fraud engine;
- core banking;
- payment switch;
- clearing system;
- GL;
- notification service.
Gunakan correlation ID end-to-end. Tetapi jangan percaya correlation ID dari client tanpa kontrol. Generate server-side dan propagate.
34. Audit untuk Maker-Checker
Dari Part 023, approval evidence harus merekam:
- request payload hash;
- maker identity;
- policy snapshot;
- authority snapshot;
- checker decision;
- decision snapshot;
- SoD evaluation result;
- reason/comment;
- execution result;
- linked domain record.
Contoh audit chain:
ApprovalRequested -> ApprovalPolicyEvaluated -> ApprovalDecisionRecorded -> ApprovalSatisfied -> ApprovedCommandExecuted -> JournalPosted
35. Audit untuk Ledger Posting
Ledger posting audit harus bisa menjawab:
- command apa yang menyebabkan posting;
- apakah posting hasil customer instruction, EOD, fee engine, interest engine, atau manual correction;
- siapa/apa aktornya;
- journal id apa yang tercipta;
- posting lines apa saja;
- apakah balanced;
- apakah reversal/correction terkait;
- apakah masuk GL extract;
- apakah muncul di statement;
- apakah direkonsiliasi.
Audit event tidak menggantikan journal. Audit event menautkan journal ke konteks.
36. Audit untuk Configuration Change
Configuration change sering lebih berbahaya dari transaction tunggal.
Contoh:
- interest rate table;
- fee pricing;
- GL mapping;
- product eligibility;
- approval matrix;
- limit policy;
- holiday calendar;
- tax rule.
Audit harus menyimpan:
- before/after;
- effective date;
- version;
- simulation result;
- approval;
- release actor;
- impacted products/accounts;
- rollback/supersession link.
37. Audit untuk EOD/BOD
EOD audit harus berisi:
- job run id;
- business date;
- step started/completed/failed;
- control totals;
- processed count/amount;
- skipped/rejected items;
- retry/restart marker;
- generated files/reports hashes;
- operator overrides;
- final certification.
Tanpa audit EOD, bank tidak bisa menjelaskan angka harian.
38. Audit untuk Reconciliation
Reconciliation audit harus berisi:
- source file/hash;
- matching rule version;
- matched/unmatched count;
- break creation;
- break assignment;
- break aging;
- correction action;
- closure evidence;
- suspense impact;
- sign-off.
Reconciliation yang hanya menutup item tanpa reason/evidence menciptakan risiko operasional.
39. Audit Failure Handling
Apa yang terjadi jika audit write gagal?
Untuk action material, biasanya pilihan aman:
If audit cannot be recorded, do not execute the business action.
Namun perlu strategi:
| Scenario | Strategy |
|---|---|
| audit table down | fail closed untuk critical action |
| central SIEM down | commit local audit + outbox retry |
| evidence store down | block action jika evidence mandatory |
| search index down | continue, rebuild later |
| hash chain service down | fail critical audit seal atau queue with explicit risk |
Jangan silently drop audit.
40. Backfill dan Migration Audit
Migration harus punya audit tersendiri.
Audit migration:
- source system record id;
- extraction batch id;
- transformation rule version;
- target record id;
- validation result;
- reconciliation totals;
- exception list;
- sign-off;
- cutover timestamp;
- rollback/fallback reference.
Setelah migration, angka awal harus bisa ditelusuri ke legacy evidence.
41. Testing Audit Trail
Test audit bukan optional.
41.1 Audit Completeness Test
Given manual debit command succeeds
Then audit events exist for request, approval, execution, and journal posting
41.2 Tamper Evidence Test
Given audit event payload changed manually
Then chain verification fails
41.3 No Sensitive Data Test
Given payment request contains token or PAN
Then audit payload does not contain raw token/PAN/CVV
41.4 Lineage Test
Given GL extract contains journal J
Then lineage resolves J back to original posting command and approval request
41.5 Authority Snapshot Test
Given actor approved request while having role R
And role R is removed later
Then audit still shows actor had role R at decision time
42. Audit Verification Job
Build periodic verification.
Audit integrity harus dimonitor, bukan diasumsikan.
43. Metrics
| Metric | Makna |
|---|---|
| audit write failure count | critical control risk |
| audit outbox lag | delayed evidence propagation |
| hash chain verification failure | tamper/corruption risk |
| privileged audit access count | sensitive access monitoring |
| export count by actor | data leakage risk |
| missing audit event rate | instrumentation gap |
| orphan journal without audit cause | lineage gap |
| audit search latency | investigation effectiveness |
| evidence storage failure | control weakness |
44. Anti-Patterns
| Anti-pattern | Dampak |
|---|---|
| treat audit as debug log | evidence hilang/terhapus |
| store full request body | privacy/security leakage |
| no actor authority snapshot | tidak bisa buktikan user sah saat action |
| no reason code | audit tidak actionable |
| mutable audit row | evidence bisa diubah |
| no correlation/causation | timeline sulit direkonstruksi |
| only current state audit | perubahan historis tidak jelas |
| no audit access logging | investigator bisa menyalahgunakan audit data |
| no hash/canonicalization | integrity claim lemah |
| overclaim non-repudiation | defensibility palsu |
45. Java Package Structure
com.bank.core.audit
├── api
├── application
│ ├── record
│ ├── query
│ ├── verify
│ └── export
├── domain
│ ├── AuditEvent.java
│ ├── AuditEventType.java
│ ├── ActorContext.java
│ ├── AuthorityContext.java
│ ├── EvidenceContext.java
│ ├── IntegrityContext.java
│ └── LineageLink.java
├── integrity
│ ├── AuditCanonicalizer.java
│ ├── AuditHasher.java
│ └── HashChainVerifier.java
├── retention
│ ├── RetentionPolicy.java
│ └── LegalHoldService.java
├── infrastructure
│ ├── jdbc
│ ├── outbox
│ ├── objectstorage
│ └── search
└── testfixtures
46. Design Review Checklist
[ ] Apa event taxonomy-nya?
[ ] Apa beda audit event, domain event, ledger journal, dan app log?
[ ] Apakah actor context cukup?
[ ] Apakah authority snapshot disimpan?
[ ] Apakah reason code structured?
[ ] Apakah before/after atau material delta tersedia?
[ ] Apakah timestamp memisahkan occurredAt, recordedAt, businessDate?
[ ] Apakah correlationId dan causationId tersedia?
[ ] Apakah lineage dari report ke source bisa ditelusuri?
[ ] Apakah audit write reliable dan tidak best-effort untuk action kritis?
[ ] Apakah audit event append-only?
[ ] Apakah ada tamper-evidence?
[ ] Apakah hash canonical deterministic?
[ ] Apakah sensitive data tidak bocor ke audit?
[ ] Apakah audit access juga diaudit?
[ ] Apakah retention/legal hold didukung?
[ ] Apakah export diawasi?
[ ] Apakah verification job memeriksa integrity?
[ ] Apakah non-repudiation claim realistis?
47. Latihan 20 Jam
Latihan 1 — Audit Manual Debit
Rancang audit trail untuk manual debit dari request sampai journal.
Output:
- audit event taxonomy;
- schema payload;
- lineage graph;
- sensitive data policy;
- query investigasi.
Latihan 2 — Audit Product Configuration Release
Rancang audit trail untuk perubahan fee parameter.
Output:
- before/after diff;
- approval evidence;
- simulation result evidence;
- effective date lineage;
- rollback/supersession model.
Latihan 3 — Hash Chain Prototype
Buat prototype Java sederhana:
- canonicalize audit event;
- compute event hash;
- compute chain hash;
- verify chain;
- test tamper detection.
48. Ringkasan
Audit trail banking-grade harus bisa menjawab:
Who did what?
When did it happen?
Under what authority?
Why was it done?
What data did they see?
What changed?
What financial records resulted?
What reports/extracts used those records?
How can we detect tampering?
How do we avoid leaking sensitive data?
How long must evidence be retained?
Who accessed the evidence later?
Engineer top 1% tidak menganggap audit sebagai log.info. Mereka mendesain audit sebagai evidence architecture.
Prinsip utama:
- audit event berbeda dari debug log;
- evidence harus structured dan queryable;
- lineage harus explicit;
- audit write untuk action kritis harus reliable;
- historical authority harus disnapshot;
- sensitive data harus diminimalkan;
- tamper evidence harus realistis;
- non-repudiation jangan overclaim;
- audit access juga harus diaudit;
- audit integrity harus diuji dan dimonitor.
Di Part 025, kita masuk ke exception queue, repair workbench, dan case-oriented operations: bagaimana exception diproses tanpa membuat ledger, audit, dan reconciliation rusak.
49. Referensi
- OWASP, Logging Cheat Sheet.
- NIST, Cybersecurity Framework 2.0.
- FFIEC, Architecture, Infrastructure, and Operations Booklet, Information Technology Examination Handbook.
- FFIEC, Information Security Booklet, Information Technology Examination Handbook.
- Basel Committee on Banking Supervision, BCBS 239: Principles for effective risk data aggregation and risk reporting.
- PCI Security Standards Council, PCI DSS.
- ISO 20022, Message Definitions.
You just completed lesson 24 in deepen practice. Use the series map if you want to review the broader track, or continue directly into the next lesson while the context is still warm.
Keep the momentum while the lesson is still fresh. Move backward for review or continue forward into the next concept.