Management Secret Key dengan Vault dan Consul

Post image

Ketika kita mengembangkan aplikasi, salah satu tantangan utama yang sering dihadapi adalah mengelola berbagai konfigurasi, seperti informasi database, API key, dan secret key lainnya. Biasanya, konfigurasi-konfigurasi ini diletakkan dalam file khusus seperti .env. Namun, metode ini memiliki keterbatasan, terutama ketika aplikasi mengalami perubahan konfigurasi. Kita perlu mengupdate file .env, mendeploy ulang aplikasi, dan bagi aplikasi mobile, harus merilisnya kembali ke Play Store atau App Store, yang mengharuskan pengguna untuk mengunduh ulang versi terbaru.

Proses ini tentu sangat tidak efisien dan merepotkan.

Namun, bayangkan jika konfigurasi tersebut disimpan di dalam sebuah layanan yang terpisah. Dengan cara ini, ketika ada perubahan, kita hanya perlu mengupdate layanan tersebut tanpa perlu memperbarui aplikasi secara langsung. Salah satu solusi yang bisa digunakan adalah dengan memanfaatkan Consul dan Vault.

Apa itu Consul dan Vault?

Consul merupakan sebuah alat yang memiliki fitur penyimpanan key-value yang bisa kita manfaatkan untuk menyimpan konfigurasi. Namun, untuk menangani secret key yang lebih sensitif, Vault memberikan fitur keamanan tambahan dengan mengenkripsi data sebelum menyimpannya. Jadi, kombinasi Consul dan Vault memungkinkan kita menyimpan konfigurasi dengan aman dan mudah diakses.

Fitur Vault dan Consul

Menurut Consul vs Vault, “Consul dikategorikan sebagai alat Open Source Service Discovery, sementara Vault masuk dalam kategori Secrets Management.” Oleh karena itu, untuk keamanan yang lebih baik, kita perlu menggabungkan Vault dengan Consul agar secret key tersimpan dengan aman.

Persiapan

Pada artikel ini, kita akan membahas beberapa langkah teknis berikut:

  1. Setup Vault
  2. Setup Consul
  3. Integrasi Vault dengan Consul
  4. Pengujian Vault

Seluruh konfigurasi yang akan digunakan berbasis Docker dan docker-compose. Jika belum familiar dengan Docker, ada baiknya mempelajarinya terlebih dahulu. Namun, tidak perlu khawatir karena seluruh konfigurasi sudah siap pakai dan dapat dijalankan dengan mudah.

Struktur Project

Struktur proyek yang akan kita bangun adalah sebagai berikut:

.
├── consul
│   ├── config
│   │   └── consul-config.json
│   └── Dockerfile
├── docker-compose.yml
└── vault
    ├── config
    │   └── vault-config.json
    ├── Dockerfile
    ├── logs
    └── policies

Setup Vault

Langkah pertama adalah membuat Dockerfile untuk Vault di folder vault dengan kode berikut:

FROM alpine:3.11
ENV VAULT_VERSION 1.4.1

RUN mkdir -p /vault
RUN apk --no-cache add bash ca-certificates wget
RUN wget --quiet --output-document=/tmp/vault.zip https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_linux_amd64.zip && \
  unzip /tmp/vault.zip -d /vault && \
  rm -f /tmp/vault.zip && \
  chmod +x /vault

ENV PATH="PATH=$PATH:$PWD/vault"
COPY ./config/vault-config.json /vault/config/vault-config.json

EXPOSE 8200
ENTRYPOINT ["vault"]

Selanjutnya, buat konfigurasi Vault dalam vault/config/vault-config.json:

{
  "storage": {
    "consul": {
      "address": "consul:8500",
      "path": "vault/"
    }
  },
  "listener": {
    "tcp": {
      "address": "0.0.0.0:8200",
      "tls_disable": 1
    }
  },
  "ui": true
}

Konfigurasi ini menyimpan data Vault di alamat Consul.

Setup Consul

Selanjutnya, kita setup Consul dengan membuat file consul/Dockerfile:

FROM alpine:3.11
ENV CONSUL_VERSION 1.7.3

RUN mkdir /consul
RUN apk --no-cache add bash ca-certificates wget
RUN wget --quiet --output-document=/tmp/consul.zip https://releases.hashicorp.com/consul/${CONSUL_VERSION}/consul_${CONSUL_VERSION}_linux_amd64.zip && \
  unzip /tmp/consul.zip -d /consul && \
  rm -f /tmp/consul.zip && \
  chmod +x /consul/consul

ENV PATH="PATH=$PATH:$PWD/consul"
COPY ./config/consul-config.json /consul/config/config.json

EXPOSE 8300 8400 8500 8600
ENTRYPOINT ["consul"]

Lalu tambahkan konfigurasi dalam consul/config/consul-config.json:

{
  "datacenter": "localhost",
  "data_dir": "/consul/data",
  "log_level": "DEBUG",
  "server": true,
  "ui": true,
  "ports": {
    "dns": 53
  }
}

Integrasi Vault dan Consul

Setelah selesai dengan setup Vault dan Consul, kita akan mengintegrasikannya melalui docker-compose. Berikut adalah konfigurasi di docker-compose.yml:

version: '3.7'
services:
  vault:
    build: ./vault
    ports:
      - 8200:8200
    volumes:
      - ./vault/config:/vault/config
    depends_on:
      - consul

  consul:
    build: ./consul
    ports:
      - 8500:8500

Untuk menjalankan semua service, cukup gunakan perintah:

docker-compose up --build

Testing Vault

Setelah semuanya berjalan, kita dapat menguji penyimpanan dan pengambilan secret key menggunakan perintah berikut di terminal:

curl --header "X-Vault-Token: <your-token>" --request GET http://127.0.0.1:8200/v1/kv/db-config

Anda akan mendapatkan respons berisi konfigurasi yang telah disimpan di Vault. Dengan metode ini, integrasi Vault dan Consul memudahkan pengelolaan secret key dengan aman dan fleksibel.

Kesimpulan

Dengan menggunakan Vault dan Consul, kita dapat mengelola secret key dengan aman dan efisien. Kita tidak perlu khawatir tentang kebocoran data karena Vault akan mengenkripsi data sebelum disimpan di Consul. Selain itu, dengan menggunakan Docker, kita dapat dengan mudah membuat dan menjalankan layanan ini di lingkungan pengembangan maupun produksi.

Saya sediakan pula repository lengkapnya di github:

icon-software
secret-store

Saefulloh Maslul

github-icon

Storing secret key with vault and consul

comments powered by Disqus

You May Also Like