HCP VaultをNew Relicでモニタリングしてみる
本記事の想定読者
- HCP Vaultをご利用中、もしくは触ったことがある方。
- New Relicをモニタリングツールとして活用している方。
- HCP Vaultの監視に興味があるが、どこから始めればいいのかよくわからん!という方。
はじめに
HCP Vaultの監視
HashiCorp Vaultを本格的に活用していく際に、その監視は避けて通れないトピックです。
例えば、
- 想定されないアプリやIPからの通信がないか。
- 想定されない時間に不審な通信がないか。
- 一度しか使われないはずのシークレットが複数回使われていないか。
- 意図しないユーザーアクセスがないか。
などなど。。。
安全に運用するためには、Vault自体のハードニングに合わせて、正しく監視することが非常に重要になります。
HashiCorp Vaultには、セルフホステッド型のVault Community/Vault Enterpriseとクラウドサービスとしてクラスタ運用をHashiCorpが受け持つHCP Vaultの2パターンがあります。
本記事では、HCP Vaultを題材として、その監視方法についてご紹介いたします。
なぜNew Relicか?
HCP Vaultのログの飛ばし先としては、New Relic以外にも、以下を選択可能です。
- Amazon CloudWatch
- Datadog
- Elastic
- Grafana Cloud
- Splunk
- Generic HTTP Sink
最後の一つはおいておいて、New Relic以外にも色々選択肢はあります。
Vaultを運用していく上でその監視は非常に重要になりますが、そのためだけにツールを導入するのも大変ですし、慣れ親しんだツールがあるのであればそれを使うに越したことはありませんので、皆様にとって最適なやり方で上手くモニタリングしていただければと思います。
私が今回New Relicを取り上げたのは、以下のような理由からです。
- HCP Vaultをご利用いただいている、もしくは検討しているお客様のうち、オブザーバビリティツールとしての採用率が高いように感じる(個人の感想)
- あとは個人利用でもクラウド版のNew Relicは使い始めやすいと感じます(フリーティアのおかげ)。
HCP Vaultではどのようなログ/メトリクスが取得できるのかを次にご紹介します。
HCP VaultのAudit Logs/MetricsをNew Relicで見てみる
HCP VaultからNew Relicへのログ・メトリクス転送設定
HCP Vaultは、Audit Logs/Metricsを、上記で示した様々な宛先に送ることができます。
設定方法の詳細についてはドキュメントをご参照いただければと思いますが、概ね宛先と認証情報の設定だけのシンプルなものです。
HCP VaultのAudit Logs/Metricsを設定するためには、Development Tier以上のクラスタが必要です。
Audit LogsとMetricsでそれぞれ設定をいれる必要があります。
New Relicにダッシュボードをインストールする
New Reclicには、あらかじめHCP Vaultのダッシュボードが用意されていますので、インストールしてみましょう。
今日現在アラートは設定されていませんが、New Relicによる可視化のとっかかりとしては十分かなと思います。こちらをスタート地点として、徐々にお使いの環境に合わせたアラート項目やパネルを追加していくのがおすすめです。
インストール自体はとても簡単で、画面表示に従って何度かクリックするだけです。
インストールが完了したら、こんな感じに見えて来るはずです!
New Relicのダッシュボードで確認できるログ・メトリクスについて
インストール直後のダッシュボードでは、以下の情報が確認できるようになっています。
Metrics
一部のパネルは直接HCP Vaultのメトリクス値を表示せずにrate等を表示しています。その場合メトリックタイプは正確でないことがあります。
HCP Vault Metrics Overview
パネル名 | メトリックタイプ | 値 | どんな意味があるか? |
---|---|---|---|
Vault core Unsealed | gauge | boolean | VaultがUnsealされ、クライアントからシークレットを取得できる状態であることを意味します。1がUnsealed、0だとSealedを意味します。 |
Number of Identity Entities | gauge | entities | Vaultに登録されているすべてのエンティティ数を意味します。 |
Login request duration | summary | ms | Vaultへのログインに平均でどれくらいの時間がかかっているのかを意味します。 |
Leases set to expire | gauge | leases | 有効期限が設定されているリース数を意味します。急激な増加や減少、意図しないタイミングでの変化に注目すべき値です。 |
Secret Count | gauge | number | 過去一時間でのKVシークレットの最大数を意味します。 |
Policy get | gauge | rate | 1分間スパンでのpolicy読み込みの回数を意味します。 |
Policy set | gauge | rate | 1分間スパンでのpolicy書き込み回数を意味します。 |
Runtime metrics
パネル名 | メトリックタイプ | 値 | どんな意味があるか? |
---|---|---|---|
Total Go routines | gauge | number | メモリで実行中のGo routineの数。Vaultの負荷状況を把握することに役立ちます。Vaultの構成や使い方によって、いわゆる「標準値」はまちまちなので、平時の値がどれくらいなのかを見たうえで異常値を検知するとよいです。 |
Allocated MB | gauge | MB | Vaultプロセスに割り当てられているメモリ空間(MB)。 |
Heap Objects used | gauge | rate | 割り当てられたヒープオブジェクト( vault.runtime.malloc_count ) のうち、利用中のオブジェクト ( vault.runtime.heap_objects ) の割合を意味します。 |
Count of object on the heap | gauge | number | 割り当てられたヒープオブジェクト数を表します ( vault.runtime.malloc_count ) 。 |
Token related metrics
パネル名 | メトリックタイプ | 値 | どんな意味があるか? |
---|---|---|---|
Available token count | gauge | number | 有効期限内の、利用可能なトークンの数を意味します。Vaultはトークン数を10分毎にアップデートします。Vaultの利用が安定している場合にはトークン数には時間や日付との相関が見られるはず(ユースケースにもよりますが)なので、傾向がわかれば外部からの不正アクセスやシステム異常などの気付きを得られる可能性があります。 |
Tokens by auth method | gauge | number | AuthMethodごとのトークン数を表します。こちらもAvailable token count同様に、気づきを得るきっかけとして活用いただけます。 |
Tokens by ttl | gauge | number | 上記と同様で、TTLごとのトークン数を意味します。トークンの有効期限は短いほどセキュアであると言えます。あまり長すぎる有効期限のトークンが無いかなどの確認にも有効です。 |
Tokens by policy | gauge | number | こちらも上記同様にトークン数をPolicyごとに集計したもおのになります。 |
Token creation/storage | summary/summary | ms/ms | トークンの作成・ストアに要した時間を表します。 |
Token lookups | summary | ms | トークンのlookupに要した時間を表します。 |
Renew/Revoke time (in ms) | summary/summary | ms/ms | リースのRenew、およびトークンのRevokeの要した時間を表します。これらの数値が長い場合、クラスタのリソースが足りない、もしくはクラスタに以上がある、などの可能性があります。 |
Audit Logs
パネル名 | 値 | どんな意味があるか? |
---|---|---|
Audit Log rate per minute | rate | 1分あたりのログの数を意味します。 |
Error logs (response/request) | number/number | それぞれresponse/requestのうちエラーになっているログの数を表します。 |
その他の気にしたいメトリクス
New Relic標準のHCP Vaultダッシュボードには含まれないものの、モニタリング対象にしておくと良いメトリクスには以下のようなものがあります。
CPU Utilization
HCP VaultはHashiCorpが運用しているとはいえ、クラスタ貸しのサービスになりますので、そのCPUリソース使用率を把握しておくことは重要です。
特に、CPU intensiveな暗号化機能等を利用している際には、注目しておく必要があります。
SELECT percentage(latest(cpu_seconds_total), WHERE mode != 'idle') AS 'CPU Utilization' FROM Metric WHERE cluster_id IN ('<YOUR-CLUSTER-IDS>') SINCE 60 MINUTES AGO TIMESERIES
Memory Utilization
CPU利用率に加え、Memoryも見ておきましょう。
SELECT average(((`__total_ram` - `__total_avail_ram`) / `__total_ram`) * 100) AS 'Memory Utilization (%)' FROM (SELECT latest(memory_total_bytes) AS '__total_ram', latest(memory_available_bytes) AS '__total_avail_ram' FROM Metric WHERE cluster_id IN ('<YOUR-CLUSTER-IDS>') LIMIT MAX TIMESERIES 1 MINUTES) SINCE 60 MINUTES AGO UNTIL NOW TIMESERIES 1 MINUTES
Disk Utilization
HashiCorp Vaultではデータの置き場所(Storage Backend)としていくつかのオプションが提供されていますが、HCP VaultではIntegrated storageが利用されています。
Integrated storageではVaultが起動しているサーバーのファイルシステムにデータが保存されるため、シークレットが増えたり、利用が増えて行くにつれてストレージの利用率も向上していきます。
SELECT average(((`__total_disk` - `__total_free_disk`) / `__total_disk`) * 100) AS 'Disk Utilization (%)' FROM (SELECT latest(filesystem_total_bytes) AS '__total_disk', latest(filesystem_free_bytes) AS '__total_free_disk' FROM Metric WHERE cluster_id IN ('vault-cluster-prod') LIMIT MAX TIMESERIES 1 MINUTES) SINCE 60 MINUTES AGO UNTIL NOW TIMESERIES 1 MINUTES
アラート設定
New Relic向けHCP Vaultダッシュボードにはアラート周りの設定が全く含まれていないので、こちらも別途設定が必要です。
こちらは利用方法や頻度によってまちまちなので、各環境に合わせて適切に設定することが重要です。
わかりやすいところだと、例えばCPU/Memory/Diskなどは80%以上で発報、Go routine数などはドキュメントに従って標準値を見たうえでしきい値を決めるか(大変)、Anomaly検知時に発報するようにしておくと良いでしょう。
さいごに
いかがでしたでしょうか?
ユースケースやクライアントからのアクセスのされ方等に応じて独自の監視項目を設けたり、別システムとの相関分析をかける(アプリケーションの起動時以外にアプリケーション用の認証リクエストが来ていないか、etc)など、まだまだできることはありそうですが、監視を始めるきっかけとしては今回ご紹介させていただいたようなところを抑えておけば良いのかなと思います。
この記事が少しでも参考になれば幸いです。
参考ドキュメント
- HCP Vault logs and metrics overview: https://developer.hashicorp.com/hcp/docs/vault/logs-metrics
- Vault Telemetry: https://developer.hashicorp.com/vault/docs/internals/telemetry
- Integrated storage: https://developer.hashicorp.com/vault/docs/concepts/integrated-storage
Discussion