2.4. GitOps を使用して OpenShift 上のシークレットプロバイダーとして HashiCorp Vault を設定する
OpenShift Container Platform 上で Secrets Store CSI Driver Operator を使用することで、HashiCorp Vault をシークレットプロバイダーとして設定できます。Argo CD によって管理される GitOps ワークフローと組み合わせることで、このセットアップは、Vault からセキュアにシークレットを取得し、OpenShift 上で実行されているアプリケーションにそれをインジェクトすることを可能にします。
GitOps リポジトリーを構築し、Vault CSI プロバイダーが OpenShift Container Platform の Secrets Store CSI ドライバーと統合されるように設定します。
次のサンプル GitOps リポジトリーレイアウトは、Vault をアプリケーションに統合するために使用されます。
GitOps リポジトリーのディレクトリー構造の例
2.4.1. GitOps を使用して Vault CSI プロバイダーをインストールする リンクのコピーリンクがクリップボードにコピーされました!
HashiCorp の公式 Helm チャートを使用する Argo CD アプリケーションをデプロイして、Vault CSI プロバイダーをインストールします。この方法は、バージョン管理された Argo CD アプリケーションリソースを通じてインストールを宣言的に管理することで、GitOps のベストプラクティスに従います。
前提条件
- 管理者として OpenShift Container Platform クラスターにログインしている。
- OpenShift Container Platform Web コンソールにアクセスできる。
- SSCSI Driver Operator がクラスターにインストールされている。
- OpenShift Container Platform クラスターに Red Hat OpenShift GitOps がインストールされている。
- GitOps リポジトリーでシークレットを使用する準備ができている。
手順
Vault CSI プロバイダー用の Argo CD アプリケーションリソースを作成します。
Vault CSI プロバイダーをデプロイするための Argo CD アプリケーションリソースを作成します。このリソースを GitOps リポジトリー (例:
config/argocd/vault-secret-provider-app.yaml) に追加します。vault-secret-provider-app.yamlファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記Helm 値の
server.enabled: trueおよびdataStorage.enabled: false設定は、一時ストレージを使用して HashiCorp Vault サーバーインスタンスをデプロイします。このセットアップは、開発環境またはテスト環境に適しています。実稼働環境では、永続ボリューム (PV) を使用してdataStorageを有効にするか、外部の Vault クラスターを使用してserver.enabledをfalseに設定することができます。Vault サーバーがすでにデプロイされている場合は、server.enabledをfalseに設定できます。
GitOps リポジトリーから
vault-secret-provider-app.yamlファイルをクラスターに適用します。oc apply -f vault-secret-provider-app.yaml
$ oc apply -f vault-secret-provider-app.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Vault CSI プロバイダーをデプロイした後、
vault-csi-providerDaemonSet の実行に失敗する場合があります。この問題は、OpenShift Container Platform がデフォルトで特権コンテナーを制限するために発生します。さらに、Vault CSI プロバイダーと Secrets Store CSI ドライバーは、hostPathマウントへのアクセスを必要としますが、Pod が特権として実行されない限り、OpenShift Container Platform はこれをブロックします。OpenShift Container Platform の権限の問題を解決するには:
vault-csi-providerDaemonSet にパッチを適用して、そのコンテナーが特権付きで実行されるようにします。oc patch daemonset vault-csi-provider -n vault-csi-provider --type=json --patch='[{"op":"add","path":"/spec/template/spec/containers/0/securityContext","value":{"privileged":true}}]$ oc patch daemonset vault-csi-provider -n vault-csi-provider --type=json --patch='[{"op":"add","path":"/spec/template/spec/containers/0/securityContext","value":{"privileged":true}}]Copy to Clipboard Copied! Toggle word wrap Toggle overflow Secrets Store CSI ドライバーサービスアカウントに、OpenShift Container Platform の特権 Security Context Constraints (SCC) へのアクセス権を付与します。
oc adm policy add-scc-to-user privileged \ system:serviceaccount:openshift-cluster-csi-drivers:secrets-store-csi-driver-operator
$ oc adm policy add-scc-to-user privileged \ system:serviceaccount:openshift-cluster-csi-drivers:secrets-store-csi-driver-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow Vault CSI プロバイダーサービスアカウントに、OpenShift Container Platform の特権 Security Context Constraints (SCC) へのアクセス権を付与します。
oc adm policy add-scc-to-user privileged \ system:serviceaccount:vault-csi-provider:vault-csi-provider
$ oc adm policy add-scc-to-user privileged \ system:serviceaccount:vault-csi-provider:vault-csi-providerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記Helm チャートで
server.enabledがtrueに設定されている場合、Vault サーバー Pod は、OpenShift Container Platform がデフォルトでブロックする特定のユーザー ID (UID) またはグループ ID (GID) を使用して実行されます。Vault サーバーのサービスアカウントに必要な Security Context Constraints (SCC) 権限を付与します。
oc adm policy add-scc-to-user anyuid system:serviceaccount:vault-csi-provider:vault
$ oc adm policy add-scc-to-user anyuid system:serviceaccount:vault-csi-provider:vaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4.2. シークレットを格納するための Vault の初期化と設定 リンクのコピーリンクがクリップボードにコピーされました!
Argo CD を使用して Vault をデプロイし、必要な SCC 権限と DaemonSet パッチを適用した後、Vault を初期化して封印を解除し、Kubernetes 認証を設定して、セキュアなシークレットの格納とアクセスを有効にします。
手順
Vault Pod にアクセスします。
Vault が OpenShift Container Platform クラスター内で実行されている場合 (たとえば、
vault-csi-providernamespace のvault-0Pod として)、次のコマンドを実行して Pod 内の Vault CLI にアクセスします。oc exec -it vault-0 -n vault-csi-provider -- /bin/sh
$ oc exec -it vault-0 -n vault-csi-provider -- /bin/shCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Vault を初期化します。
Vault インスタンスがまだ初期化されていない場合は、次のコマンドを実行します。
vault operator init
$ vault operator initCopy to Clipboard Copied! Toggle word wrap Toggle overflow 結果として、以下の出力が表示されます。
5 Unseal Keys - required to unseal the Vault. Initial Root Token - required to log in and configure Vault.
5 Unseal Keys - required to unseal the Vault. Initial Root Token - required to log in and configure Vault.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要これらの認証情報をセキュアに格納してください。Vault を封印解除するには、5 つの封印解除キーのうち少なくとも 3 つが必要です。キーを紛失した場合、格納されたシークレットへのアクセスは永久にブロックされます。
Vault を封印解除します。
Vault は封印された状態で起動します。前の手順で取得した 5 つの封印解除キーのうち 3 つを使用するには、次のコマンドを実行します。
vault operator unseal <Unseal Key 1> vault operator unseal <Unseal Key 2> vault operator unseal <Unseal Key 3>
$ vault operator unseal <Unseal Key 1> vault operator unseal <Unseal Key 2> vault operator unseal <Unseal Key 3>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 封印が解除されると、Vault はアクティブになり、使用できるようになります。
Vault にログインします。
ルートトークンを使用して Vault にログインするには、次のコマンドを実行します。
vault login <Initial Root Token>
$ vault login <Initial Root Token>Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、管理者はシークレットエンジンと認証方法を有効にして設定できるようになります。
Vault で Kubernetes 認証を有効にします。
Vault で Kubernetes 認証を有効にするには、次のコマンドを実行します。
vault auth enable kubernetes
$ vault auth enable kubernetesCopy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、Pod などの Kubernetes ワークロードがサービスアカウントを使用して Vault で認証できるようになります。
Vault で Kubernetes 認証方法を設定します。
Kubernetes API と通信するように Vault を設定するには、次のコマンドを実行します。
vault write auth/kubernetes/config \ issuer="https://kubernetes.default.svc" \ token_reviewer_jwt="$(cat/var/run/secrets/kubernetes.io/serviceaccount/token)" \ kubernetes_host="https://${KUBERNETES_PORT_443_TCP_ADDR}:443" \ kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt$ vault write auth/kubernetes/config \ issuer="https://kubernetes.default.svc" \ token_reviewer_jwt="$(cat/var/run/secrets/kubernetes.io/serviceaccount/token)" \ kubernetes_host="https://${KUBERNETES_PORT_443_TCP_ADDR}:443" \ kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 結果として、以下の出力が表示されます。
Success! Data written to: auth/kubernetes/config
Success! Data written to: auth/kubernetes/configCopy to Clipboard Copied! Toggle word wrap Toggle overflow 詳細は、以下のようになります。
-
<issuer>は、Kubernetes トークン発行者の URL の名前です。 -
<token_reviewer_jwt>は、Vault が KubernetesTokenReviewAPI を呼び出し、サービスアカウントトークンを検証するために使用する JSON Web Token (JWT) です。 -
<kubernetes_host>は、Vault が Kubernetes API サーバーと通信するために使用する URL です。 -
<kubernetes_ca_cert>は、Vault が Kubernetes API サーバーとのセキュアな通信に使用する CA 証明書です。
-
2.4.3. Vault でのシークレット、ポリシー、ロールの管理 リンクのコピーリンクがクリップボードにコピーされました!
Vault にシークレットを作成するには、Vault ポリシーを定義し、Kubernetes ワークロードがシークレットをセキュアに取得できるようにする Kubernetes 認証ロールを設定します。
手順
KV シークレットエンジンを有効にする
Key-Value (KV) バージョン 2 シークレットエンジンを使用して、バージョン管理をサポートする任意のシークレットを格納します。次のコマンドを実行して、secret/ パスで KV シークレットエンジンを有効にします。
vault secrets enable -path=secret/ kv
$ vault secrets enable -path=secret/ kvCopy to Clipboard Copied! Toggle word wrap Toggle overflow
シークレットを Vault に格納します。
KV バージョン 2 シークレットエンジンを使用してシークレットを格納します。次のコマンドを実行して、シークレットデータ、ユーザー名、およびパスワードを
secret/demo/configパスに格納します。vault kv put secret/demo/config username="demo-user" password="demo-pass"
$ vault kv put secret/demo/config username="demo-user" password="demo-pass"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Vault ポリシーを作成します。
シークレットへの読み取りアクセスを付与するポリシーを作成するには、次のコマンドを実行します。
vault policy write demo-app-policy -<<EOF path "secret/demo/config" { capabilities = ["read"] } EOF$ vault policy write demo-app-policy -<<EOF path "secret/demo/config" { capabilities = ["read"] } EOFCopy to Clipboard Copied! Toggle word wrap Toggle overflow この
demo-app-policyは、secret/demo/configのシークレットへの読み取りアクセス権を付与し、後で Kubernetes ロールにリンクされます。
Vault で Kubernetes 認証ロールを作成します。
Kubernetes サービスアカウントを Vault ポリシーにバインドするロールを作成するには、次のコマンドを実行します。
vault write auth/kubernetes/role/app \ bound_service_account_names=demo-app-sa \ bound_service_account_namespaces=demo-app \ policies=demo-app-policy \ ttl=24h
$ vault write auth/kubernetes/role/app \ bound_service_account_names=demo-app-sa \ bound_service_account_namespaces=demo-app \ policies=demo-app-policy \ ttl=24hCopy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、サービスアカウントを使用するすべての Pod が Vault に対して認証し、シークレットを取得できるようになります。
詳細は、以下のようになります。
-
<bound_service_account_names>は、Vault が信頼する Kubernetes サービスアカウントの名前です。 -
<bound_service_account_namespaces>は、サービスアカウントが配置されている namespace の名前です。 -
<policies>は、アタッチされている Vault ポリシーの名前です。 -
<ttl>は、トークンに対して発行されるTime-to-live値です。
-
2.4.4. Vault にマウントされたシークレットを使用するように GitOps 管理リソースを設定する リンクのコピーリンクがクリップボードにコピーされました!
Secrets Store CSI ドライバーと Vault プロバイダーを使用して、HashiCorp Vault からのシークレットを GitOps 管理の Kubernetes ワークロードにセキュアに挿入します。シークレットは Pod のファイルシステムにファイルとしてマウントされるため、アプリケーションはデータを Kubernetes Secret オブジェクトに格納せずにアクセスできます。
手順
SecretProviderClassを作成します。アプリケーションのマニフェストディレクトリーに
SecretProviderClassリソースを作成します (例:environments/dev/apps/demo-app/manifest/secretProviderClass.yaml)。このリソースは、Secrets Store CSI ドライバーが Vault からシークレットを取得する方法を定義します。vault-secret-provider-app.yamlファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
<provider: vault>: HashiCorp Vault の名前を指定します。- 2
<vaultAddress>: Vault サーバーのネットワークアドレスを指定します。クラスター内サービスや外部 URL など、Vault のセットアップに基づいてこれを調整します。- 3
<roleName>: アプリケーションサービスアカウントによって使用される Vault Kubernetes 認証ロールを指定します。取得するシークレットと、それらをファイル名にマップする方法を定義する配列を記述します。- 4
<objects>: 取得するシークレットと、それらをファイル名にマップする方法を定義する配列を指定します。KV v2 のsecretPathには/data/が含まれます。
ServiceAccountなどのアプリケーションを作成します。アプリケーションワークロード用の Kubernetes
ServiceAccountを作成します。ServiceAccount名は、Vault Kubernetes 認証ロールで定義されたbound_service_account_names値と一致する必要があります。マニフェストを GitOps リポジトリー (例:environments/dev/apps/demo-app/manifest/serviceAccount.yaml) に格納します。ServiceAccount.yamlファイルの例apiVersion: v1 kind: ServiceAccount metadata: name: demo-app-sa namespace: demo-app
apiVersion: v1 kind: ServiceAccount metadata: name: demo-app-sa namespace: demo-appCopy to Clipboard Copied! Toggle word wrap Toggle overflow
アプリケーションのデプロイメントを作成します。
指定された
ServiceAccountを使用するようにアプリケーションのデプロイメントを変更し、CSI ボリュームを使用してシークレットをマウントします。更新されたマニフェストを GitOps リポジトリー (例:environments/dev/apps/demo-app/manifest/deployment.yaml) に格納します。deployment.yamlファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
serviceAccountName: アプリケーション Pod で使用される KubernetesServiceAccount名 (例:demo-app-sa) を割り当てます。このServiceAccountは、必要なシークレットを取得するための権限を付与する Vault ロールにリンクされているため、HashiCorp Vault による認証に不可欠です。- 2
volumeMounts: vault-secrets ボリュームを/mnt/secrets-storeディレクトリーのコンテナーにマウントします。- 3
volumes:secrets-store.csi.k8s.ioドライバーを使用して vault-secrets ボリュームを定義し、demo-app-credsSecretProviderClassを参照します。
ワークロード用の Argo CD アプリケーションを定義します。
GitOps リポジトリーから
ServiceAccount、SecretProviderClass、Deploymentなどのアプリケーションコンポーネントをデプロイするための Argo CD アプリケーションリソースを定義します。Argo CD マニフェストをディレクトリーの場所 (例:environments/dev/apps/demo-app/argocd/demo-app.yaml) に格納します。demo-app.yamlファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4.5. シークレットインジェクションの検証 リンクのコピーリンクがクリップボードにコピーされました!
シークレットインジェクションを検証して、Vault に想定値が含まれていることを確認します。
手順
Pod のステータスを確認します。
Argo CD アプリケーションが同期され、すべてのリソースがデプロイされたら、アプリケーション Pod が
demo-appnamespace で正常に実行されていることを確認します。以下のコマンドを実行します。oc get pods -n demo-app
$ oc get pods -n demo-appCopy to Clipboard Copied! Toggle word wrap Toggle overflow
シェルセッションを開きます。
アプリケーション Pod の名前を使用してシェルセッションを開きます。
<your-app-pod-name>は、実際の Pod 名に置き換えます。oc exec -it <your-app-pod-name> -n demo-app -- sh
$ oc exec -it <your-app-pod-name> -n demo-app -- shCopy to Clipboard Copied! Toggle word wrap Toggle overflow
マウントされたシークレットを検証します。
シークレットが想定するパスにマウントされていることを確認するには、次のコマンドを実行します。
ls -l /mnt/secrets-store cat /mnt/secrets-store/demoAppUsername cat /mnt/secrets-store/demoAppPassword
$ ls -l /mnt/secrets-store cat /mnt/secrets-store/demoAppUsername cat /mnt/secrets-store/demoAppPasswordCopy to Clipboard Copied! Toggle word wrap Toggle overflow マウントされたシークレットファイル
demoAppUsernameとdemoAppPasswordに、Vault からの想定値が含まれていることを確認します。