Author: Farid Wajdi
Tech Stack: Go (Golang) Standard Library (net/http), PostgreSQL, OpenSSL, golang-migrate
Sebuah technical laboratory dan Proof of Concept (PoC) untuk membangun sistem Identity & Access Management (IAM) dan Transaksi Dompet Digital yang sepenuhnya berorientasi pada keamanan (Secure-by-Design).
Proyek ini sengaja dibangun tanpa menggunakan web framework (seperti Gin atau Fiber) dan tanpa ORM untuk mendemonstrasikan penguasaan fundamental terhadap protokol HTTP internal Go, manajemen memori, eksekusi raw SQL, serta mitigasi kerentanan keamanan di berbagai lapisan arsitektur (Layer 4 hingga Layer Data).
Sistem ini menerapkan prinsip Zero Trust dan diarsiteki dengan 7 lapisan pertahanan utama:
-
ACID Transactions & Row-Level Locking (Data Layer)
Menghindari Time-of-Check to Time-of-Use (TOCTOU) dan Race Conditions finansial menggunakan pola transaksisql.Txdengan jaring pengamandefer tx.Rollback(). Mutasi saldo dikunci secara presisi menggunakanSELECT ... FOR UPDATEdi tingkat PostgreSQL. -
Persistence Security & Connection Pool (Database Layer)
Menerapkan Parameterized Queries ($1,$2) untuk menetralisir SQL Injection (SQLi) secara mutlak. Koneksi dikelola secara ketat melalui pembatasan Connection Pool (SetMaxOpenConns,SetMaxIdleConns) untuk mencegah Resource Exhaustion (DDoS memori server DB). -
Whitelist Input Sanitization (Application Layer)
Menggunakango-playground/validatoruntuk memaksa batas panjang input dan aturan alphanum, menyaring vektor Cross-Site Scripting (XSS) dan injeksi data kotor sebelum menyentuh logika bisnis. -
Secure Session Management (Session Layer)
Menerbitkan JSON Web Token (JWT) dengan mitigasi kerentananalg: none. Sesi dikirim secara eksklusif melalui perisai Cookie berbenderaHttpOnly,Secure, danSameSite=Strict(mencegah XSS & CSRF). -
Gatekeeper & RBAC (Authorization Layer)
Memanfaatkan Context Values dalam Middleware Chain untuk mengekstrak identitas JWT secara aman, memastikan bahwa operasi rahasia seperti/wallet/deducthanya dieksekusi berdasarkan identitas kriptografis, bukan klaim JSON klien. -
Perimeter Firewall (Gateway Layer)
Injeksi Middleware Decorators untuk menolak serangan secara preemptif:- Rate Limiter: Mencegah serangan Brute-force dan volumetrik menggunakan pelacakan IP
net.SplitHostPort. - Security Headers: Memaksa HSTS, mencegah MIME Sniffing (
nosniff), dan Clickjacking (DENY). - Panic Recovery: Menangkap runtime errors untuk mencegah kebocoran Stack Trace memori OS ke publik.
- Rate Limiter: Mencegah serangan Brute-force dan volumetrik menggunakan pelacakan IP
-
Encrypted Tunnel (Transport Layer)
Konfigurasitls.Configkustom yang secara eksplisit menonaktifkan protokol usang (TLS 1.0/1.1) dan memaksa koneksi HTTPS menggunakan mekanisme kriptografi modern. -
Layered Architecture & Dependency Injection (Clean Code) Sistem dipisahkan secara ketat menjadi 3 lapisan (Handler, Service, Repository). Pemisahan tanggung jawab (Separation of Concerns) ini dicapai melalui injeksi antarmuka (Interface Injection), membuat logika bisnis terisolasi dari protokol HTTP dan kueri SQL.
.
├── certs/ # Sertifikat TLS (Diabaikan di .git)
├── cmd/
│ └── api/
│ └── main.go # Entry point, Dependency Injection (DI) Container, & Router
├── internal/
│ ├── auth/ # Engine Kriptografi: Bcrypt Hashing & JWT
│ ├── db/ # Konfigurasi PostgreSQL Connection Pool
│ ├── domain/ # Entitas Murni & Definisi Error Sentral (Tanpa dependensi eksternal)
│ ├── handlers/ # Layer 1: HTTP Resepsionis (Parsing JSON & Response Formatting)
│ ├── middleware/ # Layer 7 Firewalls (RateLimit, CORS, Headers, Gatekeeper)
│ ├── repository/ # Layer 3: Interaksi Database Raw SQL (PostgreSQL & Mocking)
│ └── service/ # Layer 2: Pusat Logika Bisnis & Pengujian Terisolasi
├── migrations/ # Skema Database (Infrastructure as Code / golang-migrate)
├── .env # Kredensial Database & Secret (Diabaikan di .git)
├── go.mod
├── go.sum
└── README.md
- Go
1.21+ - PostgreSQL
15+ - Utilitas
openssl - CLI
golang-migrate
Masuk ke PostgreSQL dan siapkan basis data beserta user dengan akses terbatas: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImZhcmlkd2FqZGkiLCJyb2xlIjoidXNlciIsImV4cCI6MTc3OTYyMzA0MSwiaWF0IjoxNzc5NjE5NDQxfQ.Q6VEOuol8bMpXgdsTLH9J3Eh9Cl7-wZa8yo9VteJit4
CREATE DATABASE iam_wallet_db;
CREATE USER iam_app WITH PASSWORD '<your_dbpassword>';
GRANT ALL PRIVILEGES ON DATABASE iam_wallet_db TO iam_app;
-- Masuk ke database iam_wallet_db lalu jalankan:
GRANT ALL ON SCHEMA public TO iam_app;Jalankan perintah ini untuk membangun tabel users dan wallets secara otomatis:
migrate -path migrations -database "postgres://iam_app:<your_dbpassword>@localhost:5432/iam_wallet_db?sslmode=disable" upBuat file .env di direktori root proyek dengan konfigurasi berikut:
DB_HOST=<your_db_url>
DB_PORT=5432
DB_USER=iam_app
DB_PASSWORD=<your_dbpassword>
DB_NAME=iam_wallet_db
JWT_SECRET=<your_jwt_secret>
DB_SSLMODE=disable/enable
FRONTEND_URL=<your_frontend_url>Buat Self-Signed Certificate lokal di dalam folder certs:
mkdir -p certs
openssl req -x509 -newkey rsa:4096 -keyout certs/server.key -out certs/server.crt -days 365 -nodes -subj "/CN=localhost"go run cmd/api/main.go
# Output:
# Koneksi PostgreSQL (Connection Pool) berhasil diamankan!
# Secure IAM API berjalan di port :8443...Karena menggunakan Self-Signed Certificate, gunakan flag
-katau--insecurepada cURL.
curl -k -X POST https://localhost:8443/register \
-H "Content-Type: application/json" \
-d '{"username": "farid", "password": "rahasia123"}'Perintah ini menggunakan -c cookies.txt untuk menyimpan Secure Cookie (JWT) secara otomatis.
curl -k -c cookies.txt -X POST https://localhost:8443/login \
-H "Content-Type: application/json" \
-d '{"username": "farid", "password": "rahasia123"}'Perintah ini menggunakan -b cookies.txt untuk mengirim JWT ke brankas sistem dan menguji mekanisme Row-Level Locking PostgreSQL.
curl -k -b cookies.txt -X POST https://localhost:8443/wallet/deductBerondong server dengan cepat. Pada request ke-6, Anda akan diblokir dengan HTTP 429 Too Many Requests.
for i in {1..6}; do curl -k -i -X GET https://localhost:8443/health; echo ""; doneSistem ini menggunakan teknik Functional Mocking pada lapisan Repository untuk menguji logika bisnis di Service Layer secara terisolasi, tanpa memerlukan koneksi ke database nyata.
Jalankan pengujian untuk memverifikasi jalur sukses dan skenario error (seperti saldo tidak mencukupi):
go test -v ./internal/service
# Output: Skenario sukses dan gagal tervalidasi dalam hitungan milidetik (< 0.01s)Untuk menjamin kode sepenuhnya patuh terhadap standar keamanan OWASP, bersih dari anti-pattern, dan efisien dalam manajemen memori, repositori ini mengintegrasikan golangci-lint (Skema Versi 2) sebagai agregator dan konduktor otomatis untuk menjalankan rangkaian inspeksi statis berikut secara paralel:
- govet: Memeriksa anomali logika dasar bawaan Go dan akurasi tanda tangan fungsi.
- staticcheck: Mengaudit efisiensi kode, arsitektur performa, dan mendeteksi API usang (deprecated).
- gosec: Memindai Abstract Syntax Tree (AST) untuk memburu celah keamanan kritis (Injeksi SQL, kebocoran kredensial, kelemahan kriptografi, dsb).
- errcheck: Memastikan akuntabilitas penanganan error, memaksa kepatuhan deteksi kegagalan pada operasi defer seperti
db.Close()dantx.Rollback(). - ineffassign: Mendeteksi inefisiensi alokasi variabel yang tidak pernah digunakan.
- bodyclose: Mencegah risiko kebocoran memori (resource leak) dengan memastikan seluruh HTTP tanggapan selalu ditutup dengan benar.
Seluruh aturan main ini dikonfigurasi secara terpusat di dalam berkas tata tertib .golangci.yml.
Jalankan orkestrasi analisis statis tunggal ini di direktori root:
golangci-lint run ./...Metrik Keberhasilan Audit Terakhir:
0 issues. (Sistem dinyatakan SEPENUHNYA PAS DAN LOLOS AUDIT)
Repositori ini menerapkan keamanan Rantai Pasok lapis ganda untuk mencegah masuknya kerentanan dari pustaka eksternal dan memitigasi serangan rekayasa sosial seperti Typosquatting:
- Integritas Kriptografi (
go.sum): Memvalidasi hash SHA-256 dari setiap dependensi terhadap database checksum global Google (sum.golang.org) guna menjamin perlindungan dari manipulasi modul di tengah jalan (man-in-the-middle). - Pemindaian Kerentanan Aktif (
govulncheck): Menggunakan alat analisis resmi dari Golang dengan pendekatan Call Graph Analysis untuk melacak Common Vulnerabilities and Exposures (CVE). Alat ini secara spesifik hanya akan menyorot fungsi rentan yang benar-benar dieksekusi oleh aplikasi, memastikan nol false positives.
Jalankan audit rantai pasok secara berkala dengan perintah:
govulncheck ./...Status Rantai Pasok Terakhir: 0 vulnerabilities affecting the code (Aman / Tervalidasi).
Aplikasi ini dikemas menggunakan standar arsitektur DevSecOps mutakhir untuk memastikan isolasi absolut dan meminimalisir Attack Surface di lingkungan Production:
- Multi-Stage Builds: Memisahkan lingkungan kompilasi dan lingkungan runtime. Biner dikompilasi secara statis (
CGO_ENABLED=0) dan jejak alat build (kompilator, kode sumber) dimusnahkan dari rilis final. - Distroless Base Image: Menggunakan
gcr.io/distroless/static-debian12. Tidak ada shell (bash/sh), tidak ada utilitas jaringan (curl/wget), dan tidak ada package manager. Memblokir penuh taktik pergerakan lateral peretas. - Non-Root & Read-Only: Container dieksekusi secara ketat sebagai pengguna
nonrootdengan hak akses terbatas. Disarankan untuk menjalankan container dengan bendera--read-onlyuntuk menciptakan immutable filesystem yang mencegah injeksi script berbahaya (RCE). - Inspeksi Artefak (Trivy): Image kontainer diaudit secara rutin menggunakan Aqua Security Trivy untuk memindai kerentanan OS (Debian) dan ketergantungan binary.
Metrik Keamanan Kontainer Terakhir: Ukuran Image 20.4MB | 0 vulnerabilities terdeteksi pada base image dan gobinary.
Karena kontainer ini dibangun dengan isolasi mutlak (distroless, read-only, dan non-root), ia tidak menyimpan kredensial atau sertifikat di dalam image. Semua konfigurasi harus disuntikkan secara dinamis saat runtime (saat kontainer dihidupkan).
Gunakan perintah di bawah ini untuk menjalankan server API secara lokal dengan aman, memastikan Anda mengeksekusinya tepat di root direktori proyek:
docker run --rm -it \
--name secure-iam-api \
--read-only \
--network host \
-w /app \
-v "$(pwd)/certs:/app/certs:ro,z" \
-e DB_HOST=localhost \
-e DB_PORT=5432 \
-e DB_USER=iam_app \
-e DB_PASSWORD=<your_dbpassword> \
-e DB_NAME=iam_wallet_db \
-e DB_SSLMODE=require/disable \
-e JWT_SECRET="<your_jwt_secret>" \
secure-iam-api:v1Anatomi Perintah Keamanan: --read-only: Mengunci filesystem kontainer agar tidak dapat ditulisi (mencegah modifikasi malware). --network host: Membuka akses jaringan agar kontainer dapat berkomunikasi dengan PostgreSQL di mesin lokal. -w /app: Menetapkan direktori kerja yang spesifik untuk akurasi pencarian path sertifikat. -v ... :ro,z: Melakukan mounting sertifikat TLS secara Read-Only (ro) dan menyuntikkan label izin khusus SELinux (z) agar kontainer non-root diizinkan membaca file dari OS Host.
Proyek ini dilengkapi dengan ban berjalan terotomatisasi (pipeline) menggunakan GitHub Actions (.github/workflows/devsecops.yml). Pipeline ini dirancang dengan filosofi Fail Fast, Fail Cheap untuk menolak kode yang tidak aman sedini mungkin sebelum mencapai tahap build.
Alur inspeksi keamanan berjalan secara berurutan:
- Secret Scanning (Trivy FS): Memblokir pipeline jika terdapat hardcoded credentials (seperti API Key atau sandi) di dalam kode sumber.
- Linting & Code Quality: Menggunakan
go vetdanstaticcheckuntuk memastikan kode bebas dari kejanggalan sintaks dan memenuhi standar idiomatis Go yang tangguh. - SAST (GoSec): Menganalisis kelemahan logika keamanan pada kode (misal: SQL Injection, kelemahan kriptografi) tanpa harus mengeksekusi aplikasi.
- SCA (Govulncheck): Memeriksa seluruh hierarki pustaka pihak ketiga (dependencies) terhadap database kerentanan (CVE) nasional.
- Container Security (Trivy Image): Setelah image Docker berbasis distroless selesai dibangun, Trivy kembali memindai hasil akhir image untuk memastikan tidak ada celah di level OS atau binary.
- Supply Chain Transparency (Syft): Pipeline secara otomatis mengekstrak SBOM (Software Bill of Materials) dalam format SPDX JSON. Ini bertindak sebagai Label yang mendata seluruh komponen di dalam image, sangat krusial untuk Incident Response jika terjadi serangan Zero-Day di masa depan.
Sistem ini membuang pencatatan log teks datar (plaintext) standar dan mengimplementasikan Structured JSON Logging menggunakan pustaka bawaan log/slog. Pendekatan ini dirancang untuk memfasilitasi pemantauan terpusat (seperti ELK Stack atau Datadog) sekaligus memitigasi kerentanan keamanan level pemantauan:
- Pencegahan Log Injection (CRLF Attack):
Masukan nakal dari pengguna yang berisi karakter newline (
\natau\r) secara otomatis di-escape olehJSONHandler. Peretas tidak dapat memanipulasi log parser untuk menyuntikkan baris log palsu. - Sanitasi PII (Personally Identifiable Information) Otomatis:
Sistem diinjeksi dengan middleware internal
ReplaceAttrpada level logger. Setiap key yang terdeteksi sebagai data sensitif (sepertipassword,token, atausecret) akan secara mutlak disensor menjadi[REDACTED]. Alamatemailjuga secara dinamis disamarkan (contoh:f***d@example.com) sebelum dicetak ke stdout, mencegah insiden kebocoran data (Data Leak) ke dasbor pemantauan. - Traceability & Status Interception:
Setiap HTTP request yang masuk dibekali dengan
request_idunik untuk keperluan Distributed Tracing. Karena antarmuka standar Go tidak menyimpan HTTP Status Code, sistem menggunakan polaresponseRecorderuntuk menyadap dan mencatatstatus_codesertaduration_msdi lapisan middleware paling dalam. Ini memungkinkan visibilitas penuh terhadap serangan volumetrik (seperti Rate Limit / 429 Too Many Requests).
Repositori ini menyertakan infrastruktur pemantauan instan berbasis Docker Compose untuk memvisualisasikan metrik keamanan dan performa aplikasi secara real-time.
Cara Menjalankan Dasbor Pemantauan:
-
Pastikan API Go sedang berjalan (mendengarkan di port
:8443). -
Masuk ke direktori
observabilitydan jalankan orkestrasi kontainer:cd observability docker compose up -d -
Buka Grafana di http://localhost:3000 (Kredensial bawaan: admin / admin).
-
Grafana telah dikonfigurasi untuk secara otomatis menghisap data dari metrik Prometheus yang diekspos secara aman oleh aplikasi Go. Anda dapat memantau anomali keamanan (seperti lonjakan HTTP 401 dan 429) serta memprofilkan kesehatan goroutine melalui antarmuka visual.
Dikembangkan sebagai bagian dari eksplorasi mendalam terhadap arsitektur backend, manajemen memori persisten, dan standar keamanan siber OWASP.