Secret Management

Secret Management #

Ansible Vault adalah titik awal yang bagus untuk mengelola secret. Tapi saat infrastruktur tumbuh, Vault punya keterbatasan: semua orang yang butuh menjalankan playbook harus punya vault password, rotasi secret membutuhkan update file yang di-commit ke Git, dan tidak ada audit trail granular siapa mengakses secret kapan. External secret manager seperti HashiCorp Vault atau AWS Secrets Manager menyelesaikan keterbatasan ini. Artikel ini membahas kapan beralih ke external secret manager dan bagaimana cara mengintegrasikannya dengan Ansible.

Ansible Vault vs External Secret Manager #

Ansible Vault:
  ✓ Built-in, tidak butuh infrastruktur tambahan
  ✓ Cocok untuk tim kecil dan project yang baru mulai
  ✓ Secret terenkripsi di Git — mudah di-backup
  ✗ Semua orang dengan vault password bisa akses SEMUA secret
  ✗ Rotasi secret = update file + commit ke Git
  ✗ Tidak ada audit trail "siapa mengakses secret X kapan"
  ✗ Secret harus di-distribute ke semua CI/CD runner

External Secret Manager:
  ✓ Akses granular per secret, per role, per user
  ✓ Audit trail lengkap
  ✓ Rotasi secret otomatis tanpa perlu update Git
  ✓ Secret tidak pernah tersimpan di Git, bahkan terenkripsi
  ✗ Infrastruktur tambahan yang perlu dikelola
  ✗ Dependency pada availability secret manager
  ✗ Lebih kompleks untuk setup awal

HashiCorp Vault dengan Ansible #

HashiCorp Vault adalah external secret manager yang paling populer di ekosistem on-premise dan hybrid cloud:

# Install koleksi community yang diperlukan
ansible-galaxy collection install community.hashi_vault
pip install hvac    # Library Python untuk HashiCorp Vault
# Ambil secret menggunakan lookup plugin
- name: Setup koneksi database
  hosts: appservers
  tasks:
    - name: Ambil database credentials dari HashiCorp Vault
      set_fact:
        db_credentials: "{{ lookup('community.hashi_vault.hashi_vault',
          'secret=secret/data/myapp/database:data',
          url='https://vault.company.internal:8200',
          auth_method='approle',
          role_id=vault_role_id,
          secret_id=vault_secret_id) }}"
      no_log: true

    - name: Konfigurasi koneksi database
      template:
        src: database.conf.j2
        dest: /etc/app/database.conf
      vars:
        db_host: "{{ db_credentials.host }}"
        db_password: "{{ db_credentials.password }}"
      no_log: true

Autentikasi AppRole adalah metode yang direkomendasikan untuk CI/CD — menggunakan role ID dan secret ID, bukan username/password:

# group_vars/all.yml
vault_url: "https://vault.company.internal:8200"
vault_role_id: "{{ lookup('env', 'VAULT_ROLE_ID') }}"       # Dari environment variable
vault_secret_id: "{{ lookup('env', 'VAULT_SECRET_ID') }}"   # Dari environment variable

AWS Secrets Manager dengan Ansible #

Untuk infrastruktur di AWS, AWS Secrets Manager adalah pilihan yang terintegrasi secara native:

ansible-galaxy collection install amazon.aws
pip install boto3 botocore
- name: Deploy aplikasi dengan credentials dari AWS Secrets Manager
  hosts: appservers
  tasks:
    - name: Ambil RDS credentials dari AWS Secrets Manager
      set_fact:
        rds_secret: "{{ lookup('amazon.aws.aws_secret',
          'prod/myapp/rds',
          region='ap-southeast-1',
          on_missing='error') | from_json }}"
      no_log: true

    - name: Deploy konfigurasi database
      template:
        src: database.conf.j2
        dest: /etc/app/database.conf
      vars:
        db_host: "{{ rds_secret.host }}"
        db_user: "{{ rds_secret.username }}"
        db_password: "{{ rds_secret.password }}"
      no_log: true

Pola: Secret Tersedia Hanya Saat Runtime #

Keuntungan terbesar external secret manager adalah secret tidak pernah disimpan di mana pun dalam playbook — ia diambil saat runtime dan hanya ada di memory:

# Pola yang direkomendasikan: ambil, gunakan, jangan simpan
- name: Jalankan task yang butuh secret
  block:
    - name: Ambil secret dari vault (hanya tersedia dalam block ini)
      set_fact:
        temp_secret: "{{ lookup('community.hashi_vault.hashi_vault', 'secret=...') }}"
      no_log: true

    - name: Gunakan secret untuk konfigurasi
      template:
        src: app.conf.j2
        dest: /etc/app/app.conf
      no_log: true

  always:
    # Hapus variabel setelah digunakan
    - name: Hapus secret dari memory
      set_fact:
        temp_secret: ""
      no_log: true

Lookup Plugin Lainnya #

Ansible menyediakan beberapa lookup plugin bawaan yang berguna untuk secret management sederhana:

# Ambil nilai dari environment variable di control node
- name: Gunakan API key dari environment variable
  command: curl -H "Authorization: Bearer {{ lookup('env', 'API_TOKEN') }}" https://api.example.com
  no_log: true

# Baca konten file (misalnya SSH public key)
- name: Distribusikan SSH key
  authorized_key:
    user: deployer
    key: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}"

# Baca file terenkripsi dengan password
- name: Baca certificate content
  set_fact:
    ssl_cert_content: "{{ lookup('file', 'files/app.crt') }}"

Ringkasan #

  • Ansible Vault cocok untuk tim kecil dan project yang baru mulai — simple dan tidak butuh infrastruktur tambahan.
  • External secret manager (HashiCorp Vault, AWS Secrets Manager) lebih tepat untuk produksi yang matang — akses granular, audit trail, dan rotasi otomatis.
  • Gunakan AppRole authentication untuk integrasi CI/CD dengan HashiCorp Vault — lebih aman dari menggunakan root token.
  • Selalu gunakan no_log: true pada task yang mengambil atau menggunakan secret — mencegah secret muncul di log.
  • Secret tidak boleh tersimpan di file atau log — ambil saat runtime, gunakan, hapus dari memory jika memungkinkan.
  • Pertimbangkan beralih ke external secret manager saat: tim > 5 orang, butuh audit trail, atau butuh rotasi secret otomatis.

← Sebelumnya: Workflow   Berikutnya: SSH Security →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact