Skip to content

Commit 90c3900

Browse files
committed
More documentation, make mount path configurable
1 parent b780f43 commit 90c3900

File tree

6 files changed

+29
-17
lines changed

6 files changed

+29
-17
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
# Hvordan få en applikasjon til å hente credentials fra Vault og koble seg til PostgreSQL
22

3-
Kopier/lim inn Java-klassene i dette repoet, inn i appen din.
3+
Kopier/lim inn Java-klassene i dette repoet (bortsett fra `HikariCPTest`), inn i appen din.
44
(Koden er ikke publisert som at maven-artifakt ennå.)
55

66
For å opprette en DataSource, lager du en HikariConfig med konfigurasjon for appen,
77
og sender inn i HikariCPVaultUtil, som tar seg av kobling mot Vault.
8+
Se `makeDataSource()` i `HikariCPTest`-klassen.
9+
10+
Denne DataSourcen bruker du videre i appen, for eksempel som en Spring Bean
11+
(hvis du bruker Spring Framework).

policy-db.hcl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ path "sys/renew/*" {
22
capabilities = ["update"]
33
}
44

5-
path "database/creds/testdb-user" {
5+
path "postgresql/preprod/creds/testdb-user" {
66
capabilities = ["read"]
77
}

provision.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ psql_root() {
1515
# That way, access to CREATE in "public" can be revoked later on, without superuser access.
1616
psql_root -c 'CREATE DATABASE "testdb"'
1717

18-
vault secrets enable database
19-
vault write database/config/testdb \
18+
vault secrets enable -path=postgresql/preprod database
19+
vault write postgresql/preprod/config/testdb \
2020
allowed_roles="testdb-user" \
2121
plugin_name=postgresql-database-plugin \
2222
connection_url="postgresql://{{username}}:{{password}}@$PGSQL_HOST:5432/testdb?sslmode=disable" \
2323
username="$PGSQL_ROOT_USERNAME" \
2424
password="$PGPASSWORD"
2525

26-
vault write database/roles/testdb-user \
26+
vault write postgresql/preprod/roles/testdb-user \
2727
db_name=testdb \
2828
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'" \
2929
default_ttl="1m" \

src/main/java/no/nav/vault/jdbc/hikaricp/HikariCPTest.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,9 @@
1212

1313
public class HikariCPTest {
1414
public static void main(String[] args) throws Exception {
15-
final HikariConfig config = new HikariConfig();
16-
config.setJdbcUrl("jdbc:postgresql://localhost:5432/testdb");
17-
config.setMaxLifetime(5000);
18-
config.setMaximumPoolSize(1);
19-
config.setConnectionTimeout(250);
20-
config.setIdleTimeout(100);
21-
22-
final HikariDataSource ds = HikariCPVaultUtil.createHikariDataSourceWithVaultIntegration(config, "testdb-user");
15+
final HikariDataSource ds = makeDataSource();
2316

17+
// The rest of the code here is just testing that the data source works.
2418
final Timer timer = new Timer("PostgreSQLSelectTimer", true);
2519
final TimerTask task = new TimerTask() {
2620
@Override
@@ -35,6 +29,16 @@ public void run() {
3529
System.out.println("Done");
3630
}
3731

32+
private static HikariDataSource makeDataSource() throws VaultError {
33+
final HikariConfig config = new HikariConfig();
34+
config.setJdbcUrl("jdbc:postgresql://localhost:5432/testdb");
35+
config.setMaxLifetime(5000);
36+
config.setMaximumPoolSize(1);
37+
config.setConnectionTimeout(250);
38+
config.setIdleTimeout(100);
39+
return HikariCPVaultUtil.createHikariDataSourceWithVaultIntegration(config, "postgresql/preprod", "testdb-user");
40+
}
41+
3842
private static void runQuery(HikariDataSource ds) {
3943
try {
4044
Connection conn = ds.getConnection();

src/main/java/no/nav/vault/jdbc/hikaricp/HikariCPVaultUtil.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,25 @@ public final class HikariCPVaultUtil {
1717
private HikariDataSource ds = null;
1818
private final HikariConfig hikariConfig;
1919
private final Vault vault;
20+
private final String mountPath;
2021
private final String role;
2122

22-
private HikariCPVaultUtil(final HikariConfig config, final Vault vault, final String role) {
23+
private HikariCPVaultUtil(final HikariConfig config, final Vault vault, final String mountPath, final String role) {
2324
this.hikariConfig = config;
2425
this.vault = vault;
26+
this.mountPath = mountPath;
2527
this.role = role;
2628
}
2729

2830
private void setDs(final HikariDataSource ds) {
2931
this.ds = ds;
3032
}
3133

32-
public static HikariDataSource createHikariDataSourceWithVaultIntegration(final HikariConfig config, final String role) throws VaultError {
34+
public static HikariDataSource createHikariDataSourceWithVaultIntegration(final HikariConfig config, final String mountPath, final String role) throws VaultError {
3335
final VaultUtil instance = VaultUtil.getInstance();
3436
final Vault vault = instance.getClient();
3537

36-
final HikariCPVaultUtil hikariCPVaultUtil = new HikariCPVaultUtil(config, vault, role);
38+
final HikariCPVaultUtil hikariCPVaultUtil = new HikariCPVaultUtil(config, vault, mountPath, role);
3739

3840
final class RefreshDbCredentialsTask extends TimerTask {
3941
@Override
@@ -67,7 +69,7 @@ public void run() {
6769
}
6870

6971
private RefreshResult refreshCredentialsAndReturnRefreshInterval() throws VaultException {
70-
final String path = "database/creds/" + role;
72+
final String path = mountPath + "/creds/" + role;
7173
logger.info("Renewing database credentials for role \"" + role + "\"");
7274
final LogicalResponse response = vault.logical().read(path);
7375
final String username = response.getData().get("username");

src/main/java/no/nav/vault/jdbc/hikaricp/VaultUtil.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ private VaultUtil() {
2626
timer = new Timer("VaultScheduler", true);
2727
}
2828

29+
// We should refresh tokens from Vault before they expire, so we add 30 seconds margin.
30+
// If the token is valid for less than 60 seconds, we use duration / 2 instead.
2931
public static long suggestedRefreshInterval(long duration) {
3032
if (duration < 60000) {
3133
return duration / 2;

0 commit comments

Comments
 (0)