Kerberos tavaszi biztonsági integráció a MiniKdc-vel

Biztonsági top

Most jelentettem be az új Learn Spring Security tanfolyamot, beleértve a Spring Security 5 új OAuth2 veremére összpontosító teljes anyagot:

>> ELLENŐRIZZE A FOLYAMATOT

1. Áttekintés

Ebben az oktatóanyagban áttekintést nyújtunk a Spring Security Kerberosról.

Írunk egy Kerberos klienst Java-ban, amely felhatalmazza magát a Kerberized szolgáltatásunk elérésére. És a saját, beágyazott kulcselosztó központunkat működtetjük a teljes, végpontok közötti Kerberos-hitelesítés elvégzésére. Mindezt a szükséges külső infrastruktúra nélkül, köszönhetően a Spring Security Kerberos-nak.

2. Kerberos és előnyei

A Kerberos egy olyan hálózati hitelesítési protokoll, amelyet az MIT az 1980-as években hozott létre, és kifejezetten hasznos a hitelesítés hálózatra történő központosítására.

1987-ben az MIT kiadta az Open Source közösségnek, és még mindig aktív fejlesztés alatt áll. 2005 - ben IETF szabványként szentté avatták aRFC 4120.

Kerberos általában az vállalati környezetben használják. Odabent úgy biztosítja a környezetet, hogy a a felhasználónak nem kell külön-külön hitelesítenie az egyes szolgáltatásokat. Ez az építészeti megoldás néven ismertEgyszeri bejelentkezés.

Egyszerűen fogalmazva, a Kerberos egy jegyrendszer. Egy felhasználó egyszer hitelesít és Jegyet biztosító Jegyet kap (TGT). Ezután a hálózati infrastruktúra kicseréli a TGT szolgáltatási jegyekre. Ezek a szolgáltatási jegyek lehetővé teszik a felhasználó számára, hogy interakcióba lépjen az infrastrukturális szolgáltatásokkal, mindaddig, amíg a TGT érvényes, általában néhány órára.

Nagyon jó, hogy a felhasználó csak egyszer jelentkezik be. De van biztonsági előnye is: ilyen környezetben a a felhasználó jelszavát soha nem küldjük el a hálózaton keresztül. Ehelyett a Kerberos tényezőként használja egy újabb titkos kulcs előállításához, amelyet az üzenet titkosításához és visszafejtéséhez használnak.

További előnye az a felhasználókat központi helyről kezelhetjük, mondjon egyet, amelyet az LDAP támogat. Ezért, ha letiltunk egy fiókot a központi adatbázisunkban egy adott felhasználó számára, akkor visszavonjuk az infrastruktúránkhoz való hozzáférését. Így az adminisztrátoroknak nem kell minden egyes szolgáltatásban külön visszavonniuk a hozzáférést.

Az SPNEGO / Kerberos Authentication tavaszi bemutatása mélyreható áttekintést nyújt a technológiáról.

3. Kerberizált környezet

Tehát hozzunk létre egy környezetet a hitelesítéshez a Kerberos protokollal. A környezet három különálló alkalmazásból áll, amelyek egyszerre fognak futni.

Első, lesz egy Kulcselosztó Központunk amely hitelesítési pontként fog működni. Ezután írunk egy klienst és egy szolgáltatási alkalmazást, amelyet a Kerberos protokoll használatára konfigurálunk.

Most a Kerberos futtatása egy kis telepítést és konfigurációt igényel. Kihasználjuk azonban a Spring Security Kerberos programot, így programozottan, beágyazott módban futtatjuk a Kulcselosztó központot. Továbbá a MiniKdc Az alábbi ábra hasznos lehet Kerberized infrastruktúrával történő integrációs tesztelés esetén.

3.1. Kulcselosztó központ működtetése

Először elindítjuk a Kulcselosztó Központunkat, amely kiadja számunkra a TGT-ket:

Karakterlánc [] config = MiniKdcConfigBuilder.builder () .workDir (PreparWorkDir ()) .principals ("kliens / localhost", "HTTP / localhost") .confDir ("minikdc-krb5.conf") .keytabName ("példa.keytab ") .épít(); MiniKdc.main (config);

Alapvetően megadtuk MiniKdc egy fő és egy konfigurációs fájl; ráadásul elmondtuk MiniKdc hogy hívjuk a kulcstábla generál.

MiniKdc generál egy krb5.conf fájl, amelyet az ügyfél- és szolgáltatóalkalmazásainknak átadunk. Ez a fájl azt az információt tartalmazza, hogy hol található a KDC - az adott tartomány gazdagépe és portja.

MiniKdc.main elindítja a KDC-t, és valami ilyesmit kell kiadnia:

Önálló MiniKdc futás ----------------------------------------------- ---- Birodalom: EXAMPLE.COM: Futás: localhost: localhost krb5conf:. \ Spring-security-sso \ spring-security-sso-kerberos \ krb-test-workdir \ krb5.conf létrehozott kulcstábla:. \ Spring-security -sso \ spring-security-sso-kerberos \ krb-test-workdir \ example.keytab a megbízókkal: [kliens / localhost, HTTP / localhost]

3.2. Kliens alkalmazás

Ügyfelünk egy Spring Boot alkalmazás lesz, amely a RestTemplate hogy külső REST API-ra hívjon.

De megyünk használat KerberosRestTemplate helyette. Szüksége lesz a kulcstáblára és az ügyfél megbízójára:

@Configuration nyilvános osztály KerberosConfig {@Value ("$ {app.user-primary: client / localhost}") privát karakterlánc; @Value ("$ {app.keytab-location}") privát karaktersorozat keytabLocation; @Bean public RestTemplate restTemplate () {return new KerberosRestTemplate (keytabLocation, megbízó); }}

És ez az! KerberosRestTemplate megtárgyalja nekünk a Kerberos protokoll kliens oldalát.

Tehát hozzunk létre egy gyors osztályt, amely lekérdez néhány adatot egy Kerberized szolgáltatásból, amelyet a végpont hosztol app.access-url:

@Service osztály SampleClient {@Value ("$ {app.access-url}") privát karakterlánc-végpont; privát RestTemplate restTemplate; // konstruktor, getter, setter String getData () {return restTemplate.getForObject (végpont, String.class); }}

Tehát készítsük el most a Szolgáltatási alkalmazásunkat, hogy ennek az osztálynak legyen mit hívnia!

3.3. Szolgáltatás alkalmazás

A Spring Security-t fogjuk használni, a megfelelő Kerberos-specifikus babokkal konfigurálva.

Vegye figyelembe azt is, hogy a szolgáltatásnak meg lesz a fője, és használja a kulcstáblát is:

@Configuration @EnableWebSecurity nyilvános osztály A WebSecurityConfig kiterjeszti a WebSecurityConfigurerAdapter {@Value ("$ {app.service-primary: HTTP / localhost}") privát karakterlánc-szolgáltatástPrincipal; @Value ("$ {app.keytab-location}") privát karaktersorozat keytabLocation; A @Orride protected void configure (HttpSecurity http) a {http .authorizeRequests () .antMatchers ("/", "/ home") kivételt dobja. AllowAll () .anyRequest (). Hitelesített () .és () .exceptionHandling (). authenticationEntryPoint (spnegoEntryPoint ()) .and () .formLogin () .loginPage ("/ login"). allowAll () .and () .logout (). allowAll () .and () .addFilterBefore (spnegoAuthenticationProcessingFilter (authenticationManagerBean (authenticationManagerBean) ), BasicAuthenticationFilter.class); } @Orride védett void configure (AuthenticationManagerBuilder auth) dobja a Kivétel {auth .authenticationProvider (kerberosAuthenticationProvider ()) .authenticationProvider (kerberosServiceAuthenticationProvider ()); } @Bean public KerberosAuthenticationProvider kerberosAuthenticationProvider () {KerberosAuthenticationProvider szolgáltató = új KerberosAuthenticationProvider (); // szolgáltató konfiguráció visszatér szolgáltató; } @Bean public SpnegoEntryPoint spnegoEntryPoint () {return new SpnegoEntryPoint ("/ login"); } @Bean public SpnegoAuthenticationProcessingFilter spnegoAuthenticationProcessingFilter (AuthenticationManager authenticationManager) {SpnegoAuthenticationProcessingFilter filter = új SpnegoAuthenticationProcessingFilter (); // szűrő konfiguráció visszatér szűrő; } @Bean public KerberosServiceAuthenticationProvider kerberosServiceAuthenticationProvider () {KerberosServiceAuthenticationProvider szolgáltató = új KerberosServiceAuthenticationProvider (); // auth szolgáltató konfigurációs visszatérési szolgáltató; } @Bean public SunJaasKerberosTicketValidator sunJaasKerberosTicketValidator () {SunJaasKerberosTicketValidator ticketValidator = new SunJaasKerberosTicketValidator (); // érvényesítő konfiguráció visszatérő jegyValidator; }}

Ne feledje, hogy a Spring Security-t konfiguráltuk az SPNEGO hitelesítéshez. Így képesek vagyunk a HTTP protokollon keresztül hitelesíteni, bár az SPNEGO hitelesítést az alapvető Java-val is elérhetjük.

4. Tesztelés

Most egy integrációs tesztet futtatunk ennek bemutatására ügyfelünk sikeresen beolvassa az adatokat egy külső szerverről a Kerberos protokollon keresztül. A teszt futtatásához működtetnünk kell az infrastruktúránkat, tehát MiniKdc és a Szolgáltatási alkalmazásunkat el kell indítani.

Alapvetően mi fogjuk használni a mi SampleClient az Ügyfélalkalmazástól, hogy kérelmet nyújtson be a Szolgáltatási alkalmazásunkhoz. Próbáljuk ki:

@Autowired private SampleClient sampleClient; @Test public void givenKerberizedRestTemplate_whenServiceCall_thenSuccess () {assertEquals ("adatok kerberizált szerverről", sampleClient.getData ()); }

Ne feledje, hogy azt is be tudjuk bizonyítani, hogy a KerberizedRestTemplate fontos, ha anélkül érik el a szolgáltatást:

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

Megjegyzendő, hogy van rá esély második tesztünk újból felhasználhatja a hitelesítő adatok gyorsítótárában már tárolt jegyet. Ez a ben használt automatikus SPNEGO-tárgyalás miatt következne be HttpUrlConnection.

Ennek eredményeként az adatok valóban visszatérhetnek, érvénytelenítve a tesztünket. Igényeinktől függően a rendszer tulajdonságán keresztül letilthatjuk a jegygyorsítótár használatát http.use.global.creds = hamis.

5. Következtetés

Ebben az oktatóanyagban felfedeztük a Kerberost a központosított felhasználói kezelés érdekében és hogyan támogatja a Spring Security a Kerberos protokollt és az SPNEGO hitelesítési mechanizmust.

Használtuk MiniKdc hogy felálljon egy beágyazott KDC, és létrehozott egy nagyon egyszerű Kerberized klienst és szervert is. Ez a beállítás hasznos volt a felfedezéshez, és különösen hasznos, amikor létrehoztunk egy integrációs tesztet a dolgok tesztelésére.

Most kapartuk el a felszínt. A mélyebb merüléshez nézze meg a Kerberos wiki oldalt vagy annak RFC-jét. Hasznos lesz a hivatalos dokumentációs oldal is. Ezen kívül, hogy lássa, miként lehetne elvégezni a dolgokat a java core-ban, a következő Oracle oktatóanyag részletesen bemutatja.

Szokás szerint a kód megtalálható a GitHub oldalán.

Biztonsági alsó

Most jelentettem be az új Learn Spring Security tanfolyamot, beleértve a Spring Security 5 új OAuth2 veremére összpontosító teljes anyagot:

>> ELLENŐRIZZE A FOLYAMATOT

$config[zx-auto] not found$config[zx-overlay] not found