Kratki uvod u proljetnu konfiguraciju oblaka

1. Pregled

Spring Cloud Config je Springov klijent / poslužiteljski pristup za pohranu i posluživanje distribuiranih konfiguracija u više aplikacija i okruženja.

Ovo spremište konfiguracija idealno je verzirano pod Git kontrola verzija i može se mijenjati tijekom izvođenja aplikacije. Iako se vrlo dobro uklapa u proljetne programe koristeći sve podržane formate konfiguracijskih datoteka zajedno s konstrukcijama poput Okoliš, PropertySource ili @Value, može se koristiti u bilo kojem okruženju s bilo kojim programskim jezikom.

U ovom tekstu usredotočit ćemo se na primjer kako postaviti a Gitkonfigurirani poslužitelj s podrškom, koristite ga na jednostavan način ODMOR aplikacijski poslužitelj i postavite sigurno okruženje, uključujući šifrirane vrijednosti svojstava.

2. Postavljanje projekta i ovisnosti

Da bismo se pripremili za pisanje nekog koda, kreiramo dva nova Maven prvo projekti. Projekt poslužitelja oslanja se na spring-cloud-config-server modul, kao i spring-boot-starter-sigurnost i proljeće-boot-starter-web početni paketi:

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

Međutim, za klijentski projekt trebat će nam samo spring-cloud-starter-config i spring-boot-starter-web moduli:

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

3. Implementacija poslužitelja za konfiguriranje

Glavni dio aplikacije je klasa config - točnije a @SpringBootApplication - koji uvlači sve potrebne postavke kroz automatski konfigurirati bilješka @EnableConfigServer:

@SpringBootApplication @EnableConfigServer javna klasa ConfigServer {javna statička void glavna (String [] argumenti) {SpringApplication.run (ConfigServer.class, argumenti); }} 

Sada moramo konfigurirati poslužitelj luka na kojem naš poslužitelj sluša i a Git-url koji pruža naš konfiguracijski sadržaj kontroliran verzijom. Potonji se mogu koristiti s protokolima poput http, ssh ili jednostavan datoteka na lokalnom datotečnom sustavu.

Savjet: Ako planirate koristiti više instanci poslužitelja konfiguracije koje upućuju na isto spremište konfiguracije, možete konfigurirati poslužitelj da klonira vaš repo u lokalnu privremenu mapu. Ali budite svjesni privatnih spremišta s dvofaktorskom autentifikacijom, njima je teško rukovati! U takvom je slučaju lakše klonirati ih u vaš lokalni datotečni sustav i raditi s kopijom.

Ima ih i nekih varijable rezerviranog mjesta i obrasci pretraživanja za konfiguriranje spremište-url dostupno; ali to je izvan dosega našeg članka. Ako ste zainteresirani, službena dokumentacija je dobro mjesto za početak.

Također moramo postaviti korisničko ime i lozinku za Osnovna provjera autentičnosti u našem primjena.svojstva kako biste izbjegli automatski generiranu lozinku pri svakom ponovnom pokretanju aplikacije:

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 = root spring.security.user.password = s3cr3t

4. Git spremište kao spremište konfiguracije

Da bismo dovršili naš poslužitelj, moramo inicijalizirati a Git spremište pod konfiguriranim URL-om, stvorite neke nove datoteke svojstava i popularizirajte ih nekim vrijednostima.

Ime konfiguracijske datoteke sastavljeno je poput normalnog proljeća primjena.svojstva, ali umjesto riječi ‘aplikacija’ konfigurirano ime, na pr. vrijednost imovine 'Spring.application.name' klijenta, a slijedi crtica i aktivni profil. Na primjer:

$> git init $> echo 'user.role = Developer'> config-client-development.properties $> echo 'user.role = User'> config-client-production.properties $> git add. $> git commit -m 'Početna svojstva config-client'

Rješavanje problema: Ako naletite ssh- povezani problemi s autentifikacijom, dvostruka provjera ~ / .ssh / poznati_hostovi i ~ / .ssh / odobreni_ključevi na vašem ssh poslužitelju!

5. Upit o konfiguraciji

Sada smo u mogućnosti pokrenuti naš poslužitelj. The GitAPI sa podrškom za konfiguraciju koji pruža naš poslužitelj može se zatražiti pomoću sljedećih staza:

/ {application} / {profile} [/ {label}] /{application}-{profile}.yml /{label}/{application}-{profile}.yml /{application}-{profile}.properties / { oznaka} / {aplikacija} - {profil} .svojstva

U kojem je {označiti} rezervirano mjesto odnosi se na Git granu, {aplikacija} na ime klijentove aplikacije i {profil} na trenutni aktivni profil aplikacije klijenta.

Tako možemo doći do konfiguracije za planirani klijent za konfiguriranje koji se izvodi u razvojnom profilu u grani ovladati; majstorski preko:

$> curl // root: [zaštićen e-poštom]: 8888 / config-client / development / master

6. Implementacija klijenta

Dalje, pobrinimo se za klijenta. Ovo će biti vrlo jednostavna klijentska aplikacija koja se sastoji od a ODMOR kontroler s jednim DOBITI metoda.

Konfiguracija, za dohvaćanje našeg poslužitelja, mora biti smještena u datoteku resursa s imenom bootstrap.aplikacija, jer će se ova datoteka (kao što naziv govori) učitati vrlo rano dok se aplikacija pokreće:

@SpringBootApplication @RestController javna klasa ConfigClient {@Value ("$ {user.role}") privatna uloga niza; javna statička void glavna (String [] args) {SpringApplication.run (ConfigClient.class, args); } @GetMapping (value = "/ whoami / {username}", proizvodi = MediaType.TEXT_PLAIN_VALUE) javni niz whoami (@PathVariable ("username") String username) {return String.format ("Zdravo! postat ćete (n)% s ... \ n ", korisničko ime, uloga); }}

Uz naziv aplikacije, aktivni profil i detalje o povezivanju stavili smo i u naš bootstrap.svojstva:

spring.application.name = config-client spring.profiles.active = development spring.cloud.config.uri = // localhost: 8888 spring.cloud.config.username = root spring.cloud.config.password = s3cr3t

Da testiramo je li konfiguracija pravilno primljena od našeg poslužitelja i vrijednost uloge dobiva injekciju u našu metodu kontrolera, mi je jednostavno uvijemo nakon pokretanja klijenta:

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

Ako je odgovor sljedeći, naš Spring Cloud Config Server i njegov klijent za sada dobro rade:

Zdravo! Vi ste Mr_Pink i postat ćete (n) programer ...

7. Šifriranje i dešifriranje

Zahtjev: Da biste koristili kriptografski jake ključeve zajedno sa značajkama Spring encryption and decryption, trebaju vam 'Datoteke s pravilima o nadležnosti za neograničenu snagu Java Cryptography Extension (JCE)' instaliran u vašem JVM. Oni se mogu preuzeti, na primjer, iz Oraclea. Da biste instalirali, slijedite upute uključene u preuzimanje. Neke distribucije Linuxa također pružaju instalacijski paket putem svojih upravitelja paketa.

Budući da konfiguracijski poslužitelj podržava šifriranje i dešifriranje vrijednosti svojstava, javna spremišta možete koristiti kao pohranu osjetljivih podataka poput korisničkih imena i lozinki. Šifrirane vrijednosti imaju prefiks sa nizom {šifra} a može se generirati REST-pozivom na stazu ‘/ Šifriraj’, ako je poslužitelj konfiguriran za upotrebu simetričnog ključa ili para ključeva.

Dostupna je i krajnja točka za dešifriranje. Obje krajnje točke prihvaćaju put koji sadrži rezervirana mjesta za ime aplikacije i njezin trenutni profil: ‘/ * / {Ime} / {profil}’. To je posebno korisno za kontrolu kriptografije po klijentu. Međutim, prije nego što postanu korisni, morate konfigurirati kriptografski ključ što ćemo učiniti u sljedećem odjeljku.

Savjet: Ako koristite curl za pozivanje API-ja za šifriranje / dešifriranje, bolje je koristiti –Data-urlencode opcija (umjesto –Data / -d) ili postavite zaglavlje "Content-Type" izričito na 'Tekst / običan'. To osigurava ispravno rukovanje posebnim znakovima poput "+" u šifriranim vrijednostima.

Ako se vrijednost ne može automatski dešifrirati tijekom dohvaćanja kroz klijenta, njezin ključ preimenovano je sa samim imenom, prefiksom riječi "nevaljano". To bi trebalo spriječiti, na primjer, upotrebu šifrirane vrijednosti kao lozinke.

Savjet: Prilikom postavljanja spremišta koje sadrži YAML datoteke, morate šifrirane i prefiksirane vrijednosti okružiti navodnicima! Sa Svojstvima to nije slučaj.

7.1. CSRF

Prema zadanim postavkama Spring Security omogućuje CSRF zaštitu za sve zahtjeve poslane u našu aplikaciju.

Stoga, da biste mogli koristiti / šifriranje i / dešifrirati krajnje točke, onemogućimo im CSRF:

@Configuration javna klasa SecurityConfiguration proširuje WebSecurityConfigurerAdapter {@Override javna void konfiguracija (HttpSecurity http) baca iznimku {http.csrf () .ignoringAntMatchers ("/ encrypt / **") .ignoringAntMatchers ("/ decrypt / **"); super.configure (http); }}

7.2. Upravljanje ključevima

Poslužitelj za konfiguriranje je prema zadanim postavkama omogućen za šifriranje vrijednosti svojstava na simetričan ili asimetričan način.

Koristiti simetričnu kriptografiju, jednostavno morate postaviti svojstvo 'Šifriraj.ključ' u vašem primjena.svojstva u tajnu po vašem izboru. Alternativno možete prenijeti varijablu okruženja ENCRYPT_KEY.

Za asimetričnu kriptografiju, možete postaviti 'Šifriraj.ključ' do a PEM-kodirana vrijednost niza ili konfigurirajte a pohrana ključeva koristiti.

Budući da nam je za naše demo poslužitelj potrebno visoko osigurano okruženje, odabrali smo potonju opciju i generirali novu pohranu ključeva, uključujući RSA par ključeva s Javom alat za ključeve prvi:

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

Nakon toga dodajemo stvorenu pohranu ključeva na naš poslužitelj bootstrap.svojstva i ponovno ga pokrenite:

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

Kao sljedeći korak možemo upitati krajnju točku šifriranja i dodati odgovor kao vrijednost konfiguraciji u našem spremištu:

$> izvoz PASSWORD = $ (curl -X POST --data-urlencode d3v3L \ // root: [email protected]: 8888 / encrypt) $> echo "user.password = {cipher} $ PASSWORD" >> config-client -development.properties $> git commit -am 'Dodana šifrirana lozinka' $> curl -X POST // root: [email protected]: 8888 / refresh

Da bismo testirali, ako naša postavka radi ispravno, mijenjamo ConfigClient klasa i ponovno pokrenite našeg klijenta:

@SpringBootApplication @RestController javna klasa ConfigClient {... @Value ("$ {user.password}") privatna lozinka niza; ... javni String whoami (@PathVariable ("username") String username) {return String.format ("Zdravo! Ti si% s i postat ćeš (n)% s," + ", ali samo ako je tvoj lozinka je '% s'! \ n ", korisničko ime, uloga, lozinka); }}

Završni upit prema našem klijentu pokazat će nam, ako je naša vrijednost konfiguracije ispravno dešifrirana:

$> curl // localhost: 8080 / whoami / Mr_Pink Pozdrav! Vi ste Mr_Pink i postat ćete (n) programer, \ ali samo ako je vaša lozinka 'd3v3L'!

7.3. Korištenje više tipki

Ako želite koristiti više ključeva za šifriranje i dešifriranje, na primjer: namjenski za svaku posluženu aplikaciju, možete dodati još jedan prefiks u obliku {ime: vrijednost} između {šifra} prefiks i BAZA64-kodirana vrijednost svojstva.

Konfiguracijski poslužitelj razumije prefikse poput {tajna: moja-kripto-tajna} ili {key: my-key-alias} gotovo iz kutije. Potonja opcija treba konfiguriranu pohranu ključeva u vašem primjena.svojstva. U ovoj se pohrani ključeva traži odgovarajući pseudonim ključa. Na primjer:

user.password = {šifra} {tajna: my-499-s3cr3t} AgAMirj1DkQC0WjRv ... user.password = {šifra} {ključ: config-client-key} AgAMirj1DkQC0WjRv ...

Za scenarije bez pohrane ključeva morate implementirati a @Grah tipa TextEncryptorLocator koja obrađuje traženje i vraća a TextEncryptor-Objekt za svaki ključ.

7.4. Posluživanje šifriranih svojstava

Ako želite onemogućiti kriptografiju na strani poslužitelja i lokalno obraditi dešifriranje svojstava-vrijednosti, možete staviti sljedeće na svoj poslužitelj primjena.svojstva:

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

Nadalje, možete izbrisati sva ostala svojstva "šifriranje. *" Da biste onemogućili ODMOR krajnje točke.

8. Zaključak

Sada smo u mogućnosti stvoriti konfiguracijski poslužitelj za pružanje skupa konfiguracijskih datoteka iz a Git spremište za klijentske aplikacije. Postoji nekoliko drugih stvari koje možete učiniti s takvim poslužiteljem.

Na primjer:

  • Konfiguracija posluživanja u YAML ili Svojstva format umjesto JSON - također s rezerviranim mjestima riješeno. Što može biti korisno kada se koristi u ne-proljetnim okruženjima, gdje konfiguracija nije izravno preslikana u PropertySource.
  • Poslužite datoteke za konfiguraciju s običnim tekstom - zauzvrat po želji s razriješenim rezerviranim mjestima. To može biti korisno, na primjer, za pružanje konfiguracije dnevnika ovisnu o okolišu.
  • Ugradite konfiguracijski poslužitelj u aplikaciju, gdje se konfigurira iz a Git spremište, umjesto da se izvodi kao samostalna aplikacija koja poslužuje klijente. Stoga neka svojstva bootstrapa moraju biti postavljena i / ili @EnableConfigServer napomena se mora ukloniti, što ovisi o slučaju upotrebe.
  • Učinite konfiguracijski poslužitelj dostupnim na usluzi Spring Netflix Eureka otkrivanje usluge i omogućite automatsko otkrivanje poslužitelja u konfiguracijskim klijentima. To postaje važno ako poslužitelj nema fiksno mjesto ili se kreće na svom mjestu.

I da završimo, pronaći ćete izvorni kôd ovog članka na Githubu.