Integrasi Kerberos Keselamatan Musim Bunga Dengan MiniKdc

Bahagian Keselamatan

Saya baru sahaja mengumumkan kursus Learn Spring Security yang baru, termasuk bahan penuh yang tertumpu pada timbunan OAuth2 baru di Spring Security 5:

>> SEMAK KURSUS

1. Gambaran keseluruhan

Dalam tutorial ini, kami akan memberikan gambaran keseluruhan mengenai Spring Security Kerberos.

Kami akan menulis pelanggan Kerberos di Java yang membenarkan dirinya mengakses perkhidmatan Kerberized kami. Dan kami akan menjalankan Pusat Pengedaran Kunci tertanam kami sendiri untuk melakukan pengesahan Kerberos dari hujung ke hujung sepenuhnya. Semua itu, tanpa memerlukan infrastruktur luaran, terima kasih kepada Spring Security Kerberos.

2. Kerberos dan Kebaikannya

Kerberos adalah protokol pengesahan rangkaian yang dibuat oleh MIT pada tahun 1980-an, sangat berguna untuk memusatkan pengesahan pada rangkaian.

Pada tahun 1987, MIT melancarkannya kepada komuniti Open Source dan ia masih dalam proses aktif. Pada tahun 2005, ia dikanonisasi sebagai standard IETF di bawahRFC 4120.

Biasanya, Kerberos digunakan dalam persekitaran korporat . Di sana, ia melindungi lingkungan sedemikian rupa sehingga pengguna tidak perlu mengesahkan ke setiap perkhidmatan secara berasingan . Penyelesaian seni bina ini dikenali sebagai Single Sign-on .

Secara sederhana, Kerberos adalah sistem tiket. Seorang pengguna mengesahkan sekali dan menerima Tiket Pemberian Tiket (TGT). Kemudian, infrastruktur rangkaian menukar TGT untuk Tiket Perkhidmatan. Tiket perkhidmatan ini membolehkan pengguna berinteraksi dengan perkhidmatan infrastruktur, selagi TGT sah, yang biasanya selama beberapa jam.

Oleh itu, sangat bagus apabila pengguna hanya melog masuk dalam satu masa. Tetapi ada keuntungan keselamatan juga: Dalam persekitaran seperti itu, kata laluan pengguna tidak pernah dihantar melalui rangkaian . Sebaliknya, Kerberos menggunakannya sebagai faktor untuk menghasilkan kunci rahsia lain yang akan digunakan untuk menghantar mesej penyulitan dan penyahsulitan.

Manfaat lain ialah kita dapat mengurus pengguna dari pusat, katakan yang disokong oleh LDAP. Oleh itu, jika kita melumpuhkan akaun di pangkalan data terpusat untuk pengguna tertentu, maka kita akan membatalkan aksesnya di infrastruktur kita. Oleh itu, pentadbir tidak perlu membatalkan akses secara berasingan di setiap perkhidmatan.

Pengenalan SPNEGO / Kerberos Authentication pada musim bunga memberikan gambaran mendalam mengenai teknologi.

3. Persekitaran Kerberized

Oleh itu, mari buat persekitaran untuk mengesahkan dengan protokol Kerberos. Persekitaran akan terdiri daripada tiga aplikasi berasingan yang akan berjalan serentak.

Pertama, kita akan mempunyai Pusat Pengedaran Kunci yang akan bertindak sebagai titik pengesahan. Seterusnya, kami akan menulis Aplikasi Pelanggan dan Perkhidmatan yang akan kami konfigurasikan untuk menggunakan protokol Kerberos.

Sekarang, menjalankan Kerberos memerlukan sedikit pemasangan dan konfigurasi. Walau bagaimanapun, kami akan memanfaatkan Spring Security Kerberos, jadi kami akan menjalankan Pusat Pengedaran Kunci secara terprogram, dalam mod tertanam. Juga, MiniKdc yang ditunjukkan di bawah ini berguna sekiranya berlaku ujian integrasi dengan infrastruktur Kerberized.

3.1. Menjalankan Pusat Pengedaran Utama

Pertama, kami akan melancarkan Pusat Pengedaran Utama kami, yang akan mengeluarkan TGT untuk kami:

String[] config = MiniKdcConfigBuilder.builder() .workDir(prepareWorkDir()) .principals("client/localhost", "HTTP/localhost") .confDir("minikdc-krb5.conf") .keytabName("example.keytab") .build(); MiniKdc.main(config);

Pada asasnya, kami telah memberikan MiniKdc satu set prinsipal dan fail konfigurasi; Selain itu, kami telah memberitahu MiniKdc apa yang perlu dipanggil keytab yang dihasilkannya.

MiniKdc akan menghasilkan fail krb5.conf yang akan kami berikan kepada aplikasi pelanggan dan perkhidmatan kami. Fail ini mengandungi maklumat di mana untuk mencari KDC kami - host dan port untuk wilayah tertentu.

MiniKdc.main memulakan KDC dan harus mengeluarkan seperti:

Standalone MiniKdc Running --------------------------------------------------- Realm : EXAMPLE.COM Running at : localhost:localhost krb5conf : .\spring-security-sso\spring-security-sso-kerberos\krb-test-workdir\krb5.conf created keytab : .\spring-security-sso\spring-security-sso-kerberos\krb-test-workdir\example.keytab with principals : [client/localhost, HTTP/localhost]

3.2. Permohonan Pelanggan

Pelanggan kami akan menjadi aplikasi Spring Boot yang menggunakan RestTemplate untuk membuat panggilan ke luar REST API.

Tetapi, kita akan menggunakan KerberosRestTemplate sebagai gantinya . Ia memerlukan keytab dan prinsipal pelanggan:

@Configuration public class KerberosConfig { @Value("${app.user-principal:client/localhost}") private String principal; @Value("${app.keytab-location}") private String keytabLocation; @Bean public RestTemplate restTemplate() { return new KerberosRestTemplate(keytabLocation, principal); } }

Dan itu sahaja! KerberosRestTemplate merundingkan sisi pelanggan protokol Kerberos untuk kami.

Oleh itu, mari buat kelas cepat yang akan meminta beberapa data dari perkhidmatan Kerberized, yang dihoskan di app endpoint.access -url :

@Service class SampleClient { @Value("${app.access-url}") private String endpoint; private RestTemplate restTemplate; // constructor, getter, setter String getData() { return restTemplate.getForObject(endpoint, String.class); } }

Oleh itu, mari buat Permohonan Perkhidmatan kami sekarang supaya kelas ini mempunyai sesuatu yang boleh dipanggil!

3.3. Permohonan Perkhidmatan

Kami akan menggunakan Spring Security, mengkonfigurasinya dengan kacang khusus Kerberos yang sesuai.

Juga, perhatikan bahawa perkhidmatan ini akan mempunyai prinsipalnya dan juga menggunakan keytab:

@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Value("${app.service-principal:HTTP/localhost}") private String servicePrincipal; @Value("${app.keytab-location}") private String keytabLocation; @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/home").permitAll() .anyRequest().authenticated() .and() .exceptionHandling() .authenticationEntryPoint(spnegoEntryPoint()) .and() .formLogin() .loginPage("/login").permitAll() .and() .logout().permitAll() .and() .addFilterBefore(spnegoAuthenticationProcessingFilter(authenticationManagerBean()), BasicAuthenticationFilter.class); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth .authenticationProvider(kerberosAuthenticationProvider()) .authenticationProvider(kerberosServiceAuthenticationProvider()); } @Bean public KerberosAuthenticationProvider kerberosAuthenticationProvider() { KerberosAuthenticationProvider provider = new KerberosAuthenticationProvider(); // provider configuration return provider; } @Bean public SpnegoEntryPoint spnegoEntryPoint() { return new SpnegoEntryPoint("/login"); } @Bean public SpnegoAuthenticationProcessingFilter spnegoAuthenticationProcessingFilter( AuthenticationManager authenticationManager) { SpnegoAuthenticationProcessingFilter filter = new SpnegoAuthenticationProcessingFilter(); // filter configuration return filter; } @Bean public KerberosServiceAuthenticationProvider kerberosServiceAuthenticationProvider() { KerberosServiceAuthenticationProvider provider = new KerberosServiceAuthenticationProvider(); // auth provider configuration return provider; } @Bean public SunJaasKerberosTicketValidator sunJaasKerberosTicketValidator() { SunJaasKerberosTicketValidator ticketValidator = new SunJaasKerberosTicketValidator(); // validator configuration return ticketValidator; } }

Perhatikan bahawa kami telah mengkonfigurasi Spring Security untuk pengesahan SPNEGO. Dengan cara ini, kita akan dapat mengesahkan melalui protokol HTTP, walaupun kita juga dapat mencapai pengesahan SPNEGO dengan inti Java.

4. Ujian

Sekarang, kami akan menjalankan ujian integrasi untuk menunjukkan bahawa pelanggan kami berjaya mengambil data dari pelayan luaran melalui protokol Kerberos . Untuk menjalankan ujian ini, kita mesti menjalankan infrastruktur kita, jadi MiniKdc dan Aplikasi Perkhidmatan kita mesti dimulakan.

Pada asasnya, kami akan menggunakan SampleClient kami dari Aplikasi Pelanggan untuk membuat permintaan ke Aplikasi Perkhidmatan kami. Mari kita mengujinya:

@Autowired private SampleClient sampleClient; @Test public void givenKerberizedRestTemplate_whenServiceCall_thenSuccess() { assertEquals("data from kerberized server", sampleClient.getData()); }

Perhatikan bahawa kami juga dapat membuktikan bahawa KerberizedRestTemplate adalah penting dengan memukul perkhidmatan tanpanya:

@Test public void givenRestTemplate_whenServiceCall_thenFail() { sampleClient.setRestTemplate(new RestTemplate()); assertThrows(RestClientException.class, sampleClient::getData); }

As a side note, there's a chance our second test could re-use the ticket already stored in the credential cache. This would happen due to the automatic SPNEGO negotiation used in HttpUrlConnection.

As a result, the data might actually return, invalidating our test. Depending on our needs, then, we can disable ticket cache usage through the system property http.use.global.creds=false.

5. Conclusion

In this tutorial, we explored Kerberos for centralized user management and how Spring Security supports the Kerberos protocol and SPNEGO authentication mechanism.

Kami menggunakan MiniKdc untuk berdiri KDC tertanam dan juga membuat pelanggan dan pelayan Kerberized yang sangat sederhana. Persediaan ini berguna untuk penerokaan dan terutama berguna ketika kami membuat ujian integrasi untuk menguji keadaan.

Sekarang, kita baru sahaja menggaru permukaannya. Untuk menyelam lebih dalam, lihat halaman wiki Kerberos atau RFC-nya. Juga, halaman dokumentasi rasmi akan berguna. Selain daripada itu, untuk melihat bagaimana perkara dapat dilakukan dalam inti java, tutorial Oracle berikut menunjukkannya secara terperinci.

Seperti biasa, kodnya boleh didapati di halaman GitHub kami.

Bahagian bawah keselamatan

Saya baru sahaja mengumumkan kursus Learn Spring Security yang baru, termasuk bahan penuh yang tertumpu pada timbunan OAuth2 baru di Spring Security 5:

>> SEMAK KURSUS