10.8.4. SPIRE フェデレーションと Automatic Certificate Management Environment プロトコルを使用する
SPIRE フェデレーションと Automatic Certificate Management Environment (ACME) プロトコルを使用すると、Let’s Encrypt からの証明書の自動プロビジョニングが実現します。ACME は、証明書の有効期限前に自動的に更新する機能も備えているため、手動での証明書管理の手間を省くことができます。
前提条件
- フェデレーションに参加するすべてのクラスターに、ゼロトラスト Workload Identity マネージャーをインストールしました。
-
OpenShift CLI (
oc) がインストールされている。 -
参加しているすべてのクラスターに、
cluster-admin特権が存在します。 - Let’s Encrypt HTTP-01 チャレンジの検証を行うには、フェデレーションエンドポイントが一般にアクセス可能である必要があります。
- すべての連合クラスター間でネットワーク接続が確立されています。
手順
各クラスター上で
SpireServerのカスタムリソースを設定し、ACME 証明書管理とのフェデレーションを有効にします。フェデレーション設定を使用して、
SpireServerリソースを作成または更新します。apiVersion: operator.openshift.io/v1alpha1 kind: SpireServer metadata: name: cluster spec: trustDomain: cluster1.example.com federation: bundleEndpoint: profile: https_web refreshHint: 300 httpsWeb: acme: directoryUrl: https://acme-v02.api.letsencrypt.org/directory domainName: federation.apps.cluster1.example.com email: admin@example.com tosAccepted: "true" managedRoute: "true"-
spec.trustDomainフィールドは、各クラスターに固有の信頼ドメインを設定します (例:cluster1.example.com、cluster2.example.com)。 -
spec.federation.bundleEndpoint.profileフィールドは、ACME ベースの証明書管理にhttps_webプロファイルを使用します。 -
spec.federation.bundleEndpoint.httpsWeb.acme.directoryUrlフィールドには、Let’s Encrypt のプロダクションディレクトリーの URL が含まれています。テストには、https://acme-staging-v02.api.letsencrypt.org/directory を使用してください。 -
spec.federation.bundleEndpoint.httpsWeb.acme.domainNameフィールドは、フェデレーションエンドポイントにアクセスできるドメイン名です。managedRouteが true に設定されている場合、これは自動的にfederation.<cluster- アプリケーション s-domain>に設定されます。 -
spec.federation.bundleEndpoint.httpsWeb.acme.emailフィールドは、ACME アカウント登録および証明書の有効期限切れ通知用のメールアドレスです。 -
spec.federation.bundleEndpoint.httpsWeb.acme.tosAcceptedフィールドは、Let’s Encrypt 利用規約に同意することを示します。 -
spec.federation.managedRouteフィールドを使用すると、オペレーターがフェデレーションバンドルエンドポイントに対して自動的にルートを作成できます。
-
以下のコマンドを実行して、各クラスターに設定を適用します。
$ oc apply -f spireserver.yaml以下のコマンドを入力して、SPIRE サーバーの状態を確認してください。次のステップに進む前に、
準備完了ステータスが返されるまでお待ちください。$ oc get spireserver cluster -w出力例
NAME STATUS AGE cluster Ready 5m以下のコマンドを実行して、フェデレーションルートが作成されていることを確認してください。
$ oc get route -n zero-trust-workload-identity-manager | grep federation出力例
NAME HOST/PORT PATH SERVICES PORT TERMINATION spire-server-federation federation.apps.cluster1.example.com spire-server 8443 passthrough各クラスターで、以下のコマンドを実行してフェデレーションエンドポイントからトラストバンドルを取得します。
$ curl https://federation.apps.cluster1.example.com > cluster1-bundle.jsonレスポンスには、JSON Web Key Set (JWKS) 形式のトラストバンドルが含まれています。
トラストバンドルの例
{ "keys": [ { "use": "x509-svid", "kty": "RSA", "n": "...", "e": "AQAB", "x5c": ["..."] } ], "spiffe_sequence": 1, "refresh_hint": 300 }フェデレーション関係を確立するために、
ClusterFederatedTrustDomainリソースを作成します。クラスター 1 上で、クラスター 2 およびクラスター 3 と連携するためのリソースを作成します。
apiVersion: spire.spiffe.io/v1alpha1 kind: ClusterFederatedTrustDomain metadata: name: cluster2-federation spec: trustDomain: cluster2.example.com bundleEndpointURL: https://federation.apps.cluster2.example.com bundleEndpointProfile: type: https_web className: zero-trust-workload-identity-manager-spire trustDomainBundle: | { "keys": [...], "spiffe_sequence": 1 } --- apiVersion: spire.spiffe.io/v1alpha1 kind: ClusterFederatedTrustDomain metadata: name: cluster3-federation spec: trustDomain: cluster3.example.com bundleEndpointURL: https://federation.apps.cluster3.example.com bundleEndpointProfile: type: https_web className: zero-trust-workload-identity-manager-spire trustDomainBundle: | { "keys": [...], "spiffe_sequence": 1 }-
spec.trustDomainBundleフィールドには、ステップ 5 でcurlを使用して取得した完全なトラストバンドル JSON が含まれています。 -
spec.classNameフィールドには、CR を監視する対象となるクラスの名前が含まれます。Spire-controller-manager は、spec.classNameが zero-trust-workload- アイデンティティー -manager-spireに設定されている場合にのみリソースを監視します。
-
以下のコマンドを実行して、
ClusterFederatedTrustDomainリソースを適用します。$ oc apply -f cluster-federated-trust-domains.yaml-
双方向の連携を確立するために、各クラスターで手順 6 と 7 を繰り返します。各クラスターは、フェデレーションを行う他のすべてのクラスターに対して、
ClusterFederatedTrustDomainリソースを必要とします。 各クラスター上の
SpireServerリソースを更新して、federatesWith設定を追加します。apiVersion: operator.openshift.io/v1alpha1 kind: SpireServer metadata: name: cluster spec: # ... existing configuration ... federation: bundleEndpoint: # ... existing bundleEndpoint configuration ... federatesWith: - trustDomain: cluster2.example.com bundleEndpointUrl: https://federation.apps.cluster2.example.com bundleEndpointProfile: https_web - trustDomain: cluster3.example.com bundleEndpointUrl: https://federation.apps.cluster3.example.com bundleEndpointProfile: https_web managedRoute: "true"-
spec.federation.federatesWithフィールドには、このクラスターがフェデレーションを行うべきすべてのリモート信頼ドメインがリストされます。
-
以下のコマンドを実行して、更新された設定を適用してください。
$ oc apply -f spireserver.yaml
検証
以下のコマンドを実行して、
ClusterFederatedTrustDomainリソースが作成されていることを確認してください。$ oc get clusterfederatedtrustdomains出力例
NAME TRUST DOMAIN ENDPOINT URL AGE cluster2-federation cluster2.example.com https://federation.apps.cluster2.example.com 5m cluster3-federation cluster3.example.com https://federation.apps.cluster3.example.com 5m次のコマンドを実行して、
ClusterFederatedTrustDomainのステータスを確認し、バンドルの同期が正しく機能していることを確認します。$ oc describe clusterfederatedtrustdomain cluster2-federationトラストバンドルが同期されたことを示す
成功ステータス条件を探してください。フェデレーションエンドポイントにアクセス可能であり、トラストバンドルを提供していることを確認するには、次のコマンドを実行します。
$ curl https://federation.apps.cluster1.example.comトラストバンドルを含む JSON レスポンスが返されるはずです。
以下のコマンドを実行して、SPIRE サーバーのログを確認し、フェデレーションがアクティブになっていることを確認してください。
$ oc logs -n zero-trust-workload-identity-manager deployment/spire-server -c spire-server --tail=50フェデレーションされた信頼ドメインとのバンドル同期が成功したことを示すログメッセージを探してください。
以下のコマンドを実行して、すべての SPIRE コンポーネントが実行されていることを確認してください。
$ oc get pods -n zero-trust-workload-identity-manager出力例
NAME READY STATUS RESTARTS AGE spire-agent-abcde 1/1 Running 0 10m spire-server-0 2/2 Running 0 10m- オプション: 異なるクラスターに SPIFFE アイデンティティーを持つワークロードをデプロイし、フェデレーション信頼を使用して相互に認証できることを確認することで、クラスター間ワークロード認証をテストします。