Apa yang dimaksud dengan rahasia, dan bagaimana menanganinya di Java

Selesai

Rahasia adalah untai karakter yang tidak boleh dibagikan dengan dunia luar: bisa berupa kata sandi database, kunci enkripsi privat, token akses pribadi, dan sebagainya. Untuk meningkatkan keamanan, banyak orang juga menganggap bahwa apa pun yang dapat membantu penyerang harus dianggap sebagai rahasia: misalnya, URL ke database produksi Anda dapat dilihat sebagai rahasia. Database Anda seharusnya tidak dapat diakses secara publik. Alasannya adalah bahwa jenis informasi ini bersifat sensitif, dan semakin sedikit informasi yang tersedia dalam kode Anda, semakin baik.

Apa yang dimaksud dengan Zero Trust dan Zero Secret?

Konsep Zero Trust adalah bahwa tidak seorang pun boleh dipercaya sepenuhnya, dan diizinkan untuk mengakses sumber daya perusahaan tanpa divalidasi dan disahkan.

Konsep ini juga berlaku untuk aplikasi Web: aplikasi tidak boleh menyimpan rahasia dalam kodenya atau dalam binari terakhirnya. Itulah yang kita sebut Zero Secret.

Rahasia harus dikelola oleh sistem eksternal, dengan aturan akses dan validasi yang ketat, untuk mengurangi risiko serangan.

Jangan memasukkan rahasia ke dalam repositori Git

Bahkan jika repositori Git Anda bersifat privat, memasukkan rahasia apa pun ke dalam kode sumber Anda adalah praktik yang buruk:

  • Siapa pun yang memiliki akses ke repositori Anda akan mengetahui data sensitif Anda
  • Siapa saja yang memiliki akses ke biner aplikasi Anda akan dapat mengekstrak rahasia darinya

Selain itu, begitu sebuah rahasia disimpan ke dalam Git, penyerang selalu dapat menemukannya dengan melihat ke dalam riwayat repositori, di mana rahasia itu dapat dilupakan untuk waktu yang lama.

Bahkan jika itu tampak praktis, Anda tidak boleh menyimpan rahasia apa pun di repositori kode sumber Anda. Untuk menghindari masalah ini, Anda dapat menggunakan alat otomatis yang secara teratur memeriksa repositori Anda dan akan mengirimkan peringatan jika mereka menemukan kata sandi atau URL database yang disimpan secara tidak sengaja.

Menggunakan variabel lingkungan

Solusi termudah untuk mengelola rahasia adalah dengan menggunakan variabel lingkungan. Variabel lingkungan memiliki beberapa keuntungan:

  • Itu mudah digunakan,
  • Itu bekerja pada semua sistem (bahkan sistem non-cloud),
  • Semua orang tahu apa itu variabel lingkungan dan mengerti cara kerjanya.

Namun, variabel lingkungan tidak cukup aman: semua proses pada sistem Anda dapat membacanya, dan variabel tersebut akan mudah diekspos menggunakan JMX pada sistem Java.

Akibatnya, variabel lingkungan sering dilihat sebagai langkah pertama menuju Zero Trust: variabel lingkungan lebih aman daripada menyimpan rahasia langsung ke dalam kode sumber, tetapi tidak memiliki kemampuan manajemen dan mudah diakses oleh penyerang.

Menggunakan rahasia Kubernetes

Kubernetes memiliki gagasan tentang secrets, yang merupakan solusi bagus lainnya. Rahasia tersebut dapat dimuat sebagai file pada sistem file aplikasi: program Java kemudian dapat membaca file tersebut pada saat pemulaian, untuk mengakses rahasia tersebut. Alat seperti Spring Frameworks bahkan memiliki dukungan standar untuk mekanisme ini, memungkinkan alat tersebut menggunakan rahasia tersebut dengan cara yang mudah dan efisien.

Mekanisme ini lebih aman daripada variabel lingkungan, karena file tersebut hanya dapat dibaca oleh proses yang membutuhkannya. Mekanisme ini juga mendapat keuntungan dari ekosistem Kubernetes yang kaya, dan dapat dikelola oleh berbagai alat manajemen, termasuk alat yang disediakan oleh penyedia cloud Anda.

Meskipun rahasia Kubernetes adalah solusi yang baik untuk Kubernetes, rahasia itu juga terbatas pada Kubernetes, dan tidak memiliki kemampuan manajemen tingkat lanjut, bergantung pada alat yang digunakan untuk mengelola infrastruktur Kubernetes.

Menggunakan penyimpanan Rahasia

Penyimpanan Rahasia, seperti Hashicorp Vault atau Azure Key Vault, adalah perangkat lunak khusus untuk mengelola rahasia. Penyimpanan ini menawarkan sistem manajemen yang kaya untuk mengotorisasi pengguna, memutar kunci keamanan, dan memvalidasi aplikasi mana yang dapat mengakses rahasia mana.

Penyimpanan ini juga menyediakan API eksternal, sehingga dapat digunakan di sistem apa pun. Misalnya, Anda dapat menggunakan Azure Key Vault di semua layanan Azure, termasuk Virtual Machines, Azure App Services, Azure Kubernetes Services, atau Azure Spring Apps.

Penyimpanan Rahasia adalah solusi paling aman dan canggih untuk mengelola rahasia, tetapi penyimpanan ini memerlukan penggunaan alat khusus.