# Vault ## Prereqs ```bash brew tap hashicorp/tap brew install hashicorp/tap/vault brew install jq ``` ## Install (Standalone) ```bash kubectl apply -f k8s/certificate.yaml helm repo add hashicorp https://helm.releases.hashicorp.com helm search repo hashicorp/vault helm upgrade --install vault hashicorp/vault --values helm/values.yaml mkdir ~/.vault-keys kubectl exec -ti vault-0 -- vault operator init -key-shares=5 -key-threshold=3 -format=json > ~/.vault-keys/cluster-keys.json kubectl exec -ti vault-0 -- vault operator unseal ``` ## Install (Cluster) ```bash kubectl apply -f k8s/certificate.yaml helm repo add hashicorp https://helm.releases.hashicorp.com helm search repo hashicorp/vault helm upgrade --install vault hashicorp/vault --values helm/values.yaml mkdir ~/.vault-keys kubectl exec -ti vault-0 -- vault operator init -key-shares=5 -key-threshold=3 -format=json > ~/.vault-keys/cluster-keys.json kubectl exec -ti vault-0 -- vault operator unseal kubectl exec -ti vault-1 -- vault operator raft join http://vault-0.vault-internal:8200 kubectl exec -ti vault-1 -- vault operator unseal kubectl exec -ti vault-2 -- vault operator raft join http://vault-0.vault-internal:8200 kubectl exec -ti vault-2 -- vault operator unseal ``` ## Add/Update policy ```bash vault policy write ducoterra policies/ducoterra.hcl ``` ## Add user ```bash vault auth enable userpass vault write auth/userpass/users/ducoterra \ policies=ducoterra \ password=password ``` ## Enable KV Secrets ```bash vault secrets enable -path=secret kv-v2 vault kv put secret/okta username='static-user' password='static-password' vault kv get secret/okta ``` ## TOTP ```bash vault secrets enable totp vault write totp/keys/okta \ url="otpauth://totp/Vault:test@test.com?secret=SECRET&issuer=Vault" vault read totp/code/okta ``` Policy: ```bash path "totp/keys/*" { capabilities = ["update"] } path "totp/code/*" { capabilities = ["read"] } ``` ## Kubernetes Secrets ```bash kubectl exec -it vault-0 -- /bin/sh vault login -method=token vault auth enable kubernetes vault write auth/kubernetes/config \ token_reviewer_jwt="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \ kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443" \ kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt vault policy write internal-app - < ### Create a CA ```bash vault secrets enable -path=pki_dnet pki vault secrets tune -max-lease-ttl=87600h pki_dnet vault write pki_dnet/root/generate/internal \ common_name=vault.ducoterra.net \ ttl=87600h vault write pki_dnet/config/urls \ issuing_certificates="https://vault.ducoterra.net/v1/pki_dnet/ca" \ crl_distribution_points="https://vault.ducoterra.net/v1/pki_dnet/crl" ``` ### Create an intermediate CA ```bash vault secrets enable -path=pki_dnet_int pki vault secrets tune -max-lease-ttl=43800h pki_dnet_int vault write -format=json pki_dnet_int/intermediate/generate/internal \ common_name="vault.ducoterra.net Intermediate Authority" \ | jq -r '.data.csr' > certs/pki_dnet_intermediate.csr vault write -format=json pki_dnet/root/sign-intermediate \ csr=@certs/pki_dnet_intermediate.csr format=pem_bundle ttl=43800h \ | jq -r '.data.certificate' > certs/pki_dnet_intermediate.cert.pem vault write pki_dnet_int/intermediate/set-signed certificate=@certs/pki_dnet_intermediate.cert.pem vault write pki_dnet_int/config/urls \ issuing_certificates="https://vault.ducoterra.net/v1/pki_dnet_int/ca" \ crl_distribution_points="https://vault.ducoterra.net/v1/pki_dnet_int/crl" vault write pki_dnet_int/roles/dnet \ allowed_domains=dnet \ allow_subdomains=true max_ttl=43800h vault write pki_dnet_int/roles/pi_hole \ allowed_domains=hole \ allow_subdomains=true max_ttl=43800h ``` Navigate to and download the CA. Import to your devices. ### Issue a certificate ```bash # Use -format=json to dump a json file vault write pki_dnet_int/issue/dnet \ common_name=freenas.dnet > certs/freenas.dnet.cert vault write pki_dnet_int/issue/pi_hole \ common_name=pi.hole > certs/pi.hole.cert ``` ### Revoke a certificate ```bash vault write pki_dnet_int/revoke serial_number= vault write pki_dnet_int/tidy tidy_cert_store=true tidy_revoked_certs=true ``` ### Use with cert-manager ```bash vault policy write pki_dnet - < cert-manager/vault-issuer.yaml < ### Connect to external vault ```bash helm install vault hashicorp/vault \ --set "injector.externalVaultAddr=https://vault.ducoterra.net" VAULT_HELM_SECRET_NAME=$(kubectl get secrets --output=json | jq -r '.items[].metadata | select(.name|startswith("vault-token-")).name') TOKEN_REVIEW_JWT=$(kubectl get secret $VAULT_HELM_SECRET_NAME --output='go-template={{ .data.token }}' | base64 --decode) KUBE_CA_CERT=$(kubectl config view --raw --minify --flatten --output='jsonpath={.clusters[].cluster.certificate-authority-data}' | base64 --decode) KUBE_HOST="https://3.14.3.104:6443" ``` ```bash vault auth enable -path=pikube kubernetes vault write auth/pikube/config \ token_reviewer_jwt="$TOKEN_REVIEW_JWT" \ kubernetes_host="https://3.14.3.104:6443" \ kubernetes_ca_cert="$KUBE_CA_CERT" vault write auth/pikube/role/issuer \ bound_service_account_names=issuer \ bound_service_account_namespaces=cert-manager \ policies=pki_dnet \ ttl=20m ``` ### Install cert-manager ```bash kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.3.1/cert-manager.yaml kubectl -n cert-manager create serviceaccount issuer ISSUER_SECRET_REF=$(kubectl -n cert-manager get serviceaccount issuer -o json | jq -r ".secrets[].name") cat > cert-manager/pikube-vault-clusterissuer.yaml <