PDP: empat jebakan, enam saluran bocor
Di mana data pasien biasanya bocor ke log dan monitoring: jebakan di resource FHIR dan saluran yang mencatat otomatis
OperationOutcome.diagnostics, narrative text.div, kode diagnosis)
dan enam saluran tempat data pasien bocor (log aplikasi, URL, trace, label metrik, Sentry, frontend), lalu menjelaskan dalam ±60 detik cara memeriksanya di sistem yang sudah jalan.
Di lesson 0024 setiap field FHIR sudah diberi warna: 🔴 drop, 🟡 HMAC, 🟢 aman. Lesson ini membahas kenapa field 🔴 tetap sering lolos: empat jebakan di resource FHIR sendiri, lalu enam saluran yang mencatat otomatis.
Empat jebakan yang membedakan jawaban mid-level (±7 menit)
- Query search adalah data pasien.
GET /Patient?identifier=https://fhir.kemkes.go.id/id/nik|3171…menaruh NIK di URL. [1] FHIR R4: "HTTP logs, including those that only contain the URL itself, should be regarded as being as sensitive as the resources themselves." Bahkan denganPOST _search, log "will still contain a rich set of information about the clinical records". [2] OperationOutcome.diagnosticsbisa memuat ulang input. Field ini teks bebas: "a description of how a value is erroneous" atau "a stack dump". [3] Pesan validasi SATUSEHAT bisa mengutip nilai yang salah. Catatissue.code;diagnosticsmasuk 🔴.- Narrative
text.divmengulang isi resource. Definisinya "a human-readable narrative that contains a summary of the resource". [4] Menyensornametapi meloloskantext.divberarti nama tetap tercetak, kali ini sebagai HTML. FHIR: "Narrative and Attachment elements present particularly difficult challenges." [5] - Kode diagnosis sensitif bocor tanpa nama. Lihat paragraf HIV di lesson 0024: kode ICD-10 itu sendiri adalah isi klinis.
Latihan 3 — Jebakan
3. Di mana bocornya: enam saluran (±8 menit)
Body yang di-log dengan sengaja jarang jadi masalah utama. Yang berbahaya adalah saluran yang mencatat otomatis.
| Saluran | Apa yang bocor | Fakta yang bisa Anda kutip |
|---|---|---|
| 1. Log aplikasi | body resource, diagnostics, nama yang disisipkan ke string pesan | pino redact hanya bekerja pada path kunci objek (case-sensitive), tidak menyentuh isi string. [6] |
| 2. URL: access log, proxy, APM | query search FHIR (NIK, nama, tanggal lahir) | Log HTTP sama sensitifnya dengan resource. [2] |
| 3. Trace (OpenTelemetry) | url.full, url.query, atribut custom | Redaksi default url.query hanya untuk kunci tanda tangan seperti X-Amz-Signature dan sig. [7] OTel "can't determine what data is sensitive in your specific context on its own". [8] |
| 4. Label metrik | patient_id sebagai label | Prometheus: "Do not use labels to store dimensions with high cardinality … such as user IDs". [9] Label juga menyebar ke dashboard dan alert yang aksesnya longgar. |
| 5. Error tracking (Sentry) | body request/response, breadcrumbs, nama transaksi berisi ID mentah | Default dataCollection mengumpulkan "request/response bodies"; denylist bawaan (auth, token, secret, …) tidak mencakup nik atau birthDate. [10] |
| 6. Frontend React | console.log(patient), analytics event, URL halaman (/pasien/3171…) | Sentry: breadcrumbs dan nama transaksi dengan URL mentah adalah tempat PII muncul. [11] |
Latihan 4 — Saluran
Latihan lisan — Saluran (±3 menit)
Pasang timer, jawab dengan suara keras seolah sedang interview, baru buka jawaban contoh.
"Anda baru masuk tim dan sistemnya sudah jalan. Bagaimana memeriksa apakah monitoring kami membocorkan data pasien?" (60 detik)
Bandingkan dengan jawaban contoh dan checklist-nya
"Saya telusuri satu request FHIR dari ujung ke ujung, misalnya search pasien by NIK, lalu cari jejaknya di setiap saluran.
Access log dan proxy: apakah query string tercatat utuh? Trace OpenTelemetry: url.full, url.query, atribut custom. Metrik: ada label berisi ID pasien?
Sentry: body request terkirim, breadcrumbs, nama transaksi dengan ID mentah? Log aplikasi: body resource, OperationOutcome.diagnostics, string pesan yang menyisipkan nama.
Frontend: console log, analytics, session replay. Untuk temuan, perbaikannya di sumber: allowlist field, HMAC untuk ID, matikan body di Sentry, tambahkan parameter FHIR ke redaksi query.
Lalu saya tambahkan tes yang gagal kalau NIK contoh muncul di output log."
Checklist: apakah Anda menyebut…
- telusuri satu request nyata (mis. search by NIK) di semua saluran?
- access log/proxy: query string?
- trace OTel (
url.query) dan label metrik? - Sentry: body, breadcrumbs, nama transaksi?
- log aplikasi dan frontend (console, analytics, replay)?
- perbaiki di sumber (allowlist, HMAC) + tes regresi?
Lulus kalau minimal 4 dari 6.
Berikutnya, lesson 0026: cara menutup saluran-saluran ini (allowlist di sumber, HMAC untuk korelasi) dan kenapa audit trail dipisah dari log operasional.
Sumber (semua diakses 2026-10-27): [1] FHIR R4 Search · [2] FHIR R4 Security · [3] FHIR R4 OperationOutcome definitions · [4] FHIR R4 DomainResource definitions · [5] FHIR R4 Security and Privacy Module (de-identification) · [6] pino: redaction · [7] OpenTelemetry semantic conventions: url · [8] OpenTelemetry: Handling sensitive data · [9] Prometheus: metric and label naming · [10] Sentry JS: configuration options · [11] Sentry JS: scrubbing sensitive data