Skip to content

Azzt17/secure-iam-api

Repository files navigation

🛡️ Secure IAM & Wallet API (DevSecOps Architecture)

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).


🏗️ Arsitektur Pertahanan Berlapis (Defense-in-Depth)

Sistem ini menerapkan prinsip Zero Trust dan diarsiteki dengan 7 lapisan pertahanan utama:

  1. ACID Transactions & Row-Level Locking (Data Layer)
    Menghindari Time-of-Check to Time-of-Use (TOCTOU) dan Race Conditions finansial menggunakan pola transaksi sql.Tx dengan jaring pengaman defer tx.Rollback(). Mutasi saldo dikunci secara presisi menggunakan SELECT ... FOR UPDATE di tingkat PostgreSQL.

  2. 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).

  3. Whitelist Input Sanitization (Application Layer)
    Menggunakan go-playground/validator untuk memaksa batas panjang input dan aturan alphanum, menyaring vektor Cross-Site Scripting (XSS) dan injeksi data kotor sebelum menyentuh logika bisnis.

  4. Secure Session Management (Session Layer)
    Menerbitkan JSON Web Token (JWT) dengan mitigasi kerentanan alg: none. Sesi dikirim secara eksklusif melalui perisai Cookie berbendera HttpOnly, Secure, dan SameSite=Strict (mencegah XSS & CSRF).

  5. Gatekeeper & RBAC (Authorization Layer)
    Memanfaatkan Context Values dalam Middleware Chain untuk mengekstrak identitas JWT secara aman, memastikan bahwa operasi rahasia seperti /wallet/deduct hanya dieksekusi berdasarkan identitas kriptografis, bukan klaim JSON klien.

  6. 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.
  7. Encrypted Tunnel (Transport Layer)
    Konfigurasi tls.Config kustom yang secara eksplisit menonaktifkan protokol usang (TLS 1.0/1.1) dan memaksa koneksi HTTPS menggunakan mekanisme kriptografi modern.

  8. 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.


📂 Struktur Repositori Standar Industri

.
├── 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

🚀 Panduan Eksekusi Lokal

1. Prasyarat Sistem

  • Go 1.21+
  • PostgreSQL 15+
  • Utilitas openssl
  • CLI golang-migrate

2. Konfigurasi Database (Least Privilege)

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;

3. Migrasi Skema (Infrastructure as Code)

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" up

4. Variabel Lingkungan (.env)

Buat 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>

5. Membangun Kriptografi Transport (TLS)

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"

6. Menjalankan Server

go run cmd/api/main.go
# Output:
#  Koneksi PostgreSQL (Connection Pool) berhasil diamankan!
#  Secure IAM API berjalan di port :8443...

🧪 Skenario Pengujian (Terminal / cURL)

Karena menggunakan Self-Signed Certificate, gunakan flag -k atau --insecure pada cURL.

1. Mendaftarkan Entitas Baru (Registrasi)

curl -k -X POST https://localhost:8443/register \
     -H "Content-Type: application/json" \
     -d '{"username": "farid", "password": "rahasia123"}'

2. Autentikasi dan Mengambil Tiket Sesi (Login)

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"}'

3. Mengakses Endpoint Terkunci (Potong Saldo)

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/deduct

4. Menguji Perimeter Keamanan (Rate Limiter DoS Test)

Berondong 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 ""; done

5. Pengujian Terisolasi (Unit Testing & Mocking)

Sistem 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)

6. Analisis Keamanan Statis & Orkestrasi Linter (SAST - DevSecOps Suite)

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() dan tx.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)

7. Analisis Rantai Pasok Perangkat Lunak (SCA - Supply Chain Security)

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).

8. Keamanan Kontainer (Container Security)

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 nonroot dengan hak akses terbatas. Disarankan untuk menjalankan container dengan bendera --read-only untuk 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.

9. Panduan Menjalankan Kontainer (Konteks Lokal)

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:v1

Anatomi 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.

10. CI/CD Security Pipeline (Otomatisasi DevSecOps)

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:

  1. Secret Scanning (Trivy FS): Memblokir pipeline jika terdapat hardcoded credentials (seperti API Key atau sandi) di dalam kode sumber.
  2. Linting & Code Quality: Menggunakan go vet dan staticcheck untuk memastikan kode bebas dari kejanggalan sintaks dan memenuhi standar idiomatis Go yang tangguh.
  3. SAST (GoSec): Menganalisis kelemahan logika keamanan pada kode (misal: SQL Injection, kelemahan kriptografi) tanpa harus mengeksekusi aplikasi.
  4. SCA (Govulncheck): Memeriksa seluruh hierarki pustaka pihak ketiga (dependencies) terhadap database kerentanan (CVE) nasional.
  5. 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.
  6. 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.

11. Secure Observability & Audit Logging

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:

  1. Pencegahan Log Injection (CRLF Attack): Masukan nakal dari pengguna yang berisi karakter newline (\n atau \r) secara otomatis di-escape oleh JSONHandler. Peretas tidak dapat memanipulasi log parser untuk menyuntikkan baris log palsu.
  2. Sanitasi PII (Personally Identifiable Information) Otomatis: Sistem diinjeksi dengan middleware internal ReplaceAttr pada level logger. Setiap key yang terdeteksi sebagai data sensitif (seperti password, token, atau secret) akan secara mutlak disensor menjadi [REDACTED]. Alamat email juga secara dinamis disamarkan (contoh: f***d@example.com) sebelum dicetak ke stdout, mencegah insiden kebocoran data (Data Leak) ke dasbor pemantauan.
  3. Traceability & Status Interception: Setiap HTTP request yang masuk dibekali dengan request_id unik untuk keperluan Distributed Tracing. Karena antarmuka standar Go tidak menyimpan HTTP Status Code, sistem menggunakan pola responseRecorder untuk menyadap dan mencatat status_code serta duration_ms di lapisan middleware paling dalam. Ini memungkinkan visibilitas penuh terhadap serangan volumetrik (seperti Rate Limit / 429 Too Many Requests).

12. Real-time Monitoring Infrastructure (Prometheus & Grafana)

Repositori ini menyertakan infrastruktur pemantauan instan berbasis Docker Compose untuk memvisualisasikan metrik keamanan dan performa aplikasi secara real-time.

Cara Menjalankan Dasbor Pemantauan:

  1. Pastikan API Go sedang berjalan (mendengarkan di port :8443).

  2. Masuk ke direktori observability dan jalankan orkestrasi kontainer:

    cd observability
    docker compose up -d
  3. Buka Grafana di http://localhost:3000 (Kredensial bawaan: admin / admin).

  4. 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.

About

Secure-by-Design IAM & Wallet API in Go — no framework, 3-tier clean architecture, JWT auth, TLS, and a full DevSecOps pipeline (gosec · govulncheck · Trivy · golangci-lint)

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors