fb
WSO2 6 minuten

Integreer HashiCorp Vault met de WSO2 Identity Server

Rob Blaauboer
Rob Blaauboer
Integration Consultant & WSO2 Trainer
Integrate HashiCorp Vault with WSO2 Identity Server
Scroll

Vault van HashiCorp is een product dat geheimen bewaart en dat goed te integreren is met de Identity Server. Het is een vervangingsmogelijkheid voor de Apache Secure Vault implementatie die op dit moment in de WSO2 Identity Server zit. In deze blog gaan we de Vault opzetten en integreren met de WSO2 Identity Server versie 5.11.0. Deze set-up gaat draaien op Windows, maar kan net zo goed gebruikt worden op Linux of MacOS.

Als de naam HashiCorp bekend klinkt, dan zou dat kunnen komen omdat het bedrijf ook Vagrant en Packer ontwikkeld heeft. Twee configuratie en deployment tools die regelmatig in samenspel met WSO2 gebruikt worden. Als je nog niet bekend bent met Vault, dan zou ik je willen aanraden om een kijkje te nemen naar de documentatie die je kunt vinden op de website van HashiCorp. Zij hebben de uitleg van de concepten uitzonderlijk goed gedaan. In deze blog leg ik uit hoe enkele details werken, waarbij ik me beperk tot de aspecten die betrekking hebben op de combinatie van de WSO2 Identity Server en Vault. 

Installatie van Vault

Als eerste zullen we Vault moeten downloaden en installeren. Zoals gezegd ga ik dat op Windows doen. Ik download Vault en installeer het in een map, dichtbij de root. Bovendien voeg ik de Vault installatiemap toe aan Path en maak het zo overal vandaan bereikbaar. Om dit te testen voer ik het volgende commando uit: vault -version.

Terminal

Dit ziet er goed uit. Ik krijg een reactie van Vault. Nu kunnen we Vault gaan configureren. Laten we beginnen met een speciale versie die lokaal draait, de zogenoemde -dev server. Dit is een ‘in-memory vault’ die geen gebruik maakt van TLS en NOOIT GEBRUIKT hoort te worden voor andere doeleinden dan het uitvoeren van testen. Houd Vault open en draaiend terwijl je door deze blog heen leest en de dingen zelf toepast.

Start de Vault server door vault server -dev uit te voeren. 

Terminal

We moeten ook het Vault address instellen met het onderstaande commando.

Terminal

set VAULT_ADDR=http://127.0.0.1:8200

Op dezelfde manier stellen we de token in op de waarde die in de server log output staat. 

set VAULT_TOKEN=s.dx9VgiWBnb0h6KgqBWQKNBM

Onthoud dat als je de Vault server stopt en opnieuw start, je deze leeggooit, omdat het een in-memory vault is. Een gewone vault schrijft op de schijf, maar dat vraagt om een complexere opzet.

We starten Vault en laten het opdrachtvenster open staan. In een tweede venster vragen we de status op.

Terminal

Installatie van de WSO2 Identity Server 

Download version 5.11.0 van de Identity Server en installeer het op je computer. In deze blog ga ik niet het hele installatieproces voor dit WSO2 product beschrijven. Als je daar meer informatie over wilt, kun je dit teruglezen in onze andere blogs over hoe je WSO2 producten kunt installeren

Key/value engine

We gaan nu een KV engine opstarten, waarbij KV logischerwijs staat voor key/value. Het KV sub-commando geeft je de mogelijkheid om onder andere alle key/value-paren in de Vault in te stellen en op te vragen.

We gaan werken met een zogenoemd Path waardoor we waarden op een georganiseerde manier kunnen opslaan. In andere woorden: we gebruiken defaults om waarden op te slaan die gerelateerd zijn aan de Identity Server, maar dat kan ook voor andere WSO2 producten of user cases gebruikt worden. 

Laten we beginnen met het toevoegen van de key/value engine. Voer het volgende commando in op de opdrachtregel:

vault secrets enable -path=wso2is -version=2 kv

Terminal

# Voeg een nieuw geheim toe
vault kv put wso2is/keystore_password value=wso2carbon

Terminal

# Haal een nieuw geheim op (ter controle)
vault kv get -field=value wso2is/keystore_password

Terminal

Nu zullen we ervoor moeten zorgen dat de Identity Server HashiCorp Vault gebruikt in plaats van zijn eigen veilige vault. Dit doen we door de Identity Server uit te breiden met een speciaal jar-bestand dat gebruik zal worden om door te verwijzen naar de HashiCorp Vault. 

Wat we hiervoor nodig hebben is een download van de broncode van de HashiCorp Vault Integration OSGI bundle. In dit geval gebruik in het zip-bestand. Je kunt het ook clonen, via Git verkrijgen of openen met GitHub desktop.

Github

Pak het zip-bestand uit in een map. Ik heb ervoor gekozen om de bestanden in een submap van de Vault installatie te zetten. We bouwen het jar-bestand vanuit het niets op met het volgende commando:

mvn clean install

Het opbouwen kan een paar minuten duren. In de doelmap vinden we de OSGI bundle die zojuist aangemaakt is en die kopiëren we naar de ‘dropins’ map van de Identity Server. 

Terminal

Kopieer het bestand target/org.wso2.carbon.securevault.hashicorp-1.0.jar naar de [IS_HOME]/repository/components/dropins/ map.

We voegen daar ook het speciale vault-java-driver-5.1.0.jar bestand aan de [IS_HOME]/repository/components/lib/ map toe.

Doorverwijzen

We zullen de volgende elementen aan het [IS-HOME]/repository/conf/security/secret-conf.properties bestand toe moeten voegen en de volgende configuraties in moeten stellen: Voor de -dev server veranderen we https://127.0.0.1:8200 naar http://127.0.0.1:8200.

In een productieomgeving dien je het adres van de vault altijd met een ingeschakeld HTTPS/TLS te gebruiken.

keystore.identity.location=repository/resources/security/wso2carbon.jks
keystore.identity.type=JKS
keystore.identity.store.password=identity.store.password
keystore.identity.store.secretProvider=org.wso2.carbon.securevault.DefaultSecretCallbackHandler
keystore.identity.key.password=identity.key.password
keystore.identity.key.secretProvider=org.wso2.carbon.securevault.DefaultSecretCallbackHandler
carbon.secretProvider=org.wso2.securevault.secret.handler.SecretManagerSecretCallbackHandler

secVault.enabled=true
secretRepositories=vault
secretRepositories.vault.provider=org.wso2.carbon.securevault.hashicorp.repository.HashiCorpSecretRepositoryProvider
secretRepositories.vault.properties.address=http://127.0.0.1:8200
secretRepositories.vault.properties.namespace=ns1
secretRepositories.vault.properties.enginePath=wso2is
secretRepositories.vault.properties.engineVersion=2

Log4J2

Als we de nieuwe vault toevoeging willen debuggen, dan kunnen we de volgende regels aan het [IS_HOME]/repository/conf/log4j2.properties bestand toevoegen. Hierdoor wordt het level op debug gezet en wordt er debug informatie gelogd op het moment van aanroepen.

logger.org-wso2-carbon-securevault-hashicorp.name=org.wso2.carbon.securevault.hashicorp
logger.org-wso2-carbon-securevault-hashicorp.level=INFO
logger.org-wso2-carbon-securevault-hashicorp.additivity=false
logger.org-wso2-carbon-securevault-hashicorp.appenderRef.CARBON_CONSOLE.ref = CARBON_CONSOLE

Daarna voegen we elders in het log4j2.properties bestand org-wso2-carbon-securevault-hashicorp toe aan de loggerslijst. Zoek naar loggers = line en voeg deze logger-naam aan het einde toe.

loggers = AUDIT_LOG, trace-messages, … ,org-wso2-carbon-securevault-hashicorp

Waarden aan de Vault toevoegen

Ale we waarden die in de vault opgeslagen zitten willen gebruiken, zullen we ze eerst moeten toevoegen. Deze hele blog gaat erover dat waarden opgeslagen worden in het pad ‘wso2is’ key vault. Je zult ze dus toe moeten voegen aan de vault en wijzigingen aan moeten brengen aan de deployment.toml.

Laten we eerst twee waarden aan de Vault toevoegen.

vault kv put wso2is/admin_password value=wso2carbon
vault kv put wso2is/database_password value=wso2carbon

Nu gaan we de deployment.toml van de WSO2 Identity Server aanpassen. Deze kun je vinden in de map [IS_HOME]/repository/conf/. Open dit bestand met een editor en voeg deze regels onderaan het bestand toe (als de [secrets] marker al bestaat, dan hoef je die niet nog een keer toe te voegen). 

[secrets]
admin_password = “”
keystore_password = “”
database_password = “”

Voeg de versleutelde ‘password alias’ toe aan de relevante delen in het deployment.toml bestand door gebruik te maken van de placeholder: $secret{alias}. Dit is een voorbeeld (waarvan ik slechts een paar regels laat zien):

[super_admin]
username=”admin”
password=”$secret{admin_password}”

[keystore.primary]
file_name = “wso2carbon.jks”
password = “$secret{keystore_password}” 

[database.identity_db]
type = “h2”

password = “$secret{database_password}”

De Identity Server starten

We kunnen de Identity Server nu starten. Voordat deze start zul je om het wachtwoord van de keystore gevraagd worden. Vul de code wso2carbon (de standaardcode) in om de Identity Server op te starten. Je kunt nu het wachtwoord in een gewoon tekstbestand zetten, dat je de naam ‘password-persist’ geeft (password-persist.txt voor Windows), zodat het daar uitgelezen kan worden. Deze aanpak is echter minder veilig. Als je dit wachtwoord ook uit de Vault wilt laten uitlezen, dan heb je custom Java code nodig (custom DefaultSecretCallbackHandler / Custom CallBack Handler), die een connectie kan maken met de Vault API en de waarde daar uit kan lezen. Dit maakt het veiliger, omdat het ook de Vault benut voor het opslaan van deze waarde.