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