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 定义。其核心流程如下:

  1. 客户端发起请求:客户端(如 Prometheus Server 或 curl)向服务端(如 Exporter 或 API)发送 HTTP 请求,未携带认证信息。
  2. 服务端返回 401:服务端检测到请求未认证,返回 401 Unauthorized 状态码,并在响应头中添加 WWW-Authenticate: Basic realm="Prometheus"。
  3. 客户端拼接凭证:客户端将用户名和密码拼接为 username:password 字符串,然后进行 Base64 编码。
  4. 发送认证头:客户端在后续请求的 Authorization 头中携带编码后的凭证,格式为 Authorization: Basic <base64>。
  5. 服务端验证:服务端解码 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)的认证方式,客户端在首次认证后获得一个令牌(),后续请求携带该 即可证明身份。其核心流程如下:

  1. 客户端发送凭证:客户端向认证服务器(Auth Server)发送用户名/密码或 。
  2. 服务端签发 :认证服务器验证凭证通过后,生成一个 (通常为随机字符串或 JWT),并返回给客户端。
  3. 客户端存储 :客户端将 存储在本地(如内存、LocalStorage、HTTP-Only Cookie)。
  4. 携带 访问资源:客户端在后续请求的 Authorization 头中携带 ,格式为 Authorization: Bearer <>。
  5. 服务端验证 :资源服务器验证 的有效性(签名、过期时间、权限范围),验证通过则返回资源。
存储安全: 避免将 存储在 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 中较少使用。
HTTP Basic Auth 与 认证流程对比 HTTP Basic Auth 1. 请求资源(无认证头) 2. 返回 401 + WWW-Authenticate 3. 拼接 username:password → Base64 4. Authorization: Basic <base64> 认证(Bearer) 1. 发送凭证(用户名/密码) 2. 验证通过,签发 3. 客户端存储 4. Authorization: Bearer <>

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)。
JWT 结构分解:Header.Payload.Signature Header(头部) 算法 & 类型 {"alg": "HS256", "typ": "JWT"} Base64URL 编码 → eyJhbGciOiJIUzI1... . Payload(载荷) 声明(Claims) {"sub": "prometheus", "role": "read_only", "exp": 1718000000} Base64URL 编码 → eyJzdWIiOiJwcm9t... . Signature(签名) 防篡改验证 HMACSHA256( header + "." + payload, secret_key ) Base64URL 编码 最终 JWT 字符串:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJwcm9tZXRoZXVzIn0.abc123def456

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。