DEV Community

Cover image for Building a Zero-Trust Golang Backend (Part 1): Secure Coding & Distroless Containers 🛡️📦
Mohammad Anang
Mohammad Anang

Posted on

Building a Zero-Trust Golang Backend (Part 1): Secure Coding & Distroless Containers 🛡️📦

Keamanan seringkali dianaktirikan demi kecepatan rilis. Dalam seri tutorial 3 bagian ini, kita akan membalik paradigma tersebut. Kita akan membangun Secure Doc API, sebuah layanan backend Golang yang dirancang dengan arsitektur Zero-Trust menggunakan ekosistem Google Cloud Platform (GCP).

Anda dapat melihat kode sumber lengkap proyek ini di repositori GitHub saya:
👉 mohammadanang/secure-doc-api

Pada Bagian 1 ini, kita akan fokus pada level aplikasi: menulis kode Go 1.24 yang siap produksi dan membungkusnya dalam container yang memiliki permukaan serangan (attack surface) nyaris nol.

  1. Graceful Shutdown di Golang

Aplikasi Cloud-Native harus siap dimatikan kapan saja oleh Kubernetes (misalnya saat proses scaling). Oleh karena itu, kita tidak bisa hanya menggunakan http.ListenAndServe. Kita perlu menangkap sinyal interupsi OS dan memastikan semua request yang sedang berjalan diselesaikan terlebih dahulu.


// cmd/server/main.go (Cuplikan)
// ... setup mux dan server ...

go func() {
    log.Println("Starting secure server on port 8080...")
    if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("Server failed to start: %v\n", err)
    }
}()

// Menunggu sinyal OS
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit

// Graceful shutdown dengan timeout 5 detik
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
server.Shutdown(ctx)

Enter fullscreen mode Exit fullscreen mode
  1. The Art of Distroless Containers

Banyak developer masih men-deploy aplikasi menggunakan image seperti alpine atau debian. Masalahnya, image ini membawa shell (/bin/sh). Jika hacker menembus aplikasi, mereka memiliki tools untuk mengeksekusi malware.
Kita akan menggunakan teknik Multi-stage build yang diakhiri dengan Google Distroless Image.


# Stage 1: Builder (Go 1.24)
FROM golang:1.24-alpine AS builder
WORKDIR /app
COPY . .
# Build binary statis
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o secure-api ./cmd/server/main.go

# Stage 2: Final (Distroless)
FROM gcr.io/distroless/static:nonroot
WORKDIR /
COPY --from=builder /app/secure-api .

# Paksa berjalan sebagai user non-root (ID 65532)
USER 65532:65532
EXPOSE 8080
ENTRYPOINT ["/secure-api"]

Enter fullscreen mode Exit fullscreen mode

Hasilnya adalah image Docker berukuran sangat kecil (~20MB) yang tidak memiliki shell sama sekali.
Di Bagian 2, kita akan membangun pipeline CI/CD di Google Cloud Build untuk mengotomatiskan security scan (SAST) dan mendiskusikan masalah Dependency Drift. Sampai jumpa di artikel selanjutnya!

Top comments (0)