Proteggi i dati riservati delle app in esecuzione nel tuo cluster Kubernetes utilizzando il piano di prova e il piano Standard
In questa esercitazione, imparerai come utilizzare il cluster IBM Cloud® Secrets Manager per gestire i segreti per le applicazioni che eseguono il tuo IBM Cloud Kubernetes Service utilizzando lo strumento open-source External Secrets Operator.
In alternativa, è possibile utilizzare il plug-in Kubernetes Service CLI per gestire i segreti TLS e non TLS. Per saperne di più su questo approccio, vedere Impostazione di Kubernetes Ingress.
Siete uno sviluppatore di un'organizzazione e il vostro team utilizza Kubernetes Service per distribuire applicazioni e servizi containerizzati su IBM Cloud. Nel tuo flusso corrente, utilizzi Kubernetes Secrets per memorizzare i dati sensibili, come password e chiavi API, utilizzati da applicazioni e servizi in esecuzione nel cluster. Per avere un maggiore controllo sui tuoi segreti dell'applicazione, vuoi la possibilità di archiviarli in un servizio di gestione dei segreti esterno, dove puoi crittografarli quando sono inattivi, monitorarne l'attività e gestirli facilmente.
Con Secrets Manager, puoi centralizzare e proteggere i segreti utilizzati dalle applicazioni eseguite nei tuoi cluster Kubernetes. Invece di fornire i tuoi segreti al momento della distribuzione, puoi configurare le tue applicazioni per richiamare in modo sicuro i segreti da Secrets Manager al runtime. Quando è il momento di ruotare il segreto, puoi farlo da Secrets Manager. Ad esempio, considera il seguente scenario:
- Come sviluppatore, utilizzi Secrets Manager per memorizzare un segreto per un'applicazione che vuoi distribuire in un cluster Kubernetes.
- Secrets Manager fornisce un ID per il segreto. Includi l'ID nel file di configurazione
ExternalSecretsper la tua applicazione e la applichi al cluster. - Il controller dei segreti esterni recupera gli oggetti
ExternalSecretsnel file di configurazione che hai definito utilizzando l'API Kubernetes. - Al runtime dell'applicazione, il controller richiama i dati segreti da Secrets Managere converte gli oggetti
ExternalSecretsin segreti Kubernetes per il cluster.
Questo scenario presenta uno strumento di terze parti che può avere un impatto sulla conformità dei carichi di lavoro eseguiti nel cluster Kubernetes. Se aggiungi una comunità o uno strumento di terze parti, tieni presente che sei responsabile del mantenimento della conformità delle tue app e di lavorare con il provider appropriato per risolvere eventuali problemi. Per ulteriori informazioni, vedere Responsabilità dell'utente nell'utilizzo di IBM Cloud Kubernetes Service.
Prima di iniziare
Prima di iniziare, assicurati di disporre dell'accesso alla piattaforma Administrator in modo da poter creare credenziali dell'account e risorse di provisioning. Sono necessari anche i seguenti prerequisiti:
- Scarica e installa la CLI di IBM Cloud.
- Installa il plugin della CLI Secrets Manager.
- Installa la CLI Kubernetes(
kubectl). - Scaricare e installare
jq.
jq ti aiuta a suddividere e filtrare i dati JSON. Utilizzare jq in questa esercitazione per acquisire e utilizzare le variabili di ambiente memorizzate.
Configura l'ambiente
Per gestire Secrets Manager e Kubernetes Service, devi creare un cluster e un'istanza Secrets Manager nel tuo account IBM Cloud. È inoltre necessario configurare autorizzazioni in modo da poter eseguire operazioni su entrambi i servizi.
In questo passo, configuri un ambiente di accesso creando una chiave API IBM Cloud e un ID servizio. Alla fine dell'esercitazione, è possibile rimuovere facilmente le risorse se non sono più necessarie. In alternativa, è possibile utilizzare un profilo attendibile per autorizzare l'operatore External Secrets.
Crea un ID servizio e una chiave API
Inizia creando le credenziali dell'account di cui hai bisogno per poter eseguire le operazioni su Secrets Manager e Kubernetes Service.
-
Dalla riga di comando, accedi alla CLI IBM Cloud tramite IBM Cloud.
ibmcloud loginSe l'accesso non riesce, esegui il comando
ibmcloud login --ssoe 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. -
Crea un ID servizio e impostalo come variabile di ambiente.
export SERVICE_ID=`ibmcloud iam service-id-create kubernetes-secrets-tutorial --description "A service ID for testing ESO integration" --output json | jq -r ".id"`; echo $SERVICE_ID -
Assegna le autorizzazioni ID servizio per leggere i segreti da Secrets Manager.
ibmcloud iam service-policy-create $SERVICE_ID --roles "SecretsReader" --service-name secrets-managerAssegnando l'accesso al servizio SecretsReader, il controller External Secrets ha il corretto livello di accesso per leggere i segreti da Secrets Manager e popolarli in un cluster Kubernetes.
-
Crea una chiave API IBM Cloud per il tuo ID servizio.
export IBM_CLOUD_API_KEY=`ibmcloud iam service-api-key-create kubernetes-secrets-tutorial $SERVICE_ID --description "An API key for testing ESO integration." --output json | jq -r ".apikey"`Questa chiave API viene utilizzata successivamente per configurare Secrets Manager per la distribuzione del cluster.
Crea un cluster Kubernetes e un'istanza Secrets Manager
Crea un cluster Kubernetes e un'istanza di Secrets Manager nel tuo account IBM Cloud.
È possibile creare gratuitamente un cluster Kubernetes e un'istanza del servizio Secrets Manager per ogni account IBM Cloud. Se si dispone già di entrambe le risorse nel proprio account, è possibile utilizzare il cluster gratuito e l'istanza Secrets Manager esistenti per completare l'esercitazione.
-
Dalla riga di comando, seleziona l'account, la regione e il gruppo di risorse in cui vuoi creare un'istanza del servizio Secrets Manager.
In questo tutorial interagirai con la regione di Dallas. Se hai effettuato l'accesso da una regione diversa, assicurati di impostare Dallas come regione di destinazione eseguendo il seguente comando.
ibmcloud target -r us-south -g default -
Creare un cluster Kubernetes.
ibmcloud ks cluster create classic --zone dal10 --flavor free --name my-test-cluster -
Crea un'istanza di Secrets Manager.
ibmcloud resource service-instance-create my-secrets-manager secrets-manager trial us-southIl provisioning sia per Secrets Manager che per il tuo cluster Kubernetes richiede 5-15 minuti per essere completato.
-
Prima di continuare con il passo successivo, verifica che il provisioning del tuo cluster e dell'istanza Secrets Manager sia stato eseguito correttamente.
- Verifica che la distribuzione del tuo nodo di lavoro sia completa.
ibmcloud ks worker ls --cluster my-test-cluster ``` Quando il tuo nodo di lavoro ha terminato il provisioning, lo stato cambia in **Pronto**. ```sh {: screen} ID Public IP Private IP Flavor State Status Zone Version kube-c39pf4ld0m87o3fv1utg-mytestclust-default-000000dd 169.xx.xx.xxx 10.xxx.xx.xxx free normal Ready mex01 1.20.7_1543 ``` 2. Successivamente, verifica che il provisioning della tua istanza Secrets Manager sia stato eseguito correttamente. ```sh {: pre} ibmcloud resource service-instance my-secrets-manager ``` Quando l'istanza ha terminato il provisioning, lo stato cambia in **Attivo**. ```plaintext {: screen} Name: my-secrets-manager ID: crn:v1:bluemix:public:secrets-manager:us-south:a/f047b55a3362ac06afad8a3f2f5586ea:fe06948b-0c6b-4183-8d4b-e6c1d38ff65f:: GUID: fe06948b-0c6b-4183-8d4b-e6c1d38ff65f Location: us-south Service Name: secrets-manager Service Plan Name: trial Resource Group Name: default State: active Type: service_instance Sub Type: Created at: 2021-01-06T17:11:32Z Created by: zara@example.com Updated at: 2021-03-31T02:33:26Z ``` -
Imposta il contesto per il tuo cluster Kubernetes nella CLI.
ibmcloud ks cluster config --cluster my-test-cluster -
Verifica che i comandi
kubectlvengano eseguiti correttamente e che il contesto Kubernetes sia impostato sul tuo cluster.kubectl config current-contextOutput di esempio:
my-test-cluster/<your_cluster_ID>
Creare un profilo di fiducia da CLI
Un profilo attendibile consente all'operatore External Secrets di leggere da Secrets Manager, senza dover creare un ID servizio o gestire una chiave API.
-
Ottieni i CRN per la tua istanza Secrets Manager e il cluster Kubernetes.
CLUSTER_CRN=$(ibmcloud ks cluster get --cluster my-test-cluster --output json | jq -r '.crn') SECRETS_MANAGER_CRN=$(ibmcloud resource service-instance my-secrets-manager --output JSON | jq -r '.[0].crn') -
Creare il profilo.
ibmcloud iam trusted-profile-create 'External Secrets' -
Autorizza il cluster Kubernetes a utilizzare il profilo attendibile.
Kubernetes
ibmcloud iam trusted-profile-rule-create 'External Secrets' --name kubernetes --type Profile-CR --conditions claim:namespace,operator:EQUALS,value:external-secrets --conditions claim:name,operator:EQUALS,value:external-secrets --conditions claim:crn,operator:EQUALS,value:$CLUSTER_CRN --cr-type IKS_SAOpenShift
ibmcloud iam trusted-profile-rule-create 'External Secrets' --name kubernetes --type Profile-CR --conditions claim:namespace,operator:EQUALS,value:external-secrets-operator --conditions claim:name,operator:EQUALS,value:cluster-external-secrets --conditions claim:crn,operator:EQUALS,value:$CLUSTER_CRN --cr-type IKS_SA -
Crea una politica di accesso che consenta al profilo attendibile di leggere i segreti dalla tua istanza Secrets Manager.
ibmcloud iam trusted-profile-policy-create 'External Secrets' --roles SecretsReader --service-instance $SECRETS_MANAGER_CRN --service-name secrets-manager
Creare un profilo di fiducia con Terraform
Un profilo attendibile consente all'operatore External Secrets di leggere da Secrets Manager, senza dover creare un ID servizio o gestire una chiave API. È possibile seguire questo esempio in Terraform che esegue tutti i passaggi per creare un profilo attendibile:
```sh {: pre}
//Get your cluster details
data "ibm_container_vpc_cluster" "cluster" {
name = var.cluster_name
resource_group_id = var.resource_group_id
}
//Get details of Secret Manager Instance
data "ibm_resource_instance" "secrets_manager" {
name = var.sm_name
resource_group_id = var.resource_group_id
service = "secrets-manager"
}
//Create Trusted Profile
resource "ibm_iam_trusted_profile" "eso_profile" {
name = var.profile_name
description = var.profile_description
}
//Attach IAM Policy for Secrets Manager Access
resource "ibm_iam_trusted_profile_policy" "secrets_policy" {
iam_id = ibm_iam_trusted_profile.eso_profile.id
roles = ["SecretsReader"]
resources {
service = "secrets-manager"
resource_instance_id = data.ibm_resource_instance.secrets_manager.guid
}
}
//Add Claim Rule for Kubernetes Service Account
resource "ibm_iam_trusted_profile_claim_rule" "eso_claim_rule" {
profile_id = ibm_iam_trusted_profile.eso_profile.id
type = "Profile-CR"
cr_type = "IKS_SA"
conditions {
claim = "name"
operator = "EQUALS"
value = var.service_account_name
}
conditions {
claim = "namespace"
operator = "EQUALS"
value = var.namespace
}
conditions {
claim = "crn"
operator = "EQUALS"
value = data.ibm_container_vpc_cluster.cluster.crn
}
}
//Variables
variable "resource_group_id" {
description = "Resource Group ID"
type = string
}
variable "sm_name" {
description = "Secret Manager Instance ID"
type = string
}
variable "cluster_name" {
description = "IKS Cluster name"
type = string
}
variable "profile_name" {
type = string
description = "Name of the trusted profile"
}
variable "profile_description" {
type = string
description = "Description of the trusted profile"
}
variable "service_account_name" {
description = "Kubernetes service account name for claim rule"
type = string
}
variable "namespace" {
description = "Kubernetes namespace for claim rule"
type = string
}
```
Prepara la tua istanza Secrets Manager
Infine, configurare l'istanza Secrets Manager per iniziare a lavorare con i segreti.
-
Dalla riga di comando, verifica di poter accedere al plugin CLI Secrets Manager.
ibmcloud secrets-manager --helpNon hai ancora il plug-in? Per installare il plug-in Secrets Manager CLI, eseguire
ibmcloud plugin install secrets-manager. -
Esportare una variabile di ambiente con il proprio endpoint API Secrets Manager univoco URL.
export SECRETS_MANAGER_URL=`ibmcloud resource service-instance my-secrets-manager --output json | jq -r '.[].dashboard_url | .[0:-3]'`; echo $SECRETS_MANAGER_URL -
Crea un gruppo di segreti per la tua istanza.
I gruppi segreti sono un modo per organizzare e controllare chi nel tuo gruppo ha accesso a segreti specifici nella tua istanza. Per creare un gruppo segreto dalla CLI
di IBM Cloud, si utilizza il ibmcloud secrets-manager secret-group-create comando.
Esegui il seguente comando per creare un gruppo di segreti e memorizzarne l'ID come una variabile di ambiente.
```sh {: pre}
export SECRET_GROUP_ID=`ibmcloud secrets-manager secret-group-create --name my-test-secret-group --description "Read and write to my test app" --output json --service-url $SECRETS_MANAGER_URL | jq -r '.id'`; echo $SECRET_GROUP_ID
```
Utilizzando il prompt dei comandi di Windows™ (`cmd.exe`) o il programma di gestione delle risorse PowerShell? Se riscontri degli errori durante la trasmissione del contenuto JSON sulla riga di comando, potresti dover regolare le stringhe per i requisiti di escape delle virgolette specifici del tuo sistema operativo. Per ulteriori informazioni, vedere [Uso delle virgolette con le stringhe nella CLI di IBM Cloud](/docs/cli?topic=cli-quote-strings).
{: tip}
Operazione riuscita. Ora puoi archiviare il segreto in Secrets Manager che vuoi popolare nel tuo cluster Kubernetes. Continua al passo successivo.
Crea un segreto in Secrets Manager
I segreti sono specifici dell'applicazione e possono variare in base alla singola applicazione o servizio che li richiede. Un segreto potrebbe essere costituito da un nome utente, una password, una chiave API o qualsiasi altro tipo di credenziale.
Secrets Manager supporta vari tipi di segreti che puoi creare e gestire nel servizio. Ad esempio, se devi gestire una chiave API per un'applicazione protetta dall'autenticazione IAM IBM Cloud, puoi creare una credenziale IAM. In alternativa, se devi gestire un segreto che può contenere qualsiasi tipo di dati strutturati o non strutturati, puoi creare un segreto arbitrario.
In questa esercitazione, si creano un nome utente e una password come esempio. Per creare un segreto dalla CLI IBM Cloud, utilizza il comando ibmcloud secrets-manager secret-create.
Esegui il seguente comando per creare il segreto e archiviare il suo ID come una variabile di ambiente.
export SECRET_ID=`ibmcloud secrets-manager secret-create --secret-type=username_password --secret-name example_username_password --username-password-username user123 --username-password-password cloudy-rainy-coffee-book --secret-labels "my-test-cluster, tutorial" --secret-group-id $SECRET_GROUP_ID --output json $SECRETS_MANAGER_URL | jq -r '.id'`; echo $SECRET_ID
Assicurati di aggiornare instance_id e region con i tuoi.
L'output mostra l'ID del tuo segreto appena creato. Ad esempio:
e0246cea-d668-aba7-eef2-58ca11ad3707
Imposta operatore segreto esterno
Ora che hai un segreto per la tua applicazione, puoi configurare lo strumento External Secrets Operator per il tuo cluster. Questo pacchetto configura la connessione
fra Secrets Manager e il tuo cluster creando ExternalSecrets oggetti convertiti in segreti Kubernetes per la tua applicazione.
External Secrets Operator è uno strumento open source che non è gestito da IBM. Per ulteriori informazioni su questo strumento o per risolvere eventuali problemi, fare riferimento alla documentazione del progetto .
Configurare l'operatore dei segreti esterno per il cluster
Kubernetes
Per prima cosa, aggiungi le risorse external-secrets al tuo cluster installando il grafico Helm ufficiale. Per ulteriori opzioni di installazione, consulta la guida introduttiva.
-
Eseguire il seguente comando per installare il repository helm External Secrets Operator:
helm repo add external-secrets https://charts.external-secrets.io -
Configura l'autenticazione tra External Secrets Operator e Secrets Manager.
Se stai utilizzando un ID servizio per l'autenticazione:
kubectl -n default create secret generic secret-api-key --from-literal=apikey=$IBM_CLOUD_API_KEY helm install external-secrets external-secrets/external-secrets -n external-secrets --create-namespace --set installCRDs=trueSe si utilizza un profilo attendibile per l'autenticazione:
echo ' installCRDs: true extraVolumes: - name: sa-token projected: defaultMode: 420 sources: - serviceAccountToken: path: sa-token expirationSeconds: 3600 audience: iam extraVolumeMounts: - mountPath: /var/run/secrets/tokens name: sa-token webhook: extraVolumes: - name: sa-token projected: defaultMode: 420 sources: - serviceAccountToken: path: sa-token expirationSeconds: 3600 audience: iam extraVolumeMounts: - mountPath: /var/run/secrets/tokens name: sa-token' >values.yml helm install external-secrets external-secrets/external-secrets -n external-secrets --create-namespace -f values.yml
OpenShift
-
Installare l'operatore External Secrets Operator creando le seguenti risorse:
echo ' apiVersion: v1 kind: Namespace metadata: name: external-secrets-operator --- apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: external-secrets-operator namespace: external-secrets-operator spec: targetNamespaces: - external-secrets-operator --- apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: external-secrets-operator namespace: external-secrets-operator spec: channel: stable installPlanApproval: Automatic name: external-secrets-operator source: community-operators sourceNamespace: openshift-marketplace ' | oc create -f- -
Configura l'autenticazione tra External Secrets Operator e Secrets Manager.
Se stai utilizzando un ID servizio per l'autenticazione:
echo " apiVersion: operator.external-secrets.io/v1alpha1 kind: OperatorConfig metadata: name: cluster namespace: external-secrets-operator spec: {} --- apiVersion: v1 kind: Secret metadata: name: secret-api-key namespace: default type: Opaque stringData: apikey: $IBM_CLOUD_API_KEY " | oc create -f-Se si utilizza un profilo attendibile per l'autenticazione:
echo ' apiVersion: operator.external-secrets.io/v1alpha1 kind: OperatorConfig metadata: name: cluster namespace: external-secrets-operator spec: extraVolumeMounts: - mountPath: /var/run/secrets/tokens name: sa-token extraVolumes: - name: sa-token projected: defaultMode: 420 sources: - serviceAccountToken: audience: iam expirationSeconds: 3600 path: sa-token webhook: extraVolumeMounts: - mountPath: /var/run/secrets/tokens name: sa-token extraVolumes: - name: sa-token projected: defaultMode: 420 sources: - serviceAccountToken: audience: iam expirationSeconds: 3600 path: sa-token ' | oc create -f-
Aggiorna la configurazione della tua app
Dopo aver installato External Secrets Operator nel tuo cluster, puoi definire Secrets Manager come backend dei segreti per la tua applicazione. Inizia creando un file di configurazione che punta al segreto in Secrets Manager che vuoi utilizzare.
-
Nella directory root della tua applicazione, crea un file
external-secrets-example.yml.touch external-secrets-example.yml -
Modifica il file per includere le informazioni sul segreto che vuoi recuperare dalla tua istanza Secrets Manager.
apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: ibmcloud-secrets-manager-example spec: provider: ibm: serviceUrl: <endpoint_url> auth: secretRef: secretApiKeySecretRef: name: secret-api-key key: apikey --- apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: ibmcloud-secrets-manager-example spec: secretStoreRef: name: ibmcloud-secrets-manager-example kind: SecretStore target: name: ibmcloud-secrets-manager-example data: - secretKey: username remoteRef: property: username key: username_password/<SECRET_ID> - secretKey: password remoteRef: property: password key: username_password/<SECRET_ID>Ci sono due modalità che si sceglie di utilizzare - ID segreto o nome segreto. Se si sceglie il nome segreto, il formato cambia da
secret_type/secret_idasecret_group/secret_type/secret_name.Sostituisci
<endpoint_url>con l'endpoint URL dell' Secrets Manager, che hai recuperato in precedenza. Sostituisci<SECRET_ID>con l'ID univoco del segreto che hai creato nel passo precedente.Se stai utilizzando un profilo attendibile per l'autenticazione, sostituisci il blocco
authcon il seguente frammento.auth: containerAuth: profile: "External Secrets" iamEndpoint: https://iam.cloud.ibm.com tokenLocation: /var/run/secrets/tokens/sa-token -
Applica la configurazione al tuo cluster.
kubectl apply -f external-secrets-example.yml -
Verifica che l'operatore dei segreti esterni sia in grado di recuperare il segreto memorizzato nella tua istanza Secrets Manager.
kubectl get secret ibmcloud-secrets-manager-example -o json | jq '.data | map_values(@base64d)'Output di esempio:
{ "password": "cloudy-rainy-coffee-book", "username": "user123" }Operazione riuscita. Ora puoi recuperare i dati segreti archiviati nella tua istanza Secrets Manager. Continua al passo successivo.
Distribuire un'app sul cluster
Infine, puoi distribuire un'applicazione nel tuo cluster che utilizza il segreto Secrets Manager che hai definito nel file external-secret-example.yml. Al runtime dell'applicazione, i dati segreti richiamati da Secrets Manager vengono
convertiti in un segreto Kubernetes che può essere utilizzato dal cluster.
Cerchi esempi su come distribuire un'applicazione? Controlla Distribuzione di Kubernetes-native apps in clusters per ulteriori informazioni sulla distribuzione di una singola istanza di un'applicazione.
(Facoltativo) Pulizia delle risorse
Se non hai più bisogno delle risorse che hai creato in questa esercitazione, puoi completare la seguente procedura per rimuoverle dall'account.
-
Elimina il tuo cluster Kubernetes di test.
ibmcloud ks cluster rm --cluster my-test-cluster -
Elimina la tua istanza Secrets Manager di test.
ibmcloud resource service-instance-delete my-secrets-manager -
Eliminare l'autorizzazione.
Se stai utilizzando un ID servizio.
ibmcloud iam service-id-delete $SERVICE_IDSe si sta utilizzando un profilo attendibile.
ibmcloud iam trusted-profile-delete 'External Secrets'
Note di interesse
Mentre crei il tuo documento YAML, tieni presente che ogni chiave nella sezione dei dati viene sottoposta a polling periodicamente utilizzando REST dall'istanza Secrets Manager. Tenere presente che:
- Per impostazione predefinita, l'intervallo di polling è impostato su 1 ora ed è il valore preferito da impostare. È possibile modificare questo valore utilizzando
spec.refreshIntervalnel modello Segreti esterni. L'intervallo può essere espresso in unità dis,moh. - Se imposti YAML per recuperare un segreto Secrets Manager per nome anziché ID (
keyByName: true), viene effettuata un'ulteriore chiamata dall'ESO per recuperare l'ID segreto pertinente. Per ulteriori informazioni, consultare la documentazione dei segreti esterni.
Passi successivi
Ottimo lavoro! In questa esercitazione, hai imparato come configurare Secrets Manager per popolare in modo sicuro i segreti dell'applicazione nel tuo cluster. Controlla ulteriori risorse per aiutarti a iniziare a utilizzare Secrets Manager.
- Esamina i tipi di segreti in Secrets Manager supportati dall'operatore External Secrets Operator.
- Ulteriori informazioni sulla API Secrets Manager.
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.