🥸

Vault Secrets Operator (VSO)の監視👀

2024/02/26に公開

本記事の想定読者

  • 既に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やらなんやらが一緒に入るので便利です。

kube-prometheus-stack
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.podMonitorSelectorNilUsesHelmValuesprometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValuesfalse にしておきます
(設定詳細はこちらをご参照ください。)

続いて vault-secrets-operator をインストールします。

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は無効化されているので、有効化しておきます。

vso_values.yaml
# Configures a Prometheus ServiceMonitor
telemetry:
  serviceMonitor:
    enabled: true

ここまで来ると、 prometheusgrafana でメトリクスが見えてくるようになっているはずです。

必要に応じて、ここから prometheus の remote write などで外に出すことも簡単にできます。

prom-remote-write-to-newrelic-sample
~~~
    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自体の監視もとても重要えす。

本記事が少しでも皆様のお役にたてば幸いです。

参考ドキュメント

Discussion