Bagaimana cara menangani data sensitif saat menggunakan Github dan Heroku?

49

Saya belum terbiasa dengan cara Git bekerja (Dan bertanya-tanya apakah seseorang selain Linus adalah;)).

Jika Anda menggunakan Heroku untuk meng-host aplikasi Anda, Anda harus memiliki kode Anda diperiksa dalam repo Git. Jika Anda bekerja pada proyek open-source, Anda kemungkinan besar akan membagikan repo ini di Github atau host Git lainnya.

Beberapa hal tidak boleh diperiksa di repo publik; kata sandi basis data, kunci API, sertifikat, dll ... Tetapi hal-hal ini masih perlu menjadi bagian dari repo Git karena Anda menggunakannya untuk mendorong kode Anda ke Heroku.

Bagaimana cara mengatasi use case ini?

Catatan: Saya tahu bahwa Heroku atau PHPFog dapat menggunakan variabel server untuk menghindari masalah ini. Pertanyaan saya lebih lanjut tentang bagaimana "menyembunyikan" bagian kode.

Jonas
sumber
3
Saya akan mulai dengan menggunakan repo pribadi. Kemudian, tergantung seberapa besar saya mempercayainya, saya dapat .gitignore file konfigurasi saya yang berisi data sensitif dan hanya versi mereka secara lokal. (Lokal menjadi lokasi sentral non eksternal yang mungkin merupakan server in-house atau siapa tahu)
Rig

Jawaban:

30

Metode yang lebih disukai untuk menjaga kerahasiaan kata sandi / kunci api di heroku adalah dengan menetapkan nilai konfigurasi melalui aplikasi commandline heroku. Contoh berikut diambil dari artikel pusat heroku dev

(Contoh di bawah ini, dan seluruh jawaban saya terkait dengan aplikasi rails)

$ cd myapp
$ heroku config:add S3_KEY=8N029N81 S3_SECRET=9s83109d3+583493190
Adding config vars and restarting myapp... done, v14
S3_KEY:     8N029N81
S3_SECRET:  9s83109d3+583493190

Kemudian referensi nilai-nilai konfigurasi ini dalam kode Anda menggunakan variabel ENV []

AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV['S3_KEY'],
  :secret_access_key => ENV['S3_SECRET']
)

Dengan cara ini kata sandi sensitif Anda tidak disimpan di repositori git. (Catatan: Saat menjalankan aplikasi secara lokal, tetapkan nilai-nilai ini dalam .bashrcfile Anda

Juga, saya tidak yakin jenis aplikasi apa yang Anda jalankan, tetapi di Rails, heroku tidak menggunakan file database.yml Anda, itu hanya mengatur nama pengguna / kata sandi database Anda sesuai dengan pengaturan aplikasi Anda. Jadi Anda dapat menghindari menyimpan kredensial itu di git

Juga, jika Anda menjalankan aplikasi Anda sendiri dan ingin tetap pribadi, alternatif yang bagus untuk github adalah bitbucket yang menawarkan repositori pribadi gratis.

Mike Vormwald
sumber
17

Beberapa ide ... Public Key Cryptography adalah jawaban yang paling fleksibel.

Kebingungan (hanya untuk kode)

Untuk bagian kode yang ingin Anda sembunyikan, dapatkah Anda menempatkannya di proyek yang berbeda, mengkompilasinya, dan memeriksa hanya kode yang dikompilasi, bukan sumbernya? Ini bukan enkripsi dan tidak cocok untuk mengenkripsi kata sandi atau kunci. Orang-orang masih dapat merekayasa ulang kode kompilasi Anda, tetapi mereka tidak mendapatkan sumbernya.

Repositori GIT pribadi

Apakah itu harus menjadi repositori git publik ?

Penyimpanan Server

Bisakah Anda menyimpan info ini dalam file yang dilindungi di direktori home dari akun pengguna yang dijalankan aplikasi tersebut? Saya akan menyalin cara ssh melakukan ini dengan ~ / .ssh / id_rsa dan chmod 600. Gagal, variabel lingkungan dapat digunakan. Anda memerlukan suatu tempat di server untuk menyimpan beberapa jenis kunci, atau Anda tidak dapat melindungi apa pun.

Kriptografi Symmetric (hanya untuk Anda)

Jika Anda adalah pengembang tunggal, Anda bisa meletakkan kunci di server dan memiliki kunci yang sama pada mesin Anda dan menggunakan skema enkripsi simetris untuk melindungi beberapa data seperti kata sandi atau sertifikat. Berbagi kunci simetris dengan teman menjadi berantakan.

Asymmetric Cryptography (untuk banyak pengembang)

Jika pengembang lain perlu memeriksa hal-hal rahasia ke dalam repositori git publik,, kunci publik / kunci privat (asimetris) kriptografi dibuat untuk hal semacam ini. Instal kunci pribadi di server Anda (jangan centang ke kontrol sumber!) Dan buat kunci publik darinya. Enkripsi data rahasia Anda menggunakan kunci publik server. Hanya server yang dapat mendekripsi data menggunakan kunci privatnya. Anda bahkan dapat memeriksa kunci publik ke dalam kontrol sumber sehingga orang lain dapat mengenkripsi data menggunakan kunci publik yang sama dan hanya server yang dapat mendekripsi itu.

Alat

Openssl mungkin satu-satunya alat kriptografi yang Anda butuhkan. Jangan menulis algoritma kriptografi Anda sendiri atau implementasi algoritma yang Anda publikasikan sendiri.

Pikiran penutup

Jika "server" adalah server web yang menggunakan https, maka Anda harus sudah memiliki semacam kunci aman di server untuk menyimpan kunci pribadi. Ini agak mengejutkan bahwa perusahaan hosting tidak akan membuat penyisihan untuk ini. Mungkin mereka memiliki beberapa petunjuk tentang bagaimana orang lain mengatasi tantangan yang Anda hadapi?

GlenPeterson
sumber
Untuk menambahkan, WRT ke penyimpanan sisi server - Saya tidak tahu apakah Anda dapat melakukan ini dengan Heroku, tetapi saya telah melihat pengaturan di mana skrip ditembakkan dari kiriman pasca-terima dan / atau sesuatu seperti Capistrano di server penempatan untuk salin file database penggunaan ke lokasi yang benar. Ini memungkinkan Anda untuk menjaga file database dari repo sepenuhnya, dan memiliki mekanisme otomatis untuk memastikan informasi tersebut masih ada.
Shauna
Bahkan repositori GIT pribadi harus melindungi data sensitif. Untuk berjaga-jaga kalau itu dipublikasikan untuk sementara waktu. Juga, saya berpikir bahwa kripto asimetris harus selalu digunakan, bukan simetris. Saya melihat tidak ada kerugian untuk itu, hanya ini terbalik: Anda bahkan dapat meninggalkan API di suatu tempat untuk membuatnya lebih mudah untuk mengenkripsi data to-be-hardcode baru yang sensitif.
Tiberiu-Ionuț Stan
7

Jika Anda ingin menjalankan kode Anda di Heroku, Anda harus memberikannya kepada mereka - Anda tidak dapat merahasiakannya dari penyedia hosting Anda.

Sejauh repositori public git pergi, jika proyek Anda adalah open source tetapi Anda tidak ingin berbagi rincian hosting, Anda perlu mempertahankan garpu pribadi dari proyek Anda untuk keperluan penyebaran.

Richard Nichols
sumber
1
Terima kasih, tetapi apa alur kerjanya untuk ini?
Jonas
6

Anda tidak boleh menyembunyikan bagian dari kode. Keamanan sistem Anda tidak harus bergantung pada kerahasiaan kode; yang dikenal sebagai "keamanan melalui ketidakjelasan", yang disukai oleh para ahli keamanan karena bekerja sangat buruk.

Sebaliknya, kata sandi, kunci crypto, dll. Harus disimpan terpisah dari kode. Simpan di file konfigurasi atau nilai konfigurasi terpisah yang dibaca oleh kode. Anda tidak perlu menyimpannya di git.

Penting: Jangan pernah menyimpan kode kunci kriptografis, kata sandi, atau rahasia lain dalam kode sumber Anda! Itu praktik yang sangat buruk.

Lihat juga:

Pasang: IT Security.SE adalah tempat yang tepat untuk mengajukan pertanyaan tentang keamanan!

DW
sumber