Cloud Vault (Static Secrets)
============================
https://github.com/spring-boot-tutorials/cloud-vault-static
Install & Run Vault Server
--------------------------
.. code-block:: sh
docker run --cap-add=IPC_LOCK --name=dev-vault \
-e 'VAULT_DEV_ROOT_TOKEN_ID=my-root-token' \
-e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200' \
-p 8200:8200 \
hashicorp/vault
- ``--cap-add=IPC_LOCK``: This capability is crucial to prevent sensitive information from being swapped to disk, enhancing security.
- ``--name=dev-vault``: Assigns a name to the container for easier management.
- ``hashicorp/vault``: Specifies the official Docker image for HashiCorp Vault.
- ``VAULT_DEV_ROOT_TOKEN_ID``: Sets the ID of the initial root token.
- ``VAULT_DEV_LISTEN_ADDRESS``: Sets the IP and port for the listener (defaults to 0.0.0.0:8200).
- ``-p 8200:8200``: Maps port 8200 from the container to port 8200 on the host, allowing access to the Vault UI or API.
Create Initial Code Base
------------------------
- Go to https://start.spring.io/
- Add the following dependencies:
- spring-boot-starter-web
- spring-cloud-starter-vault-config
- spring-cloud-vault-config-databases
- Click ``Generate``
Dependencies
------------
Dependencies used in ``pom.xml``:
.. code-block:: xml
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-vault-config
org.springframework.cloud
spring-cloud-vault-config-databases
Properties
----------
Add the following properties into ``src/main/resources/application.yaml``:
.. code-block:: yaml
spring:
application:
# this is used to specify the `path` of the secret in the `secret-engine`
name: my-bank
config:
import: vault://
cloud:
vault:
uri: http://localhost:8200
token: my-root-token
kv:
# this specifies the `secret-engine` name
backend: secret
# Uncomment to turn off KV
# enabled: false
Main
----
Modify ``VaultConfigurationApplication.java``:
.. code-block:: java
@SpringBootApplication
public class VaultConfigurationApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(VaultConfigurationApplication.class, args);
}
@Autowired
Environment env;
@Override
public void run(String... args) throws Exception {
System.out.println(env.getProperty("my-foo-1"));
System.out.println(env.getProperty("my-foo-2"));
}
}
Setup Secrets on Vault Server
-----------------------------
Connect to Vault Server
.. code-block:: sh
docker ps
docker exec -it CONTAINER_ID /bin/sh
Configure `vault` command
.. code-block:: sh
export VAULT_ADDR="http://127.0.0.1:8200"
export VAULT_TOKEN="my-root-token"
Use `vault` command to create secrets
.. code-block:: sh
vault kv put secret/my-bank my-foo-1=secret-1 my-foo-2=secret-2
Run Spring Application
----------------------
Open terminal at project root and execute the following:
.. code-block:: sh
mvn spring-boot:run
Verify output console.