TLS暗号でPrometheusのAPIとUIエンドポイントを安全にする - Prometheusドキュメント

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

SECURING PROMETHEUS API AND UI ENDPOINTS USING TLS ENCRYPTION

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

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

nginx example

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

https://example.com/prometheus/metrics

また、既に、OpenSSLまたは類似ツールで以下のファイルを生成してあるとする。

  • SSL証明書 /root/certs/example.com/example.com.crt
  • SSLキー /root/certs/example.com/example.com.key

自己証明書と秘密鍵はこのコマンドで生成することができる。

mkdir -p /root/certs/example.com && cd /root/certs/example.com
openssl req \
  -x509 \
  -newkey rsa:4096 \
  -nodes \
  -keyout example.com.key \
  -out example.com.crt

プロンプトで適切な情報を入力し、Common Nameのプロンプトにはexample.comを入力する。

nginx configuration

設定ファイルnginx.confの例を以下に示す。この設定で、nginxは、

  • 用意した証明書と鍵でTLS暗号を要求する
  • エンドポイント/prometheusへの全ての接続を、同じホストで稼働しているPrometheusサーバーへプロキシする(同時にURLから/prometheusを削除する)
http {
    server {
        listen              443 ssl;
        server_name         example.com;
        ssl_certificate     /root/certs/example.com/example.com.crt;
        ssl_certificate_key /root/certs/example.com/example.com.key;

        location /prometheus {
            proxy_pass http://localhost:9090/;
        }
    }
}

events {}

nginxが443ポートをバインドする必要があるので、rootとしてnginxを起動する。

sudo nginx -c /usr/local/etc/nginx/nginx.conf

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

Prometheus configuration

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

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

Testing

ドメイnexample.comを利用してnginxプロキシをローカルでテストしたいなら、example.comlocalhostに回すために/etc/hostsに以下のエントリを追加する。

127.0.0.1     example.com

そうすると、cURLを利用してローカルで構築したnginx/Prometheusに接続できる。

curl --cacert /root/certs/example.com/example.com.crt \
  https://example.com/prometheus/api/v1/label/job/values

フラグ--insecureまたは-kを使うことで、証明書を指定せずにnginxサーバーに接続することができる。

curl -k https://example.com/prometheus/api/v1/label/job/values

参考リンク

おすすめ書籍

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

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

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

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

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

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

和訳活動の支援

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

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