使用基本认证保护 Prometheus API 和 UI 端点安全

Prometheus 支持连接到 Prometheus 表达式浏览器HTTP API基本身份验证(也称为“基本认证”)。

注意: 本教程介绍的是连接 Prometheus 实例的基本认证。Prometheus 实例连接抓取目标也支持基本认证。

哈希密码

假设您希望要求所有访问 Prometheus 实例的用户提供用户名和密码。在本例中,使用 admin 作为用户名,并选择您喜欢的任何密码。

首先,生成密码的 bcrypt 哈希。为了生成哈希密码,我们将使用 python3-bcrypt。

假设您正在运行类似 Debian 的发行版,可以通过运行 apt install python3-bcrypt 来安装它。还有其他生成哈希密码的方法;为了测试,您也可以使用网页上的 bcrypt 生成器

这里是一个使用 python3-bcrypt 提示输入密码并进行哈希的 python 脚本

import getpass
import bcrypt

password = getpass.getpass("password: ")
hashed_password = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt())
print(hashed_password.decode())

将脚本保存为 gen-pass.py 并运行它

$ python3 gen-pass.py

这应该会提示您输入密码

password:
$2b$12$hNf2lSsxfm0.i4a.1kVpSOVyBCfIB51VRjgBUyv6kdnyTlgWj81Ay

在此示例中,我使用了“test”作为密码。

将该密码保存在某个地方,我们将在后续步骤中使用它!

创建 web.yml

我们来创建一个 web.yml 文件 (文档),内容如下

basic_auth_users:
    admin: $2b$12$hNf2lSsxfm0.i4a.1kVpSOVyBCfIB51VRjgBUyv6kdnyTlgWj81Ay

您可以使用 promtool check web-config web.yml 来验证该文件

$ promtool check web-config web.yml
web.yml SUCCESS

您可以在文件中添加多个用户。

启动 Prometheus

您可以按如下方式使用 web 配置文件启动 prometheus

$ prometheus --web.config.file=web.yml

测试

您可以使用 cURL 与您的设置交互。尝试此请求

curl --head http://localhost:9090/graph

这将返回一个 401 Unauthorized 响应,因为您未能提供有效的用户名和密码。

要使用基本认证成功访问 Prometheus 端点,例如 /metrics 端点,请使用 -u 标志提供正确的用户名,并在提示时提供密码

curl -u admin http://localhost:9090/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
...

总结

本指南中,您将用户名和哈希密码存储在 web.yml 文件中,并使用所需的参数启动了 prometheus,以便使用该文件中的凭据来验证访问 Prometheus HTTP 端点的用户身份。

本文档是开源的。请通过提交问题或拉取请求来帮助改进它。