Tiga belas aturan untuk mengembangkan aplikasi Java yang aman

Keamanan adalah salah satu aspek pengembangan perangkat lunak yang paling kompleks, luas, dan penting. Keamanan perangkat lunak juga sering diabaikan, atau disederhanakan menjadi hanya beberapa penyesuaian kecil di akhir siklus pengembangan. Kami dapat melihat hasilnya dalam daftar tahunan pelanggaran keamanan data utama, yang pada 2019 berjumlah lebih dari 3 miliar catatan yang terekspos. Jika itu bisa terjadi pada Capital One, itu bisa terjadi pada Anda.

Kabar baiknya adalah Java adalah platform pengembangan yang sudah lama ada dengan banyak fitur keamanan bawaan. Paket Keamanan Java telah menjalani pengujian pertempuran intensif, dan sering diperbarui untuk kerentanan keamanan baru. Java EE Security API yang lebih baru, dirilis pada September 2017, mengatasi kerentanan dalam arsitektur cloud dan layanan mikro. Ekosistem Java juga mencakup berbagai alat untuk membuat profil dan melaporkan masalah keamanan. 

Tetapi bahkan dengan platform pengembangan yang solid, tetaplah waspada. Pengembangan aplikasi adalah pekerjaan yang kompleks, dan kerentanan dapat bersembunyi di latar belakang kebisingan. Anda harus memikirkan tentang keamanan di setiap tahap pengembangan aplikasi, mulai dari fitur bahasa tingkat kelas hingga otorisasi titik akhir API.

Aturan dasar berikut menawarkan fondasi yang baik untuk membangun aplikasi Java yang lebih aman.

Aturan keamanan Java # 1: Tulis kode Java yang bersih dan kuat

Kerentanan suka bersembunyi dalam kerumitan, jadi jaga agar kode Anda sesederhana mungkin tanpa mengorbankan fungsionalitas. Menggunakan prinsip desain yang sudah terbukti seperti KERING (jangan mengulang sendiri) akan membantu Anda menulis kode yang lebih mudah ditinjau untuk masalah.  

Selalu ungkapkan informasi sesedikit mungkin dalam kode Anda. Menyembunyikan detail implementasi mendukung kode yang dapat dipelihara dan aman. Ketiga tip ini akan sangat membantu dalam menulis kode Java yang aman:

  • Manfaatkan pengubah akses Java dengan baik . Mengetahui cara mendeklarasikan tingkat akses yang berbeda untuk kelas, metode, dan atributnya akan sangat membantu melindungi kode Anda. Segala sesuatu yang bisa dijadikan pribadi, harus pribadi. 
  • Hindari refleksi dan introspeksi . Ada beberapa kasus di mana teknik lanjutan seperti itu bermanfaat, tetapi sebagian besar Anda harus menghindarinya. Menggunakan refleksi menghilangkan pengetikan yang kuat, yang dapat menyebabkan titik lemah dan ketidakstabilan pada kode Anda. Membandingkan nama kelas sebagai string rawan kesalahan dan dapat dengan mudah menyebabkan benturan namespace.
  • Selalu tentukan API dan permukaan antarmuka sekecil mungkin . Pisahkan komponen dan buat mereka berinteraksi di area sekecil mungkin. Meskipun satu area aplikasi Anda terinfeksi oleh pelanggaran, area lain akan aman. 

Aturan keamanan Java # 2: Hindari serialisasi

Ini adalah tip pengkodean lainnya, tetapi cukup penting untuk menjadi aturannya sendiri. Serialisasi mengambil input jarak jauh dan mengubahnya menjadi objek yang diberkahi sepenuhnya. Ini membagi dengan konstruktor dan pengubah akses, dan memungkinkan aliran data yang tidak diketahui menjadi kode yang berjalan di JVM. Akibatnya, serialisasi Java sangat tidak aman dan inheren.

Akhir serialisasi Java

Jika Anda belum pernah mendengarnya, Oracle memiliki rencana jangka panjang untuk menghapus serialisasi dari Java. Mark Reinhold, kepala arsitek grup platform Java di Oracle, mengatakan bahwa dia yakin sepertiga atau lebih dari semua kerentanan Java melibatkan serialisasi.

Sebisa mungkin, hindari serialisasi / deserialisasi dalam kode Java Anda. Sebagai gantinya, pertimbangkan untuk menggunakan format serialisasi seperti JSON atau YAML. Jangan pernah mengekspos titik akhir jaringan yang tidak dilindungi yang menerima dan bertindak atas aliran serialisasi. Ini hanyalah tikar selamat datang untuk kekacauan.

Aturan keamanan Java # 3: Jangan pernah mengekspos kredensial atau PII yang tidak dienkripsi

Sulit dipercaya, tetapi kesalahan yang bisa dihindari ini menyebabkan rasa sakit dari tahun ke tahun.

Saat pengguna memasukkan kata sandi ke browser, kata sandi itu dikirim sebagai teks biasa ke server Anda. Itu seharusnya menjadi yang terakhir kali ia melihat cahaya siang hari. Anda harus mengenkripsi kata sandi melalui sandi satu arah sebelum menyimpannya ke database, lalu melakukannya lagi setiap kali membandingkan dengan nilai tersebut.

Aturan sandi berlaku untuk semua informasi identitas pribadi (PII): kartu kredit, nomor jaminan sosial, dll. Informasi pribadi apa pun yang dipercayakan ke aplikasi Anda harus ditangani dengan sangat hati-hati.

Kredensial atau PII yang tidak dienkripsi dalam database adalah celah keamanan yang menganga, menunggu penyerang menemukan. Demikian pula, jangan pernah menulis kredensial mentah ke log, atau mengirimkannya ke file atau jaringan. Sebagai gantinya, buat hash asin untuk kata sandi Anda. Pastikan untuk melakukan riset dan menggunakan algoritme hashing yang direkomendasikan.

Langsung ke Aturan # 4: selalu gunakan perpustakaan untuk enkripsi; jangan gulung sendiri.

Aturan keamanan Java # 4: Gunakan pustaka yang dikenal dan diuji

Puaskan mata Anda dengan tanya jawab tentang memutar algoritme keamanan Anda sendiri. Pelajaran tl; dr adalah: gunakan library dan framework yang diketahui dan andal jika memungkinkan. Ini berlaku di seluruh spektrum, dari hashing kata sandi hingga otorisasi REST API.

Untungnya, Jawa dan ekosistemnya mendukung Anda di sini. Untuk keamanan aplikasi, Keamanan Musim Semi adalah standar de facto. Ini menawarkan berbagai pilihan dan fleksibilitas agar sesuai dengan arsitektur aplikasi apa pun, dan itu menggabungkan berbagai pendekatan keamanan.

Naluri pertama Anda dalam menangani keamanan seharusnya melakukan riset. Teliti praktik terbaik, lalu teliti pustaka apa yang akan menerapkan praktik tersebut untuk Anda. Misalnya, jika Anda ingin menggunakan Token Web JSON untuk mengelola autentikasi dan otorisasi, lihat pustaka Java yang merangkum JWT, lalu pelajari cara mengintegrasikannya ke Spring Security.

Bahkan menggunakan alat yang andal, cukup mudah untuk mengacaukan otorisasi dan otentikasi. Pastikan untuk bergerak perlahan dan periksa kembali semua yang Anda lakukan.

Aturan keamanan Java # 5: Bersikaplah paranoid tentang masukan eksternal

Baik itu berasal dari pengguna yang mengetik ke dalam formulir, datastore, atau API jarak jauh, jangan pernah mempercayai input eksternal.

Injeksi SQL dan skrip lintas situs (XSS) hanyalah serangan yang paling umum diketahui yang dapat diakibatkan oleh kesalahan penanganan input eksternal. Contoh yang kurang dikenal - salah satu dari banyak - adalah "serangan miliaran tawa," di mana perluasan entitas XML dapat menyebabkan serangan Denial of Service.

Setiap kali Anda menerima masukan, itu harus diperiksa kewarasannya dan disterilkan. Hal ini terutama berlaku untuk semua hal yang mungkin disajikan ke alat atau sistem lain untuk diproses. Misalnya, jika ada sesuatu yang bisa menjadi argumen untuk baris perintah OS: waspadalah!

Contoh khusus dan terkenal adalah injeksi SQL, yang dibahas dalam aturan berikutnya.

Aturan keamanan Java # 6: Selalu gunakan pernyataan yang disiapkan untuk menangani parameter SQL

Setiap kali Anda membuat pernyataan SQL, Anda berisiko menginterpolasi fragmen kode yang dapat dieksekusi.

Mengetahui hal ini, merupakan praktik yang baik untuk selalu menggunakan kelas java.sql.PreparedStatement untuk membuat SQL. Fasilitas serupa ada untuk toko NoSQL seperti MongoDB. Jika Anda menggunakan lapisan ORM, penerapan akan menggunakan PreparedStatements untuk Anda di balik terpal.

Aturan keamanan Java # 7: Jangan mengungkapkan implementasi melalui pesan kesalahan

Pesan kesalahan dalam produksi dapat menjadi sumber informasi yang subur bagi penyerang. Pelacakan tumpukan, khususnya, dapat mengungkapkan informasi tentang teknologi yang Anda gunakan dan cara Anda menggunakannya. Hindari mengungkapkan pelacakan tumpukan kepada pengguna akhir.

Lansiran gagal masuk juga termasuk dalam kategori ini. Secara umum diterima bahwa pesan kesalahan harus diberikan sebagai "Login gagal" versus "Tidak menemukan pengguna itu" atau "Sandi salah." Tawarkan bantuan sesedikit mungkin kepada pengguna yang berpotensi jahat.

Idealnya, pesan kesalahan tidak boleh mengungkapkan tumpukan teknologi yang mendasari aplikasi Anda. Jaga agar informasi itu tetap buram.

Aturan keamanan Java # 8: Selalu perbarui rilis keamanan

Pada 2019, Oracle telah menerapkan skema lisensi baru dan jadwal rilis untuk Java. Sayangnya bagi pengembang, irama rilis baru tidak membuat segalanya lebih mudah. Meskipun demikian, Anda bertanggung jawab untuk sering memeriksa pembaruan keamanan dan menerapkannya ke JRE dan JDK Anda.

Pastikan Anda mengetahui patch penting apa yang tersedia dengan secara teratur memeriksa homepage Oracle untuk peringatan keamanan. Setiap kuartal, Oracle memberikan update patch otomatis untuk rilis Java LTS (long-term-support) saat ini. Masalahnya adalah, patch itu hanya tersedia jika Anda membayar untuk lisensi dukungan Java.

Jika organisasi Anda membayar lisensi semacam itu, ikuti rute pembaruan otomatis. Jika tidak, Anda mungkin menggunakan OpenJDK, dan Anda harus melakukan tambalan sendiri. Dalam kasus ini, Anda dapat menerapkan tambalan biner, atau Anda dapat mengganti instalasi OpenJDK yang ada dengan versi terbaru. Atau, Anda dapat menggunakan OpenJDK yang didukung secara komersial seperti Azul's Zulu Enterprise.

Apakah Anda membutuhkan semua patch keamanan?

Jika Anda memperhatikan peringatan keamanan dengan cermat, Anda mungkin merasa tidak memerlukan serangkaian pembaruan tertentu. Misalnya, rilis Januari 2020 tampaknya merupakan pembaruan Java yang penting; namun, pembacaan yang cermat menunjukkan bahwa pembaruan hanya menambal lubang di keamanan applet Java, dan tidak memengaruhi server Java.

Aturan keamanan Java # 9: Cari kerentanan ketergantungan

Ada banyak alat yang tersedia untuk memindai basis kode dan dependensi Anda secara otomatis untuk menemukan kerentanan. Yang harus Anda lakukan adalah menggunakannya.

OWASP, Proyek Keamanan Aplikasi Web Terbuka, adalah organisasi yang didedikasikan untuk meningkatkan keamanan kode. Daftar alat pemindaian kode otomatis tepercaya dan berkualitas tinggi milik OWASP mencakup beberapa alat berorientasi Java.

Periksa basis kode Anda secara teratur, tetapi juga awasi ketergantungan pihak ketiga. Penyerang menargetkan pustaka sumber terbuka dan sumber tertutup. Perhatikan pembaruan untuk dependensi Anda, dan perbarui sistem Anda saat perbaikan keamanan baru dirilis.

Aturan keamanan Java # 10: Pantau dan catat aktivitas pengguna

Bahkan serangan brute-force sederhana bisa berhasil jika Anda tidak secara aktif memantau aplikasi Anda. Gunakan alat pemantauan dan pencatatan untuk mengawasi kesehatan aplikasi.

Jika Anda ingin diyakinkan mengapa pemantauan itu penting, cukup duduk dan tonton paket TCP pada port mendengarkan aplikasi Anda. Anda akan melihat semua jenis aktivitas, jauh melampaui interaksi pengguna yang sederhana. Beberapa dari aktivitas itu adalah bot dan pelaku kejahatan yang memindai kerentanan.

Anda harus mencatat dan memantau upaya masuk yang gagal dan menerapkan tindakan balasan untuk mencegah klien jarak jauh menyerang tanpa hukuman.

Pemantauan dapat mengingatkan Anda akan lonjakan yang tidak dapat dijelaskan, dan logging dapat membantu mengungkap apa yang salah setelah serangan. Ekosistem Java mencakup banyak solusi komersial dan sumber terbuka untuk penebangan dan pemantauan.

Aturan keamanan Java # 11: Waspadai serangan Denial of Service (DoS)

Setiap kali Anda memproses sumber daya yang berpotensi mahal atau melakukan operasi yang berpotensi mahal, Anda harus waspada terhadap penggunaan sumber daya yang tidak terkendali.

Oracle menyimpan daftar vektor potensial untuk jenis masalah ini dalam dokumen Secure Coding Guidelines for Java SE, di bawah judul "Denial Of Service".

Pada dasarnya, kapan pun Anda pergi untuk melakukan operasi yang mahal, seperti membuka ritsleting file terkompresi, Anda harus memantau penggunaan sumber daya yang meledak. Jangan mempercayai manifes file. Percayai hanya konsumsi aktual on-disk atau dalam memori, pantau, dan jaga agar tidak berlebihan.

Demikian pula, dalam beberapa pemrosesan, penting untuk memperhatikan perulangan selamanya yang tidak terduga. Jika sebuah loop dicurigai, tambahkan penjaga yang memastikan loop membuat kemajuan dan hubung singkat jika tampaknya telah menjadi zombie.

Aturan keamanan Java # 12: Pertimbangkan untuk menggunakan manajer keamanan Java

Java memiliki manajer keamanan yang dapat digunakan untuk membatasi sumber daya yang dapat diakses oleh proses yang berjalan. Itu dapat mengisolasi program sehubungan dengan disk, memori, jaringan, dan akses JVM. Mempersempit persyaratan ini untuk aplikasi Anda mengurangi jejak kemungkinan bahaya dari suatu serangan. Isolasi semacam itu juga bisa merepotkan, itulah sebabnya SecurityManagertidak diaktifkan secara default.

Anda harus memutuskan sendiri apakah bekerja berdasarkan SecurityManageropini yang kuat sepadan dengan lapisan perlindungan ekstra untuk aplikasi Anda. Lihat dokumen Oracle untuk mempelajari lebih lanjut tentang sintaks dan kapabilitas manajer keamanan Java.

Aturan keamanan Java # 13: Pertimbangkan untuk menggunakan layanan otentikasi cloud eksternal

Beberapa aplikasi hanya harus memiliki data penggunanya; Selebihnya, penyedia layanan cloud bisa masuk akal.

Cari di sekitar dan Anda akan menemukan berbagai penyedia otentikasi cloud. Manfaat dari layanan tersebut adalah penyedia bertanggung jawab untuk mengamankan data sensitif pengguna, bukan Anda. Di sisi lain, menambahkan layanan otentikasi meningkatkan kompleksitas arsitektur perusahaan Anda. Beberapa solusi, seperti FireBase Authentication, menyertakan SDK untuk mengintegrasikan di seluruh tumpukan.

Kesimpulan

Saya telah menyajikan 13 aturan untuk mengembangkan aplikasi Java yang lebih aman. Aturan-aturan ini mencoba-dan-benar, tetapi aturan terbesar dari semuanya adalah ini: curiga. Selalu dekati pengembangan perangkat lunak dengan kewaspadaan dan pandangan yang berpikiran keamanan. Cari kerentanan dalam kode Anda, manfaatkan API dan paket keamanan Java, dan gunakan alat pihak ketiga untuk memantau dan mencatat kode Anda untuk masalah keamanan.

Berikut adalah tiga sumber daya tingkat tinggi yang baik untuk tetap mengikuti lanskap keamanan Java yang selalu berubah:

  • OWASP 10 Teratas
  • 25 Teratas CWE
  • Panduan Kode Aman Oracle

Cerita ini, "Tiga belas aturan untuk mengembangkan aplikasi Java yang aman" pada awalnya diterbitkan oleh JavaWorld.