Vault Dedicated および Vault Secrets Operator を使用して、アプリの機密情報を保護する

このチュートリアルでは、 Vault Secrets Operator ( HashiCorp's 公式の Kubernetes オペレーター)を使用して、 IBM Cloud Vault Enterpriseで IBM Cloud Kubernetes Service クラスター上で実行されるアプリケーションのシークレットを管理する方法について学びます。

あなたは、 Kubernetes Service を使用して IBM Cloud にコンテナ化されたアプリケーションをデプロイしている組織の開発者です。 チームではシークレット管理に HashiCorp Vault を使用しており、 Kubernetes のワークロード向けにVaultとのネイティブ統合を実現したいと考えています。 Vault Secrets Operator(VSO)は、Vaultとの緊密な連携を実現し、動的シークレット、シークレットのローテーション、Vaultネイティブの認証方法といった高度な機能をサポートしています。

Vault Dedicated と Vault Secrets Operator を利用すれば、 Kubernetes 環境で HashiCorp Vault の機能を最大限に活用できます。 Vault Secrets Operator は、 Kubernetes にネイティブに統合された方法でVaultシークレットを扱う機能を提供し、静的シークレットと動的シークレットの両方をサポートしています。 例えば、以下のシナリオがあるとします。

この図は、 Secrets Manager と Kubernetes クラスター間の基本的なデータフローを示しています。
の外部シークレットのフロー

  1. 開発者は、 Kubernetes クラスタにデプロイしたいアプリケーションのシークレットを保存するために、Vault Dedicated を使用します。
  2. Vault Dedicated インスタンスに接続するには、 VaultConnection および VaultAuth リソースを使用して Vault Secrets Operator を設定します。
  3. VaultStaticSecret または VaultDynamicSecret のリソースを作成し、同期するシークレットを定義します。
  4. アプリケーションの実行時、VSOはVault Dedicatedからシークレットデータを取得し、クラスター用に Kubernetes のシークレットを作成します。
  5. VSOはシークレットを継続的に監視・同期し、ローテーションや更新を自動的に処理します。

Vault Secrets Operator は、 HashiCorp の公式ツールです。 サポートやトラブルシューティングについては、 公式ドキュメントを参照してください。

開始前に

開始する前に、アカウント資格情報を作成し、リソースをプロビジョニングできるように、必ず管理者プラットフォーム・アクセス権限 を使用するようにしてください。 以下の前提条件も必要です。

環境を設定する

Vault Dedicatedおよび Kubernetes Service を利用するには、クラスターを作成し、Vault Dedicatedインスタンスを AppRole 認証で設定する必要があります。

Kubernetes クラスターを作成する

IBM Cloud アカウントで Kubernetes クラスターを作成します。

  1. IBM Cloud CLI を使用して、コマンド・ラインから IBM Cloud にログインします。

    ibmcloud login
    

    ログインに失敗した場合は、ibmcloud login --ssoコマンドを実行して再試行してください。 フェデレーテッドIDを使用してログインする場合は、--ssoパラメーターが必要です。 このオプションを使用する場合、CLI 出力にリストされているリンクに移動して、ワンタイム・パスコードを生成します。

  2. クラスターを作成するアカウント、リージョン、およびリソースグループを選択してください。

    ibmcloud target -r REGION -g RESOURCE_GROUP
    
  3. Kubernetes クラスターを作成します。

    ibmcloud ks cluster create vpc-gen2 --zone ZONE --flavor FLAVOR --workers 1 --name vso-test-cluster --vpc-id VPC_ID --subnet-id SUBNET_ID
    

    プロビジョニングには5~15分かかります。

  4. クラスタのプロビジョニングが正常に完了していることを確認してください。

    ibmcloud ks worker ls --cluster vso-test-cluster
    

    ステータスが「 Ready 」に変わるまでお待ちください。

  5. Kubernetes クラスタのコンテキストを設定します。

    ibmcloud ks cluster config --cluster vso-test-cluster
    kubectl config current-context
    

Vault Dedicatedインスタンスの準備

VSO用に、シークレットと AppRole 認証を設定して、Vault Dedicatedインスタンスを構成します。

  1. Vault Dedicatedインスタンスの詳細を含む環境変数をエクスポートします。

    export VAULT_DEDICATED_ADDR="https://<your-vault_dedicated-instance-id>.vault.<region>.appdomain.cloud"
    export VAULT_DEDICATED_NAMESPACE="admin"
    export VAULT_TOKEN="<your-vault-token>"
    

    <your-vault_dedicated-instance-id> を Vault Dedicated インスタンス ID に、 <region> を Vault Dedicated のリージョンに、 <your-vault-token> を Vault トークンにそれぞれ置き換えてください。

  2. Vault Dedicated でテスト用シークレットを作成します。

    curl -k -X POST \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      -d '{"data":{"username":"vso-user","password":"vso-secure-pass-123"}}' \
      $VAULT_DEDICATED_ADDR/v1/kv/data/example_username_password
    

    なお、Vault Dedicated では、KV シークレットエンジンのマウントパスとして kv/ が使用されます。

  3. VSOで AppRole 認証を有効にします。

    curl -k -X POST \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      -d '{"type":"approle"}' \
      $VAULT_DEDICATED_ADDR/v1/sys/auth/approle
    

    VSOでは、 AppRole, Kubernetes、JWT、 AWS、または GCP による認証が必要です。 直接的なトークン認証には対応していません。

  4. VSOのポリシーを作成する。

    curl -k -X PUT \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      -d '{"policy":"path \"kv/data/*\" { capabilities = [\"read\", \"list\"] }\npath \"kv/metadata/*\" { capabilities = [\"read\", \"list\"] }"}' \
      $VAULT_DEDICATED_ADDR/v1/sys/policies/acl/kv-read
    
  5. VSO用の AppRole を作成します。

    curl -k -X POST \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      -d '{"policies":["kv-read"],"token_ttl":"1h","token_max_ttl":"4h"}' \
      $VAULT_DEDICATED_ADDR/v1/auth/approle/role/vso-role
    
  6. ロールIDとシークレットIDを取得します。

    export ROLE_ID=$(curl -k -X GET \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      $VAULT_DEDICATED_ADDR/v1/auth/approle/role/vso-role/role-id | jq -r '.data.role_id')
    export SECRET_ID=$(curl -k -X POST \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      $VAULT_DEDICATED_ADDR/v1/auth/approle/role/vso-role/secret-id | jq -r '.data.secret_id')
    echo "Role ID: $ROLE_ID"
    echo "Secret ID: $SECRET_ID"
    

Vault Secrets Operator をインストールする

Helm を使用して、Vault Secrets Operator をインストールします。

  1. HashiCorp の Helm リポジトリを追加します。

    helm repo add hashicorp https://helm.releases.hashicorp.com
    helm repo update
    
  2. Vault Secrets Operator をインストールします。

    helm install vault-secrets-operator \
      hashicorp/vault-secrets-operator \
      --namespace vault-secrets-operator-system \
      --create-namespace \
      --version 0.9.0
    
  3. インストールを検証します。

    kubectl get pods -n vault-secrets-operator-system
    

    すべてのポッドが「 Running 」状態になるまで待ちます。

  4. カスタムリソース定義(CRD)がインストールされていることを確認してください。

    kubectl get crd | grep vault
    

    vaultauths、 vaultconnections、 vaultdynamicsecrets、 vaultstaticsecrets といったCRDが表示されるはずです。

VaultConnection を設定し、 VaultAuth

VaultConnection および VaultAuth リソースを使用して、Vault Dedicated インスタンスに接続するように VSO を設定します。

作成 VaultConnection

  1. AppRole ( SecretID )を使用して、 Kubernetes のシークレットを作成します。

    kubectl create secret generic approle-secret \
      --namespace default \
      --from-literal=id="$SECRET_ID"
    

    VSOがキーを認識するには、そのキー名を「 id 」と指定する必要があります。

  2. vaultconnection.yaml ファイルを作成します。

    touch vaultconnection.yaml
    
  3. 以下の設定を追加してください。

    apiVersion: secrets.hashicorp.com/v1beta1
    kind: VaultConnection
    metadata:
      name: vault-connection
      namespace: default
    spec:
      address: "<VAULT_DEDICATED_ADDR>"
      skipTLSVerify: true
    

    <VAULT_DEDICATED_ADDR> を、ご自身の Vault Dedicated インスタンスのアドレスに置き換えてください。 本番環境では、 skipTLSVerify を使用する代わりに、適切な TLS を設定してください。

  4. VaultConnection を適用してください。

    kubectl apply -f vaultconnection.yaml
    

作成 VaultAuth

  1. vaultauth.yaml ファイルを作成します。

    touch vaultauth.yaml
    
  2. 以下の設定を追加してください。

    apiVersion: secrets.hashicorp.com/v1beta1
    kind: VaultAuth
    metadata:
      name: vault-dedicates-auth
      namespace: default
    spec:
      vaultConnectionRef: vault-dedicated-connection
      method: appRole
      mount: approle
      namespace: admin
      appRole:
        roleId: vso-role
        secretRef: approle-secret
    
  3. VaultAuth を適用してください。

    kubectl apply -f vaultauth.yaml
    
  4. VaultAuth のステータスを確認してください。

    kubectl get vaultauth vault-dedicated-auth -n default
    kubectl describe vaultauth vault-dedicated-auth -n default
    

作成 VaultStaticSecret

VaultStaticSecret リソースを作成し、Vault Dedicatedから Kubernetes へシークレットを同期します。

  1. vaultstaticsecret.yaml ファイルを作成します。

    touch vaultstaticsecret.yaml
    
  2. 以下の設定を追加してください。

    apiVersion: secrets.hashicorp.com/v1beta1
    kind: VaultStaticSecret
    metadata:
      name: vault-dedicated-app-secret
      namespace: default
    spec:
      vaultAuthRef: vault-dedicated-auth
      mount: kv
      type: kv-v2
      path: example_username_password
      refreshAfter: 1h
      destination:
        name: my-k8s-secret-vso
        create: true
    

    この設定では、Vault Dedicated の kv/data/example_username_password からシークレットを取得し、 my-k8s-secret-vso という名前の Kubernetes シークレットを作成します。 この秘密は1時間ごとに更新されます。

  3. VaultStaticSecret を適用してください。

    kubectl apply -f vaultstaticsecret.yaml
    
  4. シークレットが同期されたことを確認してください。

    kubectl get vaultstaticsecret vault-dedicated-app-secret -n default
    kubectl get secret my-k8s-secret-vso -n default -o json | jq '.data | map_values(@base64d)'
    

    出力例:

    {
        "password": "vso-secure-pass-123",
        "username": "vso-user"
    }
    

クラスターへのアプリのデプロイ

Vault Dedicated から同期されたシークレットを使用するアプリケーションをデプロイします。

  1. テスト用のデプロイを作成します。

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-app-vso
      namespace: default
    spec:
      containers:
      - name: app
        image: busybox
        command: ['sh', '-c', 'echo "Username: \$USERNAME"; echo "Password: \$PASSWORD"; sleep 3600']
        env:
        - name: USERNAME
          valueFrom:
            secretKeyRef:
              name: my-k8s-secret-vso
              key: username
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-k8s-secret-vso
              key: password
    EOF
    
  2. ポッドのログを確認してください。

    kubectl logs test-app-vso -n default
    

    予期される出力:

    Username: vso-user
    Password: vso-secure-pass-123
    

(オプション) リソースのクリーンアップ

リソースが不要になった場合は、 アカウントから削除してください。

  1. テスト用ネームスペースとリソースを削除してください。

    kubectl delete pod test-app-vso -n default
    kubectl delete vaultstaticsecret vault-dedicated-app-secret -n default
    kubectl delete vaultauth vault-dedicated-auth -n default
    kubectl delete vaultconnection vault-dedicated-connection -n default
    kubectl delete secret approle-secret -n default
    
  2. Vault Secrets Operator をアンインストールします。

    helm uninstall vault-secrets-operator -n vault-secrets-operator-system
    kubectl delete namespace vault-secrets-operator-system
    
  3. テスト用クラスタを削除してください。

    ibmcloud ks cluster rm --cluster vso-test-cluster
    
  4. Vault専用テストデータをクリーンアップします。

    curl -k -X DELETE \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      $VAULT_DEDICATED_ADDR/v1/kv/metadata/example_username_password
    

注目すべき点

Vault Secrets Operator を使用する際の主な留意点:

  1. 認証方法 :VSOは、トークンによる直接認証をサポートしていません。 AppRole, Kubernetes、JWT、 AWS、または GCP のいずれかの認証方法を使用する必要があります。

  2. SecretID キー名 : AppRole 認証用の Kubernetes シークレットを作成する際、キー名は「 id 」とする必要があります。「 secret-id 」や「 secretId 」にしてはいけません。

  3. 更新間隔 :[ refreshAfter ]フィールドは、VSOがシークレットの更新を確認する頻度を決定します。 鮮度とAPI負荷のバランス。

  4. 自動ロールアウト : VaultStaticSecret で rolloutRestartTargets を使用すると、シークレットが変更された際にデプロイメントが自動的に再起動されます。

  5. Vault Dedicated のマウントパス :Vault Dedicated では、KV シークレットエンジンのデフォルトのマウントパスとして、 secret/ ではなく kv/ を使用します。

  6. Vault Dedicated のネームスペース :Vault Dedicated では、Vault Enterprise のネームスペースが使用されます。 デフォルトの名前空間は admin です。 VaultAuth の設定では、常に正しい名前空間を指定してください。

  7. TLS 設定 :本番環境では、 skipTLSVerify を使用する代わりに、適切な TLS による証明書検証を設定してください。

次のステップ

お疲れさまでした。 このチュートリアルでは、Vault Secrets Operator を使用して、Vault Dedicated を Kubernetes クラスターと統合する方法について学びました。 VSOのその他の機能をご覧ください: