![Vault: Mengamankan Data Sensitif pada Aplikasi](https://images.ctfassets.net/7wjlcr9d5ii8/1ObTgAE8gpgFHPEBwLItLR/c8b814368bd299943794cf2da917a0a4/9027029071_ab7695723b_o.jpg?w=1000&h=662&fl=progressive&q=100&fm=jpg&fit=thumb&f=faces)
Ketika membangun aplikasi, kita umumnya menyimpan semua data-data ke dalam database. Termasuk di dalamnya data-data sensitif seperti nomor KTP, foto KTP, nama orang tua, alamat, nomor telepon pribadi, akun bank, dan data sensitif lainnya. Bagaimana jika data tersebut bocor? Atau ada oknum engineer yang menyalahgunakan akses yang dia punya terhadap data tersebut? Seperti yang pernah terjadi pada salah satu E-Commerce di Indonesia, dimana data tersebut dilelang ratusan juta rupiah lewat deep web. User tentu khawatir ketika menggunakan aplikasi kita. Apalagi data-data tersebut katanya sering digunakan untuk aplikasi pinjol-pinjol illegal. Untuk itu salah satu solusinya adalah data-data sensitif yang disimpan di database itu tidak disimpan dalam bentuk plain text, melainkan dalam bentuk enkripsi. Jadi misalkan ada yang membocorkan data-data tersebut dari database, orang lain ga akan bisa membaca isi data karena isinya sudah berubah menjadi karakter-karakter aneh (cipher text).
Salah satu tools untuk melakukan itu adalah Vault. Vault adalah management tools yang didesain untuk mengamankan data-data sensitif. Tenang aja, tools-nya open-source kok, jadi ga usah khawatir masalah biaya๐. Secara struktur, Vault mirip dengan Redis menyimpan data dengan struktur key-value. Bedanya, Redis dipakai untuk keperluan caching, sedangkan Vault dipakai untuk keperluan security. Sebenarnya bikin tools enkripsi sendiri juga bisa sih, tapi apakah algoritma yang kita buat itu sudah teruji? Butuh pembuktian juga kan. Sedangkan Vault dinilai sudah teruji oleh para expert security engineer. Cara kerja Vault ini sejatinya adalah seperti sebuah service lain yang kita jalankan khusus untuk melakukan enkripsi dan dekripsi data. Jadi aplikasi kita akan mengirimkan http request ke service Vault untuk melakukan enkripsi/dekripsi, lalu Vault akan mengirimkan response kembali.
Untuk cara installnya bisa merujuk ke link berikut: https://learn.hashicorp.com/tutorials/vault/getting-started-install?in=vault/getting-started Tinggal sesuaikan aja tergantung OS masing-masing.
Vault bisa dijalankan secara Production Mode maupun Development Mode. Untuk Production Mode, kita harus setup config dulu. Bikin sebuah file baru dengan nama "config.hcl" di dalam folder vault. Isi file "config.hcl" seperti berikut:
disable_mlock = true
ui = true
listener "tcp" {
address = "127.0.0.1:8200"
tls_disable = "true"
}
storage "file" {
path = "vault-data"
}
api_addr = "https://127.0.0.1:8200"
Itu adalah standar config-nya, untuk lebih advanced-nya bisa dioprek-oprek sendiri. Kita bisa atur storage yang akan kita gunakan untuk menyimpan data, yaitu lewat file, berbagai jenis database SQL, NOSQL, S3, dan lain-lain. Tapi untuk percobaan, kita akan menyimpannya di dalam file saja. Untuk menjalankannya ketik command vault server -config config.hcl
.
Selain itu, kalau mau coba-coba Development Mode, bisa juga menggunakan command vault server -dev
. Nanti service-nya akan berjalan dengan Development Mode dan akan disediakan langsung Unseal Key dan Root Tokennya di command line. Oh ya, Development Mode itu ga aman dan datanya disimpan sementara dalam memory. Itu hanya untuk experiment di local aja. Namun, pada tutorial ini, gw hanya akan menjalankannya menggunakan Production Mode dengan config di atas.
Untuk di local, kita bisa melanjutkan setup menggunakan Web UI via http://127.0.0.1:8200/
. Tapi kali ini gw hanya membahas setup lewat command line biar bisa dipraktekkan juga di server tanpa UI. Selanjutnya buka terminal baru, lalu ketikkan vault operator init
.
Ini dieksekusi hanya saat pertama kali setelah diinstall. Nanti akan muncul list Unseal Key dan Root Token. Root Token adalah token yang digunakan saat login dengan hak akses paling kuat. Sedangkan Unseal Key adalah semacam key untuk pihak otoritas yang akan digunakan setiap kita menjalankan aplikasi. By default akan di-generate 5 buah key dan dibutuhkan minimal 3 key untuk menggunakan aplikasi. Misalkan yang memegang 5 buah key itu adalah CEO, CTO, Head Engineer, Software Architect, dan Principal Engineer. Maka untuk mengakses aplikasi dibutuhkan minimal 3 orang dari mereka harus memasukkan key yang mereka punya, jadi otoritasnya ga hanya dikuasai satu orang saja. Sebenarnya aturan default ini bisa kita ubah menjadi beberapa orang, tapi untuk pembelajaran kita ikuti aturan default saja. Unseal Key tersebut ga boleh hilang atau lupa, kalau hilang itu artinya ga bakal bisa diakses lagi. Cukup ketat kan?๐
Ketika pertama kali dijalankan, status service-nya adalah Sealed alias tersegel. Untuk membuka segel tersebut, kita harus menginput Unseal Key. Langkah selanjutnya adalah ketikkan vault operator unseal
, lalu enter.
Nanti akan muncul prompt untuk memasukkan unseal key. Paste salah satu Unseal Key dari 5 key sebelumnya. Lalu ulangi langkah tersebut hingga total minimal 3 Unseal Key berbeda berhasil diinput. Untuk mengecek statusnya, bisa masukkan command vault status
. Lalu akan muncul informasi bahwa "sealed: false", yang artinya sekarang aplikasi sudah Unsealed dan bisa digunakan.
Selanjutnya adalah login menggunakan token. Oh ya, untuk lebih aman lagi kita bisa generate token baru untuk akses tertentu, jadi Root Token dan Token lainnya terpisah. Tapi kali ini gw hanya menggunakan Root Token aja biar tulisannya ga kepanjangan. Selanjutnya ketik command vault login
, lalu enter. Paste token ke dalam command line. Sekarang semua autentikasinya sudah siap!
Engine untuk melakukan enkripsi/dekripsi disebut "Transit". Kita harus mengaktifkannya terlebih dahulu jika belum aktif dengan mengetikkan command vault secrets enable transit
.
Selanjutnya kita bisa membuat encryption key seperti yang kita mau. Idealnya sih, satu encryption key untuk satu kategori data biar aman. Jadi antar kategori data itu key-nya ga sama. Misalkan kita ingin membuat encryption key untuk mengamankan data NIK, maka kita bisa membuatnya dengan command vault write -f transit/keys/nik
.
Sebelum dienkripsi semua data harus di-convert dalam bentuk base64. Misalkan text yang akan dienkripsi adalah "123654", maka itu harus di-encode dulu. Kalau untuk aplikasi pemrograman sebenarnya kita tinggal pakai library aja, tapi untuk contoh berikut karena kita masih coba-coba via command line, jadinya kita harus encode manual, contohnya lewat situs https://www.base64encode.org/ atau pakai tools lainnya juga boleh.
Untuk memasukkan data yang mau di-enkripsi, ketikkan command vault write transit/encrypt/nik plaintext=MTIzNjU0
. "MTIzNjU0" adalah hasil encode dari "123654" menggunakan tools tadi.
Nanti akan muncul dibawahnya tabel key-value salah satunya berisi key "ciphertext" dengan value "vault:v1:AyTlioMKR/IboJBrpH3k4GoB2MR58/hvK5+zbjFtOaY22g==". Itu adalah hasil enkripsi dari data "123654" tadi. Value-nya akan berbeda di komputer kalian, karena hasil enkripsinya unique dengan algoritma yang cukup kuat, jadi ga perlu takut terhadap dictionary attack.
Untuk melakukan dekripsi, copy value tadi lalu ketikkan command vault write transit/decrypt/nik ciphertext=vault:v1:AyTlioMKR/IboJBrpH3k4GoB2MR58/hvK5+zbjFtOaY22g==
. Lalu akan muncul tabel dengan key plaintext dengan value "MTIzNjU0", sesuai hasil encoded tadi.
Untuk mengubahnya ke teks asli bisa membuka situs https://www.base64decode.org atau tools decode lainnya. Sama seperti encode, untuk aplikasi kita nantinya tinggal pakai library aja untuk melakukan decode.
Ga cuma text biasa, file pun bisa kita enkripsi. Misalkan foto selfie megang KTP yang di-upload user ingin kita enkripsi juga. Jadi di server kita ga akan menyimpan file asli foto yang di-upload tersebut, melainkan hanya menyimpan hasil enkripsinya saja. Syaratnya sama, file-nya harus dikonversi ke Base64 terlebih dahulu sebelum dienkripsi. Kalau mau coba-coba bisa encode dulu foto KTP-nya lewat situs https://base64.guru/converter/encode/file atau tools encode file lainnya. Sama seperti sebelumnya, hasil encode tersebut di-paste ke dalam command line, nanti akan muncul hasil enkripsinya. Itulah value yang akan kita simpan nanti di server. Untuk dekripsi caranya juga kurang lebih sama, bedanya hasil dekripnya perlu diubah lagi menjadi file lewat tools lagi, contohnya lewat https://base64.guru/converter/decode/file.
Salah satu fitur unggulan lainnya dari Vault adalah menyimpan Secret Key, seperti key untuk Generate Token, Password Database, dan kebutuhan lainnya. Biasanya kita menyimpan Secret Key tersebut di dalam config file di dalam aplikasi. Masalahnya, gimana kalau salah satu komputer engineer diretas orang? Semua password aplikasi kita akan diketahui oleh peretas, karena biasanya itu disimpan secara plain text. Nah, dengan Vault kita bisa menyimpan Secret Key tersebut agar hanya orang-orang yang memiliki akses ke Vault saja yang bisa membaca Secret Key yang kita simpan.
Caranya juga gampang. Kalau belum aktif, kita aktifkan dulu engine-nya dengan mengetikkan command vault secrets enable kv-v2
.
Lalu buat path untuk menyimpan Secret tersebut. Misalkan kita ingin membuat path dengan nama "testing", maka ketikkan command vault secrets enable -path=testing kv
. "kv" itu adalah nama engine untuk menyimpan Secret Key.
Selanjutnya adalah menyimpan Secret Key kita ke dalam Tools tersebut. Misalkan kita ingin menyimpan password database dengan value "s3Cr3T" ke dalam subpath "auth" dengan key "pass-db", maka ketikkan command vault kv put testing/auth pass-db=s3Cr3T
.
Untuk melihat list data yang tersimpan pada path "testing/auth", kita bisa mengetikkan command vault kv get testing/auth
. Nanti akan muncul table key-value dari secret key yang kita gunakan.
Untuk menghapus path "testing/auth", kita bisa menggunakan command vault kv delete testing/auth
.
Oh ya, untuk delete kita ga bisa menghapus specific key pada subpath, jadi kalau mau delete, otomatis semua key di dalam subpath tersebut ikut terhapus. Sedangkan untuk melakukan replace, bisa dengan mengetikkan command yang sama sewaktu melakukan put data.
Gimana, gampang bukan? Bukaaan!๐ Untuk setup-nya mungkin agak ribet sih, tapi worth it lah demi sebuah kepercayaan user dan keamanan data. Apalagi di era sekarang data pribadi itu sangat rentan disalahgunakan pihak-pihak yang ga bertanggung-jawab. Sekarang kita bisa meyakinkan user kita bahwa data-data sensitif mereka yang kita simpan benar-benar aman tanpa khawatir kecolongan. Dengan adanya proses enkripsi/dekripsi ini, maka ada satu layer tambahan ketika mengakses maupun menyimpan data. Itu artinya tentu prosesnya ga semudah biasanya, walaupun ga signifikan juga perbedaannya, jadi masih worth it. Oleh karena itu ga semua data bakal dienkripsi seperti ini. Hanya data-data sensitif saja, sisanya cukup plain text seperti biasa. Next, gw akan membahas tentang integrasi Vault dengan aplikasi.