管理 TLS 和非 TLS 憑證和機密

瞭解如何在叢集裡使用憑證及密碼。

考慮使用 Secrets Manager 來集中管理並自動更新您的機密資訊。

使用 Ingress 管理 TLS 證書和秘密

您的 Ingress TLS 憑證會儲存為 Kubernetes secret。 若要管理群集中的 TLS 秘密,您可以使用 ibmcloud oc ingress secret 指令集。

例如,您可以執行下列指令,將憑證從 Secrets Manager 匯入至叢集裡的 Kubernetes 密鑰。

ibmcloud oc ingress secret create --cluster CLUSTER_NAME_OR_ID --cert-crn CRN --name SECRET_NAME --namespace openshift-ingress

要使用命令 ibmcloud oc ingress secret create 匯入憑證,您必須在叢集上註冊預設的 Secrets Manager 實例。 若您未部署 Secrets Manager 實例,且您的機密直接寫入叢集,則這些機密將缺乏必要的 CRN 值,您必須透過 OpenShift oc插件指令手動複製這些機密。

若要檢視群集中 TLS 憑證的所有 Ingress 秘密,請執行下列指令。

ibmcloud oc ingress secret ls -c CLUSTER

為 IBM- 提供的 Ingress 子網域設定 TLS 秘密

IBM 提供一個 Ingress 子網域和預設的 TLS 證書,以 Kubernetes secret 儲存在您的群集中,您可以在 Ingress 資源中指定。 IBM 提供的 TLS 憑證是由 LetsEncrypt 所簽署,並且由 IBM 完全管理。

由 IBM 提供的 Ingress 子網域通配符 *.<cluster_name>-<globally_unique_account_HASH>-0000.<region>.containers.appdomain.cloud 已預設為您的叢集註冊。 IBM 提供的 TLS 憑證是萬用字元憑證,可用於萬用字元子網域。

按照步驟為 IBM- 提供的 Ingress 子網域使用預設的 TLS 憑證。

  1. 取得儲存預設 TLS 憑證的機密名稱。 請注意,這是您在 Ingress 資源的 spec.tls 區段中指定的密碼名稱。

    ibmcloud oc cluster get -c CLUSTER | grep Ingress
    

    輸出範例

    Ingress Subdomain:      mycluster-<hash>-0000.us-south.containers.appdomain.cloud
    Ingress Secret:         mycluster-<hash>-0000
    
  2. 檢視密鑰詳細資料,並記下 CRN 值。 這是 TLS 憑證的 CRN。 如果您沒有預設 [Secrets Manager] 實例註冊到群集,則表示您的秘密沒有 CRN。 如需詳細資料,請參閱下列步驟中的附註。

    ibmcloud oc ingress secret get -c CLUSTER --name SECRET_NAME --namespace openshift-ingress
    
  3. 在您的 Ingress 資源或應用程式所在的每個命名空間中,為預設 TLS 證書建立一個秘密。 使用 --cert-crn 指令選項指定 TLS 證書 CRN。

    ibmcloud oc ingress secret create --cluster CLUSTER_NAME_OR_ID --cert-crn CRN --name SECRET_NAME --namespace openshift-ingress
    

    要使用命令 ibmcloud oc ingress secret create 複製密鑰,您必須在叢集上註冊預設的 Secrets Manager 實例。 若您未部署 Secrets Manager 實例,且您的機密直接寫入叢集,則這些機密將缺乏必要的 CRN 值,您必須透過 OpenShift oc插件指令手動複製這些機密。

為自訂子網域設定 TLS 秘訣

如果您在 Ingress 資源中定義自訂的子網域,就可以使用自己的 TLS 證書來管理 TLS 終止。 您必須建立 Kubernetes secret 來儲存 TLS 證書,然後將此 secret 匯入您的應用程式所在的每個命名空間。

透過將自訂的 TLS 證書儲存於 Secrets Manager 中,您可以直接將您的憑證匯入集群中的 Kubernetes secret。

  1. 在您的 Ingress 資源所在的命名空間中,建立或匯入 TLS 證書的秘密。 例如,您可以執行以下指令,將 Secrets Manager 中的秘密匯入群集。 使用 --cert-crn 指令選項指定 TLS 憑證的 CRN。

    要使用命令 ibmcloud oc ingress secret create 匯入憑證,您必須在叢集上註冊預設的 Secrets Manager 實例。 若您未部署 Secrets Manager 實例,且您的機密直接寫入叢集,則這些機密將缺乏必要的 CRN 值,您必須透過 OpenShift oc 插件指令手動複製這些機密。

    ibmcloud oc ingress secret create --name SECRET_NAME --cluster CLUSTER_NAME_OR_ID --cert-crn CERTIFICATE_CRN --namespace openshift-ingress
    
  2. 針對應用程式所在的每一個名稱空間,重複前一個步驟。

管理非 TLS 機密

若要管理非 TLS 的機密,您可以使用 ibmcloud oc ingress secret 指令。

有 5 種非 TLS 秘密:

  • 任意密碼 保留一個字串值。
  • IAM 認證 保留 IAM API 金鑰。
  • 使用者名稱及密碼密碼 會將使用者名稱及密碼保留為兩個個別值。
  • 索引鍵值 包含 JSON 值。
  • 自訂憑證儲存自訂 (字串) 值。

瞭解您如何使用下列工具集中管理您的非 TLS 機密 IBM Cloud Secrets Manager. 透過 Secrets Manager,您可以建立受管理的 Kubernetes 秘訣、自動更新您的秘訣、建立秘訣群組以控制誰可以存取群集中的秘訣等。

在群集中建立非 TLS 的機密

在命令中指定 --type Opaque 選項,建立非 TLS 的秘密。ibmcloud oc ingress secret create 指令中指定 選項,以建立非 的秘密。 使用 Opaque 類型,您可以包括多個非憑證 CRN 值。 若未指定 --type 選項,則預設會套用 TLS。 如需相關資訊及其他指令選項,請參閱 CLI 參考資料

以下範例指令會以指定的 Opaque 類型建立非 TLS 的秘密。 非 TLS 的秘密至少需要一個秘密 欄位。 請注意,您指定 --field 選項的方式會有所不同 根據您建立的密鑰類型

ibmcloud oc ingress secret create -c cluster-test --name example-secret --namespace openshift-ingress --field crn:v1:bluemix:public:secrets-manager:us-south:a/1aa111aa1a11111aaa1a1111aa1aa111:111a1111-11a1 --type Opaque

若要驗證已建立密鑰,請列出名稱空間中的所有密鑰。

kubectl get secret -n default

以下範例顯示了輸出結果。

NAME                   TYPE                                  DATA   AGE
all-icr-io             kubernetes.io/dockerconfigjson        1      41h
default-token-8t6xw    kubernetes.io/service-account-token   3      41h
example-secret         Opaque                                        3m

管理非 TLS 保密欄位

秘訣欄位是儲存在非 TLS 秘訣中的鍵值對。 請參閱下列範例,以檢視、新增、更新或移除非 TLS 秘 密欄位。

檢視欄位值

您可以透過取得密鑰的詳細資料來檢視密鑰欄位的值。

kubectl get secret -n default example-secret -o yaml

下列範例輸出顯示 data 區段中的密鑰欄位及其值。

apiVersion: v1
data:
  arbitraryFVT: AAAaaAAaAAA1AAAaaAAa
  userCredsFVT_password: aAAaa1aaaA=
  userCredsFVT_username: aAAaaa==
kind: Secret
metadata:
  annotations:
    ingress.cloud.ibm.com/cert-source: ibm
    razee.io/build-url: https://url.com
    razee.io/source-url: https://url.com
  creationTimestamp: "2022-11-08T19:45:05Z"
  name: example-secret
  namespace: default
  resourceVersion: "111111"
  uid: 1aaa1111-1a11-111a-a1a1-11111a1a1a1a
type: Opaque

您也可以使用 ibmcloud oc ingress secret field lsibmcloud oc ingress secret get 指令列出密鑰中的欄位,但輸出僅包含欄位名稱,而不包含與其相關聯的值。

新增密鑰欄位

在非 TLS 秘訣中加入秘訣欄位,方法是執行 ibmcloud oc ingress secret field add 命令,並加上 --field 選項。 當您使用 ibmcloud oc ingress secret create 指令建立密鑰時,也可以使用此選項來新增欄位。 此選項不適用於 TLS 的機密。

有三種方法可指定 --field 選項。 您選擇的密碼取決於密鑰類型,以及您要如何命名密鑰中的欄位。

新增欄位至非 TLS 秘訣的選項
選項 格式 說明 支援的密鑰類型
預設值 --field <crn> 新增欄位的名稱是給定 CRN 的密鑰類型的 預設欄位名稱 所有非 TLS 秘密類型
具名 --field <name>=<crn> 使用此選項來指定新增欄位的名稱。 新增欄位的名稱是針對 <name> 指定的值。 -任意
-IAM 認證
字首 --field prefix=<crn> 新增欄位的名稱是給定 CRN 所指定密鑰類型的 預設欄位名稱,字首為 <crn> 所指定密鑰的名稱及底線。
  • IAM 認證
  • 使用者名稱/密碼
  • 金鑰/值
  • 自訂認證

預設欄位名稱為 arbitrary 用於任意機密、api_key 用於 IAM 憑證、usernamepassword 用於使用者憑證,以及 key 用於鍵值對。

下列範例新增三個密鑰欄位 (使用名稱為 iam 的相同 IAM 認證密鑰),以示範不同的 --field 選項如何影響產生的欄位名稱。 您可以執行 kubectl get secret 並檢視輸出的 data 區塊,以 檢視 新增至密鑰的欄位。

ibmcloud oc ingress secret field add --cluster example-cluster --name example-iam-secret --namespace openshift-ingress  --field crn:v1:bluemix:public:secrets-manager:us-south:a/1aa111aa-1a11-111a-aa1a-1111aa1aa111:secret:111a1111-11a1-11aa-a1a1-111aa12345aa --field custom_iam_name=crn:v1:bluemix:public:secrets-manager:us-south:a/1aa111aa-1a11-111a-aa1a-1111aa1aa111:secret:111a1111-11a1-11aa-a1a1-111aa12345aa --field prefix=crn:v1:bluemix:public:secrets-manager:us-south:a/1aa111aa-1a11-111a-aa1a-1111aa1aa111:secret:111a1111-11a1-11aa-a1a1-111aa12345aa

密鑰詳細資料的 data 區塊中列出的欄位範例。

data:
  api_key: bmZrUHR1VS1fNVpMOExsTmIxeTdQcXFTSENMc2pTUjRsNTQyTzZkZ2ZQMkk=  # Default field type using the default `api_key` field name
  custom_iam_name: bmZrUHR1VS1fNVpMOExsTmIxeTdQcXFTSENMc2pTUjRsNTQyTzZkZ2ZQMkk=  # Named field type using the specified `custom_iam_name` field name.
  iam_api_key: bmZrUHR1VS1fNVpMOExsTmIxeTdQcXFTSENMc2pTUjRsNTQyTzZkZ2ZQMkk= # Prefixed field type using the `iam` name in Secrets Manager followed by the `api_key` default name.

更新密鑰欄位

執行 ingress secret update 指令,以更新密鑰欄位的值。 請注意,這不會更新 CRN。 如需相關資訊及指令選項,請參閱 CLI 參考資料

ibmcloud oc ingress secret update --cluster example-cluster --name example-secret --namespace openshift-ingress

移除密鑰欄位

您可以從非 TLS 的機密中移除機密欄位。 如需相關資訊及指令選項,請參閱 CLI 參考資料

ibmcloud oc ingress secret field rm -c example-cluster --name example-secret --namespace openshift-ingress --field-name example-Field

您可以檢查密鑰詳細資料的 data 區塊,以驗證已移除該欄位。

kubectl get secret -n default example-secret -o yaml

密鑰常見問題 (FAQ)

檢閱關於管理叢集裡密鑰的常見問題的回答。

如果我未建立並登錄 Secrets Manager 實例,是否會自動更新我的密鑰?
如果您未將 Secrets Manager 實例登錄至叢集,則預設 Ingress 密碼會每 90 天自動更新一次,並套用至叢集。 不過,不會自動更新您所建立且 參照 預設 Ingress 密碼的任何密碼。
範例實務: 您在 default 名稱空間中具有預設 Ingress 憑證。 您執行 ibmcloud oc ingress secret create 指令並參照預設 Ingress 憑證的 CRN,以鏡映 istio-system 名稱空間中的憑證。 如果沒有 Secrets Manager 實例,則 default 名稱空間中的預設 Ingress 憑證會自動更新。 不過,您負責使用 **kubectl** 指令或其他循環方法,定期更新 istio-system 名稱空間中的憑證。
我已建立參照預設 Ingress 憑證的密碼,但未建立並登錄 Secrets Manager 實例。 如何管理我的秘密?
如果您未登錄 Secrets Manager 實例,Red Hat OpenShift on IBM Cloud 只會自動更新預設 Ingress 密碼。 您負責使用 kubectl 指令或其他輪換方法來管理任何其他密鑰。 如果您的密碼參照預設 Ingress 憑證,請使用 ibmcloud ks ingress secret rm 來移除它們。