2、基础认证概念:HTTP Basic Auth原理、认证机制、Session与JWT对比
在构建 Prometheus 采集作业平台的安全防线时,认证(Authentication)与授权(Authorization)是基石。本章深入剖析三种最基础的认证概念:HTTP Basic Auth、 认证机制,以及 Session 与 JWT 的对比。理解这些原理,是后续配置 Prometheus 安全插件、实现多租户隔离和 API 网关防护的前提。
2.1 HTTP Basic Auth 原理
HTTP Basic Auth 是最简单的 HTTP 认证方式,由 RFC 7617 定义。其核心流程如下:
- 客户端发起请求:客户端(如 Prometheus Server 或 curl)向服务端(如 Exporter 或 API)发送 HTTP 请求,未携带认证信息。
- 服务端返回 401:服务端检测到请求未认证,返回
401 Unauthorized状态码,并在响应头中添加WWW-Authenticate: Basic realm="Prometheus"。 - 客户端拼接凭证:客户端将用户名和密码拼接为
username:password字符串,然后进行 Base64 编码。 - 发送认证头:客户端在后续请求的
Authorization头中携带编码后的凭证,格式为Authorization: Basic <base64>。 - 服务端验证:服务端解码 Base64,提取用户名和密码,与本地存储的凭证比对。验证通过则返回资源,否则返回 401。
⚠️ 安全警告: Base64 编码不是加密,仅是可逆编码。在未使用 HTTPS 的情况下,凭证明文暴露于网络中,极易被中间人攻击截获。在生产环境中,必须搭配 TLS/SSL 使用。
Prometheus 场景: Prometheus 的
scrape_config 支持 basic_auth 配置块,用于向目标 Exporter 发送认证凭证。这是保护 Exporter 端点不被未授权访问的最简单手段。
# Prometheus 采集配置示例:使用 Basic Auth 访问目标
scrape_configs:
- job_name: 'protected_exporter'
basic_auth:
username: 'prometheus'
password: 's3cr3t'
static_configs:
- targets: ['192.168.1.100:9100']
2.2 认证机制
认证是一种无状态(Stateless)的认证方式,客户端在首次认证后获得一个令牌(),后续请求携带该 即可证明身份。其核心流程如下:
- 客户端发送凭证:客户端向认证服务器(Auth Server)发送用户名/密码或 。
- 服务端签发 :认证服务器验证凭证通过后,生成一个 (通常为随机字符串或 JWT),并返回给客户端。
- 客户端存储 :客户端将 存储在本地(如内存、LocalStorage、HTTP-Only Cookie)。
- 携带 访问资源:客户端在后续请求的
Authorization头中携带 ,格式为Authorization: Bearer <>。 - 服务端验证 :资源服务器验证 的有效性(签名、过期时间、权限范围),验证通过则返回资源。
存储安全: 避免将 存储在 LocalStorage 中,以防止 XSS 攻击窃取。推荐使用 HTTP-Only、Secure、SameSite=Strict 属性的 Cookie 存储 ,或使用内存变量(适用于后端服务间通信)。
2.3 Session 与 JWT 对比
Session 和 JWT(JSON Web )是两种主流的 实现方案,它们在状态管理、存储位置和扩展性上存在本质差异。下表从多个维度进行对比:
| 对比维度 | Session(会话) | JWT(JSON Web ) |
|---|---|---|
| 状态存储 | 服务端存储(内存、Redis、数据库) | 客户端存储( 自身携带状态) |
| 扩展性 | 差。需要共享 Session 存储(如 Redis 集群)或粘性会话(Sticky Session) | 好。无状态,任意服务器均可验证签名,天然支持水平扩展 |
| 吊销机制 | 简单。服务端删除 Session 记录即可立即失效 | 复杂。需维护黑名单(Blacklist)或缩短过期时间,无法立即吊销已签发的 |
| 数据负载 | Session ID 仅为一个随机字符串,用户数据存储在服务端 | 本身可携带用户信息、权限声明(Claims),但会增加传输体积 |
| 跨域支持 | 差。Session ID 通常通过 Cookie 传递,受同源策略限制 | 好。通过 Authorization 头传递,天然支持跨域(CORS) |
| 典型应用 | 传统 Web 应用(如 Django、Rails 管理后台) | 微服务、API 网关、移动端、单页应用(SPA) |
Prometheus 生态选择: Prometheus 及其生态组件(如 Thanos、Cortex)更倾向于使用 Bearer 或 JWT 进行 API 认证,因为其无状态特性更适合云原生环境下的水平扩展和容器化部署。Session 方式在 Prometheus 的 Exporter 和 Alertmanager 中较少使用。
2.4 JWT 结构详解
JWT 由三部分组成,以点号(.)分隔:Header.Payload.Signature。每一部分都是 Base64URL 编码后的 JSON 字符串。
- Header(头部):声明 类型(typ)和签名算法(alg),如
{"alg": "HS256", "typ": "JWT"}。 - Payload(载荷):携带声明(Claims),包括标准声明(iss、sub、exp、iat 等)和自定义声明(如 role、tenant_id)。
- Signature(签名):使用 Header 中指定的算法,对
Header.Payload进行签名,防止篡改。
// JWT 示例(解码后)
Header: {
"alg": "HS256",
"typ": "JWT"
}
Payload: {
"sub": "prometheus_scraper",
"iss": "auth.prometheus.local",
"exp": 1718000000,
"iat": 1717913600,
"role": "read_only",
"tenant_id": "prod-01"
}
Signature: HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret_key
)
🔑 关键点: JWT 的签名保证了数据的完整性,但 Payload 本身是明文(Base64URL 解码即可读取)。切勿在 JWT 中存放密码、密钥等敏感信息。如需加密载荷,应使用 JWE(JSON Web Encryption)。
2.5 Prometheus 场景下的认证选型建议
针对 Prometheus 采集作业平台,不同组件和场景推荐使用不同的认证方式:
| 组件/场景 | 推荐认证方式 | 理由 |
|---|---|---|
| Exporter 端点保护 | HTTP Basic Auth + TLS | 简单、轻量,Exporter 通常为静态目标,无需复杂 管理 |
| Prometheus API 查询 | Bearer / JWT | 支持细粒度权限控制,适合多租户场景(如 Thanos、Cortex) |
| Alertmanager Webhook | Bearer 或 mTLS | Webhook 接收端需要验证发送方身份, 或证书认证更安全 |
| 远程写(Remote Write) | Basic Auth 或 Bearer | 需配合 TLS,防止写入端点被恶意利用 |
最佳实践: 在 Prometheus 生态中,Bearer + TLS 是推荐的认证组合。 可以定期轮换,且无状态特性便于在 Kubernetes 环境下与 Service Mesh(如 Istio)集成。对于内部网络,Basic Auth 仍可作为一种低开销的备选方案,但务必启用 HTTPS。