9.9. cert-manager Operator for Red Hat OpenShift によるルート保護
OpenShift Container Platform では、シークレット経由で TLS 証明書を参照するための設定可能なオプションを提供するために、ルート API が拡張されました。外部管理証明書 を有効にすると、手動介入によるエラーを最小限に抑え、証明書管理プロセスを効率化し、OpenShift Container Platform ルーターが参照先の証明書を迅速に提供できるようになります。
9.9.1. クラスター内のルートを保護するための証明書の設定 リンクのコピーリンクがクリップボードにコピーされました!
外部クライアントとアプリケーション間のトラフィックを暗号化するには、OpenShift Container Platform クラスター内のルートに対して証明書を設定します。TLS 終端タイプ (エッジ、パススルー、再暗号化など) を定義して、特定のセキュリティーポリシーに合わせることで、ルーティングを保護できます。
前提条件
- cert-manager Operator for Red Hat OpenShift のバージョン 1.14.0 以降がインストールされている。
-
ルートの作成と更新の両方に使用される
routes/custom-hostサブリソースに対するcreate権限がある。 -
公開する
Serviceリソースがある。
手順
次のコマンドを実行して、HTTP-01 ソルバーを設定する
Issuerを作成します。その他の ACME 発行者タイプについては、「ACME 発行者の設定」を参照してください。$ oc create -f - << EOF apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: letsencrypt-acme namespace: <namespace> spec: acme: server: https://acme-v02.api.letsencrypt.org/directory privateKeySecretRef: name: letsencrypt-acme-account-key solvers: - http01: ingress: ingressClassName: openshift-default EOF<namespace> を、発行者が配置されている名前空間に置き換えてください。それは、ルートの名前空間と同じでなければなりません。次のコマンドを実行して、ルートの
Certificateオブジェクトを作成します。secretNameは、cert-manager が発行および管理する TLS シークレットを指定し、次の手順のルートでも参照されます。$ oc create -f - << EOF apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: example-route-cert namespace: <namespace> spec: commonName: <common_host> dnsNames: - <hostname> usages: - server auth issuerRef: kind: Issuer name: letsencrypt-acme secretName: <secret_name> EOFここでは、以下のようになります。
<namespace>-
証明書リソースが配置されている名前空間を指定します。ルートの namespace と同じである必要があります。 <common_host>- ルートのホスト名を使用して、証明書の共通名を指定します。
<hostname>- 証明書の DNS 名へのルートのホスト名を指定します。
<secret_name>- 証明書を含むシークレットの名前を指定します。
次のコマンドを使用して、参照先のシークレットを読み取る権限をルーターのサービスアカウントに付与するための
Roleを作成します。$ oc create role secret-reader \ --verb=get,list,watch \ --resource=secrets \ --resource-name=<secret_name> \ --namespace=<namespace>ここでは、以下のようになります。
<secret_name>-
アクセスを許可するシークレットの名前を指定します。これは、
Certificateリソースで指定されたsecretNameと一致する必要があります。 <namespace>- シークレットとルートの両方が配置されている名前空間を指定します。
次のコマンドを実行して、ルーターのサービスアカウントを、新しく作成した
RoleリソースにバインドするRoleBindingリソースを作成します。$ oc create rolebinding secret-reader-binding \ --role=secret-reader \ --serviceaccount=openshift-ingress:router \ --namespace=<namespace><namespace> を、シークレットとルートの両方が存在する名前空間に置き換えてください。次のコマンドを実行して、エッジ TLS 終端とカスタムホスト名を使用するサービスリソースのルートを作成します。ホスト名は、次のステップで
Certificateリソースを作成するときに使用します。$ oc create route edge <route_name> \ --service=<service_name> \ --hostname=<hostname> \ --namespace=<namespace>ここでは、以下のようになります。
<route_name>- ルート名を指定します。
< サービス名 >- 公開したいサービスを指定します。
<hostname>- ルートのホスト名を指定します。
<namespace>- ルートが配置されている名前空間を指定します。
次のコマンドを使用して、ルートの
.spec.tls.externalCertificateフィールドを更新し、以前に作成したシークレットを参照し、cert-manager が発行した証明書を使用します。$ oc patch route <route_name> \ -n <namespace> \ --type=merge \ -p '{"spec":{"tls":{"externalCertificate":{"name":"<secret_name>"}}}}'ここでは、以下のようになります。
<route_name>- ルート名を指定します。
<namespace>- シークレットとルートの両方が配置されている名前空間を指定します。
<secret_name>- 証明書を含むシークレットの名前を指定します。
検証
次のコマンドを実行して、証明書が作成され、使用できる状態になっていることを確認します。
$ oc get certificate -n <namespace> $ oc get secret -n <namespace><namespace> を、シークレットとルートの両方が存在する名前空間名に置き換えてください。次のコマンドを実行して、ルーターが参照された外部証明書を使用していることを確認します。コマンドは、ステータスコード
200 OKを返すはずです。$ curl -IsS https://<hostname><hostname> をルートのホスト名に置き換えてください。次のコマンドを実行して、サーバー証明書の
subject、subjectAltName、issuerが、すべて curl verbose 出力から期待されるとおりであることを確認します。$ curl -v https://<hostname><hostname> をルートのホスト名に置き換えてください。これでルートは、cert-manager が発行した参照シークレットの証明書で正常に保護されました。cert-manager は証明書のライフサイクルを自動的に管理します。