Vault Secrets Operator (VSO)の監視👀
本記事の想定読者
- 既にHashiCorp Vaultについて概要を理解されている方。
- 既にKubernetesについて概要を理解されている方。
- VaultでKubernetesのシークレットもセキュアに管理できないかなあと考え中の方。
- Vault Secrets Operatorを使っており、Vault Secrets Operatorの監視をしなければと思っているが、どこから始めればいいのかよくわからん!という方。
はじめに - Vault Secrets Operatorおさらい
Vaultで管理しているシークレットをKubernetes上のワークロードに渡したい場合、以下のような3種類の方法があります。
Vault CSI Provider | Vault Agent Injector | Vault Secrets Operator (VSO) |
---|---|---|
CSI Secrets Storeドライバを使って、PodのCSIボリュームにシークレットをレンダリングする。 | サイドカーとしてVaultのAgentが起動し、Podの共有メモリにシークレットを配置。 | Vault Secrets OperatorがVaultのシークレットをKubernetesのSecretに同期する。 |
それぞれに一長一短があり、これがベスト!ということはないのですが、以下のような理由からVault Secrets Operator (VSO)が利用されるケースが増えてきています。
- Kubernetesの運用を維持したまま、シークレットの管理だけVaultに分離できる。
- Kubernetes上のアプリケーション・開発者はVaultを直接操作する必要がない。
- Pod事にリソースが必要にならないので、軽量。
- などなど。
とくに、アプリケーションから見ると通常のK8s Secretsから読み込むフローが変わらないというところは結構便利です。
一言に "Vault からシークレットをとってくる" といっても、もちろん疎通していれば誰でもシークレットにアクセスできるわけはありません。Vaultへの認証や認可について色々考える必要があり、場合によってはアプリケーションの構造自体を大きく変えなければならなくなる可能性もあります。
(Agent とかもあるので、やりようはあると思いますが。。。🤔)
VSOを使うとVaultとのやり取り部分をアプリケーションの代わりにVSOがやってくれます。
Vaultを使ってKubernetesのセキュリティレベルを上げたい、、、けど大変そうかも。。。という方のはじめの一歩としてはとても有効と思います。
本記事ではそんな便利なVSOの各種メトリクスについてご紹介しようと思います。
Vault Secrets Operatorの監視
なんで監視するか
ざっくり2つの観点でVSOの監視は重要です。
アプリケーション観点
Vault Secrets Operator (VSO) は前述の通り Vault と Kubernetes をつなぐための Agent のような動きをします。
Dynamic Secretsはもちろん、Static SecretsがVault側で更新された際にも、それをVaultから取ってきてアプリケーションが読み込めるようにK8s Secretsに同期してあげるのもVSOです。
K8sのSecretsを間に挟んでいるため、VSOが停止したからすぐに何も動かなくなるなどということはないかもしれませんが、アプリケーションの健全性はVSOの健全性に大きく依存します。
セキュリティ観点
シークレットのやり取りを行うためのOperatorなので、セキュリティ観点からも監視は重要です。
特にVaultと合わせて監視をし、Operatorが動いてないのにOperatorを名乗ったアクセスがないかなどを見ておくことで、不正にいち早く気づくことができるようになります。
なにで監視するか
下記に記載の設定はあくまでデモ用途に限りますので、本番環境でご利用の際には個別にご検討の上ご利用ください。🙇♂
Vault Secrets Operatorは、Prometheusのmetrics endpointを提供するようになっているので、素直にこちらを使いましょう。
このエンドポイントを利用するためには、あらかじめPrometheus Operatorをインストールしておく必要があります。
まずは kube-prometheus-stack
あたりを入れておいて、その上で vault-secrets-operator
をインストールするのがいいような気がします。
prometheus以外にも、grafanaやらなんやらが一緒に入るので便利です。
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install --create-namespace --namespace observability kube-prometheus-stack prometheus-community/kube-prometheus-stack
kube-prometheus-stack
によって prometheus-operator がインストールされます。prometheus-operatorはデフォルトでは prometheus-operator の release tag と同じ release tag がついていないとディスカバリ対象にならないようなので、rometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues
と prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues
を false
にしておきます
(設定詳細はこちらをご参照ください。)
続いて vault-secrets-operator をインストールします。
helm repo add hashicorp https://helm.releases.hashicorp.com
helm search repo hashicorp/vault-secrets-operator
helm install --create-namespace --namespace vault-secrets-operator vault-secrets-operator hashicorp/vault-secrets-operator
vault-secrets-operatorでは、デフォルトでcontroller-runtime メトリクスを出すようになっていますが、OperatorそのもののService Monitorは無効化されているので、有効化しておきます。
# Configures a Prometheus ServiceMonitor
telemetry:
serviceMonitor:
enabled: true
ここまで来ると、 prometheus
や grafana
でメトリクスが見えてくるようになっているはずです。
必要に応じて、ここから prometheus の remote write などで外に出すことも簡単にできます。
~~~
remoteWrite:
- url: https://metric-api.eu.newrelic.com/prometheus/v1/write?prometheus_server=<YOUR_SERVER_NAME>
bearerToken: <YOUR_BEARER_TOKEN>
~~~
なにを監視するか
VSO関連で取得できるメトリクスは、大きく分けて2種類あります。
一つは controller-runtime のメトリクスで、もう一つはVSO用のカスタムメトリクスになります。
Grafana Sample Dashboard
取得可能なメトリクスは多々ありますが、例によってサンプルダッシュボードで可視化されているメトリクスを監視しておくのがスタートとしては良いかなと思います。
サンプルのダッシュボードはGrafana用に提供されており、以下のように [Dashboard] > [New] > [Import] と遷移し、Dashboard ID 18656と検索すると利用可能です。
Controllers Status
VSOを構成する各コントローラの状態を確認します。
パネル名 | 見ているメトリクス | 説明 |
---|---|---|
Vault Authentication | controller_resource_status | Vault Authコントローラの健全性です。1がup、0がdownを表します。 |
Vault Connection | controller_resource_status | Vault Connectionコントローラの健全性です。1がup、0がdownを表します。 |
PKI secret | controller_resource_status | PKI secretコントローラの健全性です。1がup、0がdownを表します。 |
Dynamic secret | controller_resource_status | Dynamic secretコントローラの健全性です。1がup、0がdownを表します。 |
Overview
VSOがどの程度ビジーかどうかを表します。
パネル名 | 見ているメトリクス | 説明 |
---|---|---|
Reconcile Rate | controller_runtime_reconcile_total | reconcileの発生率。 |
Active Workers | controller_runtime_active_workers | アクティブワーカーの数。 |
Controller "hcpauth" Status
HCP Vault Secrets関連のメトリクスです。
"HCP Vault"とは別物なので注意!
パネル名 | 見ているメトリクス | 説明 |
---|---|---|
Reconcile Rate | controller_runtime_reconcile_total | hcpauthコントローラのreconcile rateを表します。 |
Reconcile Time Buckets | controller_runtime_reconcile_time_seconds_bucket |
hcpauth コントローラのreconcile操作にかかった時間のヒストグラム。 | |
Controller "XXX" Status
以下同文です。それぞれのコントローラについて、 hcpauth
と同様のメトリクスを表示します。
その他のメトリクス
上記は全てcontroller-runtimeに関するメトリクスですが、前述の通り、VSOでは個別のメトリクスも提供しています。
VSOのカスタムメトリクスは vso
で始まります。
メトリクス | 説明 |
---|---|
vso_build_info | VSOのバージョン。複数のVSOを動作させているときなどに特に有用。 |
vso_client_operations_total | Vault Clientの成功したオペレーション(login/read/write/renewなど)。 |
vso_client_operations_errors_total | Vault Clientの失敗したオペレーション(login/read/write/renewなど)。 |
この他にもvso関連のメトリクスは色々ありますので気になる方はドキュメントをご参照ください!
さいごに
いかがでしたでしょうか?
Vault Secrets Operator (VSO)はアプリケーションの代わりにVaultとのやり取りを担ってくれるとても便利なOperatorで、アプリケーションの動作やセキュリティを維持するうえではVSO自体の監視もとても重要えす。
本記事が少しでも皆様のお役にたてば幸いです。
参考ドキュメント
- Vault Secrets Operator - Telemetry: https://developer.hashicorp.com/vault/docs/platform/k8s/vso/telemetry
- Prometheus Operator: https://github.com/prometheus-operator/prometheus-operator
- What is Vault Agent?: https://developer.hashicorp.com/vault/docs/agent-and-proxy/agent
- Vault Secrets Operator: A new method for Kubernetes integration: https://www.hashicorp.com/blog/vault-secrets-operator-a-new-method-for-kubernetes-integration
- kube-prometheus-stack: https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack
- Installing and upgrading the Vault Secrets Operator: https://developer.hashicorp.com/vault/docs/platform/k8s/vso/installation
- Kubebuilder - Default Exported Metrics References: https://book.kubebuilder.io/reference/metrics-reference.html
Discussion