Tavaszi rendszerindítási biztonság automatikus konfigurálása

1. Bemutatkozás

Ebben a cikkben megnézzük a Spring Boot véleményes megközelítését a biztonságról.

Egyszerűen fogalmazva, az alapértelmezett biztonsági konfigurációra fogunk összpontosítani, és arra, hogyan kapcsolhatjuk ki vagy testre szabhatjuk, ha szükséges.

2. Alapértelmezett biztonsági beállítások

A Spring Boot alkalmazás biztonságának növelése érdekében hozzá kell adnunk a biztonsági indító függőség:

 org.springframework.boot spring-boot-starter-security 

Ez magában foglalja a SecurityAutoConfiguration osztály - tartalmazza a kezdeti / alapértelmezett biztonsági konfigurációt.

Figyelje meg, hogyan nem határoztuk meg itt a verziót, feltételezve, hogy a projekt már a Boot-ot használja szülőnek.

Egyszerűen fogalmazva, alapértelmezés szerint engedélyezi a hitelesítést az alkalmazás számára. Ezenkívül tartalmi egyeztetést használnak annak eldöntésére, hogy az basic vagy a formLogin alkalmazandó-e.

Van néhány előre definiált tulajdonság, például:

spring.security.user.name spring.security.user.password

Ha nem konfiguráljuk a jelszót az előre definiált tulajdonság segítségével tavasz.biztonság.felhasználó.jelszó és indítsa el az alkalmazást, észrevesszük, hogy véletlenszerűen generálódik egy alapértelmezett jelszó, és kinyomtatja azt a konzol naplójában:

Alapértelmezett biztonsági jelszó használatával: c8be15de-4488-4490-9dc6-fab3f91435c6

További alapértelmezéseket a Spring Boot Common Application Properties referenciaoldal biztonsági tulajdonságainak részében talál.

3. Az automatikus konfiguráció letiltása

A biztonsági automatikus konfiguráció elvetéséhez és a saját konfigurációnk hozzáadásához ki kell zárnunk a SecurityAutoConfiguration osztály.

Ez egyszerű kizárással történhet:

@SpringBootApplication (kizárva = {SecurityAutoConfiguration.class}) public class SpringBootSecurityApplication {public static void main (String [] args) {SpringApplication.run (SpringBootSecurityApplication.class, args); }} 

Vagy valamilyen konfiguráció hozzáadásával a alkalmazás.tulajdonságok fájl:

spring.autoconfigure.exclude = org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration

Vannak olyan esetek is, amikor ez a beállítás nem elég.

Például szinte minden Spring Boot alkalmazást az Actuatorral indítanak az osztályútvonalon. Ez problémákat okoz, mert egy másik automatikus konfigurációs osztálynak szüksége van az imént kizárt osztályra, így az alkalmazás nem indul el.

A probléma megoldásához ki kell zárnunk az osztályt; és - a működtető helyzetére jellemzően - ki kell zárnunk ManagementWebSecurityAutoConfiguration.

3.1. A biztonsági automatikus konfiguráció letiltása vagy túllépése

Jelentős különbség van az autokonfiguráció letiltása és túllépése között.

Letiltásával ugyanúgy, mint a semmiből hozzáadva a Spring Security függőséget és az egész beállítást. Ez több esetben is hasznos lehet:

  1. Az alkalmazásbiztonság integrálása egyéni biztonsági szolgáltatóval
  2. A régi, már meglévő biztonsági beállításokkal rendelkező tavaszi alkalmazások áttelepítése a Spring Boot alkalmazásba

De legtöbbször nem kell teljesen letiltanunk a biztonsági automatikus konfigurációt.

A Spring Boot konfigurálásának módja lehetővé teszi az autokonfigurált biztonság túllépését új / egyedi konfigurációs osztályaink hozzáadásával. Ez általában könnyebb, mivel csak egy meglévő biztonsági beállítást testreszabunk az igényeink kielégítése érdekében.

4. A tavaszi rendszerindítás biztonságának konfigurálása

Ha a biztonsági automatikus konfigurálás letiltásának útját választottuk, akkor természetesen meg kell adnunk a saját konfigurációnkat.

Amint korábban megbeszéltük, ez az alapértelmezett biztonsági konfiguráció; testreszabhatjuk a tulajdonságfájl módosításával.

Például felülírhatjuk az alapértelmezett jelszót a sajátunk hozzáadásával:

spring.security.user.password = jelszó

Ha rugalmasabb konfigurációt akarunk, például több felhasználóval és szerepkörrel - ki kell használnunk egy teljes értéket @ Konfiguráció osztály:

@Configuration @EnableWebSecurity nyilvános osztály auth .inMemoryAuthentication () .withUser ("felhasználó"). jelszó (encoder.encode ("jelszó")) .roles ("USER") .és () .withUser ("admin"). jelszó (encoder.encode (" admin ")) .roles (" FELHASZNÁLÓ "," ADMIN "); } A @Orride protected void configure (HttpSecurity http) dobja a Kivételt {http .authorizeRequests () .anyRequest () .authenticated () .és () .httpBasic (); }}

A @EnableWebSecurity az annotáció kulcsfontosságú, ha letiltjuk az alapértelmezett biztonsági konfigurációt.

Hiányzás esetén az alkalmazás nem indul el. A kommentár csak akkor választható, ha az a használatával csak felülírjuk az alapértelmezett viselkedést WebSecurityConfigurerAdapter.

Figyelje meg azt is, hogy mi használni kell a PasswordEncoder a jelszavak beállításához a Spring Boot 2 használatakor. További részletekért olvassa el az Alapértelmezett jelszó kódoló útmutatónkat a Spring Security 5-ben.

Most néhány gyors élő teszt segítségével ellenőriznünk kell, hogy a biztonsági konfigurációnk megfelelően működik-e:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = RANDOM_PORT) nyilvános osztály BasicConfigurationIntegrationTest {TestRestTemplate restTemplate; URL-alap; @LocalServerPort int port; @A nyilvános void előtt a setUp () dobja a MalformedURLException {restTemplate = new TestRestTemplate ("felhasználó", "jelszó"); base = új URL ("// localhost:" + port); } @Test public void whenLoggedUserRequestsHomePage_ThenSuccess () dobja az IllegalStateException, az IOException {ResponseEntity response = restTemplate.getForEntity (base.toString (), String.class); assertEquals (HttpStatus.OK, response.getStatusCode ()); assertTrue (response.getBody (). tartalmazza ("Baeldung")); } @Test public void, amikor aUserWithWrongCredentials_thenUnauthorizedPage () kiveti a {restTemplate = new TestRestTemplate ("felhasználó", "hibás jelszó") kivételt; ResponseEntity response = restTemplate.getForEntity (base.toString (), String.class); assertEquals (HttpStatus.UNAUTHORIZED, response.getStatusCode ()); assertTrue (response.getBody (). tartalmazza ("Jogosulatlan")); }}

Az ötlet az, hogy a Spring Boot Security mögött tulajdonképpen a Spring Security áll, így bármilyen biztonsági konfiguráció, amely ezzel elvégezhető, vagy bármilyen integráció, amelyet ez támogat, megvalósítható a Spring Boot-ban is.

5. Tavaszi indítás OAuth2 automatikus konfigurálása (régi verem használatával)

A Spring Boot egy dedikált automatikus konfigurációs támogatással rendelkezik az OAuth2 számára.

A Spring Boot 1.x-hez tartozó Spring Security OAuth-támogatást a későbbi rendszerindító verziókban eltávolították az első osztályú OAuth-támogatás helyett, amely a Spring Security 5-hez érkezett. Ezt a következő szakaszban megtudjuk.

A régi veremhez (a Spring Security OAuth használatával) először hozzá kell adnunk egy Maven-függőséget az alkalmazás beállításának megkezdéséhez:

 org.springframework.security.oauth spring-security-oauth2 

Ez a függőség olyan osztályok halmazát tartalmazza, amelyek képesek kiváltani az itt meghatározott automatikus konfigurációs mechanizmust OAuth2AutoConfiguration osztály.

Most több választási lehetőségünk van a folytatásra, az alkalmazási körünktől függően.

5.1. OAuth2 Authorization Server automatikus konfigurálása

Ha azt akarjuk, hogy alkalmazásunk OAuth2 szolgáltató legyen, használhatjuk @EnableAuthorizationServer.

Indításkor észrevesszük a naplókban, hogy az automatikus konfigurációs osztályok létrehoznak egy ügyfél-azonosítót és egy ügyfél-titkot az engedélyezési kiszolgálónkhoz, és természetesen egy véletlenszerű jelszót az alapvető hitelesítéshez.

Alapértelmezett biztonsági jelszó használata: a81cb256-f243-40c0-a585-81ce1b952a98 security.oauth2.client.client-id = 39d2835b-1f87-4a77-9798-e2975f36972e security.oauth2.client.client-secret = f1463f8b-0769-4 -521b86c55b71

Ezek a hitelesítő adatok felhasználhatók hozzáférési token megszerzésére:

curl -X POST -u 39d2835b-1f87-4a77-9798-e2975f36972e: f1463f8b-0791-46fe-9269-521b86c55b71 \ -d grant_type = client_credentials -d felhasználónév = felhasználó -d jelszó = a81cb256-f243-40c98 -145 -d hatókör = write // localhost: 8080 / oauth / token

Egy másik cikkünk további részleteket tartalmaz a témáról.

5.2. Egyéb tavaszi indítás OAuth2 automatikus konfigurációs beállításai

Van néhány egyéb felhasználási eset, amelyeket a Spring Boot OAuth2 lefed, például:

  1. Erőforrás-kiszolgáló - @EnableResourceServer
  2. Kliens alkalmazás - @ EnableOAuth2Sso vagy @ EnableOAuth2Client

Ha arra van szükségünk, hogy az alkalmazásunk a fenti típusok egyike legyen, csak hozzá kell adnunk néhány konfigurációt az alkalmazás tulajdonságaihoz, amint azt a fent hivatkozott linkek részletezik.

Minden OAuth2 specifikus tulajdonság megtalálható a Spring Boot Common Application Properties oldalon.

6. Tavaszi indítás OAuth2 automatikus konfigurálása (új verem használatával)

Az új verem használatához hozzá kell adnunk a függőségeket attól függően, hogy mit akarunk konfigurálni - egy engedélyezési kiszolgálót, egy erőforrás-kiszolgálót vagy egy kliens alkalmazást.

Nézzük meg őket egyenként.

6.1. OAuth2 Authorization Server támogatás

Amint azt az előző szakaszban láttuk, a Spring Security OAuth verem lehetőséget kínált egy Authorization Server telepítésére Spring alkalmazásként. De a projektet elavulták, és a Spring mostantól nem támogatja a saját engedélyezési kiszolgálóját. Ehelyett ajánlott meglévő, jól bevált szolgáltatókat használni, mint például az Okta, a Keycloak és a Forgerock.

A Spring Boot azonban megkönnyíti számunkra az ilyen szolgáltatók konfigurálását. Például a Keycloak konfigurációjára hivatkozhatunk A Gyors útmutató a Keycloak használatához rugós csomagtartóval vagy a Keycloak beágyazott rugós csomagtartó alkalmazáshoz.

6.2. OAuth2 erőforrás-kiszolgáló támogatás

Az erőforrás-kiszolgáló támogatásának hozzáadásához hozzá kell adnunk ezt a függőséget:

 org.springframework.boot spring-boot-starter-oauth2-resource-server 

A legfrissebb verzióval kapcsolatos információkért látogasson el a Maven Central oldalára.

Ezenkívül a biztonsági konfigurációnkban fel kell tüntetnünk a oauth2ResourceServer () DSL:

A @konfiguráció nyilvános osztálya A JWTSecurityConfig kiterjeszti a WebSecurityConfigurerAdapter {@ Felülírja a védett érvénytelen konfigurációt (HttpSecurity http) a {http ... .oauth2ResourceServer (oauth2 -> oauth2.jwt ()) kivételt dobja; ...}}

Az OAuth 2.0 erőforrás-kiszolgálónk, a Spring Security 5 segítségével részletes áttekintést ad erről a témáról.

6.3. OAuth2 ügyfélszolgálat

Az erőforrás-kiszolgáló konfigurálásához hasonlóan az ügyfélalkalmazásoknak saját függőségekre és DSL-ekre is szükségük van.

Itt található az OAuth2 ügyféltámogatás függősége:

 org.springframework.boot spring-boot-starter-oauth2-client 

A legújabb verzió a Maven Central oldalon található.

A Spring Security 5 emellett első osztályú bejelentkezési támogatást is nyújt oath2Login () DSL.

Az új verem egyszeri bejelentkezésének támogatásával kapcsolatos részletekért olvassa el az Egyszeri egyszeri bejelentkezés a Spring Security OAuth2 szolgáltatással.

7. Spring Boot 2 Security vs Spring Boot 1 Security

Az 1. tavaszi csomagtartóhoz képest A Spring Boot 2 jelentősen leegyszerűsítette az automatikus konfigurációt.

A Spring Boot 2 programban, ha saját biztonsági konfigurációt akarunk, egyszerűen hozzáadhatunk egy egyedi beállítást WebSecurityConfigurerAdapter. Ez letiltja az alapértelmezett automatikus konfigurációt és engedélyezi az egyéni biztonsági konfigurációt.

A Spring Boot 2 a Spring Security legtöbb alapértelmezettjét használja. Emiatt, a Spring Boot 1 alapértelmezés szerint nem védett végpontjai közül néhány alapértelmezés szerint biztonságban van.

Ezek a végpontok olyan statikus erőforrásokat tartalmaznak, mint a / css / **, / js / **, / images / **, / webjars / **, /**/favicon.ico, és a hiba végpontját. Ha engedélyeznünk kell a hitelesítés nélküli hozzáférést ezekhez a végpontokhoz, ezt kifejezetten konfigurálhatjuk.

A biztonsággal kapcsolatos konfiguráció egyszerűsítése érdekében A Spring Boot 2 eltávolította a következő Spring Boot 1 tulajdonságokat:

security.basic.authorize-mode security.basic.enabled security.basic.path security.basic.realm security.enable-csrf security.headers.cache security.headers.content-security-policy security.headers.content-security-policy -mode security.headers.content-type security.headers.frame security.headers.hsts security.headers.xss security.ignored security.require-ssl security.sessions

8. Következtetés

Ebben a cikkben a Spring Boot által biztosított alapértelmezett biztonsági konfigurációra összpontosítottunk. Láttuk, hogyan lehet a biztonsági automatikus konfigurációs mechanizmust letiltani vagy felülírni, és hogyan lehet új biztonsági konfigurációt alkalmazni.

Az OAuth2 forráskódja megtalálható az OAuth2 GitHub adattárunkban, a régi és az új verem számára. A kód többi része megtalálható a GitHub oktatóanyagok között.