AizuDemy

Tutorial SPIFFE SPIRE: Amankan Identitas Microservices Server dengan mTLS dan Zero Trust

Tutorial SPIFFE SPIRE: Amankan Identitas Microservices Server dengan mTLS dan Zero Trust
๐ŸŽง
Dengarkan Artikel Ini
Suara AI Otomatis โ€ข 8 mnt baca baca
โšก TL;DR

Poin Kunci Artikel Ini:

  • Jaringan internal dianggap tidak aman.
  • Implementasi mTLS Microservices Menggunakan Go SDKKini integrasikan pustaka resmi ke dalam kode Go.
  • Klien menyajikan SVID miliknya dan mengonfirmasi bahwa SPIFFE ID milik server sesuai dengan entri target.6.
๐Ÿ“‹ Daftar Isi Materi Tutup โ–ด

1. Kebocoran Credential: Masalah Utama Komunikasi Antarlayanan

Pengembangan arsitektur microservices menghadirkan tantangan teknis mendasar terkait autentikasi dan otorisasi antarlayanan. Pada infrastruktur tradisional, komunikasi antar Node atau Pod diproteksi menggunakan sertifikat TLS statis, API key, atau token autentikasi yang disimpan langsung di file konfigurasi, environment variable, maupun rahasia terenkripsi yang akhirnya ditulis ke disk.

Pendekatan statis ini menciptakan celah keamanan signifikan dalam lanskap infrastruktur modern:

  • Secret Sprawl: Kredensial rahasia tersebar di repositori Git, pipeline CI/CD, manifes Kubernetes, dan sistem berkas server. Penumpukan kredensial meningkatkan attack surface secara drastis.
  • Kunci Berumur Panjang (Long-Lived Credentials): Sertifikat X.509 dan token autentikasi jarang dirotasi karena risiko kegagalan layanan saat rotasi manual. Kredensial yang aktif berbulan-bulan memberikan waktu yang cukup bagi penyerang untuk mengeksploitasi kebocoran token.
  • Kebocoran Akses dan Pemalsuan Identitas: Apabila sebuah instance microservice diretas, penyerang dapat mengambil private key yang tersimpan di disk. Private key ini dapat digunakan untuk menyamar sebagai layanan sah dan mengakses layanan backend kritis lainnya.
  • Perbatasan Jaringan yang Kabur: Penggunaan perimeter security berbasis IP address atau Firewall tidak lagi memadai pada lingkungan dinamis seperti Kubernetes atau multi-cloud, di mana IP Pod dan VM berubah secara instan.

Arsitektur Zero Trust Architecture (ZTA) mengadopsi prinsip Never Trust, Always Verify. Jaringan internal dianggap tidak aman. Setiap permintaan antar microservices wajib diproteksi dengan verifikasi identitas kriptografis berbasis runtime secara real-time.

Untuk menyelesaikan tantangan ini, Cloud Native Computing Foundation (CNCF) menghadirkan SPIFFE (Secure Production Identity Framework for Everyone) dan SPIRE (SPIFFE Runtime Environment).

  • SPIFFE: Standar terbuka yang mendefinisikan skema identitas universal berupa URI spesifik (disebut SPIFFE ID) dan format dokumen identitas terverifikasi (X.509 SVID dan JWT SVID).
  • SPIRE: Perangkat lunak open-source mengimplementasikan standar SPIFFE yang bertindak sebagai Certificate Authority (CA) dinamis untuk mendistribusikan identitas ke workload secara otomatis tanpa intervensi manusia dan tanpa menyimpan private key di disk.

2. Konsep Dasar SPIFFE dan Arsitektur Komponen SPIRE

SPIRE beroperasi dengan arsitektur terdistribusi yang terdiri dari dua komponen utama: SPIRE Server dan SPIRE Agent.

SPIRE Server

SPIRE Server bertanggung jawab mengelola otorisasi identitas, menyimpan aturan registrasi (registration entries), memverifikasi keabsahan SPIRE Agent melalui proses Node Attestation, dan menerbitkan sertifikat X.509 SVID sebagai root atau intermediate CA.

SPIRE Agent

SPIRE Agent berjalan sebagai daemon di setiap node (VPS atau Worker Node Kubernetes). Agent melakukan Workload Attestation untuk memverifikasi entitas proses aplikasi yang berjalan di node tersebut (berdasarkan UNIX UID, GID, process path, namespace, atau ServiceAccount). Setelah proses terverifikasi, Agent menyediakan UNIX Domain Socket lokal yang digunakan oleh aplikasi untuk mengambil sertifikat SVID secara langsung ke memori (in-memory execution).

Dengan mekanisme ini, aplikasi tidak lagi membaca file sertifikat dari disk. Private key dibuat secara acak di memori runtime, dan rotasi sertifikat dilakukan secara otomatis setiap beberapa menit oleh SPIRE Agent tanpa perlu me-restart aplikasi microservice.

3. Panduan Instalasi SPIRE Server dan Agent di VPS Linux

Berikut adalah langkah-langkah praktis melakukan instalasi dan konfigurasi SPIRE pada sistem operasi Ubuntu 22.04 LTS.

Langkah 1: Unduh dan Ekstrak Biner SPIRE

Unduh rilis resmi SPIRE dari repositori GitHub dan pindahkan biner eksekutabel ke direktori sistem:

wget https://github.com/spiffe/spire/releases/download/v1.8.7/spire-1.8.7-linux-amd64-musl.tar.gz
tar -zxvf spire-1.8.7-linux-amd64-musl.tar.gz
cd spire-1.8.7
sudo cp bin/spire-server bin/spire-agent /usr/local/bin/

Langkah 2: Konfigurasi SPIRE Server

Buat direktori konfigurasi dan direktori data untuk SPIRE Server:

sudo mkdir -p /etc/spire/server /var/lib/spire/server/data

Buat file konfigurasi /etc/spire/server/server.conf dengan isi berikut:

server {
    bind_address = "127.0.0.1"
    bind_port = "8081"
    trust_domain = "example.org"
    data_dir = "/var/lib/spire/server/data"
    log_level = "INFO"
    ca_ttl = "24h"
    default_x509_svid_ttl = "1h"
}

plugins {
    DataStore "sql" {
        plugin_data {
            database_type = "sqlite3"
            connection_string = "/var/lib/spire/server/data/datastore.sqlite3"
        }
    }

    NodeAttestor "join_token" {
        plugin_data {}
    }

    KeyManager "disk" {
        plugin_data {
            keys_path = "/var/lib/spire/server/data/keys.json"
        }
    }
}

Langkah 3: Konfigurasi SPIRE Agent

Buat direktori konfigurasi dan soket untuk SPIRE Agent:

sudo mkdir -p /etc/spire/agent /var/run/spire/sockets

Buat file konfigurasi /etc/spire/agent/agent.conf:

agent {
    data_dir = "/var/lib/spire/agent"
    log_level = "INFO"
    server_address = "127.0.0.1"
    server_port = "8081"
    socket_path = "/tmp/spire-agent/public/api.sock"
    trust_domain = "example.org"
}

plugins {
    NodeAttestor "join_token" {
        plugin_data {}
    }

    KeyManager "memory" {
        plugin_data {}
    }

    WorkloadAttestor "unix" {
        plugin_data {}
    }
}

Langkah 4: Jalankan SPIRE Server dan Agent

Jalankan SPIRE Server di latar belakang (background process):

sudo spire-server run -config /etc/spire/server/server.conf &

Buat Join Token untuk proses Node Attestation Agent ke Server:

JOIN_TOKEN=$(sudo spire-server token generate -spiffeID spiffe://example.org/spire/agent/join_token -ttl 600 | awk '{print $2}')
echo "Join Token: $JOIN_TOKEN"

Jalankan SPIRE Agent menggunakan Join Token yang telah dibuat:

sudo mkdir -p /tmp/spire-agent/public
sudo spire-agent run -config /etc/spire/agent/agent.conf -joinToken "$JOIN_TOKEN" &

4. Registrasi Identitas Workload (Workload Registration Entries)

Setelah SPIRE Server dan Agent terhubung, tentukan identitas kriptografis (SPIFFE ID) yang akan diberikan ke aplikasi microservice berdasarkan atribut dari sistem operasi (Unix Attestation).

Sebagai contoh, buat aturan registrasi untuk dua aplikasi: payment-service dan order-service.

sudo spire-server entry create \
    -spiffeID spiffe://example.org/ns/default/sa/payment-service \
    -parentID spiffe://example.org/spire/agent/join_token \
    -selector unix:user:ubuntu \
    -selector unix:path:/usr/local/bin/payment-service

sudo spire-server entry create \
    -spiffeID spiffe://example.org/ns/default/sa/order-service \
    -parentID spiffe://example.org/spire/agent/join_token \
    -selector unix:user:ubuntu \
    -selector unix:path:/usr/local/bin/order-service

Penjelasan atribut selector:

  • -spiffeID: Format unik identitas standar SPIFFE yang disematkan ke sertifikat X.509 SVID.
  • -parentID: Identitas agent pengelola node tempat workload berjalan.
  • -selector unix:user: Memverifikasi bahwa proses dijalankan oleh pengguna OS tertentu.
  • -selector unix:path: Memverifikasi jalur biner terintegrasi dari proses yang dieksekusi.

5. Implementasi mTLS Microservices Menggunakan Go SDK

Kini integrasikan pustaka resmi github.com/spiffe/go-spiffe/v2 ke dalam kode Go. Aplikasi akan berkomunikasi langsung dengan SPIRE Agent melalui Workload API UNIX Socket untuk memperoleh sertifikat X.509 secara dinamis.

Server Implementation (payment-service/main.go)

Layanan server mendengarkan koneksi mTLS incoming dan memverifikasi bahwa klien yang menghubunginya memiliki SPIFFE ID yang valid (misalnya order-service).

package main

import (
	"context"
	"fmt"
	"net/http"
	"os"

	"github.com/spiffe/go-spiffe/v2/spiffeid"
	"github.com/spiffe/go-spiffe/v2/spiffetls/tlsconfig"
	"github.com/spiffe/go-spiffe/v2/workloadapi"
)

const socketPath = "unix:///tmp/spire-agent/public/api.sock"

func main() {
	ctx := context.Background()

	source, err := workloadapi.NewX509Source(ctx, workloadapi.WithClientOptions(workloadapi.WithAddr(socketPath)))
	if err != nil {
		fmt.Printf("Gagal terhubung ke SPIRE Workload API: %v\n", err)
		os.Exit(1)
	}
	defer source.Close()

	tlsConfig := tlsconfig.MTLSServerConfig(source, source, tlsconfig.AuthorizeID(
		spiffeid.RequireFromString("spiffe://example.org/ns/default/sa/order-service"),
	))

	server := &http.Server{
		Addr:      ":8443",
		TLSConfig: tlsConfig,
		Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			fmt.Fprintf(w, "Otentikasi Sukses! Komunikasi terenkripsi mTLS via SPIFFE SVID.")
		}),
	}

	fmt.Println("Payment Service berjalan pada port :8443 dengan mTLS...")
	if err := server.ListenAndServeTLS("", ""); err != nil {
		fmt.Printf("Server error: %v\n", err)
	}
}

Client Implementation (order-service/main.go)

Layanan klien melakukan inisiasi koneksi mTLS ke server. Klien menyajikan SVID miliknya dan mengonfirmasi bahwa SPIFFE ID milik server sesuai dengan entri target.

package main

import (
	"context"
	"fmt"
	"io"
	"net/http"
	"os"

	"github.com/spiffe/go-spiffe/v2/spiffeid"
	"github.com/spiffe/go-spiffe/v2/spiffetls/tlsconfig"
	"github.com/spiffe/go-spiffe/v2/workloadapi"
)

const socketPath = "unix:///tmp/spire-agent/public/api.sock"

func main() {
	ctx := context.Background()

	source, err := workloadapi.NewX509Source(ctx, workloadapi.WithClientOptions(workloadapi.WithAddr(socketPath)))
	if err != nil {
		fmt.Printf("Gagal terhubung ke SPIRE Agent: %v\n", err)
		os.Exit(1)
	}
	defer source.Close()

	authorizer := tlsconfig.AuthorizeID(spiffeid.RequireFromString("spiffe://example.org/ns/default/sa/payment-service"))
	tlsConfig := tlsconfig.MTLSClientConfig(source, source, authorizer)

	client := &http.Client{
		Transport: &http.Transport{
			TLSClientConfig: tlsConfig,
		},
	}

	resp, err := client.Get("https://localhost:8443")
	if err != nil {
		fmt.Printf("Gagal melakukan panggilan mTLS: %v\n", err)
		os.Exit(1)
	}
	defer resp.Body.Close()

	body, _ := io.ReadAll(resp.Body)
	fmt.Printf("Respon dari Server: %s\n", string(body))
}

6. Analisis Keamanan dan Keuntungan Operasional

Pengadopsian SPIFFE/SPIRE dalam arsitektur microservices memberikan peningkatan postur keamanan yang signifikan dibandingkan metode manajemen rahasia konvensional:

Fitur KeamananMetode Konvensional (Static Certs)Metode SPIFFE / SPIRE
Penyimpanan Private KeyTersimpan pada sistem berkas (disk) atau environment variable.Hanya berada di memori (in-memory execution). Kunci tidak pernah disentuh oleh disk.
Masa Berlaku KredensialBerumur panjang (3 bulan - 1 tahun).Berumur pendek (Short-lived, misal: 1 jam), memperkecil jendela eksploitasi.
Proses RotasiManual, rentan kesalahan manusia dan sering membutuhkan restart aplikasi.Otomatis dan seamless di latar belakang tanpa me-restart aplikasi.
Verifikasi IdentitasBerbasis alamat IP atau domain DNS yang mudah dipalsukan.Berbasis atribut runtime kriptografis (attestation) yang diverifikasi oleh SPIRE Agent.

7. Kesimpulan

Implementasi Zero Trust Architecture pada tingkat komunikasi microservices Go menggunakan SPIFFE dan SPIRE mengeliminasi bahaya laten kebocoran kredensial statis. Dengan menyalurkan X.509 SVID langsung ke memori runtime melalui UNIX Domain Socket, pengembang tidak perlu lagi mengelola rotasi sertifikat manual atau menyimpan file rahasia di dalam repositori dan disk server. Komunikasi mTLS terenkripsi dengan otorisasi berbasis SPIFFE ID memberikan fondasi keamanan yang tangguh, fleksibel, dan terstandarisasi untuk infrastruktur cloud-native modern.

๐Ÿ“– Artikel Terkait