Prometheusを「ただの監視ツール」で終わらせるな:ゼロトラスト時代の堅牢な要塞化戦術
多くの現場で、Prometheusは「社内LANに閉じ込めておけば安全」という幻想の下で運用されている。だが、君たちの組織がクラウドネイティブであり、ゼロトラストを標榜しているのなら、その認識は今日で捨ててほしい。
Prometheusはデフォルトでは認証を持たない。それは設計思想として「監視ネットワークは隔離されているべき」という前提があるからだ。しかし、現代の分散システムにおいて「信頼できる境界」など存在しない。
本稿では、Prometheusを公開環境へ晒しても牙を抜かれないための「TLS相互認証」と「OAuth2認可」、そして現場の生産性を極限まで高めるプロの運用術を伝授する。
—
1. ゼロトラスト環境への適応:TLS相互認証(mTLS)の実装
Prometheusのスクレイピングは、通信の盗聴と、悪意あるExporterによるデータ注入に対して脆弱だ。これを防ぐ唯一の解は mTLS(相互TLS認証) である。
エクスポーター側のTLS設定(ベストプラクティス)
単にTLSを有効にするだけでは不十分だ。`client_ca_file`を指定し、特定のCAで署名されたクライアント証明書を持つPrometheusからしかリクエストを受け付けないようにする。
exporter_config.yaml (Exporter側の設定例)
web:
config:
tls_server_config:
cert_file: /etc/certs/server.crt
key_file: /etc/certs/server.key
client_auth_type: RequireAndVerifyClientCert
client_ca_file: /etc/certs/ca.crt # Prometheusの証明書を署名したCA
Prometheus側の設定
Prometheus側も`tls_config`でクライアント証明書を提示する必要がある。
prometheus.yaml
scrape_configs:
- job_name: ‘secure-exporter’
scheme: https
tls_config:
ca_file: /etc/certs/ca.crt
cert_file: /etc/certs/client.crt # Prometheus側の証明書
key_file: /etc/certs/client.key
server_name: exporter.prod.internal # SNI検証用
—
2. プロのアクセス制御:OAuth2/Basic認証によるフロントエンド保護
PrometheusのWeb UIには、誰でもPromQLを実行できてしまうという最大の弱点がある。これを遮断するために、`nginx`や`oauth2-proxy`をサイドカーとして配置するのが正攻法だ。
推奨構成:oauth2-proxyによる認証
Prometheusの前にプロキシを置き、Google/GitHub/OktaなどのIdPで認証を強制する。これにより、誰がいつクエリを叩いたかの監査ログも確保できる。
絶対入れるべき神プラグイン・ツール:
- [oauth2-proxy](https://oauth2-proxy.github.io/oauth2-proxy/): これをPrometheusの前に置かない手はない。
- [PromLens](https://promlens.com/): クエリのデバッグ用。開発スピードが劇的に変わる。
—
3. 生産性を最大化する「設定共有化」の哲学
設定ファイルを闇雲に書くな。数が増えれば管理不能になる。チーム開発で守るべき「聖域のルール」がこれだ。
YAMLのベストプラクティス構成例
設定は「責務の分離」が鉄則だ。`prometheus.yml`に全てを詰め込むのは素人のやることである。
prometheus.yaml
global:
scrape_interval: 15s
ファイルベースのサービスディスカバリを活用する
scrape_configs:
- job_name: ‘kubernetes-pods’
file_sd_configs:
- files: [‘/etc/prometheus/sd/pods/.yaml’]
refresh_interval: 1m
【プロのテクニック】
- DRYの徹底: Prometheusの設定をHelmチャートやKustomizeでテンプレート化し、`relabel_configs`の共通パターンは外部ファイルで管理せよ。
- ルールファイルの分割: `alerts.rules`や`recording.rules`をドメインごとに分割し、シンボリックリンクで管理する。これにより、CI/CDで特定のルールファイルだけをバリデーションできる。
—
4. 現場で震えるほど役立つ「小技」
開発スピードを加速させるキーボードショートカット
PrometheusのWeb UIを開き、ブラウザのコンソールで以下を叩くか、`PromLens`を活用せよ。
- `Shift + Enter`: クエリ実行(これは基本)。
- クエリの即時プロファイリング: `curl -G ‘http://localhost:9090/api/v1/query’ –data-urlencode ‘query=…’` を叩く前に、必ず `explain` メソッド(Prometheus 2.x以降)を使用して、クエリコストを事前に見積もる癖をつけろ。
絶対にやるべき「予兆検知」
メトリクス監視の最終形態は「エラートラッキング」ではない。「変化率の監視」だ。
固定値の閾値(Threshold)でアラートを鳴らすのは今すぐやめろ。
エラー率の急増を検知する(5分間の平均エラー率が、1時間前のエラー率の5倍を超えたら通知)
(rate(http_requests_total{status=~”5..”}[5m]) > 0)
/
(rate(http_requests_total[5m]) > 0)
> 5 (rate(http_requests_total{status=~”5..”}[1h] offset 1h) / rate(http_requests_total[1h] offset 1h))
—
最後に:オブザーバビリティは「文化」である
Prometheusの設定をどれだけセキュアにしても、監視しているデータ自体がゴミであれば意味がない。
「なぜそのメトリクスが必要なのか?」「そのアラートは本当にアクション可能か?」――これをチームで問い続けることこそが、真のオブザーバビリティへの道だ。
ツールに振り回されるな。ツールを支配し、システムの鼓動を誰よりも深く理解するエンジニアであれ。健闘を祈る。