Saya menyimpan pengaturan penting seperti nama host dan port server pengembangan dan produksi di sistem kontrol versi saya. Tetapi saya tahu bahwa itu adalah praktik yang buruk untuk menyimpan rahasia (seperti kunci pribadi dan kata sandi basis data) dalam repositori VCS.
Tetapi kata sandi - seperti pengaturan lainnya - sepertinya harus diversi. Jadi apa adalah cara yang tepat untuk menjaga password versi dikendalikan?
Saya membayangkan itu akan melibatkan menjaga rahasia pada "Pengaturan rahasia" file mereka sendiri dan memiliki yang file yang dienkripsi dan versi dikendalikan. Tapi teknologi apa? Dan bagaimana cara melakukannya dengan benar? Apakah ada cara yang lebih baik sepenuhnya untuk melakukannya?
Saya mengajukan pertanyaan secara umum, tetapi dalam contoh spesifik saya, saya ingin menyimpan kunci dan kata sandi rahasia untuk situs Django / Python menggunakan git dan github .
Juga, solusi ideal akan melakukan sesuatu yang ajaib ketika saya mendorong / menarik dengan git - misalnya, jika file kata sandi terenkripsi mengubah script dijalankan yang meminta kata sandi dan mendekripsi ke tempatnya.
EDIT: Untuk kejelasan, saya sedang bertanya tentang di mana untuk menyimpan produksi rahasia.
sumber
Jawaban:
Anda memang benar ingin mengenkripsi file pengaturan sensitif Anda sambil tetap mempertahankan file dalam kontrol versi. Seperti yang Anda sebutkan, solusi terbaik adalah Git akan mengenkripsi file sensitif tertentu secara transparan saat Anda mendorongnya secara lokal (yaitu pada mesin apa pun yang memiliki sertifikat Anda), Anda dapat menggunakan file pengaturan, tetapi Git atau Dropbox atau siapa pun menyimpan file Anda di bawah VC tidak memiliki kemampuan untuk membaca informasi dalam plaintext.
Tutorial tentang Enkripsi / Dekripsi Transparan selama Push / Pull
Intisari ini https://gist.github.com/873637 memperlihatkan tutorial tentang cara menggunakan driver filter noda / bersih Git dengan openssl untuk mengenkripsi file yang didorong secara transparan. Anda hanya perlu melakukan beberapa pengaturan awal.
Ringkasan Cara Kerja
Anda pada dasarnya akan membuat
.gitencrypt
folder yang berisi 3 skrip bash,yang digunakan oleh Git untuk dekripsi, enkripsi, dan mendukung Git diff. Master frasa sandi dan garam (diperbaiki!) Didefinisikan di dalam skrip ini dan Anda HARUS memastikan bahwa .gitencrypt tidak pernah benar-benar didorong.
clean_filter_openssl
Skrip contoh :Mirip untuk
smudge_filter_open_ssl
dandiff_filter_oepnssl
. Lihat Gist.Repo Anda dengan informasi sensitif harus memiliki file .gitattribute (tidak terenkripsi dan disertakan dalam repo) yang merujuk pada direktori .gitencrypt (yang berisi semua yang dibutuhkan Git untuk mengenkripsi / mendekripsi proyek secara transparan) dan yang ada pada mesin lokal Anda.
.gitattribute
isi:Terakhir, Anda juga perlu menambahkan konten berikut ke
.git/config
file AndaSekarang, ketika Anda mendorong repositori yang berisi informasi sensitif Anda ke repositori jarak jauh, file-file tersebut akan dienkripsi secara transparan. Ketika Anda menarik dari mesin lokal yang memiliki direktori .gitencrypt (berisi frasa sandi Anda), file-file tersebut akan didekripsi secara transparan.
Catatan
Saya harus mencatat bahwa tutorial ini tidak menjelaskan cara hanya mengenkripsi file pengaturan sensitif Anda. Ini akan mengenkripsi seluruh repositori secara transparan yang didorong ke host VC jarak jauh dan mendekripsi seluruh repositori sehingga sepenuhnya didekripsi secara lokal. Untuk mencapai perilaku yang Anda inginkan, Anda dapat menempatkan file sensitif untuk satu atau banyak proyek dalam satu sensitive_settings_repo. Anda dapat menyelidiki bagaimana teknik enkripsi transparan ini bekerja dengan submit Git http://git-scm.com/book/en/Git-Tools-Submodules jika Anda benar-benar membutuhkan file sensitif berada di repositori yang sama.
Penggunaan frasa sandi tetap secara teoritis dapat menyebabkan kerentanan brute-force jika penyerang memiliki akses ke banyak repo / file terenkripsi. IMO, kemungkinan ini sangat rendah. Sebagai catatan di bagian bawah tutorial ini menyebutkan, tidak menggunakan frasa sandi tetap akan menghasilkan versi lokal repo pada mesin yang berbeda selalu menunjukkan bahwa perubahan telah terjadi dengan 'git status'.
sumber
Heroku mendorong penggunaan variabel lingkungan untuk pengaturan dan kunci rahasia:
Dengan Foreman dan
.env
file Heroku menyediakan toolchain yang patut ditiru untuk mengekspor, mengimpor, dan menyinkronkan variabel lingkungan.Secara pribadi, saya percaya itu salah untuk menyimpan kunci rahasia di samping kode. Ini pada dasarnya tidak konsisten dengan kontrol sumber, karena kuncinya adalah untuk layanan ekstrinsik dengan kode . Satu keuntungannya adalah pengembang dapat mengkloning HEAD dan menjalankan aplikasi tanpa setup. Namun, anggaplah pengembang memeriksa revisi kode bersejarah. Salinan mereka akan memasukkan kata sandi basis data tahun lalu, sehingga aplikasi akan gagal terhadap basis data hari ini.
Dengan metode Heroku di atas, pengembang dapat checkout aplikasi tahun lalu, mengkonfigurasinya dengan kunci hari ini, dan menjalankannya dengan sukses terhadap database hari ini.
sumber
Cara terbersih menurut saya adalah menggunakan variabel lingkungan. Anda tidak perlu berurusan dengan file .dist misalnya, dan status proyek pada lingkungan produksi akan sama dengan mesin lokal Anda.
Saya sarankan membaca bab konfigurasi The Twelve-Factor App , yang lain juga jika Anda tertarik.
sumber
export MY_ENV_VAR=
, dan ketika Anda menyebarkan, cukup isi dengan nilai-nilai yang tepat dansource
itu. Jika dengan menjaga Anda berarti versi pengaturan, Anda tidak harus melakukan hal ini di tempat pertama.Sebuah opsi adalah menempatkan kredensial terikat proyek ke dalam wadah terenkripsi (TrueCrypt atau Keepass) dan dorong.
Perbarui sebagai jawaban dari komentar saya di bawah ini:
Pertanyaan menarik btw. Saya baru saja menemukan ini: github.com/shadowhand/git-encrypt yang terlihat sangat menjanjikan untuk enkripsi otomatis
sumber
git-encrypt
suara persis seperti apa yang saya cari "Ketika bekerja dengan repositori git jarak jauh yang di-host di server penyimpanan pihak ketiga, kerahasiaan data terkadang menjadi perhatian. Artikel ini memandu Anda melalui prosedur pengaturan repositori git di mana direktori kerja lokal Anda seperti biasa (tidak dienkripsi) tetapi konten yang dikomunikasikan dienkripsi. " (Tentu saja, saya hanya ingin sebagian dari konten saya dienkripsi ...)Saya sarankan menggunakan file konfigurasi untuk itu dan bukan versi mereka.
Namun Anda dapat versi contoh file.
Saya tidak melihat masalah berbagi pengaturan pengembangan. Menurut definisi itu tidak boleh berisi data berharga.
sumber
Kotak hitam baru-baru ini dirilis oleh StackExchange dan sementara saya belum menggunakannya, tampaknya justru mengatasi masalah dan mendukung fitur yang diminta dalam pertanyaan ini.
Dari uraian di https://github.com/StackExchange/blackbox :
sumber
Sejak mengajukan pertanyaan ini, saya telah menetapkan solusi, yang saya gunakan ketika mengembangkan aplikasi kecil dengan tim kecil orang.
git-crypt
git-crypt menggunakan GPG untuk mengenkripsi file secara transparan ketika namanya cocok dengan pola tertentu. Untuk tujuan awal, jika Anda menambahkan ke
.gitattributes
file Anda ...... lalu file seperti
config.secret.json
akan selalu didorong ke repo jarak jauh dengan enkripsi, tetapi tetap tidak dienkripsi pada sistem file lokal Anda.Jika saya ingin menambahkan kunci GPG baru (seseorang) ke repo Anda yang dapat mendekripsi file yang dilindungi kemudian jalankan
git-crypt add-gpg-user <gpg_user_key>
. Ini menciptakan komit baru. Pengguna baru akan dapat mendekripsi komitmen selanjutnya.sumber
Tidak, hanya tidak, meskipun itu repo pribadi Anda dan Anda tidak pernah berniat untuk membagikannya, jangan.
Anda harus membuat local_settings.py meletakkannya di VCS abaikan dan di pengaturan Anda .py melakukan sesuatu seperti
Jika pengaturan rahasia Anda serba guna, saya ingin mengatakan bahwa Anda melakukan sesuatu yang salah
sumber
EDIT: Saya berasumsi Anda ingin melacak versi kata sandi Anda sebelumnya - katakanlah, untuk skrip yang akan mencegah penggunaan kembali kata sandi dll.
Saya pikir GnuPG adalah cara terbaik untuk pergi - itu sudah digunakan dalam satu proyek terkait git (git-lampiran) untuk mengenkripsi konten repositori yang disimpan di layanan cloud. GnuPG (gnu pgp) menyediakan enkripsi berbasis kunci yang sangat kuat.
Sekarang jika file 'mypassword' Anda tidak berubah, maka mengenkripsinya akan menghasilkan ciphertext yang sama dan tidak akan ditambahkan ke indeks (tanpa redundansi). Modifikasi mypassword yang paling ringan menghasilkan ciphertext dan mypassword.gpg yang sangat berbeda di area stage berbeda dari yang ada di repositori, sehingga akan ditambahkan ke komit. Bahkan jika penyerang memegang kunci gpg Anda, ia masih perlu memaksakan kata sandi. Jika penyerang mendapatkan akses ke repositori jarak jauh dengan ciphertext, ia dapat membandingkan banyak cipherteks, tetapi jumlah mereka tidak akan cukup untuk memberinya keuntungan yang tidak dapat diabaikan.
Selanjutnya Anda dapat menggunakan .gitattributes untuk memberikan dekripsi sambil-jalan untuk keluar dari git kata sandi Anda.
Anda juga dapat memiliki kunci terpisah untuk berbagai jenis kata sandi, dll.
sumber
Biasanya, saya memisahkan kata sandi sebagai file konfigurasi. dan membuat mereka berbeda.
Dan ketika saya menjalankan
main.py
, masukkan kata sandi asli ke dalamdefault.cfg
salinan itu.ps. ketika Anda bekerja dengan git atau hg. Anda dapat mengabaikan
*.cfg
file untuk membuat.gitignore
atau.hgignore
sumber
Berikan cara untuk mengganti konfigurasi
Ini adalah cara terbaik untuk mengelola sekumpulan standar waras untuk konfigurasi yang Anda setujui tanpa mengharuskan konfigurasi lengkap, atau berisi hal-hal seperti nama host dan kredensial. Ada beberapa cara untuk mengganti konfigurasi default.
Variabel lingkungan (seperti yang telah disebutkan sebelumnya) adalah salah satu cara untuk melakukannya.
Cara terbaik adalah mencari file konfigurasi eksternal yang menimpa nilai konfigurasi default. Ini memungkinkan Anda untuk mengelola konfigurasi eksternal melalui sistem manajemen konfigurasi seperti Chef, Puppet, atau Cfengine. Manajemen konfigurasi adalah jawaban standar untuk manajemen konfigurasi yang terpisah dari basis kode sehingga Anda tidak perlu melakukan rilis untuk memperbarui konfigurasi pada satu host atau sekelompok host.
FYI: Mengenkripsi kredit tidak selalu merupakan praktik terbaik, terutama di tempat dengan sumber daya terbatas. Ini mungkin terjadi bahwa mengenkripsi kredit tidak akan memberi Anda mitigasi risiko tambahan dan hanya menambahkan lapisan kompleksitas yang tidak perlu. Pastikan Anda melakukan analisis yang tepat sebelum membuat keputusan.
sumber
Enkripsi file kata sandi, gunakan misalnya GPG. Tambahkan kunci di mesin lokal Anda dan di server Anda. Dekripsi file dan letakkan di luar folder repo Anda.
Saya menggunakan passwords.conf, yang terletak di folder home saya. Pada setiap penyebaran file ini diperbarui.
sumber
Tidak, kunci pribadi dan kata sandi tidak masuk dalam kendali revisi. Tidak ada alasan untuk membebani semua orang dengan akses baca ke repositori Anda dengan mengetahui kredensial layanan sensitif yang digunakan dalam produksi, ketika kemungkinan besar tidak semuanya harus memiliki akses ke layanan tersebut.
Dimulai dengan Django 1.4, proyek Django Anda sekarang dikirimkan dengan
project.wsgi
modul yang mendefinisikanapplication
objek dan itu adalah tempat yang sempurna untuk mulai menegakkan penggunaan suatuproject.local
modul pengaturan yang berisi konfigurasi khusus situs.Modul pengaturan ini diabaikan dari kontrol revisi, tetapi kehadirannya diperlukan saat menjalankan instance proyek Anda sebagai aplikasi WSGI, khas untuk lingkungan produksi. Begini tampilannya:
Sekarang Anda dapat memiliki
local.py
modul yang pemilik dan grupnya dapat dikonfigurasi sehingga hanya personel yang berwenang dan proses Django yang dapat membaca konten file.sumber
Jika Anda membutuhkan VCS untuk rahasia Anda, setidaknya Anda harus menyimpannya di repositori kedua yang terpisah dari kode aktual Anda. Jadi, Anda dapat memberi anggota tim Anda akses ke repositori kode sumber dan mereka tidak akan melihat kredensial Anda. Selain itu, simpan repositori ini di tempat lain (mis. Pada server Anda sendiri dengan sistem file terenkripsi, bukan pada github) dan untuk memeriksanya ke sistem produksi Anda dapat menggunakan sesuatu seperti git-submodule .
sumber
Pendekatan lain bisa sepenuhnya menghindari menyimpan rahasia dalam sistem kontrol versi dan alih-alih menggunakan alat seperti kubah dari hashicorp , penyimpanan rahasia dengan penggulungan dan audit kunci, dengan API dan enkripsi yang disematkan.
sumber
Inilah yang saya lakukan:
File template berisi pengganti untuk rahasia, seperti:
my.password = ## MY_PASSWORD ##
Pada penerapan aplikasi, skrip dijalankan yang mengubah file templat menjadi file target, menggantikan placeholder dengan nilai-nilai variabel lingkungan, seperti mengubah ## MY_PASSWORD ## ke nilai $ MY_PASSWORD.
sumber
Anda dapat menggunakan EncFS jika sistem Anda menyediakannya. Dengan demikian Anda dapat menyimpan data terenkripsi Anda sebagai subfolder dari repositori Anda, sembari memberikan aplikasi Anda tampilan dekripsi untuk data yang dipasang di samping. Karena enkripsi ini transparan, tidak ada operasi khusus yang diperlukan saat menarik atau mendorong.
Namun perlu me-mount folder EncFS, yang dapat dilakukan oleh aplikasi Anda berdasarkan kata sandi yang disimpan di tempat lain di luar folder berversi (mis. Variabel lingkungan).
sumber