# Docker Secrets di Produksi: Hentikan Menaruh API Key di Variabel Lingkungan

> Mengapa variabel lingkungan biasa tidak aman untuk Docker secrets, dan cara menggunakan Docker secrets, manajer secret eksternal, dan file terenkripsi untuk melindungi kredensial dalam produksi.

URL: https://www.matthewswong.com/id/blog/docker-secrets-production/

- Author: Matthews Wong (https://www.matthewswong.com/id/about/)
- Published: 2025-06-10
- Updated: 2026-10-17
- Category: DevOps

Variabel lingkungan di container Docker terlihat dalam teks biasa melalui docker inspect — siapa pun yang memiliki akses ke Docker daemon atau runtime container dapat membaca setiap variabel lingkungan, termasuk kata sandi database, kunci API, dan JWT secret. Studi GitGuardian 2023 menemukan bahwa lebih dari 10 juta secret bocor di GitHub dalam tahun itu saja. Mengaudit konfigurasi Docker awal sering kali menemukan kredensial teks biasa dalam output docker inspect dan log CI/CD, itulah sebabnya manajemen secret layak dirombak secara sengaja.

## Mengapa Variabel Lingkungan Bukan Secret

Meneruskan secret sebagai variabel lingkungan memiliki beberapa vektor eksposur: docker inspect menampilkan semua variabel lingkungan dalam teks biasa, variabel lingkungan terlihat di /proc/1/environ di dalam container, perintah docker run dengan secret muncul di riwayat shell, dan log pipeline CI/CD dapat menangkap nilai variabel lingkungan pada perintah echo atau debug.

### Docker Swarm Secrets

Docker Swarm memiliki mekanisme secret bawaan: docker secret create menyimpan secret yang dienkripsi saat istirahat di log Swarm Raft, hanya dapat diakses oleh layanan yang secara eksplisit memintanya. Secret dipasang sebagai file di /run/secrets/ di dalam container menggunakan filesystem berbasis memori (tmpfs) yang menghilang saat container berhenti.

### Docker Compose Secrets untuk Non-Swarm

Docker Compose juga mendukung secret melalui kunci secrets di docker-compose.yml. Anda mendefinisikan sumber secret (file atau secret Swarm eksternal) dan memasangnya ke layanan tertentu. Untuk pengembangan, gunakan secret berbasis file (file lokal yang tidak ada di git). Untuk produksi, gunakan kata kunci external untuk mereferensikan secret Swarm.

> Dari pengalaman mengamankan deployment NestJS produksi, pendekatan paling pragmatis untuk setup Docker Compose tanpa Swarm adalah Mozilla SOPS dengan enkripsi age. Simpan file secret terenkripsi di repositori git Anda (aman karena terenkripsi), dekripsi ke file .env pada waktu deployment di pipeline CI/CD Anda menggunakan kunci deploy yang disimpan di GitHub Actions secrets atau variabel GitLab CI.

## Pola Secret Berbasis File

Pola secret yang paling berlaku secara universal adalah berbasis file: simpan secret sebagai file dengan izin restriktif (600, dimiliki oleh root atau pengguna service), dan minta aplikasi membaca file secret alih-alih variabel lingkungan. Sebagian besar pustaka klien mendukung ini: Node.js dapat membaca file dengan fs.readFileSync. Simpan file secret di /run/secrets/ (tmpfs) atau /etc/myapp/secrets/.

### BuildKit untuk Secret Waktu Build

Secret waktu build (token registry npm, kredensial paket privat) memerlukan penanganan khusus. Jangan pernah gunakan ARG atau ENV di Dockerfile untuk secret — mereka dipanggang ke lapisan image dan terlihat di docker history. Gunakan mount secret BuildKit Docker: RUN --mount=type=secret,id=npmrc,target=/root/.npmrc npm install.

> **Secret di File Override Docker Compose**

> Saya telah melihat tim menggunakan docker-compose.override.yml untuk secret lokal, git-ignore-nya, lalu secara tidak sengaja melakukan commit ketika entri gitignore dihapus atau file diganti nama. Bahkan satu file secret yang di-commit bisa menjadi kebocoran permanen — riwayat git menyimpannya bahkan setelah penghapusan. Gunakan file secret terpisah yang di-gitignore secara eksplisit, dokumentasikan variabel yang diperlukan dalam file .env.example dengan nilai placeholder.

## Manajer Secret Eksternal

Untuk tim yang lebih besar atau lingkungan yang sensitif terhadap kepatuhan, gunakan manajer secret khusus: HashiCorp Vault (self-hosted, open source, kaya fitur), AWS Secrets Manager (terkelola, terintegrasi dengan ECS dan EKS), GCP Secret Manager (terkelola, terintegrasi dengan Cloud Run dan GKE), atau Infisical (open source, alternatif Vault dengan UX yang lebih baik).

## Stack Secret Produksi Saya

Stack secret produksi yang praktis terlihat seperti ini: SOPS dengan enkripsi age untuk mengenkripsi secret di git (kunci disimpan di password manager dan secret platform CI/CD), Docker Compose secrets untuk injeksi secret runtime (file secret dipasang di /run/secrets/), dan file .env terpisah per lingkungan (dihasilkan oleh dekripsi SOPS di CI/CD, tidak pernah di-commit).

## Mengaudit Eksposur Secret Anda Saat Ini

Sebelum membangun solusi secret yang lebih baik, audit apa yang sudah terekspos. Jalankan docker inspect terhadap container yang berjalan dan grep untuk pola password, secret, key, dan token untuk memeriksa secret di variabel lingkungan. Tinjau file docker-compose.yml Anda untuk secret yang di-hardcode. Periksa riwayat git Anda untuk file .env yang tidak sengaja di-commit.

## Sumber & Bacaan Lanjutan

- GitGuardian — Cara Menangani Secret di Docker
- Docker Docs — Kelola Data Sensitif dengan Docker Secrets
- Wiz — Docker Secrets Dijelaskan Setup Praktik Terbaik dan Contoh

## Source links

- https://blog.gitguardian.com/how-to-handle-secrets-in-docker/
- https://docs.docker.com/engine/swarm/secrets/
- https://www.wiz.io/academy/container-security/docker-secrets

## FAQ

### Mengapa variabel lingkungan dianggap tidak aman untuk menyimpan secret di Docker?

Variabel lingkungan di container Docker terlihat dalam teks biasa melalui docker inspect, sehingga siapa pun yang memiliki akses ke Docker daemon dapat membaca nilai seperti kata sandi database dan kunci API. Nilainya juga terlihat di /proc/1/environ di dalam container dan bisa muncul di log pipeline CI/CD saat perintah echo atau debug dijalankan. Dokumentasi Docker sendiri menyatakan bahwa variabel lingkungan tidak sesuai untuk data sensitif.

### Apa pendekatan secret yang direkomendasikan untuk deployment Docker Compose yang tidak menggunakan Docker Swarm?

Post ini merekomendasikan Mozilla SOPS dengan enkripsi age sebagai pendekatan paling pragmatis untuk setup Docker Compose tanpa Swarm. Anda menyimpan file secret terenkripsi di repositori git, lalu mendekripsinya ke file .env pada waktu deployment menggunakan kunci deploy yang disimpan di GitHub Actions secrets atau variabel GitLab CI. File .env teks biasa hanya ada di memori selama deployment dan tidak pernah ditulis ke disk.

### Bagaimana Docker Swarm secrets melindungi nilai sensitif saat runtime?

Docker Swarm menyimpan secret yang dienkripsi saat istirahat di log Swarm Raft dan memasangnya sebagai file di /run/secrets/ di dalam container menggunakan filesystem berbasis memori (tmpfs). Karena tmpfs menghilang saat container berhenti, secret tidak pernah tersimpan di filesystem container dan tidak pernah terlihat dalam output docker inspect.

### Bagaimana secret waktu build seperti token registry npm harus ditangani di Dockerfile?

Secret waktu build tidak boleh pernah diteruskan melalui instruksi ARG atau ENV di Dockerfile, karena nilai-nilai tersebut dipanggang ke lapisan image dan tetap terlihat di docker history. Sebagai gantinya, gunakan mount secret BuildKit Docker dengan sintaks RUN --mount=type=secret,id=npmrc,target=/root/.npmrc npm install, yang membuat secret hanya tersedia selama satu langkah RUN tersebut dan tidak meninggalkan jejak di lapisan image mana pun.

### Manajer secret eksternal apa yang direkomendasikan post ini untuk tim besar atau lingkungan yang sensitif terhadap kepatuhan?

Post ini mencantumkan HashiCorp Vault (self-hosted, open source, kaya fitur), AWS Secrets Manager (terkelola, terintegrasi dengan ECS dan EKS), GCP Secret Manager (terkelola, terintegrasi dengan Cloud Run dan GKE), dan Infisical (open source, disebut sebagai alternatif Vault dengan UX yang lebih baik). Alat-alat ini menyediakan kontrol akses, audit logging, rotasi otomatis, dan versioning yang tidak bisa ditawarkan oleh pendekatan berbasis file.

---

- HTML version: https://www.matthewswong.com/id/blog/docker-secrets-production/
- English: https://www.matthewswong.com/en/blog/docker-secrets-production/
- Site index for agents: https://www.matthewswong.com/llms.txt
- Sitemap: https://www.matthewswong.com/sitemap.xml
- API description (OpenAPI): https://www.matthewswong.com/openapi.json
