Basic認証でPrometheusのAPIとUIを安全にする - Prometheusドキュメント

このページはPrometheus公式ドキュメント和訳+αの一部です。

SECURING PROMETHEUS API AND UI ENDPOINTS USING BASIC AUTH

Prometheusは、expressionブラウザとHTTP APIの接続に対して、Basic認証を直接サポートしていない。 それらの接続にBasic認証を要求したいなら、Prometheusをリバースプロキシと組み合わせて使い、プロキシレイヤーで認証を適用することを推奨する。 自分の好きなリバースプロキシをPrometheusと共に利用することができるが、このガイドでは、nginxの例を提供する。

注意:PrometheusインスタンスへのBasic認証での接続はサポートされていないが、Prometheusから監視対象への接続ではBasic認証がサポートされている。

nginx example

localhost:12321で稼働しているnginxサーバーの後ろでPrometheusインスタンスを運用し、全てのPrometheusのエンドポイントが/prometheusを通して利用可能にしたいとする。 つまり、Prometheusのエンドポイント/metricsに対する完全なURLは、以下のようになるだろう。

http://localhost:12321/prometheus/metrics

また、Prometheusインスタンスにアクセスする全てのユーザーにユーザー名とパスワードを要求したいとする。 この例では、ユーザー名としてadminを用い、好きなパスワードを選ぶこととする。

まず、htpasswdを利用し、ユーザー名/パスワードを保存するためのファイル.htpasswdを作成し、ディレクト/etc/nginxに保存する。

mkdir -p /etc/nginx
htpasswd -c /etc/nginx/.htpasswd admin

注意:この例では、.htpasswdを含むnginxの設定ファイルの場所として、/etc/nginxを用いるが、インストールの仕方によって異なるであろう。他のよくあるnginxの設定ディレクトリは、/usr/local/nginx/conf/usr/local/etc/nginxが挙げられる。

nginx configuration

設定ファイルnginx.confの例を以下に示す。 この設定で、nginxは、Prometheusへプロキシするエンドポイント/prometheusへの全ての接続にBasic認証を要求するようになる。

http {
    server {
        listen 12321;

        location /prometheus {
            auth_basic           "Prometheus";
            auth_basic_user_file /etc/nginx/.htpasswd;

            proxy_pass           http://localhost:9090/;
        }
    }
}

events {}

上記の設定を用いて、nginxを起動する。

nginx -c /etc/nginx/nginx.conf

Prometheus configuration

nginxプロキシの後ろでPrometheusを稼働させる際には、外部URLをhttp://localhost:12321/prometheusに、ルートプリフィックス/にセットする必要がある。

prometheus \
  --config.file=/path/to/prometheus.yml \
  --web.external-url=http://localhost:12321/prometheus \
  --web.route-prefix="/"

Testing

cURLを利用してローカルで構築したnginx/Prometheusに接続できる。このリクエストで試してみよう。

curl --head http://localhost:12321/prometheus/graph

これは、正当なユーザー名とパスワードを提供していないので、レスポンス401 Unauthorizedを返すだろう。 このレスポンスは、ヘッダーWWW-Authenticate: Basic realm="Prometheus"も返すだろう。 これは、パラメーターauth_basicで指定されたBasic認証の領域Prometheusが要求されていることを示す。

Basic認証によるPrometheusエンドポイントへのアクセスが成功するには、適切なユーザー名をフラグ-uで指定し、プロンプトでパスワードを入力する。

curl -u admin http://localhost:12321/prometheus/metrics
Enter host password for user 'admin':

何か以下のようなPrometheusの出力を返すはずである。

# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 0.0001343
go_gc_duration_seconds{quantile="0.25"} 0.0002032
go_gc_duration_seconds{quantile="0.5"} 0.0004485
...

まとめ

このガイドでは、ユーザー名とパスワードを.htpasswdに保存し、PrometheusのHTTPエンドポイントにアクセスするユーザーを認証するためにそのファイルの情報を使うようにnginxを設定し、Prometheusをリバースプロキシのために設定した。

参考リンク

おすすめ書籍

入門 Prometheus ―インフラとアプリケーションのパフォーマンスモニタリング

入門 Prometheus ―インフラとアプリケーションのパフォーマンスモニタリング

入門 監視 ―モダンなモニタリングのためのデザインパターン

入門 監視 ―モダンなモニタリングのためのデザインパターン

SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム

SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム

和訳活動の支援

Prometheusドキュメント和訳が役に立った方は、以下QRコードからPayPayで活動を支援して頂けるとありがたいです。

PayPayによる支援用QRコード
上のQRコードからPayPayによる支援