# Standar Keamanan Sistem (Security Baseline) Dokumen ini mendokumentasikan baseline kontrol keamanan yang diterapkan di seluruh layer arsitektur KeluargaMart Monorepo. --- ## 1. Keamanan Jaringan & Kontainer 1. **Prinsip Least Privilege**: - `apps/backend`: Berjalan sebagai unprivileged user `appuser` (UID 10001). - `apps/erp` & `apps/pos`: Berjalan sebagai unprivileged user `nginx` (UID 101). - `apps/b2b`: Berjalan sebagai unprivileged user `appuser` (UID 10001). - `apps/nextreport`: Berjalan sebagai unprivileged user `node` (UID 1000). 2. **Zero-Public Ingress**: - Tidak ada port aplikasi atau database yang dibuka langsung ke `0.0.0.0` pada interface publik VPS. - Semua koneksi masuk dari internet diproteksi oleh edge TLS Cloudflare dan diarahkan ke `127.0.0.1` melalui Cloudflare Tunnel terenkripsi. 3. **Isolasi Bridge Network**: - Database PostgreSQL dan Redis hanya dapat diakses dari dalam Docker bridge network internal `keluargamart`. --- ## 2. Autentikasi & Otorisasi RBAC 1. **Single Source of Truth Catalog**: - Seluruh permission didefinisikan secara kanonikal di `apps/backend/internal/modules/rbac/catalog.go`. - Tidak ada otorisasi berbasis client string yang tidak terdaftar. 2. **Fail-Closed Security**: - Setiap rute backend yang membutuhkan otentikasi akan menolak request secara otomatis (HTTP 401/403) jika token JWT tidak valid atau permission tidak mencukupi. 3. **Session & Token Management**: - JWT Access Token menggunakan kunci simetris minimal 32 karakter acak. - Refresh Token disimpan aman dan divalidasi status pencabutannya (*revocation check*). --- ## 3. Perlindungan Data & Transaksi Finansial 1. **Idempotency Protection**: - Endpoint pembuat pesanan (`POST /api/v1/orders`), POS checkout (`POST /api/v1/pos/orders`), dan pembayaran mewajibkan header idempotency token (`Idempotency-Key`). - Mencegah double deduction stok atau double charge pada retry network. 2. **Immutability of Financial Records**: - Tabel jurnal akuntansi (`journal_entries`), mutasi kas, dan transaksi pembayaran tidak boleh di-UPDATE atau di-DELETE secara langsung. - Koreksi dilakukan melalui reversing transactions. 3. **SQL Injection Prevention**: - Seluruh query database menggunakan parameterized queries via `pgx/v5` atau GORM binding. Tidak ada string concatenation pada query SQL. --- ## 4. Keamanan Frontend & Sanitasi 1. **Content Security Headers**: - Nginx dan Go backend menyisipkan header keamanan: `X-Content-Type-Options: nosniff`, `X-Frame-Options: SAMEORIGIN`, `Referrer-Policy: strict-origin-when-cross-origin`. 2. **Zero Secrets in Frontend Bundle**: - Hanya variabel publik berawalan `VITE_PUBLIC_` atau `NUXT_PUBLIC_` yang diekspos ke client bundle. - Database password, JWT secret, dan Midtrans Server Key dilarang keras diimpor ke dalam kode frontend.