IBM Cloud Docs
在 Kubernetes 叢集裡執行之應用程式的安全密碼

在 Kubernetes 叢集裡執行之應用程式的安全密碼

在本指導教學中,您將學習如何使用 IBM Cloud® Secrets Manager,透過使用 外部 Secrets Operator 開放程式碼工具來管理執行 IBM Cloud Kubernetes Service 叢集之應用程式的密碼。

或者,您可以使用 Kubernetes Service CLI 外掛程式來管理 TLS 和非 TLS 密碼。 若要進一步瞭解此方法,請參閱 設定 Kubernetes Ingress

您是組織中的開發人員,您的團隊正在使用Kubernetes Service在IBM Cloud上部署容器化應用程式和服務。 在現行流程中,您可以使用 Kubernetes Secrets 來儲存叢集裡執行的應用程式及服務所使用的機密資料 (例如密碼及 API 金鑰)。 若要進一步控制應用程式密碼,您想要能夠將叢集密碼儲存在外部密碼管理服務中,您可以在其中 靜態加密監視其活動,以及輕鬆管理它們。

使用 Secrets Manager,您可以集中並保護 Kubernetes 叢集裡執行的應用程式所使用的密碼。 您可以配置應用程式,以在執行時期安全地從 Secrets Manager 擷取密鑰,而不是在部署時注入密鑰。 當該輪替密鑰時,您可以從 Secrets Manager執行此動作。 例如,請考量下列情境:

此圖顯示 Secrets Manager 與 Kubernetes 叢集之間的基本流程。
外部秘密流程

  1. 作為開發人員,您可以使用 Secrets Manager 來儲存您要在 Kubernetes 叢集中部署之應用程式的密碼。
  2. Secrets Manager 提供密鑰的 ID。 您可以在應用程式的 ExternalSecrets 配置檔中包含 ID,並將配置套用至叢集。
  3. 「外部密鑰」控制器會提取您使用 Kubernetes API 所定義配置檔中的 ExternalSecrets 物件。
  4. 在應用程式執行時期,控制器會從 Secrets Manager擷取密碼資料,並將 ExternalSecrets 物件轉換為叢集的 Kubernetes 密碼。

此實務範例提供協力廠商工具,可影響在 Kubernetes 叢集裡執行之工作負載的相符性就緒。 如果您新增社群或協力廠商工具,請記住您負責維護應用程式的相符性,並與適當的提供者合作對任何問題進行疑難排解。 如需相關資訊,請參閱 您使用 IBM Cloud Kubernetes Service的責任

開始之前

開始之前,請確定您具有 管理者 平台存取權,以便您可以建立帳戶認證及佈建資源。 您也需要下列必要條件:

設定環境

若要使用 Secrets Manager 及 Kubernetes Service,您需要在 IBM Cloud 帳戶中建立叢集及 Secrets Manager 實例。 您還需要配置許可權,以便可以針對這兩個服務執行作業。

在此步驟中,您透過建立服務 ID 及 IBM Cloud API 金鑰來設定存取環境。 在指導教學結束時,如果不再需要資源,您可以輕鬆地移除資源。 或者,您可以使用 授信設定檔 來授權「外部密鑰」操作器。

建立服務 ID 和 API 金鑰

首先,請建立帳戶認證,您需要能夠針對 Secrets Manager 和 Kubernetes Service執行作業。

  1. 從指令行,透過 IBM Cloud CLI 登入 IBM Cloud。

    ibmcloud login
    

    如果登入失敗,請執行 ibmcloud login --sso 指令再試一次。 當您使用聯合 ID 登入時,需要 --sso 參數。 如果使用這個選項,請前往 CLI 輸出中所列的鏈結,以產生一次性的通行碼。

  2. 建立服務 ID 並將它設為環境變數。

    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
    
  3. 指派服務 ID 許可權,以從 Secrets Manager讀取密碼。

    ibmcloud iam service-policy-create $SERVICE_ID --roles "SecretsReader" --service-name secrets-manager
    

    透過指派 SecretsReader 服務存取權,「外部密鑰」控制器具有從 Secrets Manager 讀取密鑰並移入 Kubernetes 叢集的正確存取層次。

  4. 為您的服務 ID 建立 IBM Cloud API 金鑰。

    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"`
    

    您稍後可以使用此 API 金鑰來配置叢集部署的 Secrets Manager。

建立 Kubernetes 叢集及 Secrets Manager 實例

在 IBM Cloud 帳戶中建立 Kubernetes 叢集及 Secrets Manager 實例。

您可以為每個 IBM Cloud 帳戶建立一個免費 Kubernetes 叢集和 Secrets Manager 服務實例。 如果帳戶中已有兩個資源,您可以使用現有的免費叢集及 Secrets Manager 實例來完成指導教學。

  1. 從指令行中,選取您要在其中建立 Secrets Manager 服務實例的帳戶、地區及資源群組。

    在本指導教學中,您將與達拉斯地區互動。 如果您登入不同的地區,請執行下列指令,確定將達拉斯設為您的目標地區。

    ibmcloud target -r us-south -g default
    
  2. 建立 Kubernetes 集群。

    ibmcloud ks cluster create classic --zone dal10 --flavor free --name my-test-cluster
    
  3. 建立 Secrets Manager 範例。

    ibmcloud resource service-instance-create my-secrets-manager secrets-manager trial us-south
    

    同時佈建 Secrets Manager 及 Kubernetes 叢集需要 5-15 分鐘才能完成。

  4. 在繼續下一步之前,請驗證已順利佈建叢集及 Secrets Manager 實例。

    1. 驗證工作者節點的部署已完成。

      ibmcloud ks worker ls --cluster my-test-cluster
      

      當工作者節點完成佈建時,狀態會變更為 Ready

      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. 接下來,驗證 Secrets Manager 實例已順利佈建。

      ibmcloud resource service-instance my-secrets-manager
      

      當實例完成佈建時,狀態會變更為 作用中

      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
      
  5. 在 CLI 中為 Kubernetes 群集設定上下文。

    ibmcloud ks cluster config --cluster my-test-cluster
    
  6. 驗證 kubectl 指令是否適當地執行,以及 Kubernetes 環境定義是否設為您的叢集。

    kubectl config current-context
    

    輸出範例:

    my-test-cluster/<your_cluster_ID>
    

建立授信設定檔

授信設定檔可讓「外部密鑰」操作員從 Secrets Manager讀取,而不需要建立服務 ID 或管理 API 金鑰。

  1. 取得 Secrets Manager 實例及 Kubernetes 叢集的 CRN。

    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')
    
  2. 建立設定檔。

    ibmcloud iam trusted-profile-create 'External Secrets'
    
  3. 授權 Kubernetes 叢集使用授信設定檔。

    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_SA
    

    OpenShift

    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
    
  4. 建立存取原則,以容許授信設定檔從 Secrets Manager 實例讀取密碼。

    ibmcloud iam trusted-profile-policy-create 'External Secrets' --roles SecretsReader --service-instance $SECRETS_MANAGER_CRN --service-name secrets-manager
    

準備 Secrets Manager 實例

最後,配置 Secrets Manager 實例以開始使用密碼。

  1. 從指令行,驗證您可以存取 Secrets Manager CLI 外掛程式。

    ibmcloud secrets-manager --help
    

    還沒有外掛程式嗎? 若要安裝 Secrets Manager CLI 外掛程式,請執行 ibmcloud plugin install secrets-manager

  2. 匯出一個環境變數,其中包含您唯一的 Secrets Manager API 終點 URL。

    export SECRETS_MANAGER_URL=`ibmcloud resource service-instance my-secrets-manager --output json | jq -r '.[].dashboard_url | .[0:-3]'`; echo $SECRETS_MANAGER_URL
    
  3. 建立實例的密鑰群組。

    密鑰群組 是組織及控制團隊中有權存取實例中特定密鑰的人員的方法。 若要從 IBM Cloud CLI 建立密鑰群組,請使用 ibmcloud secrets-manager secret-group-create 指令。 執行下列指令,以建立密鑰群組並將其 ID 儲存為環境變數。

    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
    

    使用 Windows™ 命令提示字元 ( cmd.exe ) 或PowerShell? 如果您在指令行上傳遞 JSON 內容時發生錯誤,則可能需要調整字串,以符合作業系統特有的引號跳出需求。 如需相關資訊,請參閱 在 IBM Cloud CLI 中搭配使用引號

    成功! 現在,您可以將密鑰儲存在您要在 Kubernetes 叢集裡移入的 Secrets Manager 中。 繼續下一步。

在 Secrets Manager 中建立密鑰

密鑰是應用程式特有的,且可能根據需要它們的個別應用程式或服務而有所不同。 密鑰可能包含使用者名稱、密碼、API 金鑰或任何其他類型的認證。

Secrets Manager 支援各種 類型的密鑰,您可以在服務中建立及管理這些密鑰。 例如,如果您需要管理受 IBM Cloud IAM 鑑別保護之應用程式的 API 金鑰,則可以建立 IAM 認證。 或者,如果您需要管理可保留任何類型的結構化或非結構化資料的密鑰,則可以建立 任意密鑰

在本指導教學中,您將建立使用者名稱和密碼作為範例。 若要從 IBM Cloud CLI 建立密鑰,請使用 ibmcloud secrets-manager secret-create 指令。 執行下列指令,以建立密鑰並將其 ID 儲存為環境變數。

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

請務必將 instance_idregion 更新為您的。

輸出會顯示新建立密鑰的 ID。 例如:

e0246cea-d668-aba7-eef2-58ca11ad3707

設定外部密鑰操作員

現在您具有應用程式的密碼,您可以為叢集設定 外部 Secrets Operator 工具。 此套件透過為應用程式建立轉換為 Kubernetes 密碼的 ExternalSecrets 物件,來配置 Secrets Manager 與叢集之間的連線。

外部 Secrets Operator 是一個開放程式碼工具,不是由 IBM維護。 如需此工具或疑難排解任何問題的相關資訊,請參閱 專案說明文件

配置叢集的外部密鑰操作器

Kubernetes

首先,透過安裝正式的 Helm Chart,將 external-secrets 資源新增至叢集。 如需其他安裝選項,請參閱 入門手冊

  1. 執行下列指令,以安裝 External Secrets Operator helm 儲存庫:

    helm repo add external-secrets https://charts.external-secrets.io
    
  2. 配置外部密鑰操作員與 Secrets Manager之間的鑑別。

    如果您使用服務 ID 進行鑑別:

    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=true
    

    如果您使用授信設定檔來鑑別:

    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

  1. 透過建立下列資源來安裝外部密鑰操作器:

    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-
    
  2. 配置外部密鑰操作員與 Secrets Manager之間的鑑別。

    如果您使用服務 ID 進行鑑別:

    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-
    

    如果您使用授信設定檔來鑑別:

    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-
    

更新應用程式配置

在叢集裡安裝外部密鑰操作器之後,您可以將 Secrets Manager 定義為應用程式的密鑰後端。 首先,在您要使用的 Secrets Manager 中建立以密鑰為目標的配置檔。

  1. 在應用程式的根目錄中,建立 external-secrets-example.yml 檔案。

    touch external-secrets-example.yml
    
  2. 修改檔案以包括您要從 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>
    

    您選擇使用兩種模式-「密鑰 ID」或「密鑰名稱」。 如果選擇密鑰名稱,格式會從 secret_type/secret_id 變更為 secret_group/secret_type/secret_name

    <endpoint_url> 改為您 先前 擷取的 Secrets Manager 終點 URL。 將 <SECRET_ID> 取代為您在前一個步驟中建立之密鑰的唯一 ID。

    如果您使用授信設定檔來鑑別,請將 auth 區塊取代為下列 Snippet。

          auth:
            containerAuth:
              profile: "External Secrets"
              iamEndpoint: https://iam.cloud.ibm.com
              tokenLocation: /var/run/secrets/tokens/sa-token
    
  3. 將配置套用至叢集。

    kubectl apply -f external-secrets-example.yml
    
  4. 驗證「外部密鑰操作員」能夠提取儲存在 Secrets Manager 實例中的密鑰。

    kubectl get secret ibmcloud-secrets-manager-example -o json | jq '.data | map_values(@base64d)'
    

    輸出範例:

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

    成功! 您現在可以提取儲存在 Secrets Manager 實例中的密碼資料。 繼續下一步。

將應用程式部署到群集

最後,您可以在叢集裡部署使用 external-secret-example.yml 檔案中所定義 Secrets Manager 密鑰的應用程式。 在應用程式執行時期,從 Secrets Manager 提取的密碼資料會轉換為叢集可以使用的 Kubernetes 密碼。

尋找如何部署應用程式的範例? 請參閱 在叢集裡部署 Kubernetes原生應用程式,以進一步瞭解部署應用程式的單一實例。

(選用) 清除資源

如果您不再需要在本指導教學中建立的資源,則可以完成下列步驟以從帳戶中移除它們。

  1. 刪除測試 Kubernetes 叢集。

    ibmcloud ks cluster rm --cluster my-test-cluster
    
  2. 刪除測試 Secrets Manager 實例。

    ibmcloud resource service-instance-delete my-secrets-manager
    
  3. 刪除您的授權。

    如果您使用服務 ID。

    ibmcloud iam service-id-delete $SERVICE_ID
    

    如果您使用的是信任的設定檔。

    ibmcloud iam trusted-profile-delete 'External Secrets'
    

注意事項

當您建構 YAML 文件 時,請記住,使用 Secrets Manager 實例中的 REST,會定期輪詢資料區段中的每一個金鑰。 請注意:

  1. 預設情況下,輪詢時間間隔設定為 1 小時,這是設定的首選值。 您可以在 External Secrets 模版中使用 spec.refreshInterval 來變更此值。 間隔可以 smh 為單位來表示。
  2. 如果您設定 YAML 以依名稱而非 ID (keyByName: true) 來提取 Secrets Manager 密鑰,則 ESO 會額外呼叫以提取相關的密鑰 ID。 如需相關資訊,請參閱 外部密鑰說明文件

下一步

做得好! 在本指導教學中,您已學習如何設定 Secrets Manager,以安全地將應用程式密碼移入叢集。 請查看更多資源,以協助您開始使用 Secrets Manager。