diff --git a/ci-operator/step-registry/etcd-encryption/vault-configure/etcd-encryption-vault-configure-commands.sh b/ci-operator/step-registry/etcd-encryption/vault-configure/etcd-encryption-vault-configure-commands.sh index f58471757abc0..f4d777b8b46ec 100644 --- a/ci-operator/step-registry/etcd-encryption/vault-configure/etcd-encryption-vault-configure-commands.sh +++ b/ci-operator/step-registry/etcd-encryption/vault-configure/etcd-encryption-vault-configure-commands.sh @@ -3,52 +3,62 @@ set -o nounset set -o errexit set -o pipefail -echo "=========================================" -echo "Vault Configuration for KMS" -echo "=========================================" -echo "Namespace: ${VAULT_NAMESPACE}" -echo "Vault Enterprise NS: ${VAULT_ENTERPRISE_NS}" -echo "" - export KUBECONFIG="${SHARED_DIR}/kubeconfig" # In dev mode, Vault is already initialized and unsealed with root token "root" ROOT_TOKEN="root" -echo "Configuring Vault for KMS..." -echo "" - -# Create the Vault Enterprise namespace used by the KMS plugin -echo "Creating Vault Enterprise namespace '${VAULT_ENTERPRISE_NS}'..." -oc exec vault-0 -n "${VAULT_NAMESPACE}" -- \ - env VAULT_TOKEN="${ROOT_TOKEN}" vault namespace create "${VAULT_ENTERPRISE_NS}" - -# Enable transit secret engine -echo "Enabling transit secret engine..." -oc exec vault-0 -n "${VAULT_NAMESPACE}" -- \ - env VAULT_TOKEN="${ROOT_TOKEN}" vault secrets enable -namespace="${VAULT_ENTERPRISE_NS}" -path=transit transit - -# Create encryption key -echo "Creating transit encryption key..." -oc exec vault-0 -n "${VAULT_NAMESPACE}" -- \ - env VAULT_TOKEN="${ROOT_TOKEN}" vault write -namespace="${VAULT_ENTERPRISE_NS}" -f transit/keys/${VAULT_KMS_KEY_NAME} - -# Enable AppRole auth -echo "Enabling AppRole authentication..." -oc exec vault-0 -n "${VAULT_NAMESPACE}" -- \ - env VAULT_TOKEN="${ROOT_TOKEN}" vault auth enable -namespace="${VAULT_ENTERPRISE_NS}" approle - -# Create KMS policy -echo "Creating KMS policy..." -oc exec vault-0 -n "${VAULT_NAMESPACE}" -- \ - sh -c "VAULT_TOKEN=${ROOT_TOKEN} vault policy write -namespace=${VAULT_ENTERPRISE_NS} kms-policy - < "${CA_CERT_TMP}" + echo " ✓ CA certificate extracted" + + # Create or update ConfigMap with CA certificate in openshift-config + echo "" + echo "Creating ConfigMap ${ca_configmap} in openshift-config..." + oc create configmap "${ca_configmap}" \ + --from-file=ca-bundle.crt="${CA_CERT_TMP}" \ + -n openshift-config \ + --dry-run=client -o yaml | oc apply -f - + echo " ✓ ConfigMap ${ca_configmap} created/updated" + + # Clean up temporary CA file + rm -f "${CA_CERT_TMP}" + + echo "" + echo "=========================================" + echo "Vault Enterprise Installation Complete" + echo "=========================================" + echo "" + echo "Summary:" + echo " - Namespace: ${namespace}" + echo " - Version: ${VAULT_VERSION}" + echo " - Service: https://${release_name}.${namespace}.svc:8200" + echo " - Pod: ${pod_name} (Ready)" + echo " - TLS: Enabled (dev mode with auto-generated certificates)" + echo " - TLS CA: /var/run/tls/vault-ca.pem (inside pod)" + echo " - Enterprise License: Configured" + echo " - CA ConfigMap: ${ca_configmap} (openshift-config namespace)" + echo "" + echo "Next step: Run etcd-encryption-vault-configure to configure Vault for KMS" + echo "" +} + # Vault license secret name VAULT_LICENSE_SECRET_NAME="vault-license" @@ -75,19 +175,8 @@ fi echo "" -# Create namespace -echo "Creating namespace ${VAULT_NAMESPACE}..." -oc create namespace "${VAULT_NAMESPACE}" - -# Add restricted SCC for Vault service account -echo "Adding restricted SCC for Vault service account..." -oc adm policy add-scc-to-user restricted -z vault -n "${VAULT_NAMESPACE}" - -# Create Vault license secret from mounted credential -echo "Creating Vault license secret from mounted credential..." -oc create secret generic "${VAULT_LICENSE_SECRET_NAME}" \ - --from-file=license=/var/run/vault/tests-private-account/kms-vault-license \ - -n "${VAULT_NAMESPACE}" +setup_vault_namespace "${VAULT_NAMESPACE}" "vault" +setup_vault_namespace "${VAULT_SECONDARY_NAMESPACE}" "vault-secondary" # Fetch the Helm chart before baremetalds proxy env is applied; hashicorp chart # downloads fail with Forbidden once proxy-conf.sh is sourced on metal jobs. @@ -102,70 +191,5 @@ echo "" setup_packet_cluster -VAULT_API_ADDR="https://vault.${VAULT_NAMESPACE}.svc:8200" - -# Install Vault via Helm with dev mode and TLS enabled -echo "Installing Vault Enterprise v${VAULT_VERSION} in dev mode with TLS..." -helm upgrade --install vault "${VAULT_CHART_ARCHIVE}" \ - --namespace "${VAULT_NAMESPACE}" \ - --version "${VAULT_CHART_VERSION}" \ - --set global.enabled=true \ - --set global.openshift=true \ - --set global.tlsDisable=false \ - --set server.dev.enabled=true \ - --set server.image.repository="${VAULT_IMAGE_REPOSITORY}" \ - --set server.image.tag="${VAULT_VERSION}" \ - --set injector.enabled=false \ - --set 'server.extraEnvironmentVars.VAULT_DISABLE_USER_LOCKOUT=true' \ - --set 'server.extraEnvironmentVars.VAULT_CACERT=/var/run/tls/vault-ca.pem' \ - --set "server.extraEnvironmentVars.VAULT_API_ADDR=${VAULT_API_ADDR}" \ - --set "server.enterpriseLicense.secretName=${VAULT_LICENSE_SECRET_NAME}" \ - --set "server.enterpriseLicense.secretKey=license" \ - --set "server.extraArgs=-dev-tls -dev-tls-cert-dir=/var/run/tls -dev-tls-san=vault -dev-tls-san=vault.${VAULT_NAMESPACE}.svc" \ - --set 'server.volumes[0].name=tls' \ - --set-json 'server.volumes[0].emptyDir={}' \ - --set 'server.volumeMounts[0].name=tls' \ - --set 'server.volumeMounts[0].mountPath=/var/run/tls' \ - --wait \ - --timeout 10m - -# Helm wait passes even when vault pod is 0/1 Running, so wait for ready condition -echo "Waiting for Vault pod to be ready..." -oc wait --for=condition=ready pod/vault-0 -n "${VAULT_NAMESPACE}" --timeout=5m - -# Extract CA certificate from Vault pod -echo "" -echo "Extracting CA certificate from Vault pod..." -CA_CERT_TMP="/tmp/vault-ca-${VAULT_NAMESPACE}.pem" -oc exec vault-0 -n "${VAULT_NAMESPACE}" -- cat /var/run/tls/vault-ca.pem > "${CA_CERT_TMP}" -echo " ✓ CA certificate extracted" - -# Create or update ConfigMap with CA certificate in openshift-config -echo "" -echo "Creating ConfigMap vault-ca-bundle in openshift-config..." -oc create configmap vault-ca-bundle \ - --from-file=ca-bundle.crt="${CA_CERT_TMP}" \ - -n openshift-config \ - --dry-run=client -o yaml | oc apply -f - -echo " ✓ ConfigMap vault-ca-bundle created/updated" - -# Clean up temporary CA file -rm -f "${CA_CERT_TMP}" - -echo "" -echo "=========================================" -echo "Vault Enterprise Installation Complete" -echo "=========================================" -echo "" -echo "Summary:" -echo " - Namespace: ${VAULT_NAMESPACE}" -echo " - Version: ${VAULT_VERSION}" -echo " - Service: https://vault.${VAULT_NAMESPACE}.svc:8200" -echo " - Pod: vault-0 (Ready)" -echo " - TLS: Enabled (dev mode with auto-generated certificates)" -echo " - TLS CA: /var/run/tls/vault-ca.pem (inside pod)" -echo " - Enterprise License: Configured" -echo " - CA ConfigMap: vault-ca-bundle (openshift-config namespace)" -echo "" -echo "Next step: Run etcd-encryption-vault-configure to configure Vault for KMS" -echo "" +install_vault "${VAULT_NAMESPACE}" "vault-ca-bundle" "vault" +install_vault "${VAULT_SECONDARY_NAMESPACE}" "vault-ca-bundle-secondary" "vault-secondary" diff --git a/ci-operator/step-registry/etcd-encryption/vault-install/etcd-encryption-vault-install-ref.yaml b/ci-operator/step-registry/etcd-encryption/vault-install/etcd-encryption-vault-install-ref.yaml index 96bd00c9764e2..7ddd0e9fe817f 100644 --- a/ci-operator/step-registry/etcd-encryption/vault-install/etcd-encryption-vault-install-ref.yaml +++ b/ci-operator/step-registry/etcd-encryption/vault-install/etcd-encryption-vault-install-ref.yaml @@ -33,6 +33,10 @@ ref: (docker.io is blocked in CI due to rate limiting and CI is not accessible in disconnected environments.) On baremetalds jobs the image is mirrored to the dev-scripts local registry before Helm install. + - name: VAULT_SECONDARY_NAMESPACE + default: "vault-kms-secondary" + documentation: |- + Namespace where the second Vault Enterprise instance will be installed. documentation: |- Installs HashiCorp Vault Enterprise via Helm. @@ -44,6 +48,7 @@ ref: - Mirrors Vault image to dev-scripts local registry on baremetalds jobs - Installs Vault Enterprise using Helm chart - Waits for Vault pod to be ready + - Installs a second instance in VAULT_SECONDARY_NAMESPACE Prerequisites: - OpenShift cluster with adequate resources @@ -53,6 +58,10 @@ ref: Outputs: - Vault service available at: vault.${VAULT_NAMESPACE}.svc:8200 - Vault pod: vault-0 (Ready state) + - CA ConfigMap: vault-ca-bundle (openshift-config namespace) + - Second Vault service at: vault-secondary.${VAULT_SECONDARY_NAMESPACE}.svc:8200 + - Second Vault pod: vault-secondary-0 (Ready state) + - CA ConfigMap: vault-ca-bundle-secondary (openshift-config namespace) Next step: - Run etcd-encryption-vault-configure to initialize and configure Vault for KMS diff --git a/ci-operator/step-registry/etcd-encryption/vault-setup/etcd-encryption-vault-setup-chain.yaml b/ci-operator/step-registry/etcd-encryption/vault-setup/etcd-encryption-vault-setup-chain.yaml index 30fa49fe4156a..b0e680827df89 100644 --- a/ci-operator/step-registry/etcd-encryption/vault-setup/etcd-encryption-vault-setup-chain.yaml +++ b/ci-operator/step-registry/etcd-encryption/vault-setup/etcd-encryption-vault-setup-chain.yaml @@ -10,38 +10,45 @@ chain: reusable component that can be used across different platform workflows. What this chain does: - 1. Installs HashiCorp Vault Enterprise via Helm (vault-install step) + 1. Installs two HashiCorp Vault Enterprise instances via Helm (vault-install step) - Mirrors Vault image to dev-scripts local registry on baremetalds jobs - - Deploys Vault in dev mode to vault-kms namespace + - Deploys Vault in dev mode to vault-kms and vault-kms-secondary namespaces - Creates vault-license secret from mounted credentials - - Waits for Vault pod to be ready + - Waits for Vault pods to be ready + - Creates CA ConfigMaps (vault-ca-bundle and vault-ca-bundle-secondary) in openshift-config - 2. Configures Vault for KMS encryption (vault-configure step) + 2. Configures both Vault instances for KMS encryption (vault-configure step) - Creates Vault Enterprise namespace (default: admin) - Enables transit secret engine in the Enterprise namespace - Creates KMS encryption key in the Enterprise namespace - Configures AppRole authentication in the Enterprise namespace - - Stores credentials in vault-credentials secret + - Stores credentials in vault-credentials secret in each namespace Prerequisites: - OpenShift cluster with adequate resources - Vault Enterprise license secret named 'tests-private-account' in test-credentials namespace containing the license file at key 'kms-vault-license' - Outputs: + Outputs (primary instance): - Vault service: vault.vault-kms.svc:8200 - - Vault pod: vault-0 (Ready state) + - Vault pod: vault-0 (Ready state) in vault-kms namespace + - CA ConfigMap: vault-ca-bundle in openshift-config namespace - Credentials secret: vault-credentials in vault-kms namespace - * role-id: AppRole role ID for KMS plugin - * secret-id: AppRole secret ID for KMS plugin - * root-token: Vault root token (dev mode) + + Outputs (secondary instance): + - Vault service: vault-secondary.vault-kms-secondary.svc:8200 + - Vault pod: vault-secondary-0 (Ready state) in vault-kms-secondary namespace + - CA ConfigMap: vault-ca-bundle-secondary in openshift-config namespace + - Credentials secret: vault-credentials in vault-kms-secondary namespace Environment variables (inherited from vault-install step): - VAULT_VERSION: Vault Enterprise version (default: 2.0.0-ent) - VAULT_CHART_VERSION: Helm chart version (default: 0.28.1) - - VAULT_NAMESPACE: Vault namespace (default: vault-kms) + - VAULT_NAMESPACE: Primary Vault namespace (default: vault-kms) + - VAULT_SECONDARY_NAMESPACE: Secondary Vault namespace (default: vault-kms-secondary) - VAULT_IMAGE_REPOSITORY: Container image repo (default: quay.io/openshifttest/vault-enterprise) Environment variables (inherited from vault-configure step): - VAULT_KMS_KEY_NAME: Transit encryption key name (default: kms-key) + - VAULT_SECONDARY_KMS_KEY_NAME: Secondary transit encryption key name (default: kms-key-secondary) - VAULT_ENTERPRISE_NS: Vault Enterprise namespace (default: admin)