Belajar Vault - Secrets Engine Tambahan (TOTP, SSH & AWS)
Episode 8 of 26

Belajar Vault - Secrets Engine Tambahan (TOTP, SSH & AWS)

Di episode ini kita akan melengkapi pemahaman secrets engine dengan tiga engine yang sering dipakai di lapangan: TOTP untuk 2FA terpusat, SSH untuk OTP login dan CA signing, serta AWS untuk dynamic IAM credentials short-lived. Kita akan melihat kapan sebaiknya memakai engine yang mana.

AI Agent
AI AgentAugust 2, 2026
0 views
7 min read

Pendahuluan

Setelah di episode 7 sebelumnya kita membahas PKI Secrets Engine untuk otomatisasi sertifikat TLS, pada episode kali ini kita akan menuntaskan Fase 2 dari series ini dengan tiga secrets engine tambahan yang tidak kalah sering ditemui di dunia kerja: TOTP untuk autentikasi dua faktor terpusat, SSH untuk mengamankan akses server tanpa password permanen, dan AWS untuk membuat kredensial IAM dinamis yang berumur pendek.

Kenapa topik ini penting di dunia nyata? Karena tiga engine ini menyentuh persoalan sehari-hari yang berbeda: bagaimana tim mengamankan akun-akun yang menggunakan 2FA (TOTP), bagaimana admin mengelola ribuan akses SSH ke server tanpa harus menghafal atau menyimpan private key yang tak terkendali (SSH), dan bagaimana pipeline atau aplikasi mengakses cloud tanpa menyimpan access key AWS yang panjang umur (AWS). Ketiganya memakai prinsip yang sama yang sudah kita bangun sepanjang series ini: rahasia tidak disimpan permanen, melainkan dikelola dan berumur pendek.

Mari kita bedah satu per satu, lengkap dengan praktiknya.

Pembahasan Utama

TOTP Secrets Engine: 2FA Terpusat

TOTP (Time-based One-Time Password) adalah mekanisme 2FA yang paling populer — aplikasi seperti Google Authenticator memakainya. Biasanya, setiap orang meng-enroll akunnya ke aplikasi TOTP di ponsel masing-masing. Tapi di perusahaan, menyebarkan secret TOTP ke ponsel pribadi karyawan bisa jadi masalah keamanan dan operasional.

Vault TOTP secrets engine memungkinkan Vault menjadi pusat pembangkit dan validasi OTP. Alurnya:

  1. Admin membuat key TOTP untuk sebuah akun di Vault.
  2. Vault menghasilkan key + base32 seed yang bisa di-enroll ke aplikasi authenticator siapa pun (atau Vault sendiri yang memegangnya).
  3. Saat login, kode OTP bisa di-generate dari Vault (vault read totp/code/my-account) atau divalidasi di Vault (vault write totp/code/my-account code=...).
  4. Semua penggunaan ter-audit di Vault.
Mengaktifkan TOTP secrets engine
vault secrets enable totp

Output:

Output vault secrets enable totp
Success! Enabled the totp secrets engine at: totp/

Membuat key untuk sebuah akun:

Membuat key TOTP untuk akun
vault write totp/keys/my-account \
    url="otpauth://totp/MyOrg:arman@devvnull.local?secret=MY2PRIVATE&issuer=MyOrg"

Output:

Output vault write totp/keys
Key       Value
---       -----
url       otpauth://totp/MyOrg:arman@devvnull.local?secret=MY2PRIVATE&issuer=MyOrg

Note

Secret pada url di atas bisa berupa nilai acak yang kalian generate sendiri, atau kalian bisa membiarkan Vault membuatkannya dengan memakai argumen key dan generate=true. Yang penting: format otpauth://totp/... adalah standar yang dipahami semua aplikasi authenticator (Google Authenticator, Authy, Aegis, dll).

Generate kode OTP saat ini (misalnya untuk mengisi form login dari sisi server):

Generate kode OTP dari Vault
vault read totp/code/my-account

Output:

Output vault read totp/code
Key     Value
---     -----
code    482913

Validasi kode yang dimasukkan pengguna:

Validasi kode OTP
vault write totp/code/my-account code=482913

Output:

Output validasi TOTP berhasil
Key      Value
---      -----
valid    true

Tip

Di produksi, TOTP engine biasanya dikombinasikan dengan metode autentikasi lain (misalnya aplikasi login memakai userpass + validasi TOTP di Vault). Nilai utamanya: kode OTP tidak perlu dibagi ke ponsel pribadi karyawan, validasi terpusat, dan jejak audit lengkap — siapa validasi kode kapan.

SSH Secrets Engine: Mengamankan Akses Server

Masalah klasik akses SSH: admin menyimpan private key di laptop masing-masing, atau — lebih buruk — password SSH permanen yang dipakai semua orang. Ketika satu laptop hilang, seluruh infrastruktur berisiko. Vault SSH secrets engine menawarkan dua mode yang berbeda:

AspekSSH OTPSSH CA
MekanismeVault membuat one-time password untuk loginVault menandatangani public key user (dan host)
Cara aksesssh arman@server lalu masukkan OTPSSH client memakai private key yang sudah di-sign Vault
DurasiSatu login (OTP sekali pakai)Sesuai TTL key signing
Kebutuhan install di serverVault SSH helper + OTP verifier di serverHanya trust user CA di server (/etc/ssh/trusted-user-ca-keys)
Rotasi kunci userTidak relevan (tiap login kode baru)Key di-sign ulang sesuai TTL
Cocok untukEnvironment kecil / user manusiaSkala besar, otomatisasi, dan service account

Mode SSH OTP (One-Time Password)

Mengaktifkan SSH secrets engine
vault secrets enable ssh
Membuat role SSH OTP
vault write ssh/roles/otp-role \
    key_type=otp \
    default_user=ubuntu \
    cidr_list=10.0.0.0/8

Ketika user ingin login, Vault memberikan kode OTP:

Minta kredensial OTP untuk login SSH
vault read ssh/creds/otp-role

Output:

Output vault read ssh/creds
Key                Value
---                -----
key               a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
key_type          otp
port              22
username          ubuntu

Dengan key OTP ini, user bisa login ke server: ssh ubuntu@10.0.0.5 lalu masukkan key OTP sebagai password. Setelah dipakai sekali, OTP tersebut tidak valid lagi.

Mode SSH CA (Signing)

Mode CA lebih elegan untuk skala besar. Prinsipnya: Vault memiliki CA SSH, dan server-server dipercaya untuk menerima key yang ditandatangani Vault. User tidak perlu menyimpan secret di Vault — cukup public key-nya yang di-sign.

Membuat role SSH CA
vault write ssh/roles/ca-role \
    key_type=ca \
    allowed_user_domains=dev,ops \
    default_extensions="permit-pty,permit-port-forwarding" \
    allowed_users=ubuntu

User menyerahkan public key-nya untuk ditandatangani:

Sign public key user
vault write ssh/sign/ca-role \
    public_key=@/home/arman/.ssh/id_ed25519.pub \
    valid_principals="arman"

Output:

Output vault write ssh/sign
Key            Value
---            -----
key_type       ca
signed_key     ssh-ed25519-cert-v01@openssh.com AAAA... (sertifikat SSH, bukannya sekadar public key)

Hasil signed_key adalah sertifikat SSH (bukan sekadar public key) yang memiliki masa berlaku. Server yang mempercayai Vault CA akan otomatis menerima key ini hingga TTL-nya habis — setelah itu user harus meminta tanda tangan baru.

Vault juga bisa menandatangani host keys (identitas server itu sendiri), sehingga client bisa memverifikasi bahwa server yang dituju benar-benar server milik perusahaan — mencegah serangan man-in-the-middle:

Sign host key sebuah server
vault write ssh/sign/host-signer \
    public_key=@/etc/ssh/ssh_host_ed25519_key.pub \
    valid_principals="dev-server-01"

Output:

Output sign host key
Key            Value
---            -----
key_type       ca
signed_key     ssh-ed25519-cert-v01@openssh.com AAAA... (sertifikat host server)

Kombinasi user CA + host CA inilah yang membentuk zero-trust SSH: user terverifikasi lewat sertifikat, server terverifikasi lewat sertifikat, dan keduanya berumur pendek. Tidak ada lagi password permanen atau host key yang dibiarkan begitu saja.

Warning

Perbedaan krusial: pada SSH OTP, server butuh plugin Vault SSH helper untuk memverifikasi password satu kali. Pada SSH CA, yang diperlukan hanyalah menambahkan public key CA Vault ke trusted-user-ca-keys server — jauh lebih ringan dan tidak butuh proses tambahan di server. Untuk infrastruktur besar, SSH CA hampir selalu pilihan yang lebih tepat.

AWS Secrets Engine: Dynamic IAM Credentials

Masalah klasik cloud: access key AWS yang dibuat sekali dan hidup bertahun-tahun, disimpan di laptop, environment variable, atau — tidak jarang — di commit Git. Jika bocor, attacker punya akses penuh ke akun AWS.

AWS secrets engine memakai prinsip dynamic secrets yang sama dengan database engine di episode 5: Vault membuat IAM credentials temporary yang otomatis kedaluwarsa.

Mengaktifkan AWS secrets engine
vault secrets enable aws

Output:

Output vault secrets enable aws
Success! Enabled the aws secrets engine at: aws/

Konfigurasi kredensial AWS yang dipakai Vault untuk mengelola IAM (membuat user / menandatangani token STS):

Konfigurasi root AWS credentials di Vault
vault write aws/config/root \
    access_key="AKIAIOSFODNN7EXAMPLE" \
    secret_key="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
    region="ap-southeast-1"

Buat role yang mendefinisikan kebijakan IAM untuk kredensial dinamis:

Membuat AWS role (policy berbasis)
vault write aws/roles/my-role \
    credential_type=iam_user \
    policy_document=-<<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:ListBucket"],
      "Resource": "*"
    }
  ]
}
EOF

Sekarang, setiap kali pipeline atau aplikasi butuh akses AWS:

Membaca kredensial AWS dinamis
vault read aws/creds/my-role

Output:

Output vault read aws/creds/my-role
Key                Value
---                -----
lease_id           aws/creds/my-role/1h2VzQ6xW9pLcN4mB7kR5sT0dF8jK3y
lease_duration     768h
lease_renewable    true
 
access_key         AKIAVPQEXAMPLEDYNAMICKEY
secret_key         5hS9mZcQwE3rTgY2uNvB6lK7xDfC0jJp
security_token     <nil>

Important

Untuk credential_type=iam_user, Vault membuat user IAM baru di akun AWS beserta access key-nya, dan menghapus user tersebut ketika lease berakhir. Untuk credential_type=federation_token atau assumed_role, Vault memakai AWS STS sehingga tidak perlu membuat user baru — akses didapat via token sesi yang TTL-nya lebih pendek (maksimal 1 jam untuk federation). Pilih yang sesuai: iam_user untuk kebutuhan 768 jam (default maksimum), STS-based untuk kredensial berumur pendek.

Contoh command lain yang sering dipakai:

Kredensial AWS via STS (berumur pendek)
vault read aws/creds/my-sts-role

Output:

Output kredensial STS
Key                Value
---                -----
access_key         ASIAVPQEXAMPLESHORTLIVED
secret_key         pQn1sLvXc3rTgY5uNhB7jK9mZdF2wA6y
security_token     IQoJb3JpZ2luX2Vj... (token sesi STS panjang)
lease_id           aws/creds/my-sts-role/6sR4tG8vY2mC5xH7bN9kQ3wL0zF1jD8
lease_duration     1h

Tip

Inilah alasan mengapa pipeline CI/CD di episode 18 nanti bisa berjalan tanpa menyimpan satu pun access key AWS di repository: saat pipeline butuh akses, ia cukup meminta kredensial dinamis dari Vault, memakainya selama job berjalan, dan kredensial itu hilang begitu lease berakhir. Tidak ada lagi secret AWS yang bersarang di GitHub/GitLab selama bertahun-tahun.

Skenario Gabungan: Ketiga Engine dalam Satu Alur

Agar gambaran ketiga engine semakin nyata, mari rangkai dalam satu skenario: sebuah perusahaan yang mengelola platform data internal.

LapisanKebutuhanEngine yang Dipakai
Akses manusiaEngineer login ke dashboard adminTOTP (2FA)
Akses serverEngineer SSH ke server produksiSSH CA (signing key user)
OtomasiPipeline membaca data dari S3AWS (dynamic IAM credentials)

Satu Vault cluster yang sama melayani ketiganya — masing-masing dengan mount, role, dan policy-nya sendiri. Inilah keindahan Vault: satu kontrol plane untuk semua jenis rahasia, dari kode OTP sampai kredensial cloud, dengan satu model audit dan satu model akses.

Kapan Memakai Engine yang Mana?

Ketiga engine ini melayani kebutuhan yang berbeda — jangan sampai tertukar:

KebutuhanEngineAnalogi
2FA / one-time code untuk login aplikasiTOTPKartu sekali pakai untuk masuk gedung
Akses SSH ke serverSSH (OTP / CA)Barcode parkir yang di-scan sekali, atau kartu akses terverifikasi
Akses cloud AWSAWSKaryawan kontrak yang masa kerjanya otomatis berakhir

Note

Aturan praktis: pilih engine berdasarkan apa yang ingin kalian kendalikan. Ingin mengontrol kode login → TOTP. Ingin mengontrol siapa boleh SSH ke mana → SSH. Ingin mengontrol siapa boleh mengakses cloud dengan kebijakan apa → AWS. Ketiganya sebenarnya memakai mesin yang sama di bawah permukaan: secrets engine + lease + policy + audit.

Kesalahan Umum TOTP, SSH & AWS

EngineKesalahanGejalaSolusi
TOTPURL otpauth salah formatKode tidak muncul di authenticatorGunakan format otpauth://totp/{issuer}:{account}?secret={base32}
TOTPValidasi kode yang sudah lewat masa berlakunyavalid=falseKode TOTP hanya valid ~30 detik; validasi segera setelah diterima
SSH OTPLupa meng-install helper di serverLogin OTP ditolakPastikan vault-ssh-helper aktif dan role OTP memakai cidr_list yang tepat
SSH CALupa menambahkan trusted CA di serverHost key verification failed / key ditolakTambahkan public key CA Vault ke trusted-user-ca-keys server
AWSMemakai iam_user padahal butuh TTL pendekBanyak user IAM menumpukGunakan federation_token / assumed_role via STS
AWSPolicy dokument di-encode salahError invalid policy JSONUji dengan credential_type yang sesuai dan policy JSON valid
SemuaToken/lease yang dipakai tidak pernah di-renewKoneksi putus mendadakTerapkan renewal / re-fetch sebelum TTL habis (episode 12)

Penutup

Pada episode 8 ini kita telah melengkapi pemahaman tentang secrets engine dengan tiga engine tambahan: TOTP untuk pembangkit dan validasi OTP 2FA yang terpusat, SSH dengan dua mode (OTP sekali pakai vs CA signing) untuk mengamankan akses server, serta AWS untuk dynamic IAM credentials yang berumur pendek. Kita juga melihat perbandingan kapan memakai engine yang mana, dan jebakan-jebakan umum di masing-masing engine.

Inti episode ini: semua secrets engine Vault mengikuti pola yang sama — konfigurasi sekali, lalu kredensial dikelola dan berumur pendek, dengan akses terpusat, terpolicy, dan teraudit. Apa pun teknologi yang kalian amankan — database, data, sertifikat, login, atau cloud — pola pikirnya konsisten.

Dengan selesainya Fase 2, kalian sudah menguasai seluruh secrets engine inti Vault. Di episode 9 selanjutnya kita akan masuk ke Fase 3: Vault Policies — bagaimana mengontrol siapa yang boleh mengakses apa, dengan bahasa HCL dan konsep capabilities yang menentukan keamanan seluruh sistem. Pastikan tetap semangat!

Belajar Vault - Secrets Engine Tambahan (TOTP, SSH & AWS) | Belajar Secret Management dengan HashiCorp Vault