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 証明書を使用する手順に従ってください。
-
デフォルトの 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 -
シークレットの詳細を表示し、CRN 値をメモします。 これは、 TLS 証明書のCRNである。 デフォルトの [Secrets Manager] クラスタにデフォルト・インスタンスが登録されていない場合、シークレットにはCRNがありません。 詳しくは、以下のステップの注を参照してください。
ibmcloud oc ingress secret get -c CLUSTER --name SECRET_NAME --namespace openshift-ingress -
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 シークレットに直接インポートすることができます。
-
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 -
アプリが存在する名前空間ごとに前のステップを繰り返します。
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 つの方法があります。 選択するものは、シークレットのタイプと、シークレット内のフィールドに名前を付ける方法によって異なります。
| オプション | フォーマット | 説明 | サポート対象シークレット・タイプ |
|---|---|---|---|
| デフォルト | --field <crn> |
追加されるフィールドの名前は、指定された CRN のシークレット・タイプの デフォルト・フィールド名 です。 | TLS 以外のすべてのシークレットタイプ |
| 名前付き | --field <name>=<crn> |
追加するフィールドの名前を指定するには、このオプションを使用します。 追加されたフィールドの名前は、 <name> に指定された値です。 |
|
| 接頭部付き | --field prefix=<crn> |
追加されたフィールドの名前は、指定された CRN によって指定されたシークレット・タイプの デフォルト・フィールド名 で、接頭部として <crn> で指定されたシークレットの名前と下線が付きます。 |
|
デフォルトのフィールド名は、任意のシークレットに対して、IAM api_key クレデンシャルに対して、 arbitrary ユーザー username クレデンシャルに対して password 、 key キーと値に対してです。
以下の例では、異なる --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を使用してそれらを削除します。