セキュリティモデル
注意以下の技術的な詳細に入る前に、Prometheusは監視システムとして、監視対象システムに関する情報を収集し提供することを強調しておきたいと思います。したがって、Prometheusコンポーネントが提供するHTTPエンドポイントは、インターネットのような公開ネットワークに公開すべきではありません(ご自身で理解し、適切な対策を講じている場合を除く)。これには、計装されたバイナリの/metrics
エンドポイント、サーバーコンポーネントの様々なAPIエンドポイント、Goで実装されたサーバーコンポーネントの/pprof
エンドポイントが含まれますが、これらに限定されません。さらに、これらのエンドポイントへのリクエストでサーバーが過負荷になり、最終的にDoS状態になることは容易に起こり得ます。
Prometheusは多くのコンポーネントと他のシステムとの多くの統合を持つ洗練されたシステムです。信頼された環境と信頼されていない環境の両方に展開できます。
このページでは、Prometheusの一般的なセキュリティ上の仮定と、一部の構成で発生する可能性のある攻撃ベクトルについて説明します。
他の複雑なシステムと同様に、バグが発見されるのはほぼ確実であり、その中にはセキュリティに関連するものもあります。セキュリティ上のバグを発見した場合は、関連するリポジトリのMAINTAINERSに記載されているメンテナーに非公開で報告し、[email protected]にもCCしてください。できるだけ早く問題を修正し、リリース日を調整いたします。ご協力いただいたことを公に認めるかどうか、また名前を挙げるかどうかを選択できます。
自動セキュリティスキャナー
セキュリティスキャナーのユーザーへの特別な注意: 生成されるレポートには十分注意してください。ほとんどのスキャナーは汎用的であり、多くの誤検知を生成します。ますます多くのレポートが私たちに送信されており、それらすべてに目を通して、期待される丁寧な返信をするにはかなりの労力が必要です。この問題は、GoおよびNPMの依存関係スキャナーで特に顕著です。
私たちの時間と努力に敬意を表し、生のレポートを提出しないようお願い申し上げます。代わりに、どの特定の結果が私たちに適用され、その理由を概説した分析を添えて提出してください。
Prometheusは企業ではなくボランティアによって維持されています。したがって、セキュリティ問題の修正は最善の努力に基づいて行われます。Prometheus、Alertmanager、Node Exporter、Blackbox Exporter、およびPushgatewayについては、7日以内にセキュリティ修正をリリースするよう努めています。
Prometheus
信頼されていないユーザーがPrometheusのHTTPエンドポイントとログにアクセスできると想定されています。彼らはデータベースに含まれるすべての時系列情報、およびさまざまな運用/デバッグ情報にアクセスできます。
また、信頼されたユーザーのみが、Prometheusおよびその他のコンポーネントのコマンドライン、設定ファイル、ルールファイル、およびランタイム環境のその他の側面を変更できると想定されています。
Prometheusがどのターゲットをどれくらいの頻度で、どのような設定でスクレイプするかは、完全に設定ファイルによって決定されます。管理者は、サービスディスカバリーシステムからの情報を使用することを決定する場合があります。これは、リラベリングと組み合わせることで、そのサービスディスカバリーシステムのデータを変更できるユーザーに一部の制御を付与する可能性があります。
スクレイプされたターゲットは、信頼されていないユーザーによって実行される場合があります。デフォルトでは、ターゲットが別のターゲットになりすますデータを公開することはできないはずです。honor_labels
オプションは、特定のラベル再設定設定と同様に、この保護を削除します。
Prometheus 2.0以降、--web.enable-admin-api
フラグは、時系列の削除などの機能を含む管理HTTP APIへのアクセスを制御します。これはデフォルトで無効になっています。有効にすると、管理機能と変更機能は/api/*/admin/
パスでアクセスできるようになります。--web.enable-lifecycle
フラグは、PrometheusのHTTPリロードとシャットダウンを制御します。これもデフォルトで無効になっています。有効にすると、/-/reload
と/-/quit
パスでアクセスできるようになります。
Prometheus 1.xでは、/-/reload
と/api/v1/series
に対するDELETE
は、HTTP APIにアクセスできる誰でもアクセスできます。/-/quit
エンドポイントはデフォルトで無効ですが、-web.enable-remote-shutdown
フラグで有効にできます。
リモート読み取り機能により、HTTPアクセスを持つユーザーはリモート読み取りエンドポイントにクエリを送信できます。たとえば、PromQLクエリがリレーショナルデータベースに対して直接実行される場合、Prometheusにクエリを送信できるユーザー(Grafanaなどを介して)は、そのデータベースに対して任意のSQLを実行できます。
Alertmanager
AlertmanagerのHTTPエンドポイントにアクセスできるユーザーは、そのデータにアクセスできます。彼らはアラートを作成および解決できます。彼らはサイレンスを作成、変更、削除できます。
通知の送信先は設定ファイルで決定されます。特定のテンプレート設定では、通知がアラートで定義された送信先に送信される可能性があります。たとえば、通知がアラートラベルを宛先メールアドレスとして使用する場合、Alertmanagerにアラートを送信できるユーザーは誰でも任意のメールアドレスに通知を送信できます。アラートで定義された送信先がテンプレート可能なシークレットフィールドである場合、PrometheusまたはAlertmanagerのいずれかにアクセスできるユーザーは、そのシークレットを表示できます。
テンプレート可能なシークレットフィールドは、上記のユースケースで通知をルーティングするためのものです。テンプレートファイル機能を使用してシークレットを設定ファイルから分離する方法としては意図されていません。テンプレートファイルに保存されたシークレットは、Alertmanager設定ファイルでレシーバーを設定できる誰でも流出させる可能性があります。たとえば、大規模なセットアップでは、各チームが完全に制御するAlertmanager設定ファイルのフラグメントを持ち、それが最終的な完全な設定ファイルに結合される場合があります。
Pushgateway
PushgatewayのHTTPエンドポイントにアクセスできるユーザーは、そこに格納されているメトリックを作成、変更、削除できます。Pushgatewayは通常、honor_labels
を有効にしてスクレイプされるため、PushgatewayにアクセスできるユーザーはPrometheusに任意の時系列を作成できることを意味します。
--web.enable-admin-api
フラグは、既存のすべてのメトリックグループを消去する機能を含む、管理HTTP APIへのアクセスを制御します。これはデフォルトで無効になっています。有効にすると、管理機能は /api/*/admin/
パスでアクセスできるようになります。
Exporter
Exporterは通常、事前設定された一連のコマンド/リクエストを使用して1つの構成されたインスタンスとしか通信せず、HTTPエンドポイントを介して拡張することはできません。
SNMPおよびBlackbox exporterのように、URLパラメータからターゲットを取得するExporterもあります。したがって、これらのExporterにHTTPアクセスできるユーザーは、任意のエンドポイントにリクエストを送信させることができます。また、クライアント側の認証もサポートしているため、HTTP基本認証パスワードやSNMPコミュニティ文字列などのシークレット情報が漏洩する可能性があります。TLSのようなチャレンジレスポンス認証メカニズムはこれによる影響を受けません。
クライアントライブラリ
クライアントライブラリは、ユーザーのアプリケーションに含めることを意図しています。
クライアントライブラリが提供するHTTPハンドラーを使用している場合、悪意のあるリクエストがそのハンドラーに到達しても、追加の負荷やスクレイプの失敗による問題以上の問題を引き起こすことはできないはずです。
認証、認可、および暗号化
Prometheus とほとんどの Exporter は TLS をサポートしています。これには、TLS クライアント証明書によるクライアントの認証も含まれます。Prometheus の設定に関する詳細はこちら
にあります。
Go プロジェクトは、Go の crypto/tls ライブラリに基づいた同じ TLS ライブラリを共有しています。最低バージョンは TLS 1.2 をデフォルトとしています。このポリシーは Qualys SSL Labs の推奨事項に基づいており、デフォルト設定と適切に提供された証明書で「A」評価を達成しつつ、Go の上流のデフォルトに可能な限り忠実に従うことを目指しています。この評価を達成することで、完璧なセキュリティと使いやすさのバランスが取れています。
Java エクスポーターには今後 TLS が追加される予定です。
異なる暗号スイートや古いTLSバージョンなど、特別なTLS要件がある場合は、安全でないとマークされていない限り、最小TLSバージョンと暗号を調整できます。それでも要件を満たせない場合でも、現在のTLS設定により、サーバーとより特別な要件を持つリバースプロキシ間で安全なトンネルを構築できます。
HTTP基本認証もサポートされています。基本認証はTLSなしで使用できますが、その場合、ユーザー名とパスワードはネットワーク上で平文で公開されます。
サーバー側では、基本認証のパスワードはbcryptアルゴリズムでハッシュ化されて保存されます。セキュリティ標準に合ったラウンド数を選択するのはユーザーの責任です。ラウンド数を増やすと、CPUパワーの消費とリクエスト認証にかかる時間が増える代わりに、ブルートフォース攻撃がより困難になります。
さまざまなPrometheusコンポーネントは、クライアント側の認証と暗号化をサポートしています。TLSクライアントサポートが提供されている場合、SSL検証をスキップするinsecure_skip_verify
というオプションも用意されていることがよくあります。
APIセキュリティ
管理エンドポイントと変更エンドポイントはcURLなどのシンプルなツールを介してアクセスすることを意図しているため、組み込みのCSRF保護はありません。これはそのようなユースケースを妨げるためです。したがって、リバースプロキシを使用する場合は、CSRFを防ぐためにそのようなパスをブロックすることをお勧めします。
非変更エンドポイントの場合、XSSを防ぐために、リバースプロキシでAccess-Control-Allow-Origin
などのCORSヘッダーを設定することをお勧めします。
信頼されていないユーザーからの入力(例:コンソールテンプレートへのURLパラメータや、自分で作成したもの)を含むPromQLクエリを作成する場合、そのユーザーが任意のPromQLクエリを実行できないように、信頼されていない入力を適切にエスケープしてインジェクション攻撃を防ぐようにしてください。たとえば、up{job="
は、
が"} or some_metric{zzz="
の場合、up{job=""} or some_metric{zzz=""}
になります。
Grafanaを使用している方へ:ダッシュボードの権限はデータソースの権限ではないため、プロキシモードでユーザーが任意のクエリを実行する能力を制限するものではありません。
シークレット
非機密情報またはフィールドは、HTTP APIおよび/またはログを介して利用できる場合があります。
Prometheusでは、サービスディスカバリから取得されたメタデータは機密情報とは見なされません。Prometheusシステム全体で、メトリックは機密情報とは見なされません。
設定ファイル内の秘密情報(ドキュメントに明示的に記載されているもの)は、ログやHTTP APIには公開されません。コンポーネントがHTTPエンドポイントを介して設定を公開することは一般的であるため、秘密情報は他の設定フィールドに配置すべきではありません。ディスク上のファイルへの望ましくない読み取りおよび書き込みから保護するのはユーザーの責任です。
依存関係によって使用される他のソースからの秘密情報(例:EC2サービスディスカバリで使用されるAWS_SECRET_KEY
環境変数)は、私たちの管理外のコードや、それが保存されている場所を公開する機能のために漏洩する可能性があります。
サービス拒否
過剰な負荷や高コストなクエリに対する緩和策はいくつか講じられていますが、あまりにも多くのクエリや高コストなクエリ/メトリックが提供されると、コンポーネントは停止します。悪意のある行動よりも、信頼されたユーザーによる偶発的な停止の可能性の方が高いです。
CPU、RAM、ディスク容量、IOPS、ファイル記述子、帯域幅など、コンポーネントに十分なリソースを提供するのはユーザーの責任です。
すべてのコンポーネントの障害を監視し、障害発生時に自動的に再起動するように設定することをお勧めします。
ライブラリ
このドキュメントでは、標準のソースコードからビルドされた「素の」バイナリを対象としています。Prometheusのソースコードを変更したり、独自のコードでPrometheusの内部(公式クライアントライブラリAPIを除く)を使用したりする場合、ここに記載されている情報は適用されません。
ビルドプロセス
Prometheusのビルドパイプラインは、サードパーティプロバイダー上で実行されており、Prometheus開発チームの多くのメンバーとこれらのプロバイダーのスタッフがアクセスできます。バイナリの正確な出自が気になる場合は、プロジェクトが提供する事前ビルド済みバイナリに頼るのではなく、ご自身でビルドすることをお勧めします。
Prometheus-Community
Prometheus-Community組織配下のリポジトリは、サードパーティのメンテナーによってサポートされています。
Prometheus-Community組織のリポジトリでセキュリティ上のバグを発見した場合は、関連するリポジトリのMAINTAINERSに記載されているメンテナーに非公開で報告し、[email protected]にもCCしてください。
この組織内のリポジトリの中には、このドキュメントに示されているものとは異なるセキュリティモデルを持つものもあります。そのような場合は、それらのリポジトリのドキュメントを参照してください。
外部監査
-
2018年、CNCF は cure53 による外部セキュリティ監査を後援し、2018年4月から2018年6月まで実施されました。詳細は、監査の最終レポートをご覧ください。
-
2020年、CNCFはNode Exporterに関するcure53による2回目の監査を後援しました。
-
2023年には、CNCFがChainguardによるPrometheusのソフトウェアサプライチェーンセキュリティ評価を後援しました。