Menjaga rahasia di luar kendali sumber - apakah kita hanya memindahkan masalahnya?

10

Saya mewarisi beberapa proyek di mana rahasia dalam kontrol sumber di App.config dan file serupa. Untungnya ini bukan repositori publik sehingga risikonya tidak seserius seharusnya. Saya mencari cara yang lebih baik untuk mengelola ini, seperti Azure KeyVault. (Tapi saya tidak bermaksud pertanyaan ini khusus untuk solusi itu.)

Secara umum, bukankah kita hanya memindahkan masalahnya? Misalnya, dengan Azure KeyVault, ID aplikasi dan rahasia aplikasi menjadi hal-hal yang Anda butuhkan untuk tetap di luar kendali sumber. Berikut ini adalah contoh khas bagaimana ini cenderung salah. Pendekatan lain akhirnya menjadi serupa, dengan kunci API atau file keystore yang harus Anda lindungi.

Sepertinya saya bahwa produk seperti Azure KeyVault tidak lebih baik, dan tanpa tujuan lebih rumit, daripada menyimpan rahasia Anda dalam file konfigurasi terpisah dan memastikannya ada di .gitignore atau yang setara. File ini harus dibagikan sesuai kebutuhan melalui saluran samping. Tentu saja, orang mungkin akan saling tidak aman mengirim email satu sama lain ...

Apakah ada cara untuk mengelola rahasia yang tidak hanya memindahkan masalah? Saya percaya pertanyaan ini memiliki satu jawaban yang jelas. Dengan analogi, jika saya bertanya bagaimana HTTPS tidak hanya memindahkan masalah, jawabannya adalah bahwa kunci CA didistribusikan dengan OS Anda, dan kami mempercayainya karena kami memercayai metode distribusi OS. (Apakah kita harus merupakan pertanyaan terpisah ...)

StackOverthrow
sumber

Jawaban:

12

Bisa dibilang Anda baru memindahkan masalahnya. Pada akhirnya, harus ada rahasia yang tersimpan di suatu tempat yang memiliki akses ke aplikasi Anda untuk memiliki kata sandi, kunci ssh, apa pun.

Tetapi, jika dilakukan dengan benar, Anda memindahkan masalah dari suatu tempat yang sulit diamankan dengan benar ke masalah yang dapat Anda jaga lebih baik. Misalnya, menaruh rahasia di repo github publik hampir seperti membiarkan kunci rumah Anda ditempel di pintu depan Anda. Siapa pun yang menginginkannya tidak akan kesulitan menemukan mereka. Tetapi jika Anda pindah ke, katakan toko kunci di jaringan internal tanpa konektivitas luar Anda memiliki peluang yang jauh lebih baik untuk menjaga keamanan kata sandi Anda. Itu lebih seperti menyimpan kunci Anda di saku Anda. Bukan tidak mungkin kehilangan mereka (setara dengan memberikan kata sandi Azure Anda misalnya), tetapi membatasi eksposur Anda vs menempelkan kunci Anda ke pintu Anda.

Becuzz
sumber
4

Rahasia seperti kunci enkripsi dan kredensial tidak boleh diperiksa ke dalam kontrol sumber karena beberapa alasan. Yang pertama jelas bahwa kunci enkripsi dan kredensial harus selalu berdasarkan kebutuhan untuk mengetahui, dan kontrol sumber bukanlah cara yang dapat diandalkan untuk melindungi informasi dari pengungkapan. Alasan lain mengapa Anda tidak ingin rahasia seperti itu dalam kontrol sumber Anda biasanya karena rahasia biasanya (tetapi tidak selalu) spesifik untuk atribut tertentu dari lingkungan aplikasi Anda akan berjalan masuk (Mis. Memperoleh kunci pribadi untuk membuat digital tanda tangan diperlukan untuk otorisasi layanan web, titik akhir spesifik dari layanan web tersebut dapat berjalan di lingkungan QA yang membutuhkan tanda tangan QA).

Cara yang benar untuk memperlakukan suatu lingkungan (atau rahasia global) adalah memperlakukannya seperti Anda memperlakukan atribut konfigurasi lingkungan lainnya, dengan kontrol keamanan tambahan untuk ukuran yang baik. Modul kode yang dirancang dengan baik, independen dan dapat versi harus identik di seluruh lingkungan sedemikian rupa sehingga lingkungan yang digunakan untuk menginformasikan aplikasi tentang atributnya (mis. Rincian koneksi basis data, kredensial, titik akhir layanan web, jalur file, dll ...) Sekarang detail konfigurasi yang penting untuk aplikasi Anda dieksternalisasi dan menjadi parameter konfigurasi lingkungan Anda.

Sekarang untuk membahas beberapa argumen Anda:

Secara umum, bukankah kita hanya memindahkan masalahnya?

Tidak ada keamanan yang sempurna, namun "memindahkan" masalah ke area di mana tindakan dan kontrol tambahan dapat dilakukan akan meningkatkan kesulitan dan mengurangi kemungkinan pengungkapan rahasia secara tidak sengaja atau berbahaya. Aturan praktis yang baik untuk diikuti ketika merancang sistem di mana data rahasia harus dilindungi adalah untuk selalu menempatkan kontrol dalam dua pasangan. Yang saya maksudkan adalah untuk memastikan bahwa pengungkapan informasi rahasia atau keamanan secara tidak sengaja atau berbahaya terjadi maka harus ada kegagalan atau dalam dua atau lebih kontrol.

Contoh yang baik dari ini mungkin menyimpan file yang dienkripsi di server. Saya juga memiliki kunci dekripsi rahasia yang harus saya jaga kerahasiaannya di file lain.

  • Simpan kunci dan file terenkripsi di server yang sama (0 Kontrol, siapa pun yang memiliki akses ke server dapat dengan sepele memperoleh informasi rahasia)
  • Lakukan langkah-langkah di atas dan lindungi akses file ke kedua file sehingga hanya dapat dibaca oleh pengguna runtime aplikasi OS (1 Kontrol, kompromi kata sandi pengguna root atau pengguna runtime aplikasi akan memungkinkan penyerang memperoleh informasi rahasia)
  • Simpan kunci dalam brankas kunci eksternal, dapatkan kunci dengan berbagai tindakan keamanan seperti daftar putih alamat IP, otentikasi sertifikat, dan tindakan lain pada aplikasi yang dapat mengakses file terenkripsi pada sistem file-nya. (Banyak Kontrol, banyak kegagalan kontrol keamanan harus terjadi agar data rahasia dikompromikan)

Sekali lagi, tidak ada yang namanya keamanan sempurna tetapi tujuan memiliki banyak kontrol memastikan bahwa beberapa kegagalan perlu terjadi agar pengungkapan terjadi.

Sepertinya saya bahwa produk-produk seperti Azure KeyVault tidak lebih baik, dan tentu saja lebih rumit,

Rumit ya, tidak ada artinya sepenuhnya subjektif. Kami tidak dapat berdiskusi tentang tidak ada gunanya keamanan tambahan tanpa secara realistis mempertimbangkan seberapa serius data rahasia akan terungkap. Jika seseorang dapat menggunakan data rahasia untuk mengirim transfer kawat ilegal dari lembaga keuangan Anda, maka sesuatu seperti kunci lemari besi adalah tentang hal terjauh dari yang tidak ada gunanya.

daripada menyimpan rahasia Anda di file konfigurasi terpisah dan memastikannya ada di .gitignore atau yang setara.

Sampai seseorang tanpa sengaja memeriksanya ke dalam kendali sumber, sekarang rahasia itu tertanam dalam sejarah kendali sumber selamanya.

Tentu saja, orang mungkin akan saling tidak aman mengirim email satu sama lain ...

Keamanan bukan hanya masalah teknis, tetapi juga masalah orang. Itu akan keluar dari topik namun saya merasa pada titik ini Anda mencoba untuk berbicara sendiri tentang melakukan yang diperlukan.

Apakah ada cara untuk mengelola rahasia yang tidak hanya memindahkan masalah? Saya percaya pertanyaan ini memiliki satu jawaban yang jelas. Dengan analogi, jika saya bertanya bagaimana HTTPS tidak hanya memindahkan masalah, jawabannya adalah bahwa kunci CA didistribusikan dengan OS Anda, dan kami mempercayainya karena kami memercayai metode distribusi OS.

Keamanan tidak selalu membuat masalah hilang, sebagian besar waktu menempatkan kontrol di sekitar mereka. Analogi Anda ringkas karena sebenarnya itulah yang dilakukan kriptografi kunci publik-swasta. Kami "memindahkan masalah" ke CA dengan menempatkan kepercayaan penuh dan tak tertandingi di CA kami untuk menjamin identitas entitas yang memiliki sertifikat publik. Pada dasarnya, tidak ada kekurangan kegagalan yang besar (mis. Kehilangan kepercayaan pada CA) harus terjadi untuk mengarah pada masalah keamanan.

Seperti banyak hal lainnya, keamanan adalah garis yang harus Anda tarik berdasarkan kriteria subjektif, sifat data, konsekuensi dari pengungkapan, selera risiko, anggaran, dll ...

maple_shaft
sumber
0

Layak untuk mempertimbangkan git secretproyek ( http://git-secret.io/ ) untuk menyimpan file rahasia di git repo yang dienkripsi dengan kunci asimetrik. Kunci publik juga dalam repo, kunci pribadi tidak.

Fitur dari pendekatan ini adalah:

  • ketika pengguna baru / mesin perlu mendekripsi file aman - ia menerbitkan / mengirim kunci gpg publik (penjaga privasi alias pgp). Pengguna yang sudah dapat mendekripsi file aman dapat mengenkripsi ulang mereka dengan kunci tambahan baru - setelah itu pengguna baru dapat mendekripsi file aman dengan kunci pribadinya.
  • jelas Anda perlu mengontrol siapa yang dapat melakukan / mendorong ke repositori git. Jika tidak, penyerang dapat melakukan kunci publiknya sendiri dan menunggu sampai seseorang yang berwenang akan mengenkripsi ulang file yang diamankan dengan kunci publik baru yang disusupi ini.
Tomas Kulhanek
sumber