Ganti kredensial statis yang berisiko dengan OpenID Connect, autentikasi passwordless berbasis token berumur pendek untuk AWS, GCP, dan Azure, sekaligus menerapkan prinsip least privilege.

Di episode 11 kita mengamankan controller: mematikan akses anonim, memilih skema autentikasi, dan menerapkan RBAC. Namun ada satu celah keamanan yang sering luput: kredensial cloud statis.
Banyak tim menyimpan AWS Access Key, GCP Service Account Key, atau Azure Client Secret secara permanen di Jenkins Credentials. Kredensial semacam itu ibarat master key — berlaku selamanya, tidak pernah berubah, dan begitu bocor, siapa pun bisa menguasai seluruh resource cloud. Risikonya nyata: bot peretas memindai repository dan file publik dalam hitungan menit, dan begitu sebuah key terpublikasi, dampaknya bisa meluas ke lingkungan produksi.
Solusi modernnya adalah OpenID Connect (OIDC). Konsepnya sederhana: Jenkins tidak lagi menyimpan kredensial statis, melainkan meminta token berumur pendek setiap build berjalan, lalu menukarnya dengan kredensial sementara di cloud. Di episode ini kita akan memahami alurnya, mengapa ia lebih aman, dan bagaimana menerapkannya di AWS, GCP, serta Azure.
Simpan kredensial statis di Jenkins berarti memikul tiga beban sekaligus:
Warning
Jangan menulis access key statis langsung di dalam Jenkinsfile atau parameter pipeline. Jika terlanjur tersimpan di Jenkins Credentials, rencanakan migrasi ke OIDC dan segera rotasi key-nya.
OIDC dibangun di atas protokol OAuth 2.0 dan memperkenalkan ID Token — sebuah JSON Web Token (JWT) yang berisi klaim seperti issuer, audience, dan subject. Sifat-sifat kunci yang membuatnya cocok untuk CI/CD:
Jenkins bertindak sebagai OIDC Provider: saat build berjalan, Jenkins menerbitkan ID Token, lalu cloud provider memverifikasi tanda tangan token lewat endpoint JWKS milik Jenkins dan menukarnya menjadi kredensial sementara. Analoginya seperti boarding pass pesawat: berlaku sekali, berisi tujuan spesifik, dan kadaluarsa setelah penerbangan — berbeda dengan kunci ruangan yang berlaku selamanya.
Di AWS, pertukaran ini memakai STS AssumeRoleWithWebIdentity. Alurnya:
withOIDC untuk meminta ID token.Contoh trust policy role tersebut:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::123456789012:oidc-provider/jenkins.example.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"jenkins.example.com:aud": "aws-deploy",
"jenkins.example.com:sub": "repo:my-org/my-app:environment:prod"
}
}
}
]
}Setelah role siap, pipeline cukup meminta token dan menjalankan AWS CLI di dalamnya:
pipeline {
agent { label 'linux-runner' }
stages {
stage('Deploy ke AWS Tanpa Password') {
steps {
withOIDC(id: 'aws-deploy', provider: 'aws-oidc') {
sh 'aws sts get-caller-identity'
sh 'aws s3 sync ./dist s3://my-app-bucket --delete'
}
}
}
}
}Tip
Nilai audience di pipeline harus sama persis dengan audience pada trust policy. Batasi juga klaim subject per repository dan environment agar token dari job lain tidak bisa menyalahgunakan role yang sama.
Di Google Cloud Platform, konsep serupa bernama Workload Identity Federation. Kalian membuat workload identity pool beserta provider OIDC yang menunjuk ke issuer Jenkins, lalu mengimpersonate sebuah service account. Buat pool dan provider-nya dengan gcloud:
gcloud iam workload-identity-pools create jenkins-pool \
--location=global --display-name="Jenkins Pool"
gcloud iam workload-identity-pools providers create-oidc jenkins-provider \
--location=global --workload-identity-pool=jenkins-pool \
--issuer-uri="https://jenkins.example.com" \
--attribute-mapping="google.subject=assertion.sub"Di Microsoft Azure, gunakan federated identity credentials pada App Registration atau Managed Identity. Setiap federated credential mendefinisikan issuer, subject, dan audience yang harus dipenuhi token dari Jenkins:
az identity federated-credential create \
--name jenkins-cred \
--identity-name my-app-id \
--resource-group rg-prod \
--issuer "https://jenkins.example.com" \
--subject "repo:my-org/my-app:environment:prod" \
--audiences "azure-deploy"Mari bandingkan pendekatan lama dan baru secara langsung:
| Aspek | Static Credentials | OIDC |
|---|---|---|
| Masa hidup kredensial | Permanen sampai dirotasi manual | Beberapa menit per build |
| Dampak jika bocor | Akses penuh tanpa batas waktu | Token cepat kadaluarsa |
| Rotasi | Manual, rawan terlupa | Otomatis setiap build |
| Cakupan akses | Sulit dilacak per job | Bisa dibatasi per subject & audience |
| Operasional | Backup key, file service account | Tidak ada rahasia cloud tersimpan |
Dengan OIDC, prinsip least privilege berlaku secara alami: setiap job meminta role terendah yang cukup untuk tugasnya, token hanya valid untuk konteks spesifik, dan tidak ada kredensial permanen yang bisa dicuri dan dipakai berulang kali.
Important
OIDC mengurangi risiko kebocoran key tetapi tidak menghilangkan kebutuhan otorisasi. Tetap batasi permission role-nya sekecil mungkin dan pisahkan role untuk staging serta production.
Pada episode 12 ini kalian telah memahami mengapa kredensial statis berbahaya bagi pipeline, cara kerja OIDC dengan ID Token berumur pendek, dan bagaimana Jenkins bertindak sebagai OIDC provider yang bertukar token dengan AWS via STS AssumeRoleWithWebIdentity, GCP via Workload Identity, serta Azure via federated identity credentials. Kalian juga melihat bagaimana pendekatan ini menerapkan least privilege secara alami.
Menariknya, hampir semua konfigurasi yang kita lakukan manual lewat UI selama ini — termasuk pengaturan keamanan, RBAC, dan kredensial — sebenarnya bisa ditulis sebagai kode.
Di episode 13 berikutnya kita akan membahas Jenkins Configuration as Code (JCasC): mengelola seluruh controller lewat file jenkins.yaml dan menciptakan Jenkins yang identik dalam hitungan detik. Sampai jumpa!