Spring Vault

Top di sicurezza

Ho appena annunciato il nuovo corso Learn Spring Security, incluso il materiale completo incentrato sul nuovo stack OAuth2 in Spring Security 5:

>> SCOPRI IL CORSO

1. Panoramica

La cassaforte di HashiCorp è uno strumento per archiviare e proteggere i segreti. Vault, in generale, risolve il problema di sicurezza dello sviluppo software di come gestire i segreti. Per saperne di più, consulta il nostro articolo qui.

Spring Vault fornisce astrazioni primaverili al Vault di HashiCorp.

In questo tutorial, esamineremo un esempio su come archiviare e recuperare i segreti dal Vault.

2. Dipendenze di Maven

Per cominciare, diamo un'occhiata alle dipendenze di cui abbiamo bisogno per iniziare a lavorare con Spring Vault:

  org.springframework.vault spring-vault-core 2.1.1.RELEASE   

L'ultima versione di spring-vault-core può essere trovata su Maven Central.

3. Configurazione di Vault

Esaminiamo ora i passaggi necessari per configurare Vault.

3.1. Creazione di un VaultTemplate

Per proteggere i nostri segreti, dovremo creare un'istanza di un VaultTemplate per il quale abbiamo bisogno di istanze di VaultEndpoint e TokenAuthentication :

VaultTemplate vaultTemplate = new VaultTemplate(new VaultEndpoint(), new TokenAuthentication("00000000-0000-0000-0000-000000000000"));

3.2. Creazione di un VaultEndpoint

Esistono alcuni modi per creare un'istanza di VaultEndpoint . Diamo un'occhiata ad alcuni di loro.

Il primo è semplicemente istanziarlo utilizzando un costruttore predefinito, che creerà un endpoint predefinito che punta a // localhost: 8200:

VaultEndpoint endpoint = new VaultEndpoint();

Un altro modo è creare un VaultEndpoint specificando l'host e la porta di Vault:

VaultEndpoint endpoint = VaultEndpoint.create("host", port);

Infine, possiamo anche crearlo dall'URL di Vault:

VaultEndpoint endpoint = VaultEndpoint.from(new URI("vault uri"));

Ci sono alcune cose da notare qui: Vault sarà configurato con un token radice di 00000000-0000-0000-0000-000000000000 per eseguire questa applicazione.

Nel nostro esempio, abbiamo utilizzato TokenAuthentication , ma sono supportati anche altri metodi di autenticazione.

4. Configurazione dei bean di Vault utilizzando Spring

Con Spring, possiamo configurare il Vault in un paio di modi. Uno consiste nell'estensione di AbstractVaultConfiguration e l'altro nell'utilizzo di EnvironmentVaultConfiguration che utilizza le proprietà dell'ambiente di Spring.

Ora esamineremo entrambi i modi.

4.1. Utilizzo di AbstractVaultConfiguration

Creiamo una classe che estenda AbstractVaultConfiguration, per configurare Spring Vault:

@Configuration public class VaultConfig extends AbstractVaultConfiguration { @Override public ClientAuthentication clientAuthentication() { return new TokenAuthentication("00000000-0000-0000-0000-000000000000"); } @Override public VaultEndpoint vaultEndpoint() { return VaultEndpoint.create("host", 8020); } }

Questo approccio è simile a quello che abbiamo visto nella sezione precedente. La differenza è che abbiamo utilizzato Spring Vault per configurare i bean di Vault estendendo la classe astratta AbstractVaultConfiguration.

Dobbiamo solo fornire l'implementazione per configurare VaultEndpoint e ClientAuthentication .

4.2. Utilizzo di EnvironmentVaultConfiguration

Possiamo anche configurare Spring Vault utilizzando EnviromentVaultConfiguration :

@Configuration @PropertySource(value = { "vault-config.properties" }) @Import(value = EnvironmentVaultConfiguration.class) public class VaultEnvironmentConfig { }

EnvironmentVaultConfiguration utilizza PropertySource di Spring per configurare i bean di Vault. Dobbiamo solo fornire al file delle proprietà alcune voci accettabili.

Maggiori informazioni su tutte le proprietà predefinite possono essere trovate nella documentazione ufficiale.

Per configurare il Vault, abbiamo bisogno di almeno un paio di proprietà:

vault.uri=//localhost:8200 vault.token=00000000-0000-0000-0000-000000000000

5. Protezione dei segreti

Creeremo una semplice classe Credentials che esegue il mapping a nome utente e password:

public class Credentials { private String username; private String password; // standard constructors, getters, setters }

Ora, vediamo come possiamo proteggere il nostro oggetto Credentials utilizzando VaultTemplate:

Credentials credentials = new Credentials("username", "password"); vaultTemplate.write("secret/myapp", credentials);

Con queste righe completate, i nostri segreti sono ora memorizzati.

Successivamente, vedremo come accedervi.

6. Accesso ai segreti

Possiamo accedere ai segreti protetti utilizzando il metodo read () in VaultTemplate, che restituisce VaultResponseSupport come risposta:

VaultResponseSupport response = vaultTemplate .read("secret/myapp", Credentials.class); String username = response.getData().getUsername(); String password = response.getData().getPassword();

I nostri valori segreti sono ora pronti.

7. Conclusione

In questo articolo, abbiamo appreso le basi di Spring Vault con un esempio che mostra come funziona Vault in scenari tipici .

Come al solito, il codice sorgente presentato qui può essere trovato su GitHub.

Fondo di sicurezza

Ho appena annunciato il nuovo corso Learn Spring Security, incluso il materiale completo incentrato sul nuovo stack OAuth2 in Spring Security 5:

>> SCOPRI IL CORSO