Creating Vault secrets for external EDB PostgreSQL credentials
Create Vault secrets for EDB PostgreSQL credentials.
About this task
To use EDB PostgreSQL bind credentials from Vault, create Vault secrets for the Postgres database connection credentials.
Procedure
-
Create secrets in Vault for external Postgres database connection credentials.
vault kv put secret/im-external-edb-postgres-creds ca.crt="<ca_crt_content>" tls.crt="<tls_crt_content>" tls.key="<tls_key_content>" -
If exeternal Postgres supports password-based authentication, you can also create a password in Vault.
vault kv put secret/im-external-edb-postgres-creds db_password="<psql_db_password>" ca.crt="<ca_crt_content>" tls.crt="<tls_crt_content>" tls.key="<tls_key_content>" -
Configure Vault to use Kubernetes authentication.
vault auth enable kubernetes -
Configure the Kubernetes authentication method.
- If Vault is running in the same Kubernetes cluster, run the following command:
vault write auth/kubernetes/config \ issuer="https://kubernetes.default.svc.cluster.local" \ 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 - If Vault is running outside of the Kubernetes cluster, run the following commands to gather the token and the
ca.crtcertificate from one of the pods, update it in Vault, and help ensure thatvault-csi-provideris running in the cluster.oc exec -n <CSNamespace> -it <some-pod> -- shcat /var/run/secrets/kubernetes.io/serviceaccount/token cat /var/run/secrets/kubernetes.io/serviceaccount/ca.crtvault write auth/kubernetes/config \ issuer="https://kubernetes.default.svc.cluster.local" \ token_reviewer_jwt="<token_content>" \ kubernetes_host="<kuberentes_external_host>" \ kubernetes_ca_cert=<ca_crt_content>`
- If Vault is running in the same Kubernetes cluster, run the following command:
-
Create a policy for IBM Cloud Pak foundational services Identity Management (IM) EDB.
vault policy write cs-im-edb-policy - <<EOF # Read-only access to bind password path "secret/data/im-external-edb-postgres-creds" { capabilities = ["read"] } EOF -
Create an
authrole to access the policy. Replace the<CSNamespace>value with a namespace where IBM Cloud Pak foundational services is deployed.Starting with version 4.17.0, use the following command:
vault write auth/kubernetes/role/cs-im-edb-role \ bound_service_account_names="ibm-iam-operand-restricted,platform-identity-management,platform-identity-provider" \ bound_service_account_namespaces="<CSNamespace>" \ audience="https://kubernetes.default.svc" \ policies="cs-im-edb-policy" \ ttl=20mFor versions 4.16.0 and earlier, use the following command:
vault write auth/kubernetes/role/cs-im-edb-role \ bound_service_account_names=ibm-iam-operand-restricted \ bound_service_account_namespaces=<CSNamespace> \ policies=cs-im-edb-policy \ ttl=20m -
Create a
SecretProviderClassobject for external EDB PostgreSQL credentials.- Run one of the following commands to create a
SecretProviderClassobject that contains external EDB PostgreSQL credentials in the foundational services namespace with theauthentication.operator.ibm.com/as-volume: "im-external-edb-cred-vol"andapp.kubernetes.io/part-of: "im"labels.- Replace the
<CSNamespace>value with a namespace where foundational services is deployed. - Do not change the
objectNamevalue and labels. - If external PostgreSQL does not support password-based authentication, run the following command:
cat << EOF | oc apply -f - apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: im-external-edb-creds-spc namespace: <CSNamespace> labels: authentication.operator.ibm.com/as-volume: "pgsql-certs" app.kubernetes.io/part-of: "im" spec: parameters: objects: | - objectName: "ca.crt" secretPath: "secret/data/im-external-edb-postgres-creds" secretKey: "ca.crt" - objectName: "tls.crt" secretPath: "secret/data/im-external-edb-postgres-creds" secretKey: "tls.crt" - objectName: "tls.key" secretPath: "secret/data/im-external-edb-postgres-creds" secretKey: "tls.key" roleName: cs-im-edb-role vaultAddress: 'http://vault.hashicorp-vault:8200' provider: vault EOF - If external PostgreSQL does support password-based authentication, run the following command:
cat << EOF | oc apply -f - apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: im-external-edb-creds-spc namespace: <CSNamespace> labels: authentication.operator.ibm.com/as-volume: "pgsql-certs" app.kubernetes.io/part-of: "im" spec: parameters: objects: | - objectName: "ca.crt" secretPath: "secret/data/im-external-edb-postgres-creds" secretKey: "ca.crt" - objectName: "tls.crt" secretPath: "secret/data/im-external-edb-postgres-creds" secretKey: "tls.crt" - objectName: "tls.key" secretPath: "secret/data/im-external-edb-postgres-creds" secretKey: "tls.key" - objectName: "DATABASE_PASSWORD" secretPath: "secret/data/im-external-edb-postgres-creds" secretKey: "db_password" roleName: cs-im-edb-role vaultAddress: 'http://vault.hashicorp-vault:8200' provider: vault EOF
- Replace the
- After the secret provider classes are created, update the IM authentication custom resource (CR) by setting the
useSecretsStoreCSIvalue totrue. Then, the IM operator picks theSecretProviderClassobjects, mounts them into IM operand pods, and uses external EDB Postgres credentials from Vault. After theSecretProviderClassobjects are present in the cluster, updated volume and volume mounts appear.- This example shows the volume before the
SecretProviderClassobjects are present in the cluster.- name: pgsql-certs secret: secretName: im-datastore-edb-secret defaultMode: 420
- This example shows volume mounts before the
SecretProviderClassobjects are present in the cluster.- name: pgsql-certs mountPath: /certs/pgsql - This example shows the volume after the
SecretProviderClassobjects are present in the cluster.- name: pgsql-certs csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: im-external-edb-creds-spc - This example shows volume mounts after the
SecretProviderClassobjects are present in the cluster.- name: pgsql-certs mountPath: /certs/pgsql
- This example shows the volume before the
- Run one of the following commands to create a