使用TLS加密保护PROMETHEUS API和UI端点


Prometheus不直接支持与Prometheus实例(即表达式浏览器或HTTP API)连接的传输层安全性(TLS)加密。 如果您想为这些连接强制执行TLS,我们建议将Prometheus与反向代理结合使用,并在代理层应用TLS。 您可以使用Prometheus的任何反向代理,但在本指南中我们将提供一个nginx示例

nginx例子

假设您想要在example.com域(您拥有)的nginx服务器后面运行Prometheus实例,并且可以通过/prometheus端点获得所有Prometheus端点。 因此,Prometheus’/metrics端点的完整URL将是:

  1. https://example.com/prometheus/metrics

我们还假设你使用OpenSSL或类似工具生成了以下内容:

  • /root/certs/example.com/example.com.crt上的SSL证书
  • /root/certs/example.com/example.com.key上的SSL密钥

您可以使用以下命令生成自签名证书和私钥:

  1. mkdir -p /root/certs/example.com && cd /root/certs/example.com
  2. openssl req \
  3. -x509 \
  4. -newkey rsa:4096 \
  5. -nodes \
  6. -keyout example.com.key \
  7. -out example.com.crt

根据提示填写相应的信息,并确保在Common Name提示符下输入example.com

nginx配置

下面是一个示例nginx.conf配置文件。 使用此配置,nginx将:

  • 使用您提供的证书和密钥强制执行TLS加密
  • 将与/prometheus端点的所有连接代理到在同一主机上运行的Prometheus服务器(同时从URL中删除/prometheus
  1. http {
  2. server {
  3. listen 443 ssl;
  4. server_name example.com;
  5. ssl_certificate /root/certs/example.com/example.com.crt;
  6. ssl_certificate_key /root/certs/example.com/example.com.key;
  7. location /prometheus {
  8. proxy_pass http://localhost:9090/;
  9. }
  10. }
  11. }
  12. events {}

以root身份启动nginx(因为nginx需要绑定到端口443):

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

Prometheus配置

在nginx代理后面运行Prometheus时,您需要将外部URL设置为http://example.com/prometheus,并将路由前缀设置为/

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

测试

如果您想使用example.com域在本地测试nginx代理,可以在/etc/hosts文件中添加一个条目,将example.com重新路由到localhost

  1. 127.0.0.1 example.com

然后,您可以使用cURL与本地nginx / Prometheus设置进行交互:

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

您可以使用--insecure-k标志连接到nginx服务器而不指定证书:

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