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

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

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

Ingressによる TLS 証明書と秘密の管理

あなたのIngress TLS 証明書は、 Kubernetes シークレットとして保存されます。 クラスタ内の 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値が設定されていません。そのため、 OpenShiftocプラグインコマンドを使用して手動でコピーする必要があります。

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

ibmcloud oc 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 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
    

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

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

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

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

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

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

    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 コマンドを使用します。

TLS、5種類の秘密がある:

  • 任意のシークレット は、1 つのストリング値を保持します。
  • IAM 資格情報 には、IAM API キーが保持されます。
  • ユーザー名とパスワードのシークレット は、ユーザー名とパスワードを 2 つの別個の値として保持します。
  • キー値 は 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 以外の秘密は、少なくとも1つの秘密 フィールドを 必要とする。 --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 ls コマンドおよび ibmcloud oc ingress secret get コマンドを使用して、シークレット内のフィールドをリストすることもできますが、出力にはフィールド名のみが含まれ、それに関連付けられた値は含まれません。

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

TLS でないシークレットにシークレットフィールドを追加するには、次のコマンドを実行する。 ibmcloud oc ingress secret field add--field コマンドを実行する。 ibmcloud oc 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 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 を使用してそれらを削除します。