HashiCorp Vault のセットアップ - Kubernetes および cert-manager
Kubernetes で HashiCorp Vault および Certificate Manager を設定して、Vault の内部シークレットエンジンではなく、DigiCert PKI シークレットエンジンを使用します。X.509 証明書は発行者インターフェースを通じて、Kubernetes 内で動的に生成されます。
開始する前に
前提条件
アクティブで、自己ホスト型の Vault インスタンス。DigiCert® Trust Lifecycle Manager はクラウドホスト型の Vault のインスタンスをサポートしていません。
必要とする OS およびチップセットの DigiCert® Vault PKI プラグインバイナリ。
次にアクセスできる、少なくとも 1 人のサービスユーザーおよび API トークン。
Trust Lifecycle Manager。
アカウントレベルの権限。
証明書要求およびプロビジョニングに必要なアカウント。
設定に割り当てようとするデフォルトの証明書プロファイルの証明書プロファイル ID(GUID)。
Trust Lifecycle Manager で、[ポリシー]>[証明書プロファイル]を選択します。
使用しようとする証明書プロファイルを検出して選択します。
プロファイル説明の一番上にある [GUID] の値をコピーします。
Docker。
Helm CLI。
Kubernetes CLI。
Minikube。
cert-manager。
統合ワークフロー
DigiCert® Trust Lifecycle Manager からプラグインを取得します。
DigiCert® Trust Lifecycle Manager にサインインします。
[統合]>[コネクタ]に移動します。
[Vault]セクションで、[HashiCorp]を選択します。
ステップに従ってプラグインバイナリ
digicert-pki-engineをダウンロードします。次の手順で定義した
plugin_directoryにプラグインを移動します。
Helm チャートを使用して Vault をインストールし、使用に向けて開封します。サポートについて詳しくは、『HashiCorp の文書』を参照してください。
HashiCorp Vault プラグインを
Vault-0ポッドにコピーして、Vault 構成ファイルにplugin_directoryパスを設定します。Vault-0ポッドでインタラクティブシェルセッションを開始します。$ kubectl exec --stdin=true --tty=true vault-0 -- /bin/sh
Vault にプラグインを登録します。
vault write sys/plugins/catalog/secret/vault-pki-backend-digicert sha_256="a2b10f2b8c3e76ec2580651fdb3bd012a11eafc20e2f62020956282df16b9a9e" command="vault-pki-backend-digicert"
DigiCert® PKI シークレットエンジンを有効化します。
vault secrets enable -path=digicert-pki -plugin-name=digicert-pki-engine
プラグインが DigiCert® 環境に接続可能になる設定を作成します。
vault write digicert-pki/configs/[config name] url="https://one.digicert.com/" api_key="01aad362f1610f7d9e171f0fa2_80995e78c63a8e7d474c41dbecb2a165f049aa47799ad42f90fc386b1edb680c"
応答:
Success! Data written to: digicert-pki/configs/[config name]
デフォルトの
profile_id(GUID)を定義するロールを作成します。注記
ロールに定義された
profile_idはデフォルトで、証明書要求で別の ID を渡すことによって上書きできます。vault write digicert-pki/roles/[role name] config_name="[config name]" profile_id="017e05b0-fedc-4a9a-88f7-1fd759f20f37"
応答:
Success! Data written to: digicert-pki/roles/[role name]
PKI シークレットエンジンのパスに読み取りアクセスが可能な
digicert-pkiというポリシーを作成します。vault policy write digicert-pki path "digicert-pki*" { capabilities = ["read", "list"] } path "digicert-pki/sign/win-the-customer-com" { capabilities = ["create", "update"] } path "digicert-pki/issue/win-the-customer-com" { capabilities = ["create"] }
これらの手順について詳しくは、『HashiCorp の文書』を参照してください。
クライアントが Kubernetes サービスアカウントトークンで認証できるように Vault を設定します。
vault-0ポッドのissuerという認証ロールを作成して、Kubernetes サービスアカウントのdigicert-pkiポリシーとバインドします。vault write auth/kubernetes/role/issuer \ bound_service_account_names=issuer \ bound_service_account_namespaces=default \ policies=digicert-pki \ ttl=20m
cert-manager を導入します。
cert-manager により、証明書を生成する Vault エンドポイントとやり取りする発行者を定義することができます。これらの発行者は証明書が要求されると起動されます。
デフォルトの名前空間に
issuerというサービスアカウントを作成します。$ kubectl create serviceaccount issuer
Vault 発行者を設定するには、最初に Kubernetes シークレットリソースを作成する必要があります。サービスアカウントは、Kubernetes 1.23 の発行者が必要とするシークレットを生成します。Kubernetes 1.24 以上では、シークレットを明示的に作成する必要があります。
$ cat >> issuer-secret.yaml apiVersion: v1 kind: Secret metadata: name: issuer-token-lmzpj annotations: kubernetes.io/service-account.name: issuer type: kubernetes.io/service-account-token発行者シークレットを作成します。
$ kubectl apply -f issuer-secret.yaml secret/issuer-token-lmzpj created
デフォルトの名前空間にある全てのシークレットを取得します。発行者シークレットは、プレフィックスとして
issuer-tokenを付て、ここに表示されます。$ kubectl get secrets NAME TYPE DATA AGE issuer-token-lmzpj kubernetes.io/service-account-token 3 6s sh.helm.release.v1.vault.v1 helm.sh/release.v1 1 33m
ISSUER_SECRET_REFという変数を作成して、シークレット名をキャプチャします。ISSUER_SECRET_REF=$(kubectl get secrets --output=json | jq -r '.items[].metadata | select(.name|startswith("issuer-token-")).name')Vault を証明書発行者に設定する
vault-issuerという発行者リソースを定義します。$ cat > vault-issuer.yaml apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: vault-issuer namespace: default spec: vault: server: http://vault.default:8200 path: digicert-pki/sign/win-the-customer-com auth: kubernetes: mountPath: /v1/auth/kubernetes role: issuer secretRef: name: $ISSUER_SECRET_REF key: tokenvault-issuer発行者を作成します。$ kubectl apply --filename vault-issuer.yaml
キー | 説明 |
|---|---|
metadata.name | 発行者の名前を |
spec.vault.server | サーバーアドレスを、デフォルトの名前空間で作成された Kubernetes サービスに設定します。 |
spec.vault.path | Vault ロールの署名エンドポイントを設定します(この例では |
spec.vault.auth.kubernetes.mountPath | Vault 認証エンドポイントを設定します。 |
spec.vault.auth.kubernetes.role | Vault Kubernetes のロールを |
spec.vault.auth.kubernetes/secretRef.name | Kubernetes サービスアカウントのシークレットを設定します。 |
spec.vault.auth.kubernetes/secretRef.key | キータイプを |
win-the-customer-com(例)という名前の証明書を定義します。cat > win-the-customer-com-cert.yaml apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: win-the-customer-com namespace: default spec: secretName: win-the-customer-com-tls issuerRef: name: vault-issuer commonName: test.winthecustomer1.com dnsNames: - test.winthecustomer1.comwin-the-customer-comの証明書を要求します。kubectl apply --filename win-the-customer-com.yaml
証明書の詳細を表示します。
Common Name: test29sept.winthecustomer.com Dns Names: test27septdns.winthecustomer.com Issuer Ref: Name: issuer Secret Name: win-the-customer-com-tls Status: Conditions: Last Transition Time: 2024-09-29T18:08:37Z Message: Certificate is up to date and has not expired Observed Generation: 1 Reason: Ready Status: True Type: Ready Not After: 2024-10-29T18:08:37Z Not Before: 2024-09-29T18:08:37Z Renewal Time: 2024-10-19T18:08:37Z Revision: 1 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Issuing 28s cert-manager-certificates-trigger Issuing certificate as Secret does not exist Normal Generated 28s cert-manager-certificates-key-manager Stored new private key in temporary Secret resource "win-the-customer-com-q22vp" Normal Requested 28s cert-manager-certificates-request-manager Created new CertificateRequest resource "win-the-customer-com-z9lhx" Normal Issuing 26s cert-manager-certificates-issuing The certificate has been successfully issuedこれで DigiCert から発行された証明書が Kubernetes シークレットに追加され、コピーが
vault-0ディレクトリに保存されました。vault list vault-pki/certs Keys ---- 281b93ecc49106db473084f5e41095034f67a0a0 56195e18913c66d277b2e509c8b0e194925f59f9 6937bbf0ba698f270804a954c02139507fc25998 7a8619ed9ae90f04dd7a2180887b35bfb487cc81
次の手順
Vault を正常に設定したら、その他すべてのアクティビティについて設定および証明書の操作を参照してください。