10.8.3. SPIRE フェデレーションを https_spiffe プロファイルで設定する
Zero Trust Workload Identity Manager は SPIRE フェデレーションをサポートしており、複数の独立した SPIRE デプロイメント間で信頼関係を確立できます。この手順では、SPIRE サーバー間で SPIFFE ベースの TLS 認証を使用する https_spiffe プロファイルを使用してフェデレーションを設定する方法を示します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - フェデレーションに参加するすべてのクラスターに、ゼロトラスト Workload Identity マネージャーをインストールしました。
-
参加しているすべてのクラスターに、
cluster-admin特権が存在します。 - 統合しようとしているクラスター間には、ネットワーク接続が確立されています。
手順
各クラスターで
SpireServerカスタムリソースを設定し、https_spiffeプロファイルとのフェデレーションを有効にします。https_spiffeプロファイルは SPIFFE ベースの TLS 認証を使用し、SPIRE サーバーはそれぞれ独自の SPIFFE 検証可能アイデンティティー文書 (SVID) を使用して相互に認証を行います。apiVersion: operator.openshift.io/v1alpha1 kind: SpireServer metadata: name: cluster spec: trustDomain: cluster1.example.com federation: bundleEndpoint: profile: https_spiffe refreshHint: 300 managedRoute: "true"-
spec.trustDomainフィールドは、各クラスターに固有の信頼ドメインを設定します。 -
spec.federation.bundleEnpoint.profileフィールドは、SPIFFE ベースの TLS 認証にhttps_spiffeプロファイルを使用します。 -
spec.federation.bundleEndpoint.refreshHintフィールドは、リモートサーバーがトラストバンドルを更新する間隔 (秒単位) を示します。範囲:60-3600 秒。 -
spec.federation.managedRouteフィールドを使用すると、Operator によるルートの自動作成が可能になります。
-
以下のコマンドを実行して、設定変更を適用してください。
$ oc apply -f spire-server.yaml以下のコマンドを入力して、SPIRE サーバーの状態を確認してください。
準備完了ステータスが返されるまでお待ちください。$ oc get spireserver cluster -wフェデレーションルートが作成されていることを確認してください。
$ 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 -k https://federation.apps.cluster2.example.com > cluster2-bundle.json注記https_spiffeプロファイルの場合、証明書がシステムの CA バンドルによって信頼されていない場合は、-kフラグを使用する必要があるかもしれません。レスポンスには、JSON Web Key Set (JWKS) 形式のトラストバンドルが含まれています。
トラストバンドルの例
{ "keys": [ { "use": "x509-svid", "kty": "RSA", "n": "...", "e": "AQAB", "x5c": ["..."] } ], "spiffe_sequence": 1, "refresh_hint": 300 }各リモート信頼ドメインごとに
ClusterFederatedTrustDomainリソースを作成します。クラスター 1 上で、クラスター 2 と連携するためのリソースを作成します。
apiVersion: spire.spiffe.io/v1alpha1 kind: ClusterFederatedTrustDomain metadata: name: federation-to-cluster2 spec: trustDomain: <CLUSTER2_APPS_DOMAIN> bundleEndpointURL: https://federation.<CLUSTER2_APPS_DOMAIN> bundleEndpointProfile: type: https_spiffe endpointSPIFFEID: spiffe://<CLUSTER2_APPS_DOMAIN>/spire/server className: zero-trust-workload-identity-manager-spire trustDomainBundle: | { "keys": [ { "use": "x509-svid", "kty": "RSA", "n": "...", "e": "AQAB", "x5c": ["..."] } ], "spiffe_sequence": 1 }以下は、
<CLUSTER2_APPS_DOMAIN>- 連携する外部クラスターの信頼ドメインを指定します。
spec.bundleEndpointProfile.endpointSPIFFEID-
リモート SPIRE サーバーの SPIFFE ID を指定します。リモートサーバーのアイデンティティーを検証するために、
https_spiffeプロファイルで必要です。 spec.trustDomainBundle- 前の手順で取得した、完全なトラストバンドル JSON を指定します。
仕様クラス名-
CR を監視するクラスの名前を指定します。Spire-controller-manager は、
spec.classNameが zero-trust-workload- アイデンティティー -manager-spireに設定されている場合にのみリソースを監視します。
次のコマンドを実行して、
ClusterFederatedTrustDomainリソースを適用します。$ oc apply -f clusterfederatedtrustdomain.yaml-
フェデレーションを行うべきリモートクラスターごとに、各クラスターで手順 5-7 を繰り返します。双方向フェデレーションの場合、各クラスターは他のすべてのクラスターに対して
ClusterFederatedTrustDomainリソースを必要とします。 各クラスター上の
SpireServerリソースを更新して、federatesWith設定を追加します。apiVersion: operator.openshift.io/v1alpha1 kind: SpireServer metadata: name: cluster spec: trustDomain: cluster1.example.com federation: bundleEndpoint: profile: https_spiffe refreshHint: 300 federatesWith: - trustDomain: cluster2.example.com bundleEndpointUrl: https://federation.apps.cluster2.example.com bundleEndpointProfile: https_spiffe endpointSpiffeId: spiffe://cluster2.example.com/spire/server - trustDomain: cluster3.example.com bundleEndpointUrl: https://federation.apps.cluster3.example.com bundleEndpointProfile: https_spiffe endpointSpiffeId: spiffe://cluster3.example.com/spire/server 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 \ statefulset/spire-server -c spire-server --tail=50フェデレーションされた信頼ドメインとのバンドル同期が成功したことを示すログメッセージを探してください。