Proljetna sigurnosna integracija Kerberos-a s MiniKdc

Sigurnost Vrh

Upravo sam najavio novi tečaj Learn Spring Security, uključujući puni materijal usredotočen na novi OAuth2 stog u Spring Security 5:

>> PROVJERITE TEČAJ

1. Pregled

U ovom uputstvu pružit ćemo pregled Spring Security Kerberos.

Napisat ćemo Kerberos klijenta na Javi koji se autorizira za pristup našoj Kerberized usluzi. A mi ćemo pokrenuti vlastiti ugrađeni centar za distribuciju ključeva kako bismo izvršili potpunu autentičnost Kerberos s kraja na kraj. Sve to, bez ikakve vanjske infrastrukture potrebne zahvaljujući Spring Security Kerberos.

2. Kerberos i njegove blagodati

Kerberos je mrežni protokol za provjeru autentičnosti koji je MIT stvorio 1980-ih, posebno koristan za centraliziranje provjere autentičnosti na mreži.

1987. godine MIT ga je objavio u zajednici otvorenog koda i još je uvijek u aktivnom razvoju. 2005. proglašen je svetom kao IETF standard podRFC 4120.

Obično je Kerberos koristi se u korporacijskim okruženjima. Tamo osigurava okoliš na takav način da korisnik ne mora provjeriti autentičnost svake usluge zasebno. Ovo arhitektonsko rješenje poznato je pod nazivomJednokratna prijava.

Jednostavno rečeno, Kerberos je sustav za prodaju karata. Korisnik potvrđuje jednom i dobiva ulaznicu za dodjelu ulaznica (TGT). Zatim mrežna infrastruktura razmjenjuje taj TGT za uslužne karte. Te ulaznice za usluge omogućavaju korisniku interakciju s infrastrukturnim uslugama, sve dok TGT vrijedi, što je obično nekoliko sati.

Dakle, sjajno je što se korisnik potpisuje samo odjednom. Ali tu je i sigurnosna korist: u takvom okruženju korisnička lozinka nikad se ne šalje mrežom. Umjesto toga, Kerberos ga koristi kao faktor za generiranje drugog tajnog ključa koji će se koristiti za šifriranje i dešifriranje poruka.

Druga je prednost ta možemo upravljati korisnicima sa središnjeg mjesta, recimo onaj iza kojeg stoji LDAP. Stoga, ako onemogućimo račun u našoj centraliziranoj bazi podataka za određenog korisnika, tada ćemo mu opozvati pristup u našoj infrastrukturi. Stoga administratori ne moraju zasebno opozvati pristup u svakoj usluzi.

Uvod u SPNEGO / Kerberos autentifikaciju u proljeće daje detaljan pregled tehnologije.

3. Kerberizirano okruženje

Dakle, stvorimo okruženje za autentifikaciju s Kerberos protokolom. Okruženje će se sastojati od tri zasebne aplikacije koje će se istodobno pokretati.

Prvi, imat ćemo distribucijski centar ključeva koja će djelovati kao točka provjere autentičnosti. Dalje, napisat ćemo klijenta i uslužnu aplikaciju koje ćemo konfigurirati za upotrebu Kerberos protokola.

Sada, pokretanje Kerberosa zahtijeva malo instalacije i konfiguracije. Međutim, iskoristit ćemo Spring Security Kerberos, tako da ćemo Centar za distribuciju ključeva pokrenuti programski, u ugrađenom načinu rada. Također, MiniKdc dolje prikazana korisna je u slučaju testiranja integracije s kerberiziranom infrastrukturom.

3.1. Pokretanje centra za distribuciju ključeva

Prvo ćemo pokrenuti naš distribucijski centar ključeva koji će nam izdati TGT-ove:

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

U osnovi, dali smo MiniKdc skup principala i konfiguracijska datoteka; osim toga, rekli smo MiniKdc kako nazvati tipkovnica generira.

MiniKdc generirat će a krb5.conf datoteku koju ćemo dostaviti našim klijentima i uslužnim aplikacijama. Ova datoteka sadrži informacije gdje pronaći naš KDC - hosta i priključka za dano područje.

MiniKdc.main pokreće KDC i trebao bi iznijeti nešto poput:

Samostalni MiniKdc pokrenut ----------------------------------------------- ---- Područje: EXAMPLE.COM Izvodi se na: localhost: localhost krb5conf:. \ Spring-security-sso \ spring-security-sso-kerberos \ krb-test-workdir \ krb5.conf kreirana keytab:. \ Spring-security -sso \ spring-security-sso-kerberos \ krb-test-workdir \ example.keytab s nalogodavcima: [client / localhost, HTTP / localhost]

3.2. Prijava klijenta

Naš će klijent biti aplikacija Spring Boot koja koristi RestTemplate za upućivanje poziva vanjskom REST API-ju.

Ali, idemo koristiti KerberosRestTemplate umjesto toga. Trebat će tipkovnica i nalog klijenta:

@Configuration javna klasa 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); }}

I to je to! KerberosRestTemplate pregovara s klijentskom stranom Kerberos protokola za nas.

Dakle, stvorimo brzu klasu koja će tražiti neke podatke iz Kerberized usluge, hostirane na krajnjoj točki app.access-url:

@Service class SampleClient {@Value ("$ {app.access-url}") private String endpoint; privatni RestTemplate restTemplate; // konstruktor, getter, postavljač String getData () {return restTemplate.getForObject (krajnja točka, String.class); }}

Pa, izradimo sada našu Uslužnu aplikaciju kako bi ovaj razred imao što nazvati!

3.3. Prijava usluge

Koristit ćemo Spring Security, konfigurirajući ga s odgovarajućim grahom specifičnim za Kerberos.

Također imajte na umu da će usluga imati svog principala i koristiti i tablicu ključeva:

@Configuration @EnableWebSecurity javna klasa WebSecurityConfig proširuje WebSecurityConfigurerAdapter {@Value ("$ {app.service-principal: HTTP / localhost}") private String servicePrincipal; @Value ("$ {app.keytab-location}") private String keytabLocation; @Override zaštićena void konfiguracija (HttpSecurity http) baca Exception {http .authorizeRequests () .antMatchers ("/", "/ home"). AllowAll () .anyRequest (). Authenticated () .and () .exceptionHandling (). authenticationEntryPoint (spnegoEntryPoint ()) .and () .formLogin () .loginPage ("/ login"). allowAll () .and () .logout (). dozvolaAll () .and () .addFilterBefore (spnegoAuthenticationProcessingFilter ( ), BasicAuthenticationFilter.class); } @Override zaštićena void konfiguracija (AuthenticationManagerBuilder auth) baca iznimku {auth .authenticationProvider (kerberosAuthenticationProvider ()) .authenticationProvider (kerberosServiceAuthenticationProvider ()); } @Bean public KerberosAuthenticationProvider kerberosAuthenticationProvider () {KerberosAuthenticationProvider provider = novi KerberosAuthenticationProvider (); // dobavljač povrat konfiguracije davatelja; } @Bean public SpnegoEntryPoint spnegoEntryPoint () {return new SpnegoEntryPoint ("/ login"); } @Bean public SpnegoAuthenticationProcessingFilter spnegoAuthenticationProcessingFilter (AuthenticationManager authenticationManager) {SpnegoAuthenticationProcessingFilter filter = novi SpnegoAuthenticationProcessingFilter (); // filter filtra return filter; } @Bean public KerberosServiceAuthenticationProvider kerberosServiceAuthenticationProvider () {KerberosServiceAuthenticationProvider provider = novi KerberosServiceAuthenticationProvider (); // autorizacija davatelja usluga povrat podataka; } @Bean public SunJaasKerberosTicketValidator sunJaasKerberosTicketValidator () {SunJaasKerberosTicketValidator ticketValidator = new SunJaasKerberosTicketValidator (); // povratak konfiguracije validatora ticketValidator; }}

Imajte na umu da smo konfigurirali Spring Security za SPNEGO provjeru autentičnosti. Na taj ćemo način moći provjeriti autentičnost putem HTTP protokola, premda SPNEGO provjeru autentičnosti možemo postići i s osnovnom Javom.

4. Ispitivanje

Sada ćemo pokrenuti test integracije da to pokažemo naš klijent uspješno dohvaća podatke s vanjskog poslužitelja putem protokola Kerberos. Da bismo pokrenuli ovaj test, moramo imati pokrenutu našu infrastrukturu MiniKdc i naša aplikacija za uslugu mora biti pokrenuta.

U osnovi, koristit ćemo naše SampleClient iz Zahtjeva klijenta da podnese zahtjev našoj aplikaciji usluge. Isprobajmo:

@Autowired private SampleClient sampleClient; @Test javna praznina givenKerberizedRestTemplate_whenServiceCall_thenSuccess () {assertEquals ("podaci s kerberizovanog poslužitelja", sampleClient.getData ()); }

Imajte na umu da također možemo dokazati da KerberizedRestTemplate važno je pritiskom na uslugu bez nje:

@Test javna praznina givenRestTemplate_whenServiceCall_thenFail () {sampleClient.setRestTemplate (novi RestTemplate ()); assertThrows (RestClientException.class, sampleClient :: getData); }

Kao popratna napomena, postoji šansa naš drugi test mogao bi ponovno upotrijebiti kartu koja je već pohranjena u predmemoriji vjerodajnica. To bi se dogodilo zbog automatskog pregovaranja o SPNEGO-u korištenog u HttpUrlConnection.

Kao rezultat, podaci bi se zapravo mogli vratiti, poništavajući naš test. Ovisno o našim potrebama, tada možemo onemogućiti upotrebu predmemorije ulaznica putem sistemskog svojstva http.use.global.creds = netačno.

5. Zaključak

U ovom vodiču, istražili smo Kerberos za centralizirano upravljanje korisnicima i kako Spring Security podržava Kerberos protokol i SPNEGO mehanizam provjere autentičnosti.

Koristili smo MiniKdc da ustane ugrađeni KDC i također je stvorio vrlo jednostavan Kerberized klijent i poslužitelj. Ova je postavka bila zgodna za istraživanje, a posebno korisna kada smo kreirali integracijski test kako bismo testirali stvari.

Sad smo tek ogrebali površinu. Da biste zaronili dublje, pogledajte wiki stranicu Kerberos ili njegov RFC. Također, korisna će biti i službena stranica s dokumentacijom. Osim toga, da bismo vidjeli kako bi se stvari mogle raditi u jezgri Java, sljedeći Oracleov tutorial to detaljno prikazuje.

Kao i obično, kod se može naći na našoj GitHub stranici.

Dno sigurnosti

Upravo sam najavio novi tečaj Learn Spring Security, uključujući puni materijal usredotočen na novi OAuth2 stog u Spring Security 5:

>> PROVJERITE TEČAJ

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