IBM Cloud Docs
TLS および非 TLS の証明書とシークレットの管理

TLS および非 TLS の証明書とシークレットの管理

クラスターで証明書とシークレットを使用する方法について説明します。

Secrets Manager を使用して、シークレットを一元的に管理し、自動的に更新することを検討してください。

Ingress を使用した TLS 証明書と TLS シークレットの管理

Ingress TLS 証明書は Kubernetes シークレットとして保管されます。 クラスター内の TLS シークレットを管理するために、 ibmcloud ks ingress secret コマンド・セットを使用できます。

例えば、以下のコマンドを実行して、Secrets Manager の証明書をクラスター内の Kubernetes シークレットにインポートできます。

ibmcloud ks ingress secret create --cluster <cluster_name_or_ID> --cert-crn <crn> --name <secret_name> --namespace default

ibmcloud ks ingress secret create コマンドを使用して証明書をインポートするには、デフォルトの Secrets Manager インスタンスがクラスターに登録されている必要があります。 Secrets Manager インスタンスがなく、代わりにシークレットがクラスターに直接書き込まれる場合、シークレットには必要な CRN 値がないため、 kubectl コマンドを使用して手動でコピーする必要があります。

クラスター内の TLS 証明書のすべての Ingress シークレットを表示するには、以下のコマンドを実行します。

ibmcloud ks ingress secret ls -c <cluster>

IBM提供の Ingress サブドメイン用の TLS シークレットのセットアップ

IBM は、Ingress サブドメインと、クラスター内に Kubernetes シークレットとして保管されているデフォルトの TLS 証明書を提供します。これらは、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 ks 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 ks ingress secret get -c <cluster> --name <secret_name> --namespace default
    
  3. Ingress リソースまたはアプリが存在する各名前空間に、デフォルトの TLS 証明書のシークレットを作成します。 --cert-crn コマンド・オプションを使用して TLS 証明書 CRN を指定します。

    あるいは、defaultCertificate 構成マップibm-ingress-deploy-configでシークレットを として設定することもできます。

    ibmcloud ks ingress secret create --cluster <cluster_name_or_ID> --cert-crn <CRN> --name <secret_name> --namespace default
    

    ibmcloud ks ingress secret create コマンドを使用して秘密をコピーするには、デフォルトの Secrets Manager インスタンスがクラスターに登録されている必要があります。 Secrets Manager インスタンスがなく、代わりにシークレットがクラスターに直接書き込まれる場合、シークレットには必要な CRN 値がないため、 kubectl コマンドを使用して手動でコピーする必要があります。

カスタム・サブドメインの TLS シークレットのセットアップ

Ingress リソースにカスタム・サブドメインを定義する場合は、独自の TLS 証明書を使用して TLS 終端を管理できます。 TLS 証明書を保管するための Kubernetes シークレットを作成してから、アプリが存在する各名前空間にそのシークレットをインポートする必要があります。

Secrets Manager にカスタム TLS 証明書を保管することで、クラスター内の Kubernetes シークレットに証明書を直接インポートできます。

  1. Ingress リソースが存在する名前空間で TLS 証明書のシークレットを作成またはインポートします。 例えば、以下のコマンドを実行して、 Secrets Manager からクラスターにシークレットをインポートできます。 --cert-crn コマンド・オプションを使用して、TLS 証明書の CRN を指定します。

    ibmcloud ks ingress secret create コマンドを使用して証明書をインポートするには、デフォルトの Secrets Manager インスタンスがクラスターに登録されている必要があります。 Secrets Manager インスタンスがなく、代わりにシークレットがクラスターに直接書き込まれる場合、シークレットには必要な CRN 値がないため、 kubectl コマンドを使用して手動でコピーする必要があります。

    ibmcloud ks ingress secret create --name <secret_name> --cluster <cluster_name_or_ID> --cert-crn <certificate_crn> --namespace default
    
  2. アプリが存在する名前空間ごとに前のステップを繰り返します。

非 TLS シークレットの管理

非 TLS シークレットを管理するには、 ibmcloud ks ingress secret コマンドを使用できます。

TLS 以外のシークレットには、以下の 4 つのタイプがあります。

  • 任意のシークレット は、1 つのストリング値を保持します。
  • IAM 資格情報 には、IAM API キーが保持されます。
  • ユーザー名とパスワードのシークレット は、ユーザー名とパスワードを 2 つの別個の値として保持します。
  • キー値 は JSON 値を保持します。

IBM Cloud Secrets Manager を使用して非 TLS シークレットを一元的に管理する方法について説明します。 Secrets Managerを使用して、管理対象の Kubernetes シークレットの作成、シークレットの自動更新、クラスター内のシークレットへのアクセス権限を持つユーザーを制御するシークレット・グループの作成などを行うことができます。

クラスターでの非 TLS シークレットの作成

ibmcloud ks ingress secret create コマンドで --type Opaque オプションを指定して、非 TLS シークレットを作成します。 Opaque タイプでは、複数の非証明書 CRN 値を含めることができます。 --type オプションが指定されていない場合、デフォルトで TLS が適用されます。 詳細および追加のコマンド・オプションについては、 CLI リファレンス を参照してください。

以下のコマンド例では、 Opaque タイプを指定して非 TLS シークレットを作成します。 非 TLS シークレットには、少なくとも 1 つのシークレット・ フィールド が必要です。 --field オプションの指定方法は、 作成するシークレットのタイプによって 異なることに注意してください。

ibmcloud ks ingress secret create -c cluster-test --name example-secret --namespace default --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://travis.ibm.com/alchemy-containers/armada-ingress-secret-mgr/builds/78876583
    razee.io/source-url: https://github.ibm.com/alchemy-containers/armada-ingress-secret-mgr/commit/651fa822632128163cf638c47f0a14b1e0e2915a
  creationTimestamp: "2022-11-08T19:45:05Z"
  name: example-secret
  namespace: default
  resourceVersion: "111111"
  uid: 1aaa1111-1a11-111a-a1a1-11111a1a1a1a
type: Opaque

ibmcloud ks ingress secret field ls コマンドおよび ibmcloud ks ingress secret get コマンドを使用して、シークレット内のフィールドをリストすることもできますが、出力にはフィールド名のみが含まれ、それに関連付けられた値は含まれません。

シークレット・フィールドの追加

--field オプションを指定して ibmcloud ks ingress secret field add コマンドを実行することにより、TLS 以外のシークレットにシークレット・フィールドを追加します。 ibmcloud ks ingress secret create コマンドを使用してシークレットを作成するときに、このオプションを使用してフィールドを追加することもできます。 このオプションは、TLS シークレットではサポートされていません。

--field オプションを指定するには、3 つの方法があります。 選択するものは、シークレットのタイプと、シークレット内のフィールドに名前を付ける方法によって異なります。

非 TLS シークレットにフィールドを追加するためのオプション
オプション フォーマット 説明 サポート対象シークレット・タイプ
デフォルト --field <crn> 追加されるフィールドの名前は、指定された CRN のシークレット・タイプの デフォルト・フィールド名 です。 すべての非 TLS シークレット・タイプ
名前付き --field <name>=<crn> 追加するフィールドの名前を指定するには、このオプションを使用します。 追加されたフィールドの名前は、 <name> に指定された値です。 -任意
-IAM 資格情報
接頭部付き --field prefix=<crn> 追加されたフィールドの名前は、指定された CRN によって指定されたシークレット・タイプの デフォルト・フィールド名 で、接頭部として <crn> で指定されたシークレットの名前と下線が付きます。 -IAM 資格情報
-ユーザー名/パスワード
-キー/値

デフォルトのフィールド名は、 arbitrary (任意のシークレットの場合)、 api_key (IAM 資格情報の場合)、 username または password (ユーザー資格情報の場合)、および key (キー値の場合) です。

以下の例では、異なる --field オプションが結果のフィールド名に与える影響を示すために、3 つのシークレット・フィールド ( iam という名前の同じ IAM 資格情報シークレットを使用) を追加します。 kubectl get secret を実行し、出力の data ブロックを表示することで、シークレットに追加された フィールドを表示 できます。

ibmcloud ks ingress secret field add --cluster example-cluster --name example-iam-secret --namespace default  --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 ks ingress secret update --cluster example-cluster --name example-secret --namespace default

シークレット・フィールドの削除

TLS 以外のシークレットからシークレット・フィールドを削除できます。 詳細情報およびコマンド・オプションについては、 CLI リファレンス を参照してください。

ibmcloud ks ingress secret field rm -c example-cluster --name example-secret --namespace default --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 ks ingress secret create コマンドを実行し、デフォルトの Ingress 証明書の CRN を参照して、 istio-system 名前空間内の証明書をミラーリングします。 Secrets Manager インスタンスがない場合、 default 名前空間内のデフォルトの Ingress 証明書が自動的に更新されます。 ただし、 **kubectl** コマンドまたは別のローテーション方式を使用して、 istio-system 名前空間内の証明書を定期的に更新する必要があります。
デフォルトの Ingress 証明書を参照するシークレットを作成しましたが、 Secrets Manager インスタンスを作成して登録しませんでした。 シークレットを管理するにはどうすればよいですか?
Secrets Manager インスタンスを登録しない場合、 IBM Cloud Kubernetes Service はデフォルトの Ingress シークレットのみを自動的に更新します。 kubectl コマンドまたは別のローテーション方式を使用して他のシークレットを管理する必要があります。 シークレットがデフォルトの Ingress 証明書を参照している場合は、 ibmcloud ks ingress secret rm を使用してそれらを削除します。