Skip to content

Secrets CSI Usage

The Secrets CSI driver is used in HyperShift's managed Azure architecture in order to read secrets from Azure Key Vault and mount them as files in a pod. This allows for the secure storage of sensitive information such as credentials and certificates.

More information on Secrets CSI driver can be found in the official documentation.

Overview

A single managed identity is used to pull any secrets or certificates from Azure Key Vault. The managed identity is created when the AKS cluster is created. For example, this happens when the flag enable-addons azure-keyvault-secrets-provider is provided when creating the AKS cluster using the Azure CLI.

Important

The created managed identity is expected to have the Key Vault Secrets User role assigned to it so that it can read secrets and credentials from the Azure Key Vault.

Important

This managed identity will be used by any HostedClusters managed by the HO to read secrets from the Azure Key Vault.

This managed identity is passed in as a client ID to the HyperShift Operator during installation through the flag aro-hcp-key-vault-users-client-id. This client ID will be passed in to every created SecretProviderClass CR and used in the field called userAssignedIdentityID.

SecretsProviderClass CRs

The HyperShift Operator creates a SecretProviderClass CR for:

  • the control plane operator (CPO)
  • the nodepool management provider (CAPZ)

The CPO creates a SecretProviderClass CR for:

  • key management service (KMS)
  • cloud-network-config-controller (CNCC)
  • cloud provider (CP, aka CCM)
  • ingress
  • image registry
  • Azure disk CSI driver
  • Azure file CSI driver

Here is an example of a SecretProviderClass CR for the CPO:

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  annotations:
    hypershift.openshift.io/cluster: e2e-clusters-example/example-cluster
spec:
  parameters:
    keyvaultName: aks-e2e
    objects: |2

      array:
        - |
          objectName: cpo-secret
          objectEncoding: utf-8
          objectType: secret
    tenantId: f47a1c3d-89ab-4def-b456-123456789abc
    usePodIdentity: "false"
    useVMManagedIdentity: "true"
    userAssignedIdentityID: 92bd5e7a-3cfe-41a2-9f88-df0123456789
  provider: azure

How SecretProviderClass CR is Used

The SecretProviderClass CR is then used by the Secrets CSI driver to mount the secret, objectName in the above example, into the pod as a file in a volume mount. Here is an example of a pod spec that mounts the secret:

  containers:
...
    name: control-plane-operator
...
    volumeMounts:
      - mountPath: /mnt/certs
        name: cpo-cert
        readOnly: true
...
    volumes:
      - csi:
          driver: secrets-store.csi.k8s.io
          readOnly: true
          volumeAttributes:
            secretProviderClass: managed-azure-cpo
        name: cpo-cert

The mounted secret can be viewed in the pod by navigating to the /mnt/certs directory and catting the file. In this example, something like:

k exec -it control-plane-operator -- /bin/bash
cat /mnt/certs/cpo-secret

How Secret Information is Used By Components

All the different components using the Secrets CSI driver will have their own way of consuming the secret.

Consumed directly in the operator/controller

The following components directly use the secret file mounted in the pod to authenticate with Azure cloud:

  • CPO
  • CNCC
  • ingress
  • image registry

For example:

    certPath := config.ManagedAzureCertificatePath + hcp.Spec.Platform.Azure.ManagedIdentities.ControlPlane.ControlPlaneOperator.CredentialsSecretName
    creds, err := dataplane.NewUserAssignedIdentityCredential(ctx, certPath, dataplane.WithClientOpts(azcore.ClientOptions{Cloud: cloud.AzurePublic}))
    if err != nil {
        return fmt.Errorf("failed to create azure creds to verify resource group locations: %v", err)
    }

Consumed by a configuration file

The following components use a configuration file in order to know where to find the secret mounted in the pod:

  • CP/CCM
  • Azure disk CSI driver
  • Azure file CSI driver

For an example, see the official documentation.

Consumed through a CR

Finally, the nodepool management provider (CAPZ) uses a CR, AzureClusterIdentity, to identify where the secret is mounted in the pod.

For an example, see the official documentation.