Vault
https://testdriven.io/blog/managing-secrets-with-vault-and-consul/
https://github.com/visa2learn/spring-cloud-vault-db-cred-rotation
init
docker-compose -f docker-compose-vault.yml up -d --build
docker exec -it <...> bash
vault operator unseal
vault login
export VAULT_TOKEN=your_token_goes_here
Usefully commands:
export VAULT_ADDR=http://127.0.0.1:8200
Auth
curl \
--header "X-Vault-Token: $VAULT_TOKEN" \
--request LIST \
http://127.0.0.1:8200/v1/auth/token/accessors
#Add new secret engine
vault secrets enable -path=secret kv
vault secrets enable -path=secret -version=2 kv
vault secrets list
#Interact with engine
vault kv put secret/psql username=postgres password=password
vault kv get secret/psql
Config vault with postgres example
vault secrets disable database
vault secrets enable database
vault secrets list
vault write database/config/postgresql \
plugin_name=postgresql-database-plugin \
connection_url="postgresql://{{username}}:{{password}}@psql-db:5432/<...>?sslmode=disable" \
allowed_roles="*" \
username="postgres" \
password="password"
vault write database/roles/loginToPostgres db_name=postgresql \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO \"{{name}}\"; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
default_ttl="30s" \
max_ttl="1m"
vault list database/roles/
vault read database/creds/loginToPostgres
Prod Setup
https://github.com/KQT3/vault-setup
docker-compose.yml
version: '3.5'
services:
vault:
build:
context: ./vault
dockerfile: Dockerfile
container_name: vault-1
ports:
- 8200:8200
volumes:
- ./vault/config:/vault/config
- ./vault/policies:/vault/policies
- ./vault/data:/vault/data
- ./vault/logs:/vault/logs
environment:
- VAULT_ADDR=http://127.0.0.1:8200
- VAULT_API_ADDR=http://127.0.0.1:8200
command: server -config=/vault/config/vault-config.json
cap_add:
- IPC_LOCK
Dockerfile
# base image
FROM alpine:3.14
# set vault version
ENV VAULT_VERSION 1.8.2
# create a new directory
RUN mkdir /vault
# download dependencies
RUN apk --no-cache add \
bash \
ca-certificates \
wget
# download and set up vault
RUN wget --quiet --output-document=/tmp/vault.zip https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_linux_amd64.zip && \
unzip /tmp/vault.zip -d /vault && \
rm -f /tmp/vault.zip && \
chmod +x /vault
# update PATH
ENV PATH="PATH=$PATH:$PWD/vault"
# add the config file
COPY ./config/vault-config.json /vault/config/vault-config.json
# expose port 8200
EXPOSE 8200
# run vault
ENTRYPOINT ["vault"]
~/vault/config
vault-config.json
{
"backend": {
"file": {
"path": "vault/data"
}
},
"listener": {
"tcp":{
"address": "0.0.0.0:8200",
"tls_disable": 1
}
},
"ui": true
}
Scripts
auth.py
#!/usr/bin/env python3
import hvac
def init_server():
client = hvac.Client(url='http://127.0.0.1:8200')
print(f" Is client authenticated: {client.is_authenticated()}")
init_server()
read.py
#!/usr/bin/env python3
import hvac
def read_secret():
client = hvac.Client(url='http://127.0.0.1:8200')
print(f" Is client authenticated: {client.is_authenticated()}")
read_response = client.secrets.kv.v1.read_secret(path='psql')
print(read_response['data']['password'])
return read_response['data']['password']
read_secret()
Setup using UI
- Key Shares (Default): 5 key shares
- Key Threshold (Default): 3 key shares
In the default setup, when you initialize Vault for the first time, the root key will be split into 5 parts (key shares). you will only need 3 out of the 5 key shares to reconstruct the root key and unseal Vault.
- Enable new engine
- KV
- Create secret
Create tls
https://localhost:8200/ui/vault
Change owner of files sudo chown -R systemd-network .
Use same encryption as nginx
ssl_certificate /etc/letsencrypt/live/vault.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/vault.example.com/privkey.pem; # managed by Certbot
openssl genpkey -algorithm RSA -out localhost.key
openssl req -new -key localhost.key -out localhost.csr -subj "/CN=localhost"
openssl x509 -req -days 365 -in localhost.csr -signkey localhost.key -out localhost.crt
openssl genpkey -algorithm RSA -out vault.key
openssl req -new -key vault.key -out vault.csr -subj "/CN=vault.example.com"
openssl x509 -req -days 365 -in vault.csr -signkey vault.key -out vault.crt
sudo chown -R systemd-network .