Auditor TokoKita mengajukan permintaan yang tampak sederhana: tunjukkan bahwa semua data terklasifikasi restricted di-mask, dienkripsi, dan dihapus maksimal 90 hari setelah dibuat. Dokumen kebijakan 40 halaman tidak bisa menjawabnya — dokumen hanya menyatakan niat, bukan kenyataan. Jawaban yang bisa dibuktikan datang dari policy-as-code: kebijakan ditulis dalam format yang bisa dibaca mesin, lalu dievaluasi otomatis terhadap inventaris aset sehingga status kepatuhan diketahui setiap saat, bukan hanya saat audit. Bab penutup section ini merangkai seluruh bab sebelumnya — klasifikasi, masking, enkripsi, retensi, audit — menjadi satu kebijakan yang hidup dan ditegakkan lewat kode.

Kerangka Compliance yang Sering Ditemui #

Empat kerangka berikut paling sering membingkai pembicaraan compliance di tim data. Sebagai engineer kita tidak perlu menghafal pasalnya, tetapi wajib mengenali fokusnya karena fokus itulah yang menurun menjadi kontrol teknis yang kita bangun:

KerangkaWilayahFokus singkat
UU PDP (UU No. 27/2022)Indonesiapelindungan data pribadi: dasar pemrosesan, hak subjek data, sanksi administratif
GDPRUni Eropahak akses dan penghapusan, data minimization, denda hingga 4% omzet global
HIPAAAmerika Serikatkerahasiaan data kesehatan (PHI) beserta audit aksesnya
PCI-DSSindustri kartu pembayarankeamanan data kartu: enkripsi, kontrol akses, audit log

Keempatnya berbeda rumusan tetapi menuntut pola kontrol yang sama: tahu data apa yang dimiliki (katalog), batasi aksesnya (RBAC), lindungi isinya (enkripsi, masking), hapus tepat waktu (retention), dan buktikan semuanya (audit log). Perlu dicatat sekali saja: bab ini menjelaskan praktik teknis secara umum, bukan nasihat hukum.

Policy sebagai Kode #

Kebijakan TokoKita menyatakan kontrol wajib per klasifikasi — klasifikasi yang definisinya kita bangun di Chapter Klasifikasi Data. Data public hanya dibatasi umur simpan; internal wajib terenkripsi dengan RBAC; restricted menambah masking PII dan memperpendek retention ke 90 hari:

yaml
# Policy keamanan TokoKita: kontrol wajib per klasifikasi data.
# Klasifikasi (public/internal/restricted) didefinisikan di chapter Klasifikasi Data.
klasifikasi:
  public:
    retention_hari: 3650
  internal:
    retention_hari: 1095
    encryption: wajib
    rbac: wajib
  restricted:
    retention_hari: 90
    encryption: wajib
    masking_pii: wajib
    rbac: wajib

Struktur sengaja datar dan deklaratif: setiap klasifikasi memetakan nama kontrol ke syarat. Sebuah kontrol bernilai wajib berarti aset harus memasangnya; retention_hari berarti umur simpan konfigurasi aset tidak boleh melebihi angka tersebut. Kebijakan semacam ini jauh lebih mudah di-review daripada prosa — reviewer tinggal membandingkan tabel per klasifikasi.

Evaluasi Aset terhadap Policy #

Sisi lainnya adalah inventaris aset: setiap aset membawa klasifikasinya dan daftar kontrol yang benar-benar terpasang. Skrip berikut memuat policy, membandingkan tiap aset dengan kontrol wajib klasifikasinya, lalu mencetak laporan pelanggaran:

python
"""Policy-as-code: evaluasi aset terhadap kontrol wajib per klasifikasi."""
from pathlib import Path

import yaml

POLICY = Path(__file__).parent / "policy.yaml"

# Inventaris aset: klasifikasi + kontrol yang benar-benar terpasang saat ini.
ASET = [
    {"nama": "pesanan.parquet", "klasifikasi": "internal",
     "kontrol": {"encryption": True, "masking_pii": False, "rbac": True,
                 "retention_hari": 730}},
    {"nama": "pelanggan.csv", "klasifikasi": "restricted",
     "kontrol": {"encryption": True, "masking_pii": False, "rbac": True,
                 "retention_hari": 365}},
    {"nama": "produk.csv", "klasifikasi": "public",
     "kontrol": {"encryption": False, "masking_pii": False, "rbac": False,
                 "retention_hari": 1825}},
    {"nama": "logs_layanan", "klasifikasi": "internal",
     "kontrol": {"encryption": False, "masking_pii": False, "rbac": True,
                 "retention_hari": 1095}},
]


def muat_policy(path):
    """Muat policy YAML dan pastikan setiap klasifikasi punya batas retention."""
    policy = yaml.safe_load(path.read_text())["klasifikasi"]
    for nama, kontrol in policy.items():
        if "retention_hari" not in kontrol:
            raise ValueError(f"klasifikasi '{nama}' wajib punya retention_hari")
    return policy


def evaluasi_aset(policy, aset):
    """Bandingkan kontrol terpasang dengan kontrol wajib; kumpulkan pelanggaran."""
    masalah = []
    if aset["klasifikasi"] not in policy:
        return [f"klasifikasi '{aset['klasifikasi']}' tidak dikenal policy"]
    for kontrol, nilai in policy[aset["klasifikasi"]].items():
        terpasang = aset["kontrol"].get(kontrol)
        if kontrol == "retention_hari":
            if terpasang > nilai:
                masalah.append(
                    f"retention {terpasang} hari melebihi batas {nilai} hari")
        elif nilai == "wajib" and not terpasang:
            masalah.append(f"{kontrol} wajib tapi tidak terpasang")
    return masalah


def jalankan():
    policy = muat_policy(POLICY)
    print(f"=== Evaluasi {len(ASET)} aset terhadap policy ===")
    total_masalah = 0
    for aset in ASET:
        masalah = evaluasi_aset(policy, aset)
        label = f"{aset['nama']:<16}({aset['klasifikasi']})"
        if not masalah:
            print(f"{label:<32}: LULUS")
        else:
            total_masalah += len(masalah)
            print(f"{label:<32}: {len(masalah)} PELANGGARAN")
            for m in masalah:
                print(f"{'':<34}- {m}")
    bermasalah = sum(1 for a in ASET if evaluasi_aset(policy, a))
    print(f"Ringkasan: {len(ASET) - bermasalah} aset lolos, "
          f"{bermasalah} aset bermasalah ({total_masalah} pelanggaran)")


if __name__ == "__main__":
    jalankan()

Output yang Dihasilkan:

text
=== Evaluasi 4 aset terhadap policy ===
pesanan.parquet (internal)      : LULUS
pelanggan.csv   (restricted)    : 2 PELANGGARAN
                                  - retention 365 hari melebihi batas 90 hari
                                  - masking_pii wajib tapi tidak terpasang
produk.csv      (public)        : LULUS
logs_layanan    (internal)      : 1 PELANGGARAN
                                  - encryption wajib tapi tidak terpasang
Ringkasan: 2 aset lolos, 2 aset bermasalah (3 pelanggaran)

Mari kita telaah baris-baris kode di atas:

  1. Baris 9-22 (ASET): inventaris aset dalam bentuk data — persis informasi yang seharusnya sudah terpelihara di katalog dan registry ownership, sehingga di produksi daftar ini dipanen otomatis, bukan diketik manual.
  2. Baris 25-31 (muat_policy): policy divalidasi saat dimuat; klasifikasi tanpa retention_hari langsung ditolak, karena kebijakan yang cacat lebih buruk daripada tidak ada kebijakan.
  3. Baris 37-38 (klasifikasi tak dikenal): aset yang klasifikasinya tidak ada di policy langsung dilaporkan — aset tak terklasifikasi adalah pelanggaran tersendiri, bukan aset yang lolos begitu saja.
  4. Baris 41-46 (dua jenis aturan): kontrol wajib gagal bila tidak terpasang; retention_hari gagal bila konfigurasi aset melebihi batas. Dua aturan ini menangkap dua kesalahan paling umum: kontrol lupa dipasang, dan data disimpan terlalu lama.
  5. Baris 64-66 (ringkasan): total aset lolos dan total pelanggaran — angka yang pantau di dashboard compliance mingguan.

pelanggan.csv menjadi pelanggaran paling serius: berklasifikasi restricted tetapi PII-nya belum di-mask dan retention-nya empat kali batas. Perbaikannya mengarah jelas — pasang masking dari Chapter Masking dan Tokenization dan jalankan enforcement dari Chapter Privasi dan Retensi Data — dan setelah diperbaiki, evaluasi ulang akan membuktikannya.

Alur evaluasi lengkapnya tergambar berikut:

Siklus Hidup Kebijakan #

Policy-as-code tidak berhenti di satu evaluasi. Kebijakan hidup dalam siklus: ditulis sebagai draf oleh tim data bersama tim legal, di-review seperti pull request biasa, disetujui owner kebijakan, lalu ditegakkan di dua tempat — evaluasi terjadwal yang melaporkan pelanggaran existing, dan gerbang CI yang menolak pipeline baru yang melanggar (aset restricted tanpa masking tidak boleh ikut ter-deploy). Kebijakan juga wajib direview berkala: klasifikasi berubah, kerangka regulasi bertambah, dan kontrol baru menjadi tersedia. Karena berbentuk kode, setiap perubahan kebijakan punya riwayat, penulis, dan alasan — kebijakan itu sendiri tunduk pada tata kelola.

Rujukan resmi ketiga kerangka asing di tabel awal: teks GDPR di EUR-Lex , standar sistem manajemen keamanan informasi ISO/IEC 27001 , dan Dewan Standar Keamanan PCI . Dengan kebijakan yang ditegakkan lewat kode, section keamanan dan tata kelola ini ditutup: data TokoKita kini terlindungi, terkatalog, tertelusuri, dimiliki, dan patuh sekaligus. Fondasi berikutnya adalah menjalankan seluruh platform ini di atas infrastruktur yang lebih besar — wilayah section Cloud dan Infrastruktur Data.