Pedoman devops di https://12factor.net/config menyarankan untuk memasukkan rahasia situs web (kata sandi basis data, kunci api, dll.) Ke dalam variabel lingkungan. Apa kelebihan yang dimiliki daripada menggunakan file teks (JSON, XML, YAML, INI, atau yang serupa) yang diabaikan dari kontrol versi?
Saya merasa jauh lebih mudah untuk menyalin file konfigurasi dengan rahasia daripada menangani variabel lingkungan di .bash_profile dan konfigurasi server web. Apakah saya melewatkan sesuatu?
web-server
configuration
website
environment-variables
Aidas Bendoraitis
sumber
sumber
Jawaban:
Penulis daftar alasan mereka, meskipun agak terpisah. Argumen utama mereka adalah bahwa mudah untuk secara tidak sengaja memeriksa file konfigurasi, dan file konfigurasi memiliki beragam format dan dapat tersebar di seluruh sistem (ketiganya merupakan argumen yang biasa-biasa saja untuk konfigurasi terkait keamanan seperti token dan kredensial auth).
Berdasarkan pengalaman saya sendiri, Anda pada dasarnya memiliki tiga opsi berikut, dengan kelebihan dan kekurangan terkait:
Simpan data dalam file konfigurasi.
Saat mengambil pendekatan ini, Anda harus mengisolasi mereka dari repositori itu sendiri, dan pastikan mereka berada di luar area tempat aplikasi menyimpan kontennya.
Keuntungan:
Kekurangan:
Simpan data dalam variabel lingkungan.
Biasanya ini dilakukan dengan sumber daftar variabel dan nilai lingkungan dari skrip startup, tetapi dalam beberapa kasus mungkin hanya menyatakannya pada baris perintah sebelum nama program.
Keuntungan:
Kekurangan
hidepid
opsi mount untuk/proc
di LInux misalnya), tetapi mereka tidak diaktifkan secara default, dan tidak melindungi terhadap serangan dari pengguna yang memiliki proses.Gunakan argumen baris perintah untuk meneruskan data.
Serius, hindari ini di semua biaya, itu tidak aman dan itu adalah rasa sakit di pantat untuk mempertahankan.
Keuntungan:
Kekurangan:
sumber
Variabel lingkungan akan diwarisi oleh setiap proses anak dari server web. Itu setiap sesi yang terhubung ke server, dan setiap program memunculkannya. Rahasia akan terungkap secara otomatis ke semua proses tersebut.
Jika Anda menyimpan rahasia dalam file teks, mereka harus dapat dibaca oleh proses server, dan sangat berpotensi oleh setiap proses anak juga. Tetapi setidaknya program harus pergi dan menemukannya; mereka tidak disediakan secara otomatis. Anda mungkin juga dapat membuat beberapa proses anak berjalan di akun yang berbeda, dan membuat rahasia hanya dapat dibaca oleh akun tersebut. Sebagai contoh, suEXEC melakukan ini di Apache.
sumber
MYVAR=foo /path/to/some/executable
) membatasi penyebaran ke proses dan itu hanya anak-anak - dan di mana master daemon yang diperlukan dapat menggosok / mereset / memodifikasi lingkungan proses anak.Bahkan jika ada beberapa trade off terkait keamanan yang harus dibuat ketika datang ke variabel lingkungan atau file, saya tidak berpikir keamanan adalah kekuatan pendorong utama untuk rekomendasi ini. Ingat penulis 12factor.net juga (atau dulu juga?) Pengembang Heroku PaaS. Membuat semua orang menggunakan variabel lingkungan mungkin sedikit menyederhanakan pengembangan mereka. Ada begitu banyak variasi dalam berbagai format dan lokasi file konfigurasi dan akan sulit bagi mereka untuk mendukung semuanya. Variabel lingkungan mudah dibandingkan.
Tidak perlu banyak imajinasi untuk menebak beberapa percakapan yang dilakukan.
1 : sumber: dibuat-buat.
sumber
TL; DR
Ada sejumlah alasan untuk menggunakan variabel lingkungan alih-alih file konfigurasi, tetapi dua yang paling umum untuk diabaikan adalah nilai utilitas dari konfigurasi out-of-band dan peningkatan pemisahan antara server, aplikasi, atau peran organisasi. Daripada menyajikan daftar lengkap semua alasan yang mungkin, saya hanya membahas dua topik ini dalam jawaban saya, dan menyentuh ringan pada implikasi keamanannya.
Konfigurasi Keluar-Band: Memisahkan Rahasia dari Kode Sumber
Jika Anda menyimpan semua rahasia Anda di file konfigurasi, Anda harus mendistribusikan rahasia itu ke setiap server. Itu berarti memeriksa rahasia menjadi kontrol revisi di samping kode Anda, atau memiliki repositori atau mekanisme distribusi yang sepenuhnya terpisah untuk rahasia.
Enkripsi rahasia Anda tidak benar-benar membantu menyelesaikan masalah ini. Yang perlu dilakukan hanyalah mendorong masalah ke satu penghapusan, karena sekarang Anda juga harus khawatir tentang manajemen dan distribusi utama!
Singkatnya, variabel lingkungan adalah pendekatan untuk memindahkan data per-server atau per-aplikasi dari kode sumber ketika Anda ingin memisahkan pengembangan dari operasi. Ini sangat penting jika Anda telah menerbitkan kode sumber!
Tingkatkan Pemisahan: Server, Aplikasi, dan Peran
Meskipun Anda tentu bisa memiliki file konfigurasi untuk menyimpan rahasia Anda, jika Anda menyimpan rahasia dalam kode sumber Anda memiliki masalah kekhususan. Apakah Anda memiliki cabang atau repositori terpisah untuk setiap set rahasia? Bagaimana Anda memastikan set rahasia sampai ke server yang tepat? Atau apakah Anda mengurangi keamanan dengan memiliki "rahasia" yang sama di mana-mana (atau dapat dibaca di mana-mana, jika Anda memiliki semuanya dalam satu file), dan karenanya merupakan risiko yang lebih besar jika kontrol keamanan satu sistem gagal?
Jika Anda ingin memiliki rahasia unik di setiap server, atau untuk setiap aplikasi, variabel lingkungan akan menghilangkan masalah karena harus mengelola banyak file. Jika Anda menambahkan server, aplikasi, atau peran baru, Anda tidak perlu membuat file baru atau memperbarui yang lama: Anda cukup memperbarui lingkungan sistem yang dimaksud.
Berpisah Pikiran tentang Keamanan
Walaupun eksplorasi menyeluruh terhadap keamanan kernel / memori / file berada di luar cakupan untuk jawaban ini, ada baiknya menunjukkan bahwa variabel lingkungan per-sistem yang diterapkan dengan benar tidak kalah aman daripada rahasia "terenkripsi". Dalam kedua kasus, sistem target masih harus menyimpan rahasia yang didekripsi dalam memori di beberapa titik untuk menggunakannya.
Ini juga layak menunjukkan bahwa ketika nilai disimpan dalam memori yang mudah menguap pada node yang diberikan, tidak ada file pada disk yang dapat disalin dan diserang secara offline. Ini umumnya dianggap sebagai keuntungan bagi rahasia di dalam memori, tetapi ini tentu saja tidak konklusif.
Masalah variabel lingkungan vs teknik manajemen rahasia lainnya benar-benar lebih tentang keamanan dan kegunaan pertukaran daripada tentang absolut. Jarak tempuh Anda mungkin beragam.
sumber
Secara pribadi, saya tidak akan merekomendasikan pengaturan variabel lingkungan
.bashrc
karena ini menjadi terlihat oleh semua proses yang dimulai oleh shell tetapi untuk mengatur mereka di tingkat daemon / pengawas (skrip init / rc, systemd config) sehingga cakupannya terbatas jika diperlukan .Di mana tim yang terpisah mengelola operasi, variabel lingkungan menyediakan antarmuka yang mudah bagi operasi untuk mengatur lingkungan aplikasi tanpa harus mengetahui tentang file / format konfigurasi dan / atau untuk menggunakan pengelompokan konten mereka. Ini terutama benar dalam pengaturan multi-bahasa / multi-kerangka kerja di mana tim operasi dapat memilih sistem penempatan (OS, proses penyelia) berdasarkan kebutuhan operasional (kemudahan penempatan, skalabilitas, keamanan, dll).
Pertimbangan lain adalah jalur pipa CI / CD - karena kode melewati lingkungan yang berbeda(mis. dev, test / qa, staging, produksi) keterangan lingkungan (zona penempatan, keterangan koneksi basis data, kredensial, alamat IP, nama domain, dll, dll) paling baik diatur oleh alat / kerangka kerja manajemen konfigurasi khusus dan dikonsumsi oleh aplikasi proses dari lingkungan (dalam KERING, menulis sekali, jalankan di mana saja mode). Secara tradisional di mana pengembang cenderung mengelola masalah operasional ini, mereka cenderung memeriksa file konfigurasi atau template selain kode - dan akhirnya menambahkan solusi dan kompleksitas lainnya ketika persyaratan operasional berubah (misalnya lingkungan / penyebaran / situs baru ikut serta, skalabilitas / keamanan Menimbang,
Untuk produksi, saya lebih suka mengatur aplikasi env-vars di EnvironmentFile seperti
/etc/default/myapplication.conf
yang digunakan oleh manajemen konfigurasi dan mengatur hanya dapat dibaca olehroot
sedemikian sehinggasystemd
(atau hal lain dalam hal ini) dapat menelurkan aplikasi di bawah pengguna sistem Deprivileged khusus dalam Pribadi grup . Didukung oleh grup pengguna khusus untukops
dansudo
- file-file ini secara default tidak dapat dibaca. Ini adalah persyaratan 12faktor yang mendukung semua kebaikan Dev + Ops plus memiliki semua manfaat keamanan yang layak sambil tetap memungkinkan pengembang / penguji untuk menjatuhkan EnvironmentFiles mereka sendiri di lingkungan dev / qa / test.sumber
Dari perspektif pengembang, menyimpan data konfigurasi dalam variabel lingkungan menyederhanakan penyebaran di antara lingkungan yang berbeda - pengembangan, QA, dan produksi - dan membebaskan pengembang dari keharusan khawatir tentang penggunaan file konfigurasi yang salah.
Aplikasi web Azure menyediakan opsi untuk menggunakan pola ini dan itu bekerja dengan sangat baik.
Selain itu, menjaga data yang berpotensi sensitif di luar kendali sumber. Mengabaikan file-file dari kontrol sumber tidak benar-benar layak (setidaknya dalam. NET) karena banyak konfigurasi boilerplate yang diperlukan juga hadir dalam file-file itu.
sumber