Keselamatan Saluran HTTP / HTTPS Musim Semi

1. Gambaran keseluruhan

Tutorial ini menunjukkan cara menggunakan HTTPS untuk melindungi halaman log masuk aplikasi anda menggunakan ciri Spring's Channel Security.

Menggunakan HTTPS untuk pengesahan sangat penting untuk melindungi integriti data sensitif ketika dalam pengangkutan.

Artikel ini dibina di atas tutorial Spring Security Login dengan menambahkan lapisan keselamatan tambahan. Kami menyoroti langkah-langkah yang diperlukan untuk mengamankan data pengesahan dengan melayani halaman log masuk melalui saluran HTTPS yang dikodkan.

2. Persediaan Awal Tanpa Keselamatan Saluran

Mari kita mulakan dengan konfigurasi keselamatan yang dijelaskan dalam artikel di atas.

Aplikasi web membolehkan pengguna mengakses:

  1. /anonymous.html tanpa pengesahan,
  2. /login.html , dan
  3. halaman lain ( /homepage.html ) setelah berjaya log masuk.

Akses dikendalikan oleh konfigurasi berikut:

@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/anonymous*") .anonymous(); http.authorizeRequests() .antMatchers("/login*") .permitAll(); http.authorizeRequests() .anyRequest() .authenticated(); 

Atau melalui XML:

Pada ketika ini, halaman log masuk boleh didapati di:

//localhost:8080/spring-security-login/login.html

Pengguna dapat mengesahkan diri melalui HTTP, namun ini tidak selamat kerana kata laluan akan dihantar dalam teks biasa.

3. Konfigurasi Pelayan HTTPS

Untuk hanya menyampaikan halaman masuk melalui HTTPS - pelayan web anda mesti dapat melayani halaman HTTPS . Ini memerlukan sokongan SSL / TLS diaktifkan.

Perhatikan bahawa anda boleh menggunakan sijil yang sah atau, untuk tujuan ujian, anda boleh membuat sijil anda sendiri.

Katakan kita menggunakan Tomcat dan melancarkan sijil kita sendiri. Kita perlu membuat kedai kunci dengan sijil yang ditandatangani sendiri.

Menjana kedai kunci boleh dilakukan dengan mengeluarkan arahan berikut di terminal:

keytool -genkey -alias tomcat -keyalg RSA -storepass changeit -keypass changeit -dname 'CN=tomcat'

Ini akan membuat kunci peribadi dan sijil yang ditandatangani sendiri di kedai kunci lalai untuk profil pengguna anda, di folder rumah anda.

Langkah seterusnya adalah mengedit conf / server.xml agar kelihatan seperti ini:

SSL / TLS kedua tag biasanya dikomentari dalam file konfigurasi sehingga tanpa memberi komen dan menambah maklumat keystore adalah semua yang diperlukan. Maklumat lebih lanjut terdapat dalam dokumentasi berkaitan Tomcat.

Dengan adanya konfigurasi HTTPS, halaman log masuk kini dapat dilayani di bawah URL berikut juga:

//localhost:8443/spring-security-login/login.html

Pelayan web selain Tomcat memerlukan konfigurasi yang berbeza tetapi mungkin serupa.

4. Mengkonfigurasi Keselamatan Saluran

Pada ketika ini, kami dapat melayani halaman log masuk di bawah HTTP dan HTTPS. Bahagian ini menerangkan cara mengamanatkan penggunaan HTTPS.

Untuk memerlukan HTTPS untuk halaman log masuk, ubah konfigurasi keselamatan anda dengan menambahkan yang berikut:

http.requiresChannel() .antMatchers("/login*").requiresSecure();

Atau tambahkan atribut memerlukan-saluran = "https" ke konfigurasi XML anda:

Selepas ini pengguna hanya boleh masuk melalui HTTPS. Semua pautan relatif seperti pemajuan ke /homepage.html akan mewarisi protokol permintaan asal dan akan diserahkan di bawah HTTPS.

Semasa mencampurkan permintaan HTTP dan HTTPS dalam satu aplikasi web, ada aspek tambahan yang harus diperhatikan dan memerlukan konfigurasi lebih lanjut.

5. Mencampurkan HTTP dan HTTPS

Dari sudut keselamatan, melayani semua perkara melalui HTTPS adalah amalan yang baik dan matlamat yang kukuh untuk dimiliki.

Namun, jika menggunakan HTTPS secara eksklusif bukan pilihan, kami dapat mengkonfigurasi Spring untuk menggunakan HTTP dengan menambahkan yang berikut ke konfigurasi:

http.requiresChannel() .anyRequest().requiresInsecure();

Atau tambahkan atribut memerlukan-saluran = "http" ke XML:

Ini memerintahkan Spring untuk menggunakan HTTP untuk semua permintaan yang tidak dikonfigurasi secara jelas untuk menggunakan HTTPS, tetapi pada masa yang sama ia melanggar mekanisme log masuk yang asal. Bahagian berikut menerangkan penyebabnya.

5.1. URL Pemprosesan Log Masuk Tersuai Melalui HTTPS

Konfigurasi keselamatan dalam tutorial keselamatan asal mengandungi yang berikut:

Tanpa memaksa / perform_login untuk menggunakan HTTPS, pengalihan akan berlaku pada varian HTTP, kehilangan maklumat log masuk yang dihantar dengan permintaan asal.

Untuk mengatasi ini, kita perlu mengkonfigurasi Spring untuk menggunakan HTTPS untuk URL pemprosesan:

http.requiresChannel() .antMatchers("/login*", "/perform_login");

Notice the extra argument /perform_login passed to the antMatchers method.

The equivalent in the XML configuration requires adding a new <intercept-url> element to the config:

If your own application is using the default login-processing-url (which is /login) you don't need to configure this explicitly as the /login* pattern already covers that.

With the configuration in place, users are able to login, but not to access authenticated pages e.g. /homepage.html under the HTTP protocol, because of Spring's session fixation protection feature.

5.2. Disabling session-fixation-protection

Session fixation is a problem which can't be avoided when switching between HTTP and HTTPS.

By default Spring creates a new session-id after a successful login. When a user loads the HTTPS login page the user's session-id cookie will be marked as secure. After logging in, the context will switch to HTTP and the cookie will be lost as HTTP is insecure.

To avoid this setting session-fixation-protection to none is required.

http.sessionManagement() .sessionFixation() .none();

Or via XML:

Disabling session fixation protection might have security implications, therefore you need to weigh the pros and cons if you're concerned about session fixation based attacks.

6. Test

After applying all these configuration changes accessing /anonymous.html without logging in (using either // or //) will forward you to the page through HTTP.

Opening other pages directly like /homepage.html should get you forwarded to the login page via HTTPS and after login you will be forwarded back to /homepage.html using HTTP.

7. Conclusion

Dalam tutorial ini kami telah melihat bagaimana mengkonfigurasi aplikasi web Spring yang berkomunikasi melalui HTTP kecuali mekanisme log masuk. Walau bagaimanapun , aplikasi web moden yang baru hampir selalu menggunakan HTTPS secara eksklusif sebagai protokol komunikasi mereka. Menurunkan tahap keselamatan atau mematikan ciri keselamatan (seperti sesi-penetapan-perlindungan ) tidak pernah menjadi idea yang baik.

Tutorial ini berdasarkan pangkalan data yang terdapat di GitHub. Konfigurasi keselamatan saluran dapat diaktifkan dengan menyenaraikan https sebagai profil Spring yang aktif.