Kerberos tavaszi biztonsági integráció a MiniKdc-vel
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 FOLYAMATOT1. Á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ó