Keselamatan J2EE: Bekas berbanding kebiasaan

Sejak pertama kali halaman masuk ditambahkan ke aplikasi Web, keselamatan selalu menjadi salah satu komponen penting yang penting bagi kejayaan aplikasi di Web. Dari segi sejarah, semuanya dikodkan dengan tangan. Setiap aplikasi Web mempunyai kaedah khusus untuk mengesahkan dan kemudian memberi kuasa kepada pengguna. Pembangun juga membina komponen untuk pendaftaran, pentadbiran, dan fungsi lain yang diperlukan. Walaupun sedikit overhead, pendekatan ini memungkinkan fleksibiliti yang tinggi.

Dengan kedatangan JAAS, Java Authentication and Authorization Service, aplikasi memperoleh satu set antarmuka dan konfigurasi yang dapat mereka gunakan untuk menyeragamkan tugas-tugas tersebut. Walaupun dengan penambahan JAAS pada spesifikasi, J2EE masih mempunyai beberapa masalah untuk diselesaikan sebelum pembangun aplikasi dapat berhenti membuat API khusus. Memilih antara menggunakan piawaian J2EE atau membuat penyelesaian khusus memerlukan mengetahui kelebihan masing-masing dan, tentu saja, keperluan aplikasi anda.

Artikel ini bertujuan untuk memberikan semua maklumat yang diperlukan untuk memutuskan antara keselamatan kebiasaan atau kontena. Saya membincangkan fungsi keselamatan aplikasi yang paling biasa untuk memberikan latar belakang keselamatan yang diperlukan. Berikutan perbincangan tersebut adalah penjelasan terperinci mengenai pelaksanaan keselamatan J2EE yang disediakan oleh spesifikasi dan juga kaedah yang paling umum untuk melaksanakan keselamatan khusus. Setelah anda memahami setiap kaedah dengan lebih baik, anda harus mempunyai cukup maklumat untuk memilih kaedah mana yang paling sesuai dengan kehendak aplikasi anda.

Apakah bekas itu?

Sebelum kita membincangkan pelbagai jenis keselamatan dan masalah pelaksanaan keselamatan, mari kita tinjau apa itu wadahadalah. Bekas adalah persekitaran di mana aplikasi berjalan. Ia juga sinonim dengan pelayan aplikasi J2EE. Dari segi kontena J2EE, aplikasi J2EE berjalan di dalam wadah, yang mempunyai tanggungjawab khusus berkenaan dengan aplikasi tersebut. Terdapat banyak jenis bekas J2EE dan tahap sokongan J2EE yang berbeza. Tomcat dari Apache adalah wadah Web yang hanya menerapkan bahagian Servlet (aplikasi Web) dari spesifikasi J2EE. BEA WebLogic adalah pelayan aplikasi J2EE yang mematuhi sepenuhnya, yang bermaksud ia menyokong semua aspek spesifikasi J2EE dan telah lulus ujian pensijilan J2EE Sun. Sekiranya anda tidak yakin dengan sokongan yang diberikan oleh pelayan aplikasi anda, hubungi vendor untuk maklumat lebih lanjut.

Keselamatan aplikasi

Topik lain yang mesti kita bahas sebelum memulakannya ialah perbezaan antara keselamatan aplikasi dan jenis keselamatan lain. Keselamatan aplikasi adalah keselamatan yang dilakukan secara langsung oleh aplikasi atau secara tidak langsung oleh kerangka atau wadah untuk aplikasi berkenaan dengan pengguna aplikasi tersebut. Contoh pengguna aplikasi adalah seseorang yang log masuk ke kedai buku dalam talian dan membeli beberapa buku Java. Jenis keselamatan lain ada, seperti keselamatan rangkaian dan keselamatan JVM. Salah satu contoh jenis keselamatan tersebut adalah pengguna yang memulakan proses Java pada mesin. Sepanjang kertas ini, setiap kali saya membincangkan keselamatan, saya bermaksud keselamatan aplikasi. Jenis keselamatan lain dapat dicapai di luar ruang lingkup perbincangan ini.

Fokus di sini adalah keselamatan J2EE, yang merupakan jenis keselamatan aplikasi kerana berkaitan dengan pengguna aplikasi J2EE (iaitu pemanggil). Pengguna mungkin seseorang yang menggunakan kedai buku dalam talian atau aplikasi lain yang menggunakan perkhidmatan pembelian aplikasi kedai buku, seperti penjual semula dalam talian yang lain.

Fungsi keselamatan aplikasi

Terdapat lima fungsi utama ketika mempertimbangkan keselamatan aplikasi: pengesahan, pengesahan, pendaftaran, penyelenggaraan akaun (kemas kini), dan penghapusan / penonaktifan akaun. Walaupun hanya sebagian kecil dari semua fungsi yang mungkin dimiliki aplikasi, ini adalah yang paling mendasar dan standard untuk semua aplikasi. Kurang secara formal, fungsi-fungsi ini adalah mengetahui pengguna (pengesahan), mengetahui apa yang dapat dilakukan pengguna (pengesahan), membuat pengguna baru (pendaftaran), mengemas kini maklumat pengguna (penyelenggaraan akaun), dan membuang pengguna atau mencegah pengguna mengakses aplikasi (penghapusan akaun).

Sebilangan besar aplikasi membenarkan pengguna atau pentadbir melaksanakan fungsi ini. Apabila pengguna melaksanakan fungsi ini, mereka melakukannya untuk diri mereka sendiri. Pentadbir selalu melaksanakan fungsi ini bagi pihak pengguna lain.

Seperti yang akan digambarkan, semua fungsi ini tidak dapat dilaksanakan tanpa penyelesaian khusus, bahkan untuk pengesahan. Kami akan membahas masing-masing secara ringkas untuk menggambarkan konsep dan apa yang kekurangan J2EE yang mesti dibina khas.

Pengesahan

Pengesahan adalah proses mengenal pasti pengguna yang berinteraksi dengan aplikasi. Pada saat penulisan ini, pengesahan J2EE dapat dilaksanakan dengan menggunakan berbagai solusi, masing-masing ditentukan sebagai bagian dari spesifikasi J2EE (versi 1.0-1.4). Pengesahan adalah konsep utama perbincangan ini dan akan dibahas dengan lebih terperinci kemudian. Penting untuk menyedari bahawa pengesahan adalah fungsi keselamatan yang paling banyak menyokong dalam spesifikasi J2EE, tetapi kod atau konfigurasi khusus biasanya diperlukan untuk melaksanakan pengesahan J2EE (aka pengesahan kontena)

Kebenaran

Pengesahan adalah proses mengesahkan bahawa pengguna mempunyai kebenaran untuk mengambil tindakan tertentu. J2EE merangkumi topik ini, tetapi dibatasi kepada otorisasi berdasarkan peranan, yang bermaksud bahawa aktiviti dapat dibatasi berdasarkan peranan yang diberikan pengguna. Sebagai contoh, pengguna dalam peranan pengurus mungkin dapat menghapus inventori, sementara pengguna dalam peranan pekerja mungkin tidak.

Selain itu, aplikasi mungkin mempertimbangkan dua jenis kebenaran: Java Runtime Environment (JRE) / wadah dan kebenaran aplikasi. Kebenaran JRE / kontena adalah proses menentukan sama ada pengguna yang membuat permintaan itu mempunyai hak untuk melakukannya. JRE / bekas menentukan ini sebelum sebarang kod dijalankan. Contohnya ialah bekas J2EE yang mesti memeriksa terlebih dahulu sama ada pengguna semasa mempunyai kebenaran untuk menjalankan servlet (melalui kekangan URL sumber) sebelum menjalankan servlet. Jenis kebenaran ini juga dikenali sebagai keselamatan deklaratifkerana dinyatakan dalam fail konfigurasi untuk aplikasi Web. Kecuali disokong oleh kontena, keselamatan deklaratif tidak dapat diubah pada waktu berjalan. Keselamatan deklaratif dapat digunakan dalam banyak cara untuk memberi kuasa kepada pengguna aplikasi J2EE, tetapi topik itu tidak termasuk dalam ruang lingkup perbincangan ini. (Lihat Servlet 2.3 Spesifikasi Bab 12. Bahagian 2 merangkumi keselamatan deklaratif, dan 8 adalah titik permulaan yang baik untuk kekangan keselamatan.)

Seperti disebutkan sebelumnya, pengguna mungkin merupakan aplikasi lain atau hanya pengguna aplikasi. Walau apa pun, kebenaran JRE / kontena dilakukan semasa setiap permintaan. Permintaan ini mungkin permintaan HTTP dari penyemak imbas ke aplikasi Web atau panggilan EJB (Enterprise JavaBeans) jarak jauh. Dalam kedua-dua kes tersebut, dengan syarat JRE / wadah mengenali pengguna, pengguna boleh melaksanakan kebenaran berdasarkan maklumat pengguna tersebut.

Kebenaran permohonan adalah proses pemberian kuasa kerana aplikasi dijalankan. Kebenaran permohonan boleh dibahagikan kepada kebenaran berdasarkan peranan dan berdasarkan segmen. Contoh kebenaran aplikasi berdasarkan peranan adalah apabila aplikasi menggunakan tahap penambahan tahap yang berbeza berdasarkan sama ada pengguna adalah pekerja atau pelawat (iaitu, potongan pekerja). J2EE menyediakan API yang disebut keselamatan program untuk mencapai kebenaran berdasarkan peranan (lihat Servlet 2.3 Spesifikasi Bab 12, Bahagian 3 untuk maklumat lebih lanjut).

Kebenaran berdasarkan segmen adalah kebenaran berdasarkan atribut pengguna lain, seperti usia atau hobi. Kebenaran berdasarkan segmen disebut sedemikian kerana ia mengelompokkan pengguna menjadi segmen berdasarkan atribut tertentu. J2EE tidak mempunyai kaedah untuk melaksanakan kebenaran berdasarkan segmen. Contoh kebenaran berdasarkan segmen adalah sama ada butang pada borang dapat dilihat oleh pengguna yang berumur lebih dari 40 tahun. Penjual tertentu mungkin menawarkan jenis kebenaran ini, tetapi ini akan menjamin penguncian vendor dalam semua keadaan.

Pendaftaran

Pendaftaran adalah proses menambahkan pengguna baru ke aplikasi. Pengguna aplikasi mungkin dapat membuat akaun baru untuk mereka sendiri atau aplikasi mungkin memilih untuk membatasi aktiviti ini kepada pentadbir aplikasi. Spesifikasi J2EE tidak memiliki API atau konfigurasi yang membolehkan aplikasi menambah pengguna baru; oleh itu, jenis keselamatan ini selalu dibina khas. J2EE tidak memiliki kemampuan untuk memberitahu pengguna bahawa pengguna baru telah mendaftar dan bahawa maklumatnya mesti dikekalkan dan dikekalkan semasa sesi kerjanya.

Penyelenggaraan

Penyelenggaraan akaun adalah proses mengubah maklumat akaun, seperti maklumat hubungan, log masuk, atau kata laluan. Sebilangan besar aplikasi membenarkan pengguna aplikasi, dan juga pentadbir, melakukan penyelenggaraan. Spesifikasi J2EE juga tidak memiliki API atau konfigurasi untuk penyelenggaraan akaun. Mekanisme hilang untuk memberitahu wadah bahawa maklumat pengguna telah berubah

Penghapusan

Penghapusan akaun biasanya dihadkan kepada pengguna pentadbiran sahaja. Kadang-kadang, beberapa aplikasi mungkin membolehkan pengguna menghapus akaun mereka sendiri. Sebilangan besar aplikasi sebenarnya tidak pernah memadamkan pengguna; mereka hanya menonaktifkan akaun sehingga pengguna tidak lagi dapat log masuk. Melakukan penghapusan yang keras dan cepat biasanya disukai kerana data akaun jauh lebih sukar untuk dibangkitkan sekiranya perlu. J2EE tidak menyediakan cara untuk membuang atau menyahaktifkan pengguna dari aplikasi. Tidak memiliki mekanisme untuk memberitahu penampung bahawa pengguna tertentu telah dinonaktifkan atau dikeluarkan. J2EE juga tidak memiliki mekanisme untuk segera mengeluarkan pengguna dari aplikasi ketika akaunnya telah dihapus.

Apakah pengesahan kontena?

Pengesahan kontena adalah proses memberitahu wadah identiti pengguna yang membuat permintaan semasa. Untuk kebanyakan kontena, proses ini melibatkan mengaitkan ServletRequestobjek semasa , utas pelaksanaan semasa, dan sesi dalaman dengan identiti pengguna. Dengan mengaitkan sesi dengan identiti, wadah dapat menjamin bahawa permintaan semasa dan semua permintaan berikutnya oleh pengguna yang sama dapat dikaitkan dengan sesi yang sama, sehingga sesi pengguna tersebut berakhir. Objek sesi ini biasanya tidak sama dengan HttpSessionobjek, walaupun yang pertama digunakan untuk membuat dan memelihara yang terakhir. Setiap permintaan berikutnya oleh pengguna yang sama dikaitkan dengan sesi menggunakan penulisan semula URL atau cookie sesi, menurut Spesifikasi Servlet 2.3, Bab 7.

Seperti yang disebutkan di atas dalam perbincangan mengenai otorisasi kami, setiap tindakan yang dilakukan oleh penampung serta setiap tindakan yang dilakukan oleh JRE atas nama pengguna tersebut diperiksa dengan teliti untuk memastikan pengguna memiliki izin untuk melakukan tindakan tersebut. Untuk mengulangi contoh sebelumnya, apabila wadah menjalankan servlet bagi pihak pengguna, ia mengesahkan bahawa pengguna termasuk dalam set peranan yang diberi izin untuk melaksanakan servlet tersebut. JRE 1.4 juga melakukan pemeriksaan ini untuk banyak tindakan, termasuk ketika fail atau soket dibuka. Pengesahan JRE adalah konsep yang kuat dan dapat memastikan bahawa setiap permintaan ke bekas pada dasarnya selamat.

Pada masa ini, J2EE menyediakan beberapa mekanisme yang berbeza untuk melaksanakan pengesahan pengguna. Ini termasuk pengesahan berasaskan borang, pengesahan klien HTTPS, dan pengesahan asas HTTP. JAAS disertakan sebagai kaedah pengesahan yang diperlukan yang mesti disokong oleh bekas. Tetapi spesifikasi tidak ketat mengenai bagaimana wadah harus menyediakan fungsi ini; oleh itu, setiap bekas memberikan sokongan yang berbeza untuk JAAS. Di samping itu, JAAS dengan sendirinya adalah kerangka pengesahan mandiri dan dapat digunakan untuk melaksanakan pengesahan kontena tanpa mengira apakah spesifikasi menyokongnya. Saya menerangkan konsep ini dengan lebih terperinci kemudian.

Setiap mekanisme pengesahan menyediakan cara standard untuk memberikan maklumat mengenai pengguna mengenai wadah. Saya merujuknya sebagai realisasi kepercayaan . Wadah masih harus menggunakan maklumat ini untuk mengesahkan bahawa pengguna ada dan mempunyai kebenaran yang mencukupi untuk membuat permintaan. Saya merujuknya sebagai pengesahan kelayakan . Beberapa kontena menyediakan konfigurasi untuk menetapkan pengesahan kelayakan dan yang lain menyediakan antara muka yang mesti dilaksanakan.

Kaedah pengesahan J2EE

Mari lihat sebentar beberapa kaedah yang paling biasa untuk melaksanakan dan mengkonfigurasi pengesahan kontena.

Pengesahan berdasarkan borang

Pengesahan berasaskan borang membolehkan pengguna dikenali dan disahkan dengan pelayan aplikasi J2EE menggunakan sebarang bentuk HTML. Tindakan borang mestilah j_security_checkdan dua parameter permintaan HTTP (medan input borang) mesti selalu ada dalam permintaan, satu dipanggil j_usernamedan yang lain j_password,. Dengan menggunakan pengesahan berasaskan borang, pengesahan kelayakan berlaku semasa borang dihantar dan nama pengguna dan kata laluan dihantar ke pelayan.

Berikut adalah contoh halaman JSP (JavaServer Pages) yang menggunakan pengesahan berasaskan bentuk:

 Log masuk Masukkan nama pengguna anda:

Masukkan kata laluan anda: