Lesson 0025 · FHIR · Modul PDP · ±18 menit

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

Target lesson ini: Anda bisa menyebut empat jebakan (query search, 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)

  1. 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 dengan POST _search, log "will still contain a rich set of information about the clinical records". [2]
  2. OperationOutcome.diagnostics bisa 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. Catat issue.code; diagnostics masuk 🔴.
  3. Narrative text.div mengulang isi resource. Definisinya "a human-readable narrative that contains a summary of the resource". [4] Menyensor name tapi meloloskan text.div berarti nama tetap tercetak, kali ini sebagai HTML. FHIR: "Narrative and Attachment elements present particularly difficult challenges." [5]
  4. 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.

SaluranApa yang bocorFakta yang bisa Anda kutip
1. Log aplikasibody resource, diagnostics, nama yang disisipkan ke string pesanpino redact hanya bekerja pada path kunci objek (case-sensitive), tidak menyentuh isi string. [6]
2. URL: access log, proxy, APMquery search FHIR (NIK, nama, tanggal lahir)Log HTTP sama sensitifnya dengan resource. [2]
3. Trace (OpenTelemetry)url.full, url.query, atribut customRedaksi 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 metrikpatient_id sebagai labelPrometheus: "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 mentahDefault dataCollection mengumpulkan "request/response bodies"; denylist bawaan (auth, token, secret, …) tidak mencakup nik atau birthDate. [10]
6. Frontend Reactconsole.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