Jarná integrácia zabezpečenia Kerberos s MiniKdc

Zabezpečenie Najlepšie

Práve som oznámil nový kurz Learn Spring Security vrátane úplného materiálu zameraného na nový zásobník OAuth2 vo Spring Security 5:

>> SKONTROLUJTE KURZ

1. Prehľad

V tomto tutoriáli poskytneme prehľad Spring Security Kerberos.

Napíšeme klienta Kerberos v prostredí Java, ktorý sa sám autorizuje na prístup k našej službe Kerberized. A spustíme naše vlastné integrované Centrum distribúcie kľúčov, aby sme mohli vykonávať úplnú komplexnú autentifikáciu pomocou protokolu Kerberos. To všetko bez potreby akejkoľvek externej infraštruktúry vďaka Spring Security Kerberos.

2. Kerberos a jeho výhody

Kerberos je sieťový autentifikačný protokol, ktorý MIT vytvoril v 80. rokoch minulého storočia, zvlášť užitočný na centralizáciu autentifikácie v sieti.

V roku 1987 ho MIT vydal komunite Open Source a stále je v aktívnom vývoji. V roku 2005 bol kanonizovaný ako štandard IETF podRFC 4120.

Spravidla je to Kerberos používané v podnikových prostrediach. Tam zaisťuje ochranu životného prostredia takým spôsobom, že používateľ sa nemusí overovať pre každú službu zvlášť. Toto architektonické riešenie je známe akoJednotné prihlásenie.

Jednoducho povedané, Kerberos je systém predaja cestovných lístkov. Používateľ sa autentifikuje raz a dostane lístok poskytujúci vstupenky (TGT). Potom sieťová infraštruktúra vymení tento TGT za vstupenky na služby. Tieto lístky na službu umožňujú používateľovi komunikovať so službami infraštruktúry, pokiaľ je platný TGT, ktorý je zvyčajne na pár hodín.

Je teda skvelé, že sa používateľ prihlási iba raz. Ale je tu aj bezpečnostná výhoda: V takom prostredí heslo používateľa sa nikdy neposiela cez sieť. Namiesto toho ho Kerberos používa ako faktor na generovanie ďalšieho tajného kľúča, ktorý sa použije na šifrovanie a dešifrovanie správ.

Ďalšou výhodou je to môžeme používateľov spravovať z centrálneho miesta, povedzme taký, ktorý je podporovaný protokolom LDAP. Ak teda deaktivujeme účet v našej centralizovanej databáze pre daného používateľa, zrušíme mu prístup v našej infraštruktúre. Správcovia teda nemusia v každej službe odobrať prístup osobitne.

Úvod do overovania pomocou protokolu SPNEGO / Kerberos na jar poskytuje podrobný prehľad o tejto technológii.

3. Kerberizované prostredie

Vytvorme teda prostredie pre autentifikáciu pomocou protokolu Kerberos. Prostredie bude pozostávať z troch samostatných aplikácií, ktoré budú bežať súčasne.

Najprv, budeme mať Centrum distribúcie kľúčov ktorý bude slúžiť ako autentifikačný bod. Ďalej napíšeme Klient a Aplikáciu služieb, ktoré nakonfigurujeme na používanie protokolu Kerberos.

Spustenie protokolu Kerberos teraz vyžaduje trochu inštalácie a konfigurácie. Využijeme však Spring Security Kerberos, takže Centrum distribúcie kľúčov spustíme programovo vo vloženom režime. Tiež MiniKdc zobrazené nižšie je užitočné v prípade testovania integrácie s infraštruktúrou Kerberized.

3.1. Prevádzka Centra distribúcie kľúčov

Najskôr spustíme naše Centrum distribúcie kľúčov, ktoré pre nás vydá TGT:

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

V podstate sme dali MiniKdc sada príkazcov a konfiguračný súbor; navyše sme si povedali MiniKdc ako nazvať keytab generuje.

MiniKdc vygeneruje a krb5.conf súbor, ktorý dodáme našim klientom a aplikáciám služieb. Tento súbor obsahuje informácie, kde nájsť náš KDC - hostiteľa a port pre danú oblasť.

MiniKdc.main spustí KDC a mal by vydať niečo ako:

Samostatný MiniKdc spustený ----------------------------------------------- ---- Realm: EXAMPLE.COM Beží na: localhost: localhost krb5conf:. \ Spring-security-sso \ spring-security-sso-kerberos \ krb-test-workdir \ krb5.conf vytvoril keytab:. \ Spring-security -sso \ spring-security-sso-kerberos \ krb-test-workdir \ example.keytab s princípmi: [klient / localhost, HTTP / localhost]

3.2. Klientská aplikácia

Našim klientom bude aplikácia Spring Boot, ktorá používa a RestTemplate na volanie externého rozhrania REST API.

Ale, ideme použitie KerberosRestTemplate namiesto toho. Bude to potrebovať kľúčovú kartu a príkazcu klienta:

@Configuration verejná trieda KerberosConfig {@Value ("$ {app.user-principal: client / localhost}") súkromný principál reťazca; @Value ("$ {app.keytab-location}") private String keytabLocation; @Bean public RestTemplate restTemplate () {return new KerberosRestTemplate (keytabLocation, principal); }}

A je to! KerberosRestTemplate pre nás vyjednáva klientsku stranu protokolu Kerberos.

Poďme teda vytvoriť rýchlu triedu, ktorá bude dopytovať niektoré údaje zo služby Kerberized hostenej v koncovom bode app.access-url:

@Service class SampleClient {@Value ("$ {app.access-url}") private String endpoint; súkromná RestTemplate restTemplate; // konštruktor, getter, setter String getData () {return restTemplate.getForObject (endpoint, String.class); }}

Poďme teda teraz vytvoriť našu aplikáciu služieb, aby táto trieda mala čo volať!

3.3. Aplikácia služby

Použijeme Spring Security a nakonfigurujeme ho s príslušnými fazuľami špecifickými pre Kerberos.

Upozorňujeme tiež, že služba bude mať svoje hlavné sídlo a bude tiež používať tabuľku kľúčov:

@Configuration @EnableWebSecurity verejná trieda WebSecurityConfig rozširuje WebSecurityConfigurerAdapter {@Value ("$ {app.service-principal: HTTP / localhost}") súkromný reťazec servicePrincipal; @Value ("$ {app.keytab-location}") private String keytabLocation; @Override protected void configure (HttpSecurity http) vyvolá výnimku {http .authorizeRequests () .antMatchers ("/", "/ home"). PermitAll () .anyRequest (). Autentizovaný (). A () .exceptionHandling (). authenticationEntryPoint (spnegoEntryPoint ()). a () .formLogin () .loginPage ("/ login"). permitAll () .and () .logout (). permitAll () .and () .addFilterBefore (spnegoAuthenticationProcessingFilter (authenticationManagerBean ()) ), BasicAuthenticationFilter.class); } @Override protected void configure (AuthenticationManagerBuilder auth) hodí výnimku {auth .authenticationProvider (kerberosAuthenticationProvider ()) .authenticationProvider (kerberosServiceAuthenticationProvider ()); } @Bean public KerberosAuthenticationProvider kerberosAuthenticationProvider () {poskytovateľ KerberosAuthenticationProvider = nový KerberosAuthenticationProvider (); // poskytovateľ vráti konfiguráciu poskytovateľa; } @Bean public SpnegoEntryPoint spnegoEntryPoint () {vrátiť nový SpnegoEntryPoint ("/ login"); } @Bean public SpnegoAuthenticationProcessingFilter spnegoAuthenticationProcessingFilter (AuthenticationManager authenticationManager) {SpnegoAuthenticationProcessingFilter filter = nový SpnegoAuthenticationProcessingFilter (); // konfigurácia filtra spätný filter; } @Bean public KerberosServiceAuthenticationProvider kerberosServiceAuthenticationProvider () {poskytovateľ KerberosServiceAuthenticationProvider = nový KerberosServiceAuthenticationProvider (); // overenie konfigurácie poskytovateľa vrátenie poskytovateľa; } @Bean public SunJaasKerberosTicketValidator sunJaasKerberosTicketValidator () {SunJaasKerberosTicketValidator ticketValidator = nový SunJaasKerberosTicketValidator (); // konfigurácia validátora spiatočný ticketValidator; }}

Upozorňujeme, že sme konfigurovali Spring Security pre autentifikáciu SPNEGO. Týmto spôsobom sa budeme môcť autentifikovať pomocou protokolu HTTP, aj keď s jadrom Java môžeme dosiahnuť aj autentifikáciu SPNEGO.

4. Testovanie

Teraz ukážeme test integrácie náš klient úspešne získava údaje z externého servera prostredníctvom protokolu Kerberos. Na vykonanie tohto testu je potrebné, aby sme mali spustenú našu infraštruktúru MiniKdc a naša Aplikácia služieb musí byť spustená.

V zásade použijeme našu SampleClient z klientskej aplikácie podať žiadosť o našu aplikáciu služby. Vyskúšajme to:

@Autowired private SampleClient sampleClient; @Test public void givenKerberizedRestTemplate_whenServiceCall_thenSuccess () {assertEquals ("údaje z kerberizovaného servera", sampleClient.getData ()); }

Upozorňujeme, že môžeme tiež dokázať, že KerberizedRestTemplate je dôležité zasiahnuť službu bez nej:

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

Na okraj je tu šanca náš druhý test by mohol znovu použiť lístok už uložený v pamäti poverení. Stalo by sa tak kvôli automatickému vyjednávaniu SPNEGO použitému v HttpUrlConnection.

Ako výsledok, údaje sa môžu skutočne vrátiť, čo zneplatní náš test. V závislosti na našich potrebách potom môžeme deaktivovať použitie medzipamäte lístkov prostredníctvom vlastnosti systému http.use.global.creds = false.

5. Záver

V tomto návode preskúmali sme protokol Kerberos pre centralizovanú správu používateľov a ako Spring Security podporuje protokol Kerberos a autentifikačný mechanizmus SPNEGO.

Použili sme MiniKdc postaviť sa na zabudovanú KDC a tiež vytvoril veľmi jednoduchý Kerberizovaný klient a server. Toto nastavenie bolo užitočné na preskúmanie a obzvlášť užitočné, keď sme vytvorili test integrácie, aby sme mohli veci otestovať.

Teraz sme povrch iba poškriabali. Ak sa chcete ponoriť hlbšie, pozrite si wiki stránku Kerberos alebo jej RFC. Užitočná bude aj stránka s oficiálnou dokumentáciou. Okrem toho, aby ste videli, ako sa dajú veci robiť v jadre Java, podrobne to ukazuje nasledujúci tutoriál Oracle.

Ako obvykle, kód nájdete na našej stránke GitHub.

Bezpečnostné dno

Práve som oznámil nový kurz Learn Spring Security vrátane úplného materiálu zameraného na nový zásobník OAuth2 vo Spring Security 5:

>> SKONTROLUJTE KURZ

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