Skip to main content

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)。

    1. Trust Lifecycle Manager で、[ポリシー]>[証明書プロファイル]を選択します。

    2. 使用しようとする証明書プロファイルを検出して選択します。

    3. プロファイル説明の一番上にある [GUID] の値をコピーします。

  • Docker。

  • Helm CLI。

  • Kubernetes CLI。

  • Minikube。

  • cert-manager。

統合ワークフロー

DigiCert​​®​​ Trust Lifecycle Manager からプラグインを取得します。

  1. DigiCert​​®​​ Trust Lifecycle Manager にサインインします。

  2. [統合]>[コネクタ]に移動します。

  3. [Vault]セクションで、[HashiCorp]を選択します。

  4. ステップに従ってプラグインバイナリ digicert-pki-engine をダウンロードします。

  5. 次の手順で定義した plugin_directory にプラグインを移動します。

  1. Helm チャートを使用して Vault をインストールし、使用に向けて開封します。サポートについて詳しくは、『HashiCorp の文書』を参照してください。

  2. HashiCorp Vault プラグインを Vault-0 ポッドにコピーして、Vault 構成ファイルに plugin_directory パスを設定します。

  3. Vault-0 ポッドでインタラクティブシェルセッションを開始します。

    $ kubectl exec --stdin=true --tty=true vault-0 -- /bin/sh
  4. Vault にプラグインを登録します。

    vault write sys/plugins/catalog/secret/vault-pki-backend-digicert 
    sha_256="a2b10f2b8c3e76ec2580651fdb3bd012a11eafc20e2f62020956282df16b9a9e" 
    command="vault-pki-backend-digicert"
  5. DigiCert​​®​​ PKI シークレットエンジンを有効化します。

    vault secrets enable -path=digicert-pki -plugin-name=digicert-pki-engine
  6. プラグインが 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]
  7. デフォルトの 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]
  8. 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 の文書』を参照してください。

  1. クライアントが 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
  2. cert-manager を導入します。

cert-manager により、証明書を生成する Vault エンドポイントとやり取りする発行者を定義することができます。これらの発行者は証明書が要求されると起動されます。

  1. デフォルトの名前空間に issuer というサービスアカウントを作成します。

    $ kubectl create serviceaccount issuer
  2. 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
    
  3. 発行者シークレットを作成します。

    $ kubectl apply -f issuer-secret.yaml
    secret/issuer-token-lmzpj created
  4. デフォルトの名前空間にある全てのシークレットを取得します。発行者シークレットは、プレフィックスとして 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
  5. ISSUER_SECRET_REF という変数を作成して、シークレット名をキャプチャします。

    ISSUER_SECRET_REF=$(kubectl get secrets --output=json | jq -r '.items[].metadata | select(.name|startswith("issuer-token-")).name')
  6. 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: token
    
  7. vault-issuer 発行者を作成します。

    $ kubectl apply --filename vault-issuer.yaml

キー

説明

metadata.name

発行者の名前を vault-issuer に設定します。

spec.vault.server

サーバーアドレスを、デフォルトの名前空間で作成された Kubernetes サービスに設定します。

spec.vault.path

Vault ロールの署名エンドポイントを設定します(この例では win-the-customer-com)。

spec.vault.auth.kubernetes.mountPath

Vault 認証エンドポイントを設定します。

spec.vault.auth.kubernetes.role

Vault Kubernetes のロールを issuer に設定します。

spec.vault.auth.kubernetes/secretRef.name

Kubernetes サービスアカウントのシークレットを設定します。

spec.vault.auth.kubernetes/secretRef.key

キータイプを token に設定します。

  1. 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.com
    
  2. win-the-customer-com の証明書を要求します。

    kubectl apply --filename win-the-customer-com.yaml
    
  3. 証明書の詳細を表示します。

    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
  4. これで DigiCert から発行された証明書が Kubernetes シークレットに追加され、コピーが vault-0 ディレクトリに保存されました。

    vault list vault-pki/certs
    Keys
    ----
    281b93ecc49106db473084f5e41095034f67a0a0
    56195e18913c66d277b2e509c8b0e194925f59f9
    6937bbf0ba698f270804a954c02139507fc25998
    7a8619ed9ae90f04dd7a2180887b35bfb487cc81

次の手順

Vault を正常に設定したら、その他すべてのアクティビティについて設定および証明書の操作を参照してください。