Kubernetes CSR を使用したカスタム CA 統合
この機能には、Kubernetesバージョン1.18以上が必要です。
このタスクでは、Kubernetes CSR API7と統合するカスタム証明書認証局を使用して、ワークロード証明書をプロビジョニングする方法を示します。異なるワークロードは、異なる証明書署名者から証明書に署名させることができます。各証明書署名者は、事実上異なるCAです。同じ証明書署名者から発行された証明書を持つワークロードは、互いにmTLSで通信できますが、異なる署名者によって署名されたワークロードは通信できません。この機能は、Kubernetes CSR APIを使用して証明書に署名するIstiodにリンクされた軽量コンポーネントであるChiron8を活用します。
この例では、オープンソースのcert-manager9を使用します。Cert-managerは、バージョン1.4以降でKubernetes CertificateSigningRequests
の試験的なサポート10を追加しました。
Kubernetes クラスタにカスタム CA コントローラをデプロイする
インストール手順11に従って、cert-managerをデプロイします。
cert-manager用に、3つの自己署名クラスタ発行者 `istio-system`、`foo`、`bar` を作成します。注:名前空間発行者や他のタイプの発行者も使用できます。
各クラスタ発行者に対してシークレットが作成されていることを確認する
各クラスタ発行者のルート証明書をエクスポートする
デフォルトの cert-signer 情報を使用して Istio をデプロイする
以下の設定で、`istioctl` を使用してIstioをクラスタにデプロイします。`ISTIO_META_CERT_SIGNER` は、ワークロードのデフォルトの証明書署名者です。
`bar` と `foo` の名前空間を作成します。
`bar` 名前空間のワークロードの証明書署名者を定義するために、`bar` 名前空間に `proxyconfig-bar.yaml` をデプロイします。
`foo` 名前空間のワークロードの証明書署名者を定義するために、`foo` 名前空間に `proxyconfig-foo.yaml` をデプロイします。
`foo` と `bar` の名前空間に、`httpbin` と `curl` のサンプルアプリケーションをデプロイします。
同じ名前空間内の httpbin
と curl
間のネットワーク接続を確認する
ワークロードがデプロイされると、関連する署名者情報を含むCSRリクエストを送信します。IstiodはCSRリクエストをカスタムCAに転送して署名します。カスタムCAは、正しいクラスタ発行者を使用して証明書に署名して返します。`foo` 名前空間のワークロードは `foo` クラスタ発行者を使用し、`bar` 名前空間のワークロードは `bar` クラスタ発行者を使用します。正しいクラスタ発行者によって署名されていることを確認するには、同じ名前空間のワークロードが通信できる一方で、異なる名前空間のワークロードは通信できないことを確認します。
`CURL_POD_FOO` 環境変数を `curl` ポッドの名前に設定します。
`foo` 名前空間のサービス `curl` と `httpbin` 間のネットワーク接続を確認します。
`foo` 名前空間のサービス `curl` と `bar` 名前空間の `httpbin` 間のネットワーク接続を確認します。
クリーンアップ
名前空間を削除し、Istioとcert-managerをアンインストールします。
この機能を使用する理由
カスタムCA統合 - Kubernetes CSRリクエストで署名者名を指定することにより、この機能により、IstioはKubernetes CSR APIインターフェースを使用してカスタム証明書認証局と統合できます。これには、カスタムCAが `CertificateSigningRequest` リソースを監視し、それらに対して動作するKubernetesコントローラーを実装する必要があります。
より優れたマルチテナンシー - 異なるワークロードに異なる証明書署名者を指定することにより、異なるテナントのワークロードの証明書を異なるCAで署名できます。