TLS および TLS 以外の証明書と秘密の管理

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

シークレットを集中管理し自動更新するために、[Secrets Manager サービス名] の利用をご検討ください。

Ingressによる 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サブドメインとデフォルトの TLS 証明書を提供し、Ingressリソースで指定できる Kubernetes シークレットとしてクラスタに保存されます。 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
    

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

カスタムサブドメインの TLS シークレットの設定

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

カスタム TLS 証明書を Secrets Manager に格納することで、証明書をクラスタの 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、5種類の秘密がある:

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

TLS、秘密を一元管理する方法をご紹介します。 IBM Cloud Secrets Manager. Secrets Manager を使用すると、管理された Kubernetes シークレットの作成、シークレットの自動更新、クラスタ内のシークレットへのアクセス者を制御するシークレットグループの作成などを行うことができます。

クラスタ内で TLS 以外のシークレットを作成する

コマンドに --type Opaque オプションを指定して、 TLS 以外のシークレットを作成する。 ibmcloud ks ingress secret create コマンドで指定する。 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://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 ks ingress secret field ls コマンドおよび ibmcloud ks ingress secret get コマンドを使用して、シークレット内のフィールドをリストすることもできますが、出力にはフィールド名のみが含まれ、それに関連付けられた値は含まれません。

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

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

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

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

デフォルトのフィールド名は、任意のシークレットに対して、IAM api_key クレデンシャルに対して、 arbitrary ユーザー username クレデンシャルに対して passwordkey キーと値に対してです。

以下の例では、異なる --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 を使用してそれらを削除します。