Proteggi i segreti delle app con Vault Dedicated e External Secrets Operator

In questo tutorial imparerai come utilizzare IBM Cloud Vault Enterprise per gestire i segreti delle applicazioni in esecuzione nel tuo cluster IBM Cloud Kubernetes Service, avvalendoti dello strumento open source External Secrets Operator.

Sei uno sviluppatore all'interno di un'organizzazione e il tuo team utilizza Kubernetes Service per distribuire applicazioni e servizi containerizzati su IBM Cloud. Desideri archiviare i segreti della tua applicazione in Vault Dedicated, il servizio gestito HashiCorp Vault di IBM Cloud, dove potrai crittografarli a riposo, gestirne il ciclo di vita e ruotarli facilmente.

Grazie a Vault Dedicated e all’External Secrets Operator, è possibile centralizzare e proteggere i segreti utilizzati dalle applicazioni in esecuzione nei cluster di Kubernetes. Anziché inserire i segreti al momento della distribuzione, è possibile configurare le applicazioni in modo che recuperino in modo sicuro i segreti da Vault Dedicated durante l'esecuzione. Ad esempio, considera il seguente scenario:

Il diagramma illustra il flusso di base tra Secrets Manager e il tuo cluster Kubernetes.
Flusso dei segreti esterni

  1. In qualità di sviluppatore, utilizzi Vault Dedicated per archiviare un segreto relativo a un'applicazione che desideri distribuire in un cluster di Kubernetes.
  2. È possibile configurare l'External Secrets Operator per connettersi alla propria istanza di Vault Dedicated utilizzando il provider HashiCorp Vault.
  3. Il controller External Secrets recupera gli oggetti “ ExternalSecrets ” presenti nel file di configurazione che hai definito utilizzando l’API Kubernetes.
  4. Durante l'esecuzione dell'applicazione, il controller recupera i dati segreti da Vault Dedicated e converte gli oggetti " ExternalSecrets " in segreti " Kubernetes " per il proprio cluster.

Questo scenario riguarda uno strumento di terze parti che può influire sulla preparazione alla conformità dei carichi di lavoro in esecuzione nel cluster di Kubernetes. Se aggiungi uno strumento della community o di terze parti, tieni presente che sei responsabile di garantire la conformità delle tue app e di collaborare con il fornitore competente per risolvere eventuali problemi. Per ulteriori informazioni, consulta la sezione “Le tue responsabilità nell’uso di IBM Cloud Kubernetes Service ”.

Prima di iniziare

Prima di iniziare, assicurati di disporre dei diritti di amministratore sulla piattaforma, in modo da poter creare le credenziali degli account e assegnare le risorse. Sono inoltre necessari i seguenti prerequisiti:

jq ti aiuta a suddividere e filtrare i dati JSON. In questo tutorial si utilizza jq per recuperare e utilizzare le variabili d’ambiente memorizzate.

Configura l'ambiente

Per utilizzare Vault Dedicated e Kubernetes Service, è necessario creare un cluster nel proprio account IBM Cloud e configurare l'accesso alla propria istanza di Vault Dedicated.

Crea un cluster Kubernetes

Crea un cluster " Kubernetes " nel tuo account IBM Cloud.

  1. Dalla riga di comando, accedi a IBM Cloud tramite la CLI di IBM Cloud.

    ibmcloud login
    

    Se l'accesso non riesce, esegui il comando ibmcloud login --sso e prova di nuovo. Il parametro --sso è obbligatorio quando accedi con un ID federato. Se viene utilizzata questa opzione, vai al link elencato nell'output della CLI per generare una passcode monouso.

  2. Selezionare l'account, la regione e il gruppo di risorse in cui si desidera creare il cluster.

    ibmcloud target -r REGION -g RESOURCE_GROUP
    

    Sostituisci REGION con la tua regione di destinazione (ad esempio, au-syd) e RESOURCE_GROUP con il nome del tuo gruppo di risorse.

  3. Creare un cluster Kubernetes.

    ibmcloud ks cluster create vpc-gen2 --zone ZONE --flavor FLAVOR --workers 1 --name eso-test-cluster --vpc-id VPC_ID --subnet-id SUBNET_ID
    

    Sostituisci ZONE, FLAVOR, VPC_ID e SUBNET_ID con i tuoi valori. Il processo di configurazione del cluster di Kubernetes richiede dai 5 ai 15 minuti.

  4. Prima di passare alla fase successiva, verifica che il cluster sia stato configurato correttamente.

    ibmcloud ks worker ls --cluster eso-test-cluster
    

    Una volta completata la configurazione del nodo di lavoro, lo stato passa a “Pronto ”.

  5. Imposta il contesto per il tuo cluster Kubernetes nella CLI.

    ibmcloud ks cluster config --cluster eso-test-cluster
    
  6. Verifica che i comandi kubectl vengano eseguiti correttamente e che il contesto Kubernetes sia impostato sul tuo cluster.

    kubectl config current-context
    

Prepara la tua istanza Vault Dedicated

Configura la tua istanza Vault Dedicated per iniziare a lavorare con i segreti e imposta l'autenticazione per l'External Secrets Operator.

  1. Esporta le variabili d'ambiente con i dettagli della tua istanza Vault Dedicated.

    export VAULT_DEDICATED_ADDR="https://<your-vault_dedicated-instance-id>.vault.<region>.appdomain.cloud"
    export VAULT_DEDICATED_NAMESPACE="admin"
    

    Sostituisci <your-vault_dedicated-instance-id> con l'ID della tua istanza di Vault Dedicated e <region> con la tua regione di Vault Dedicated (ad esempio, au-syd).

  2. Ottieni un token Vault dalla tua istanza Vault Dedicated.

    È possibile generare un token dall'interfaccia utente di Vault Dedicated oppure utilizzando la CLI di Vault. Per lo sviluppo e il collaudo, è possibile utilizzare un token root. Per la produzione, creare un token con le politiche appropriate.

    export VAULT_TOKEN="<your-vault-token>"
    
  3. Verifica il punto di montaggio del motore dei segreti KV in Vault Dedicated.

    Le istanze dedicate di Vault hanno, per impostazione predefinita, il motore dei segreti KV v2 montato su kv/. È possibile verificarlo nell'interfaccia utente di Vault Dedicated oppure visualizzando l'elenco dei mount.

    curl -k -X GET \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      $VAULT_DEDICATED_ADDR/v1/sys/mounts | jq
    
  4. Crea un segreto di prova in Vault Dedicated.

    curl -k -X POST \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      -d '{"data":{"username":"user123","password":"cloudy-rainy-coffee-book"}}' \
      $VAULT_DEDICATED_ADDR/v1/kv/data/example_username_password
    

    Si noti che Vault Dedicated utilizza kv/ come percorso di montaggio per il motore dei segreti KV.

  5. Verifica che il segreto sia stato creato.

    curl -k -X GET \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      $VAULT_DEDICATED_ADDR/v1/kv/data/example_username_password | jq
    

Installa l'operatore External Secrets

Installa l'Operator External Secrets utilizzando Helm.

  1. Aggiungi il repository "External Secrets" d Helm.

    helm repo add external-secrets https://charts.external-secrets.io
    helm repo update
    
  2. Installa l'operatore External Secrets.

    helm install external-secrets \
      external-secrets/external-secrets \
      --namespace external-secrets \
      --create-namespace \
      --set installCRDs=true
    
  3. Verificare l'installazione.

    kubectl get pods -n external-secrets
    

    Attendere che tutti i pod siano nello stato “Running ”.

  4. Verificare che le definizioni delle risorse personalizzate (CRD) siano installate.

    kubectl get crd | grep external-secrets
    

    Dovresti dare un'occhiata a CRD come secretstores, clustersecretstores e externalsecrets.

Configurare SecretStore per Vault Dedicated

Crea una risorsa “ SecretStore ” che definisca le modalità di connessione di External Secrets Operator alla tua istanza di Vault Dedicated.

  1. Crea un segreto " Kubernetes " utilizzando il tuo token Vault.

    kubectl create secret generic vault-token \
      --namespace external-secrets \
      --from-literal=token="$VAULT_TOKEN"
    
  2. Crea un file denominato " secretstore.yaml ".

    touch secretstore.yaml
    
  3. Aggiungi la seguente configurazione al file.

    apiVersion: external-secrets.io/v1beta1
    kind: SecretStore
    metadata:
      name: vault-dedicated-secretstore
      namespace: default
    spec:
      provider:
        vault:
          server: "<VAULT_DEDICATED_ADDR>"
          path: "kv"
          version: "v2"
          namespace: "admin"
          auth:
            tokenSecretRef:
              name: "vault-token"
              key: "token"
              namespace: "external-secrets"
    

    Sostituisci <VAULT_DEDICATED_ADDR> con l'indirizzo della tua istanza Vault Dedicated. Si noti che l' path è impostato su kv, che è il punto di montaggio predefinito per il motore dei segreti KV in Vault Dedicated.

  4. Applicare la configurazione " SecretStore ".

    kubectl apply -f secretstore.yaml
    
  5. Verificare che l’ SecretStore sia valido.

    kubectl get secretstore vault-dedicated-secretstore -n default
    kubectl describe secretstore vault-dedicated-secretstore -n default
    

    Lo stato dovrebbe essere "Valido " se la connessione a Vault Dedicated è andata a buon fine.

Crea un ExternalSecret

Crea una risorsa “ ExternalSecret ” che definisca quali segreti recuperare da Vault Dedicated.

  1. Crea un file “ externalsecret.yaml ”.

    touch externalsecret.yaml
    
  2. Aggiungere la seguente configurazione.

    apiVersion: external-secrets.io/v1beta1
    kind: ExternalSecret
    metadata:
      name: vault-dedicated-app-secret
      namespace: default
    spec:
      refreshInterval: 1h
      secretStoreRef:
        name: vault-dedicated-secretstore
        kind: SecretStore
      target:
        name: my-k8s-secret
        creationPolicy: Owner
      data:
      - secretKey: username
        remoteRef:
          key: example_username_password
          property: username
      - secretKey: password
        remoteRef:
          key: example_username_password
          property: password
    

    Il parametro " refreshInterval " determina la frequenza con cui External Secrets Operator interroga Vault Dedicated per verificare la presenza di aggiornamenti. Il valore predefinito e consigliato è 1 ora.

  3. Applicare la configurazione " ExternalSecret ".

    kubectl apply -f externalsecret.yaml
    
  4. Verificare che l’operatore dei segreti esterni abbia recuperato il segreto da Vault Dedicated.

    kubectl get secret my-k8s-secret -o json | jq '.data | map_values(@base64d)'
    

    Output di esempio:

    {
        "password": "cloudy-rainy-coffee-book",
        "username": "user123"
    }
    

    Operazione riuscita. Ora puoi recuperare i dati riservati dalla tua istanza Vault Dedicated e utilizzarli nel tuo cluster di Kubernetes.

Distribuire un'app sul cluster

Infine, è possibile distribuire nel proprio cluster un’applicazione che utilizza il segreto di Vault Dedicated. Durante l'esecuzione dell'applicazione, i dati riservati recuperati da Vault Dedicated vengono convertiti in un segreto " Kubernetes " che può essere utilizzato dal proprio cluster.

  1. Crea una semplice distribuzione di prova che utilizzi il segreto.

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-app
      namespace: default
    spec:
      containers:
      - name: app
        image: busybox
        command: ['sh', '-c', 'echo "Username: \$USERNAME"; echo "Password: \$PASSWORD"; sleep 3600']
        env:
        - name: USERNAME
          valueFrom:
            secretKeyRef:
              name: my-k8s-secret
              key: username
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-k8s-secret
              key: password
    EOF
    
  2. Controlla i log del pod per verificare che il segreto sia stato inserito.

    kubectl logs test-app -n default
    

    Output previsto:

    Username: user123
    Password: cloudy-rainy-coffee-book
    

Cerchi altri esempi su come distribuire un'app? Consulta la guida “Distribuzione di applicazioni native di Kubernetes ” in cluster per ulteriori informazioni sulla distribuzione delle applicazioni.

(Facoltativo) Liberare le risorse

Se non hai più bisogno delle risorse che hai creato in questo tutorial, puoi seguire i passaggi riportati di seguito per rimuoverle dal tuo account.

  1. Elimina il tuo cluster di prova " Kubernetes ".

    ibmcloud ks cluster rm --cluster eso-test-cluster
    
  2. Eliminare i segreti di test nell'area dedicata di Vault.

    curl -k -X DELETE \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      $VAULT_DEDICATED_ADDR/v1/kv/metadata/example_username_password
    

Note di interesse

Durante la creazione dei documenti YAML, tieni presente quanto segue:

  1. Intervallo di polling: per impostazione predefinita, l'intervallo di polling è impostato su 1 ora (refreshInterval: 1h) ed è il valore consigliato. È possibile modificare questo valore nel modello " ExternalSecret ". L'intervallo può essere espresso in unità di s, m o h.

  2. Percorso di montaggio di Vault Dedicated: Vault Dedicated utilizza kv/ come percorso di montaggio predefinito per il motore dei segreti KV, anziché secret/. Assicurati di specificare il percorso corretto nella configurazione di SecretStore.

  3. Spazi dei nomi di Vault Dedicated: Vault Dedicated utilizza gli spazi dei nomi di Vault Enterprise. Lo spazio dei nomi predefinito è admin. Assicurati di specificare lo spazio dei nomi corretto nella configurazione di SecretStore.

  4. Metodi di autenticazione: per semplicità, questo tutorial utilizza l'autenticazione tramite token. Negli ambienti di produzione, si consiglia di utilizzare i metodi di autenticazione AppRole o Kubernetes per garantire una maggiore sicurezza.

  5. TLS Note: Vault Dedicated richiede connessioni di tip TLS. Negli ambienti di produzione, assicurarsi che sia configurata una corretta convalida dei certificati, anziché utilizzare skipTLSVerify.

Passi successivi

Ottimo lavoro! In questo tutorial hai imparato come configurare Vault Dedicated per inserire in modo sicuro i segreti delle applicazioni nel tuo cluster di Kubernetes utilizzando l'External Secrets Operator. Scopri altre risorse che ti aiuteranno a muovere i primi passi con Vault Dedicated.