Gyors bevezető a Spring Cloud konfigurációhoz

1. Áttekintés

Tavaszi Felhő Konf a Spring kliens / szerver megközelítése az elosztott konfigurációk tárolására és kiszolgálására több alkalmazás és környezet között.

Ennek a konfigurációs tárolónak ideális verziója van Git verzióvezérlés és az alkalmazás futásidején módosítható. Míg nagyon jól illeszkedik a tavaszi alkalmazásokba, az összes támogatott konfigurációs fájlformátumot és az ehhez hasonló konstrukciókat használva Környezet, PropertySource vagy @Value, bármilyen programozási nyelvet futtató környezetben használható.

Ebben az írásban egy példára fogunk koncentrálni a Git-támogatott konfigurációs kiszolgáló, használd egyszerűen PIHENÉS alkalmazáskiszolgáló és biztonságos környezet beállítása, beleértve a titkosított tulajdonságértékeket.

2. A projekt beállítása és függőségei

Hogy felkészüljünk valamilyen kód írására, létrehozunk két újat Maven projektek. A szerver projekt a spring-cloud-config-server modul, valamint a spring-boot-starter-security és tavasz-boot-starter-web kezdő csomagok:

 org.springframework.cloud spring-cloud-config-server org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-web 

Az ügyfélprojekthez azonban csak a következőkre lesz szükségünk tavasz-felhő-indító-konfiguráció és a spring-boot-starter-web modulok:

 org.springframework.cloud spring-cloud-starter-config org.springframework.boot spring-boot-starter-web 

3. A Config Server megvalósítása

Az alkalmazás fő része egy config osztály - pontosabban a @SpringBootApplication - amely az összes szükséges beállítást behúzza a automatikus konfigurálás annotáció @EnableConfigServer:

@SpringBootApplication @EnableConfigServer public class ConfigServer {public static void main (String [] argumentumok) {SpringApplication.run (ConfigServer.class, argumentumok); }} 

Most konfigurálnunk kell a szervert kikötő amelyen a szerverünk hallgat és a Git-url, amely a verzió által vezérelt konfigurációs tartalmunkat biztosítja. Ez utóbbiak hasonló protokollokkal használhatók http, ssh vagy egy egyszerű fájl helyi fájlrendszeren.

Tipp: Ha több konfigurációs kiszolgáló példányát tervezi használni, amelyek ugyanarra a konfigurációs lerakatra mutatnak, beállíthatja a kiszolgálót, hogy klónozza a repót egy helyi ideiglenes mappába. De vegye figyelembe a kétfaktoros hitelesítéssel rendelkező magántárakat, ezeket nehéz kezelni! Ilyen esetben könnyebb klónozni őket a helyi fájlrendszerre, és dolgozni a másolattal.

Vannak olyanok is helyőrző változók és keresési minták a. konfigurálásához repository-url elérhető; de ez meghaladja cikkünk kereteit. Ha érdekli, a hivatalos dokumentáció jó kiindulópont.

Be kell állítanunk egy felhasználónevet és egy jelszót a Alap-hitelesítés miénkben alkalmazás.tulajdonságok elkerülheti az automatikusan létrehozott jelszót minden alkalmazás újraindításakor:

server.port = 8888 spring.cloud.config.server.git.uri = ssh: // localhost / config-repo spring.cloud.config.server.git.clone-on-start = true spring.security.user.name = gyökér tavasz.biztonság.felhasználó.jelszó = s3cr3t

4. A Git-tár a konfigurációs tárhelyként

A szerverünk befejezéséhez inicializálnunk kell a Git adattárat a konfigurált URL alatt hozzon létre néhány új tulajdonságfájlt, és népszerűsítse azokat bizonyos értékekkel.

A konfigurációs fájl neve úgy áll, mint egy normál tavasz alkalmazás.tulajdonságok, de az „alkalmazás” szó helyett egy konfigurált név, pl. az ingatlan értéke ‘Tavasz.alkalmazás.neve’ kliens kerül felhasználásra, amelyet egy kötőjel és az aktív profil követ. Például:

$> git init $> echo 'user.role = Fejlesztő'> config-client-development.properties $> echo 'user.role = Felhasználó'> config-client-production.properties $> git add. $> git pühend -m 'kezdeti config-kliens tulajdonságok'

Hibaelhárítás: Ha összefut sshkapcsolatos hitelesítési problémák, kettős ellenőrzés ~ / .ssh / ismert_tulajdonosok és ~ / .ssh / engedéllyel_kulcsok az ssh szerveren!

5. A konfiguráció lekérdezése

Most elindíthatjuk a szerverünket. A GitA szerverünk által biztosított backback konfigurációs API lekérdezhető a következő elérési utak használatával:

/ {alkalmazás} / {profil} [/ {címke}] /{application}-{profile}.yml /{label}/{application}-{profile}.yml /{application}-{profile}.properties / { label} / {application} - {profile} .properties

Amelyben a {címke} helyőrző egy Git ágra utal, {Alkalmazás} az ügyfél alkalmazás nevéhez és a {profil} az ügyfél aktuális aktív alkalmazásprofiljára.

Tehát a fiókban fejleszthetjük a fejlesztési profil alatt futó tervezett config kliensünk konfigurációját fő- keresztül:

$> curl // root: [e-mail védett]: 8888 / config-client / development / master

6. Az ügyfél megvalósítása

Ezután vigyázzunk az ügyfélre. Ez egy nagyon egyszerű kliens alkalmazás lesz, amely a PIHENÉS vezérlő egy KAP módszer.

A szerver beolvasásához a konfigurációt egy elnevezett erőforrás fájlba kell helyezni bootstrap.alkalmazás, mert ezt a fájlt (amint azt a neve is jelzi) nagyon korán töltjük be, amíg az alkalmazás elindul:

@SpringBootApplication @RestController nyilvános osztály ConfigClient {@Value ("$ {user.role}") privát karakterlánc-szerepkör; public static void main (String [] args) {SpringApplication.run (ConfigClient.class, args); } @GetMapping (value = "/ whoami / {username}", = MediaType.TEXT_PLAIN_VALUE) public String whoami (@PathVariable ("felhasználónév") String felhasználónév) {return String.format ("Hello!% S vagy és (n)% s lesz ... \ n ", felhasználónév, szerep); }}

Az alkalmazásnév mellett az aktív profilt és a csatlakozás részleteit is feltesszük a mappánkba bootstrap.tulajdonságok:

spring.application.name = config-client spring.profiles.active = development spring.cloud.config.uri = // localhost: 8888 spring.cloud.config.username = gyökér spring.cloud.config.password = s3cr3t

Annak teszteléséhez, hogy a konfigurációt megfelelően kapta-e meg szerverünk és a szerepérték befecskendezik a kontroller módszerünkbe, egyszerűen göndörítjük az ügyfél indítása után:

$> curl // localhost: 8080 / whoami / Mr_Pink

Ha a válasz a következő, akkor a Spring Cloud Config Server és ügyfele egyelőre jól dolgoznak:

Helló! Ön Mr_Pink és fejlesztővé válik (n) ...

7. Titkosítás és visszafejtés

Követelmény: A kriptográfiailag erős kulcsok, valamint a Spring titkosítási és visszafejtési funkciók használatához szükséged van a következőkre: „Java kriptográfiai kiterjesztés (JCE) korlátlan erősségű joghatósági házirend-fájlok” telepítve van a JVM. Ezek letölthetők például az Oracle-ről. A telepítéshez kövesse a letöltésben található utasításokat. Néhány Linux disztribúció telepíthető csomagot is biztosít a csomagkezelőkön keresztül.

Mivel a konfigurációs kiszolgáló támogatja a tulajdonságértékek titkosítását és visszafejtését, használhatja a nyilvános tárhelyeket bizalmas adatok, például felhasználónév és jelszó tárolására. A titkosított értékek előtagja a karakterlánc {rejtjel} és az útvonal REST-hívásával generálható ’/ Titkosítás’, ha a szerver szimmetrikus kulcs vagy kulcspár használatára van beállítva.

A visszafejtendő végpont is elérhető. Mindkét végpont elfogadja az alkalmazás nevének és aktuális profiljának helyőrzőket tartalmazó útvonalát: ’/ * / {Név} / {profil} '. Ez különösen hasznos az ügyfélenkénti kriptográfia vezérléséhez. Mielőtt azonban hasznossá válnának, be kell állítania egy kriptográfiai kulcsot, amelyet a következő szakaszban fogunk megtenni.

Tipp: Ha a curl segítségével hívja meg az en- / decryption API-t, jobb, ha a –Adat-urlencode opció (a –Adatok / -d), vagy állítsa a „Content-Type” fejlécet explicitre „Szöveg / sima”. Ez biztosítja a speciális karakterek, például a „+” helyes kezelését a titkosított értékekben.

Ha egy értéket nem lehet automatikusan visszafejteni az ügyféllel történő letöltés közben, akkor az kulcs átnevezi magát a nevet, előtagja az „érvénytelen” szó. Ennek meg kell akadályoznia például egy titkosított érték használatát jelszóként.

Tipp: A YAML fájlokat tartalmazó adattár felállításakor a titkosított és előtagolt értékeket egyetlen idézőjelekkel kell körülvennie! A Properties esetében ez nem így van.

7.1. CSRF

Alapértelmezés szerint a Spring Security lehetővé teszi a CSRF-védelmet az alkalmazásunknak küldött összes kérelemben.

Ezért, hogy használni tudja a / titkosítás és / visszafejteni végpontok, tiltsuk le a CSRF-et számukra:

A @Configuration public class SecurityConfiguration kiterjeszti a WebSecurityConfigurerAdapter {@Orride public void configure (HttpSecurity http) dobja a {http.csrf () .ignoringAntMatchers ("/ encrypt / **") .ignoringAntMatchers ("/ decrypt / **") kivételt; super.configure (http); }}

7.2. Kulcskezelés

A konfigurációs kiszolgáló alapértelmezés szerint engedélyezi a tulajdonságértékek szimmetrikus vagy aszimmetrikus titkosítását.

Szimmetrikus rejtjelezés használata, egyszerűen meg kell adnia az ingatlant ‘Encrypt.key’ a te alkalmazás.tulajdonságok az általad választott titokhoz. Alternatív megoldásként átadhatja a környezeti változót ENCRYPT_KEY.

Az aszimmetrikus rejtjelezéshez, beállíthatja ‘Encrypt.key’ a PEMkódolt karaktersorozat értéke vagy konfigurálja a kulcstár használni.

Mivel nagyon biztonságos környezetre van szükségünk a demo szerverünkhöz, az utóbbi opciót választottuk, és létrehoztunk egy új kulcstárat, beleértve a RSA kulcs-pár, a Java-val kulcstartó első:

$> keytool -genkeypair -alias config-server-key \ -keyalg RSA -keysize 4096 -sigalg SHA512wRSA \ -név 'CN = Config Server, OU = Spring Cloud, O = Baeldung' \ -keypass my-k34-s3cr3t -keystore config-server.jks \ -storepass my-s70r3-s3cr3t

Ezt követően hozzáadjuk a létrehozott kulcstárat a szerverünkhöz bootstrap.tulajdonságok és futtassa újra:

encrypt.keyStore.location = classpath: /config-server.jks encrypt.keyStore.password = my-s70r3-s3cr3t encrypt.keyStore.alias = config-server-key encrypt.keyStore.secret = my-k34-s3cr3t

Következő lépésként lekérdezhetjük a titkosítási végpontot, és hozzáadhatjuk a választ értékként egy adattárunk konfigurációjához:

$> export PASSWORD = $ (curl -X POST --data-urlencode d3v3L \ // gyökér: [e-mail védett]: 8888 / titkosítás) $> echo "user.password = {rejtjel} $ PASSWORD" >> config-client -development.properties $> git comm -am 'Titkosított jelszó hozzáadása' $> curl -X POST // root: [e-mail védett]: 8888 / refresh

Annak teszteléséhez, hogy a beállításunk megfelelően működik-e, módosítjuk a ConfigClient osztály és indítsa újra ügyfelünket:

@SpringBootApplication @RestController public class ConfigClient {... @Value ("$ {user.password}") private String jelszó; ... public String whoami (@PathVariable ("felhasználónév") String felhasználónév) {return String.format ("Üdvözlet!% s vagy, és (n)% s," + "leszel, de csak akkor, ha a jelszó '% s'! \ n ", felhasználónév, szerepkör, jelszó); }}

Az ügyfelünk elleni utolsó lekérdezés megmutatja, ha a konfigurációs értékünket visszafejtjük:

$> curl // localhost: 8080 / whoami / Mr_Pink Helló! Ön Mr_Pink és fejlesztővé válik (\), de csak akkor, ha a jelszava 'd3v3L'!

7.3. Több kulcs használata

Ha több kulcsot szeretne használni a titkosításhoz és a visszafejtéshez, például: egy dedikáltat minden kiszolgált alkalmazáshoz, akkor hozzáadhat egy másik előtagot {név: érték} között {rejtjel} előtag és a BASE64kódolt tulajdonságérték.

A konfigurációs kiszolgáló az előtagokat hasonlóan érti {titok: titkosításom vagy {kulcs: my-key-alias} majdnem dobozon kívül. Ez utóbbi opcióhoz egy konfigurált kulcstárra van szükség alkalmazás.tulajdonságok. Ez a kulcstár keres egy megfelelő kulcsaliast. Például:

user.password = {rejtjel} {secret: my-499-s3cr3t} AgAMirj1DkQC0WjRv ... user.password = {rejtjel} {kulcs: config-kliens-kulcs} AgAMirj1DkQC0WjRv ...

A kulcstár nélküli forgatókönyveknél meg kell valósítani a @Bab típusú TextEncryptorLocator amely kezeli a keresést és visszaadja a TextEncryptor-Tárgy minden kulcshoz.

7.4. Titkosított tulajdonságok kiszolgálása

Ha le szeretné tiltani a kiszolgálóoldali kriptográfiát, és a tulajdonságértékek visszafejtését helyben szeretné kezelni, akkor a következőket teheti meg a kiszolgálón: alkalmazás.tulajdonságok:

spring.cloud.config.server.encrypt.enabled = hamis

Ezenkívül törölheti az összes többi „encrypt. *” Tulajdonságot a PIHENÉS végpontok.

8. Következtetés

Most létrehozhatunk egy konfigurációs kiszolgálót a konfigurációs fájlok készletének biztosításához a Git kliens alkalmazások tárháza. Van még néhány dolog, amit megtehet egy ilyen szerverrel.

Például:

  • A konfiguráció kiszolgálása itt: YAML vagy Tulajdonságok formátum helyett JSON - helyfoglalókkal is megoldva. Ami hasznos lehet, ha nem tavaszi környezetben használjuk, ahol a konfiguráció nincs közvetlenül hozzárendelve a PropertySource.
  • Szöveges konfigurációs fájlok kiszolgálása - viszont opcionálisan megoldott helyőrzőkkel. Ez hasznos lehet például környezettől függő naplózási konfiguráció biztosításához.
  • Beágyazza a konfigurációs kiszolgálót egy alkalmazásba, ahol a Git tárhelyet, ahelyett, hogy önálló alkalmazásként futtatná az ügyfeleket. Ezért be kell állítani néhány bootstrap tulajdonságot és / vagy a @EnableConfigServer az annotációt el kell távolítani, ami a használati esettől függ.
  • Tegye elérhetővé a konfigurációs szervert a Spring Netflix Eureka szolgáltatáskeresés során, és engedélyezze az automatikus szerverkeresést a konfigurációs ügyfelekben. Ez akkor válik fontossá, ha a szervernek nincs rögzített helye, vagy abban mozog.

És összefoglalva, megtalálja a cikk forráskódját a Githubon.