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シークレットを扱う機能を提供し、静的シークレットと動的シークレットの両方をサポートしています。 例えば、以下のシナリオがあるとします。
- 開発者は、 Kubernetes クラスタにデプロイしたいアプリケーションのシークレットを保存するために、Vault Dedicated を使用します。
- Vault Dedicated インスタンスに接続するには、 VaultConnection および VaultAuth リソースを使用して Vault Secrets Operator を設定します。
- VaultStaticSecret または VaultDynamicSecret のリソースを作成し、同期するシークレットを定義します。
- アプリケーションの実行時、VSOはVault Dedicatedからシークレットデータを取得し、クラスター用に Kubernetes のシークレットを作成します。
- VSOはシークレットを継続的に監視・同期し、ローテーションや更新を自動的に処理します。
Vault Secrets Operator は、 HashiCorp の公式ツールです。 サポートやトラブルシューティングについては、 公式ドキュメントを参照してください。
開始前に
開始する前に、アカウント資格情報を作成し、リソースをプロビジョニングできるように、必ず管理者プラットフォーム・アクセス権限 を使用するようにしてください。 以下の前提条件も必要です。
-
jqは、JSONデータのスライスとフィルタリングに役立ちます。 このチュートリアルにあるjqを使用して、保管された環境変数を取得・使用します。
-
IBM Cloud アカウントプロビジョニングされたVault Dedicatedインスタンス。 詳細については、「 Vault Dedicated インスタンスの設定 」を参照してください。
環境を設定する
Vault Dedicatedおよび Kubernetes Service を利用するには、クラスターを作成し、Vault Dedicatedインスタンスを AppRole 認証で設定する必要があります。
Kubernetes クラスターを作成する
IBM Cloud アカウントで Kubernetes クラスターを作成します。
-
IBM Cloud CLI を使用して、コマンド・ラインから IBM Cloud にログインします。
ibmcloud loginログインに失敗した場合は、
ibmcloud login --ssoコマンドを実行して再試行してください。 フェデレーテッドIDを使用してログインする場合は、--ssoパラメーターが必要です。 このオプションを使用する場合、CLI 出力にリストされているリンクに移動して、ワンタイム・パスコードを生成します。 -
クラスターを作成するアカウント、リージョン、およびリソースグループを選択してください。
ibmcloud target -r REGION -g RESOURCE_GROUP -
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分かかります。
-
クラスタのプロビジョニングが正常に完了していることを確認してください。
ibmcloud ks worker ls --cluster vso-test-clusterステータスが「 Ready 」に変わるまでお待ちください。
-
Kubernetes クラスタのコンテキストを設定します。
ibmcloud ks cluster config --cluster vso-test-cluster kubectl config current-context
Vault Dedicatedインスタンスの準備
VSO用に、シークレットと AppRole 認証を設定して、Vault Dedicatedインスタンスを構成します。
-
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 トークンにそれぞれ置き換えてください。 -
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/が使用されます。 -
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/approleVSOでは、 AppRole, Kubernetes、JWT、 AWS、または GCP による認証が必要です。 直接的なトークン認証には対応していません。
-
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 -
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 -
ロール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 をインストールします。
-
HashiCorp の Helm リポジトリを追加します。
helm repo add hashicorp https://helm.releases.hashicorp.com helm repo update -
Vault Secrets Operator をインストールします。
helm install vault-secrets-operator \ hashicorp/vault-secrets-operator \ --namespace vault-secrets-operator-system \ --create-namespace \ --version 0.9.0 -
インストールを検証します。
kubectl get pods -n vault-secrets-operator-systemすべてのポッドが「 Running 」状態になるまで待ちます。
-
カスタムリソース定義(CRD)がインストールされていることを確認してください。
kubectl get crd | grep vaultvaultauths、vaultconnections、vaultdynamicsecrets、vaultstaticsecretsといったCRDが表示されるはずです。
VaultConnection を設定し、 VaultAuth
VaultConnection および VaultAuth リソースを使用して、Vault Dedicated インスタンスに接続するように VSO を設定します。
作成 VaultConnection
-
AppRole ( SecretID )を使用して、 Kubernetes のシークレットを作成します。
kubectl create secret generic approle-secret \ --namespace default \ --from-literal=id="$SECRET_ID"VSOがキーを認識するには、そのキー名を「
id」と指定する必要があります。 -
vaultconnection.yamlファイルを作成します。touch vaultconnection.yaml -
以下の設定を追加してください。
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 を設定してください。 -
VaultConnection を適用してください。
kubectl apply -f vaultconnection.yaml
作成 VaultAuth
-
vaultauth.yamlファイルを作成します。touch vaultauth.yaml -
以下の設定を追加してください。
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 -
VaultAuth を適用してください。
kubectl apply -f vaultauth.yaml -
VaultAuth のステータスを確認してください。
kubectl get vaultauth vault-dedicated-auth -n default kubectl describe vaultauth vault-dedicated-auth -n default
作成 VaultStaticSecret
VaultStaticSecret リソースを作成し、Vault Dedicatedから Kubernetes へシークレットを同期します。
-
vaultstaticsecret.yamlファイルを作成します。touch vaultstaticsecret.yaml -
以下の設定を追加してください。
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時間ごとに更新されます。 -
VaultStaticSecret を適用してください。
kubectl apply -f vaultstaticsecret.yaml -
シークレットが同期されたことを確認してください。
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 から同期されたシークレットを使用するアプリケーションをデプロイします。
-
テスト用のデプロイを作成します。
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 -
ポッドのログを確認してください。
kubectl logs test-app-vso -n default予期される出力:
Username: vso-user Password: vso-secure-pass-123
(オプション) リソースのクリーンアップ
リソースが不要になった場合は、 アカウントから削除してください。
-
テスト用ネームスペースとリソースを削除してください。
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 -
Vault Secrets Operator をアンインストールします。
helm uninstall vault-secrets-operator -n vault-secrets-operator-system kubectl delete namespace vault-secrets-operator-system -
テスト用クラスタを削除してください。
ibmcloud ks cluster rm --cluster vso-test-cluster -
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 を使用する際の主な留意点:
-
認証方法 :VSOは、トークンによる直接認証をサポートしていません。 AppRole, Kubernetes、JWT、 AWS、または GCP のいずれかの認証方法を使用する必要があります。
-
SecretID キー名 : AppRole 認証用の Kubernetes シークレットを作成する際、キー名は「
id」とする必要があります。「secret-id」や「secretId」にしてはいけません。 -
更新間隔 :[
refreshAfter]フィールドは、VSOがシークレットの更新を確認する頻度を決定します。 鮮度とAPI負荷のバランス。 -
自動ロールアウト : VaultStaticSecret で
rolloutRestartTargetsを使用すると、シークレットが変更された際にデプロイメントが自動的に再起動されます。 -
Vault Dedicated のマウントパス :Vault Dedicated では、KV シークレットエンジンのデフォルトのマウントパスとして、
secret/ではなくkv/を使用します。 -
Vault Dedicated のネームスペース :Vault Dedicated では、Vault Enterprise のネームスペースが使用されます。 デフォルトの名前空間は
adminです。 VaultAuth の設定では、常に正しい名前空間を指定してください。 -
TLS 設定 :本番環境では、
skipTLSVerifyを使用する代わりに、適切な TLS による証明書検証を設定してください。
次のステップ
お疲れさまでした。 このチュートリアルでは、Vault Secrets Operator を使用して、Vault Dedicated を Kubernetes クラスターと統合する方法について学びました。 VSOのその他の機能をご覧ください:
- ダイナミックなデータベース認証情報について VaultDynamicSecret 動的なデータベース認証情報について。
- 代替となるマルチプロバイダーソリューションとして、「 External Secrets Operator 」を検討してみてください。
- 「 Vault Secrets Operator」のドキュメントを確認してください。
- Vaultの 機能と設定について詳しくはこちらをご覧ください。