Bagaimana saya bisa menyimpan kunci rahasia dan kata sandi saya dengan aman di sistem kontrol versi saya?

134

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.

Chris W.
sumber
1
Sebenarnya uang muka untuk menjaga seluruh repo pribadi.
John Mee
29
@ JohnMee Saya sebenarnya sudah membayar untuk repositori pribadi, tetapi intinya tetap - Anda tidak boleh menyimpan informasi sensitif di repositori Anda.
Chris W.
1
Saya pikir sebagian besar alasan jawaban yang memuaskan akan sulit didapat adalah bahwa kata sandi plaintext kuno untuk terhubung ke database adalah peninggalan era yang kurang bermusuhan. Jawaban yang tepat adalah sesuatu seperti "kode Anda tidak perlu rahasia", tetapi sistem yang Anda akses tidak memberi Anda banyak pilihan.
msw
4
Mengapa? Ada nilai nihil dalam versi yang mengontrol kata sandi untuk layanan eksternal. Nilai utama dari kontrol versi adalah bahwa Anda dapat memeriksa revisi historis aplikasi Anda yang diketahui berfungsi dan menjalankannya . Namun, kata sandi lama tidak berguna bagi Anda. Jika mereka telah dicabut, mereka tidak akan pernah bekerja lagi.
Kolonel Panic
1
Kemungkinan rangkap: programmers.stackexchange.com/questions/205606/…
Pengguna

Jawaban:

100

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 .gitencryptfolder yang berisi 3 skrip bash,

clean_filter_openssl 
smudge_filter_openssl 
diff_filter_openssl 

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_opensslSkrip contoh :

#!/bin/bash

SALT_FIXED=<your-salt> # 24 or less hex characters
PASS_FIXED=<your-passphrase>

openssl enc -base64 -aes-256-ecb -S $SALT_FIXED -k $PASS_FIXED

Mirip untuk smudge_filter_open_ssldan diff_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:

* filter=openssl diff=openssl
[merge]
    renormalize = true

Terakhir, Anda juga perlu menambahkan konten berikut ke .git/configfile Anda

[filter "openssl"]
    smudge = ~/.gitencrypt/smudge_filter_openssl
    clean = ~/.gitencrypt/clean_filter_openssl
[diff "openssl"]
    textconv = ~/.gitencrypt/diff_filter_openssl

Sekarang, 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'.

dgh
sumber
1
Oh, sangat menarik. Ini terdengar hampir persis seperti yang saya inginkan (kecuali mengenkripsi seluruh repositori).
Chris W.
Anda bisa menyimpan semua file pengaturan sensitif untuk beberapa aplikasi dalam satu repositori terenkripsi atau menambahkan repositori terenkripsi dengan pengaturan sensitif ke proyek Anda sebagai submodule Git seperti yang dijelaskan di sini git-scm.com/book/en/Git-Tools-Submodules .
dgh
Menyimpan kata sandi / pengaturan produksi dalam submodul (terenkripsi) tidak jarang. stackoverflow.com/questions/11207284/… . Bahkan akan membuatnya lebih mudah untuk mengelola pengaturan lintas proyek.
dgh
Mungkin ada baiknya memeriksa github.com/AGWA/git-crypt untuk solusi yang diperbarui. Ini memiliki keuntungan dari memungkinkan file individu untuk dienkripsi, dan itu mengklaim "terbukti aman secara semantik". Penulis intinya sendiri menyarankan agar alat ini lebih baik, di github.com/shadowhand/git-encrypt .
geekley
52

Heroku mendorong penggunaan variabel lingkungan untuk pengaturan dan kunci rahasia:

Pendekatan tradisional untuk menangani konfigurasi seperti itu adalah dengan meletakkannya di bawah sumber - dalam semacam file properti. Ini adalah proses yang rawan kesalahan, dan sangat rumit untuk aplikasi open source yang sering harus mempertahankan cabang terpisah (dan pribadi) dengan konfigurasi khusus aplikasi.

Solusi yang lebih baik adalah dengan menggunakan variabel lingkungan, dan menjaga kunci keluar dari kode. Pada host tradisional atau yang bekerja secara lokal Anda dapat mengatur vars lingkungan di bashrc Anda. Di Heroku, Anda menggunakan config vars.

Dengan Foreman dan .envfile 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.

Kolonel Panic
sumber
1
Jawaban ini tidak cukup perhatian, tetapi kebanyakan bertepatan dengan cara linux.
Nikolay Fominyh
11
Jadi, jika vars lingkungan diatur di bashrc Anda, dan Anda sedang menggunakan server baru, lalu apa yang menciptakan bashrc? Bukankah itu hanya memindahkan kata sandi dari repo kode sumber Anda, dan ke konfigurasi penyebaran Anda? (yang mungkin juga dalam repo kode sumber, atau dalam repo sendiri?)
Jonathan Hartley
@JonathanHartley .bashrc Anda seharusnya tidak ada dalam kode repo untuk aplikasi Django Anda.
Steve
4
Maaf, komentar saya tidak jelas, tetapi itu karena saya benar-benar bingung. Saya suka suara dari sudut pandang jawaban ini, tetapi tidak pernah sepenuhnya memahaminya. Jika saya menggunakan beberapa lingkungan berbeda, yang masing-masing berisi beberapa host, dan mungkin beberapa jenis host, maka jelas saya perlu mengotomatiskan pembuatan file .bashrc yang akan ada pada setiap host untuk mengatur variabel lingkungannya. Jadi, apakah jawaban yang mengatakan saya harus memiliki repo kedua , terpisah dari sumber saya, yang berisi semua pengaturan yang akan menjadi variabel lingkungan di .bashrc pada penerapan?
Jonathan Hartley
1
Mereka hanya perlu dikonfigurasi setelah mesin PER Anda menyebarkan. Jika proses penyebaran Anda adalah "memutar mesin baru dan mengujinya tidak apa-apa sebelum mengarahkan lalu lintas ke sana lalu menembak yang lama di kepala", yang merupakan praktik terbaik IMHO, maka Anda benar-benar perlu mengotomatiskan pembuatan apa pun yang menetapkan env vars.
Jonathan Hartley
16

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.

Samy Dindane
sumber
6
Sepertinya variabel lingkungan adalah cara yang baik untuk menjalankan aplikasi dengan pengaturan rahasia ... tetapi masih tidak menjawab pertanyaan di mana menyimpan pengaturan itu.
Chris W.
2
Anda biasanya harus memiliki file README untuk setiap aplikasi Anda. Di sana, tentukan variabel lingkungan mana yang harus ditetapkan, dan setiap kali Anda menggunakan proyek, cukup ikuti langkah-langkah dan atur masing-masing. Anda juga dapat membuat skrip shell dengan banyak export MY_ENV_VAR=, dan ketika Anda menyebarkan, cukup isi dengan nilai-nilai yang tepat dan sourceitu. Jika dengan menjaga Anda berarti versi pengaturan, Anda tidak harus melakukan hal ini di tempat pertama.
Samy Dindane
Juga, upvote untuk The Twelve-Factor App - benar-benar hal yang hebat.
Chris W.
4
@ Samy: Dan jika Anda memiliki penyebaran otomatis?
Jonathan Hartley
3
@ Samy Saya masih tidak mengerti bagaimana variabel lingkungan akan diatur. Halaman aplikasi 12 faktor juga tidak memperjelas (kecuali Anda menggunakan Heroku, yang bukan proyek saya saat ini.) Apakah kita mengatakan bahwa skrip penghasil perlu meminta toko konfigurasi pusat "Saya mesin X, tolong beri saya data konfigurasi saya ", dan yang merespons dengan nilai-nilai variabel lingkungan yang harus ditetapkan. Dalam hal ini, saya tidak berpikir Anda perlu skrip yang dihasilkan lagi. Saya berspekulasi liar di sini, apakah saya menggonggong pohon yang tepat?
Jonathan Hartley
10

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

schneck
sumber
Akan menyenangkan untuk memiliki sesuatu yang dapat saya otomatisasi. Sehingga jika file kata sandi terenkripsi saya mengubahnya secara otomatis mendekripsi file baru.
Chris W.
7
Pertanyaan menarik btw. Saya baru saja menemukan ini: github.com/shadowhand/git-encrypt yang terlihat sangat menjanjikan untuk enkripsi otomatis.
schneck
1
Wow LUAR BIASA. Deskripsi tentang git-encryptsuara 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 ...)
Chris W.
@schneck memposting komentar Anda sebagai jawaban sehingga Chris bisa menerimanya - sepertinya itu yang ia cari.
Tony Abou-Assaleh
9

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.

tiktak
sumber
1
Tapi lalu di mana menyimpan catatan kata sandi kanonik? Itu akan membuat saya gugup memiliki data yang hanya duduk di file konfigurasi pada mesin yang mungkin meledak suatu hari.
Chris W.
@ ChrisW. Jika mesin meledak, Anda tidak perlu lagi menggunakan kata sandi ... Namun, jika Anda hanya memiliki satu salinan data di mesin produksi Anda, itu akan menaikkan bendera merah. Tetapi itu tidak berarti harus dalam VCS. Seharusnya ada RAID, cadangan lengkap yang dilengkapi dengan cadangan tambahan pada media magnetik dan optik. Banyak perusahaan memiliki prosedur kontrol perubahan yang dapat menentukan bagaimana dan di mana menyimpan kata sandi dan materi sensitif lainnya di atas kertas juga.
Steve Buzonas
@ Chris Saya tidak ingin kasar tetapi sepertinya Anda tidak memberi tahu kami kebenarannya dan kata sandi yang ingin Anda simpan tidak digunakan dalam Pengembangan tetapi dalam produksi. Bukankah ini benar? Kalau tidak, mengapa Anda peduli dengan mesin pengembangan atau pengujian dan kata sandi pengembangan? Tidak ada yang akan melakukan itu.
tiktak
BTW, di perusahaan kami, semua kata sandi pengembangan tersedia di atas kertas dan di intranet. Karena mereka tidak memiliki nilai. Mereka ada di sana karena perangkat lunak yang kami kembangkan memerlukan otentikasi.
tiktak
@tiktak, Anda benar - pertanyaan saya adalah tentang apa yang berkaitan dengan kata sandi produksi. Saya tidak terlalu peduli tentang menyimpan kata sandi pengembangan di A VCS di tempat yang jelas. Maaf jika saya belum membuatnya cukup jelas.
Chris W.
7

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 :

Aman menyimpan rahasia dalam repo VCS (yaitu Git atau Mercurial). Perintah-perintah ini memudahkan Anda untuk mengenkripsi file spesifik GPG dalam repo sehingga mereka "dienkripsi saat istirahat" di repositori Anda. Namun, skrip membuatnya mudah untuk mendekripsi mereka ketika Anda perlu melihat atau mengeditnya, dan mendekripsi mereka untuk digunakan dalam produksi.

Chris W.
sumber
7

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 .gitattributesfile Anda ...

*.secret.* filter=git-crypt diff=git-crypt

... 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.

Chris W.
sumber
5

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.

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

from local_settings import DATABASES, SECRET_KEY
DATABASES = DATABASES

SECRET_KEY = SECRET_KEY

Jika pengaturan rahasia Anda serba guna, saya ingin mengatakan bahwa Anda melakukan sesuatu yang salah

Hedde van der Heide
sumber
9
Tapi aku masih harus melacak rahasia itu di suatu tempat . Misalnya, keypass atau semacamnya, kan?
Chris W.
Peraturan dan implementasi menyimpan data pribadi tergantung pada kebijakan perusahaan untuk proyek tersebut. Saya sangat meragukan kode sumber proyek adalah tempat yang tepat karena penguji atau programmer pihak ketiga mana pun dapat melihatnya
Hedde van der Heide
4

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.

  1. Anda menyimpan kunci di mesin lokal Anda.
  2. Anda menambahkan 'mypassword' ke file yang diabaikan.
  3. Pada pre-commit hook Anda mengenkripsi file mypassword ke dalam file mypassword.gpg yang dilacak oleh git dan menambahkannya ke komit.
  4. Pada post-merge hook Anda cukup mendekripsi mypassword.gpg ke mypassword.

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.

pielgrzym
sumber
3

Biasanya, saya memisahkan kata sandi sebagai file konfigurasi. dan membuat mereka berbeda.

/yourapp
    main.py
    default.cfg.dist

Dan ketika saya menjalankan main.py, masukkan kata sandi asli ke dalam default.cfgsalinan itu.

ps. ketika Anda bekerja dengan git atau hg. Anda dapat mengabaikan *.cfgfile untuk membuat .gitignoreatau.hgignore

mengagumi
sumber
File .dist adalah apa yang saya bicarakan: contoh file konfigurasi nyata. Praktik yang baik adalah bahwa itu mungkin untuk menjalankan perangkat lunak hanya dengan mengganti nama dengan menghapus ekstensi ".dist" (atau lebih baik: menyalin), yaitu, Anda harus dapat mencoba perangkat lunak dalam hitungan detik, tanpa harus mengkonfigurasinya selama sepanjang hari.
tiktak
3

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.

dietbuddha
sumber
2

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.

Willian
sumber
Maka perangkat lunak perlu mendekripsi file kata sandi.
tiktak
Ya, hanya ketika menyebarkan situs, kata sandi dapat didekripsi dan ditulis ke file kata sandi teks biasa
Willian
2

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.wsgimodul yang mendefinisikan applicationobjek 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:

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.local")

# This application object is used by the development server
# as well as any WSGI server configured to use this file.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

Sekarang Anda dapat memiliki local.pymodul yang pemilik dan grupnya dapat dikonfigurasi sehingga hanya personel yang berwenang dan proses Django yang dapat membaca konten file.

Filip Dupanović
sumber
2

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 .

Bernhard Vallant
sumber
1

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.

Kai Peters
sumber
1

Inilah yang saya lakukan:

  • Simpan semua rahasia sebagai env vars di $ HOME / .secrets (go-r perms) yang $ HOME / .bashrc sumber (cara ini jika Anda membuka .bashrc di depan seseorang, mereka tidak akan melihat rahasia)
  • File konfigurasi disimpan dalam VCS sebagai templat, seperti config.properties yang disimpan sebagai config.properties.tmpl
  • 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.

Pavel Chernikov
sumber
0

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).

dronus
sumber