Istio
cert-manager ユーティリティと ACMEv2 プロトコルを使用して、Istio の相互 TLS(mTLS)認証機能用の証明書を DigiCert® Trust Lifecycle Manager から取得するには、以下の手順を実行します。
開始する前に
証明書プロファイル
DigiCert® Trust Lifecycle Manager で以下のベーステンプレートを使用して、ACME 経由でサービスメッシュ用の mTLS 証明書を発行するための証明書プロファイルを作成します。
テンプレート名 | トラストタイプ | 発行 CA | 登録方法 |
|---|---|---|---|
| プライベート | DigiCert® Private CA | mTLS over ACME |
このプロファイルは一般的な証明書プロパティを定義し、必要な ACME URL と外部アカウントバインディング(EAB)クレデンシャルを次のように提供します。
ACME ディレクトリの URL: Trust Lifecycle Manager から証明書を要求する ACME サーバーの URL。
鍵識別子(KID): Trust Lifecycle Manager アカウントで証明書プロファイルを識別します。
HMAC キー: 証明書要求中にアカウントの鍵を暗号化し、認証する際に使用されます。
ルート CA 証明書
DigiCert® Private CA で、Trust Lifecycle Manager 証明書プロファイルで選択した発行 CA のルート CA 証明書をダウンロードします。このルート CA 証明書を使用して、サービスメッシュ環境における信頼を確立します。
DigiCert ONE の右上の領域にあるマネージャーメニューを開き、[CA]を選択します。
[CA サービス]メニューから[CA の管理]>[ルート]を選択します。Trust Lifecycle Manager 証明書プロファイルの発行 CA のルートを見つけます。
ルート CA の名前にカーソルを置いてアクション(3 点)メニューを開き、[証明書 .pem をダウンロード]オプションを選択します。
cert-manager
Istio の側で、Trust Lifecycle Manager からその ACME サービスを介して証明書を取得する cert-manager ユーティリティを設定します。
以下のコマンドを使用して、サービスメッシュ環境に cert-manager をインストールします。
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.5/cert-manager.yaml
Istio が使用する名前空間を作成します。デフォルトでは、
istio-systemです。kubectl create namespace istio-system
以下のコマンドを使用して、DigiCert ACME 外部アカウントバインディング(EAB)用の Kubernetes シークレットを作成します。
kubectl create secret generic <eab_secret_name> --from-literal secret=<eab_hmac> -n <namespace>
eab_secret_nameパラメータにはシークレットの名前を指定します。eab_hmacパラメータには、Trust Lifecycle Manager の証明書プロファイルの HMAC キーを指定します。namespaceパラメータには、Istio の名前空間名(istio-system)を指定します。例:kubectl create secret generic digicert_acme --from-literal secret=MWJiMjQ5MDQ5YWUzOTFiN2JlOWNmODBmNDY2NWNhM2U2MTgyYzI2ZDMxZDNhNmJmNzliZTZlNzE5MzIxODk1Yg -n istio-system
統合ワークフロー
Istio 統合パッケージをダウンロードし、統合の設定を支援する以下のサンプルファイルを取得します。
sample-issuer.yaml: cert-manager に ACME ベースの発行者を追加するサンプルの設定ファイル。
注記
ダウンロード可能なサンプルファイルは、[コネクタの追加]>[インフラの自動化]>[Istio]を選択して、Trust Lifecycle Manager の[Integrations > Connectors]ページから入手することもできます。
サンプルファイルを使用して、サービスメッシュ環境で DigiCert ACME 発行を有効にします。
sample-issuer.yaml ファイルを更新し、以下のパラメータに値を指定します。
metadata セクション:
name: ACME ベースの発行者名。namespace: Istio の名前空間名。
spec > acme セクション:
email: 発行された証明書の技術担当者のメールアドレス。server: Trust Lifecycle Manager で対象となる証明書プロファイルの ACME ディレクトリの URL。externalAccountBinding > keyID: 対象の証明書プロファイルの ACME EAB 鍵識別子(KID)。externalAccountBinding > keySecretRef > name: DigiCert ACME 外部アカウントバインディング(EAB)用の Kubernetes シークレットの名前。externalAccountBinding > privateKeySecretRef > name: DigiCert ACME EAB の秘密鍵を保存するために使用する Kubernetes シークレット名。
以下のコマンドを実行し、ACME アカウントが作成されるのを待ちます。サンプルの発行者設定ファイルの名前を変更した場合は、最後の引数としてその新しいファイル名を指定します。
kubectl apply -f sample-issuer.yaml
以下のコマンドを実行し、ACME アカウントが DigiCert ACME サーバーに登録されていることを確認します。
kubectl describe issuer <issuer_name> -n <namespace>
sample-issuer.yaml ファイルで設定した発行者名と Istio の名前空間名(
istio-system)を指定します。例:kubectl describe issuer digicert-acme-issuer -n istio-system
cert-manager で ACME ベースの発行者を介してサービスメッシュで証明書を取得するために、istio-csr と Istio を設定します。
この部分の詳細については、『istio-csr の公式インストールガイド』を参照してください。
警告
これらの手順には Helm が必要であり、指定された順序で完了する必要があります。Istio をインストールする前に istio-csr ユーティリティをインストールする必要があります。Istio がすでにインストールされている場合は、先にアンインストールしてください。
DigiCert® Private CA からダウンロードしたルート CA 証明書を使用して、Kubernetes シークレットを作成します。これで、発行された証明書に対する信頼がサービスメッシュ内で確立されます。
たとえば、デジサートからダウンロードしたルート CA 証明書が ca.pem という名前だった場合は、次のようになります。
kubectl create secret generic -n cert-manager istio-root-ca --from-file=ca.pem=ca.pem
詳細は、istio-csr のインストールガイドでステップ 4 を参照してください。
まだ存在しない場合は、Helm に Jetstack リポジトリを追加して cert-manager チャートを取得します。
helm repo add jetstack https://charts.jetstack.io
Jetstack を追加してから、Helm チャートリポジトリキャッシュを更新します。
helm repo update
以下のパラメータで、Helm を介して istio-csr をインストールします。
ACM_issuer_nameパラメータには、cert-manager における ACME ベースの発行者の名前を指定します。app.tls.rootCAFile変数には、上記の最初のステップで作成した Kubernetes シークレットからルート CA 証明書への完全なパスを指定します。helm install -n cert-manager cert-manager-istio-csr jetstack/cert-manager-istio-csr \ --set "app.certmanager.issuer.name=<ACME_issuer_name>" \ --set "app.tls.rootCAFile=/var/run/secrets/istio-csr/ca.pem" \ --set "volumeMounts[0].name=root-ca" \ --set "volumeMounts[0].mountPath=/var/run/secrets/istio-csr" \ --set "volumes[0].name=root-ca" \ --set "volumes[0].secret.secretName=istio-root-ca"
詳細は、istio-csr のインストールガイドでステップ 5 を参照してください。
Istio をインストールします。たとえば、
istioctlユーティリティを使用して Istio をインストールする場合は、次のようになります。Istio 展開マニフェストをダウンロードします。
curl -sSL https://raw.githubusercontent.com/cert-manager/website/7f5b2be9dd67831574b9bde2407bed4a920b691c/content/docs/tutorials/istio-csr/example/istio-config-getting-started.yaml > istio-install-config.yaml
マニフェストをインストールします。
istioctl install -f istio-install-config.yaml
詳細は、『Istio スタートガイド』、または istio-csr インストールガイドのステップ 6 を参照してください。
追加要件
以下の条件の場合、Istio は自動的にデジサートから相互 TLS(mTLS)証明書を要求します。
Istio インジェクション: Istio インジェクションが有効になっている名前空間でポッドが実行されているか、ポッドに注釈
sidecar.istio.io/inject: "true"を指定して Istio インジェクションを明示的に有効化している必要があります。サービス登録: ポッドは Istio サービスレジストリにサービスとして登録されている必要があります。通常は、ポッドを選択する Kubernetes Service リソースの作成もこれに含まれます。
宛先ルール: サービスの TLS 設定を指定する宛先ルールが存在する必要があります。Istio には、すべてのサービスに mTLS を有効化するデフォルトの宛先ルールがあります。
ポッドの ID: ポッドには有効な ID が必要です。これは証明書の生成に使用されます。この ID は通常、ポッドのサービスアカウントおよび名前空間から生成されます。
認証局(CA): Istio には、証明書を発行できる CA が構成される必要があります。デフォルトでは、Istio は組み込みの CA を使用します。
証明書ライフサイクルイベント
Istio サービスメッシュでのクライアントまたはサーバー認証に mTLS 証明書が必要な場合は、次のようになります。
Istio デーモン(
istiod)が CSR を生成します。istio-csr ユーティリティが CSR を取得し、cert-manager のために
CertificateRequestリソースを作成します。cert-manager が要求を DigiCert ACME サービスに送信し、生成された証明書を Trust Lifecycle Manager からダウンロードします。
istio-csr ユーティリティが発行された証明書を Istio デーモンに戻し、デーモンがそれをサービスメッシュに配布します。
Kubernetes における証明書リソースすべてについて詳細ステータス情報を確認する場合は、いつでも以下のコマンドを実行できます。最後の引数として Istio 名前空間名(istio-system)を指定します。
kubectl describe certificate -n <namespace>
証明書は Trust Lifecycle Manager の[インベントリ]ビューにも表示されるので、それを監視して通知を設定することができます。