基于Keycloak 23.0.1与OpenTelemetry 0.90.1的安全链路配置问询
OpenTelemetry 0.90.1 + Keycloak 23.0.1 节点间安全链路配置流程
架构回顾
- InsideAppExporter:内置OpenTelemetry SDK,生成并发送追踪数据到Collector
- OpenTelemetry Collector:代理节点,接收应用数据,带OAuth2鉴权转发到Agent
- OpenTelemetry Agent:部署在Keycloak所在节点,接收Collector数据,启用OIDC鉴权+TLS加密
1. 生成TLS证书(用cfssl工具)
先搞定节点间加密的证书:
- 初始化CA配置文件:
cfssl print-defaults config > ca-config.json,按需修改过期时间等参数 - 生成CA根证书和密钥:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca - 给Agent节点生成服务端证书:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server agent.example.com-csr.json | cfssljson -bare agent.example.com
证书分发:
- Agent节点:放置
agent.example.com.pem(服务端证书)和agent.example.com-key.pem(私钥) - Collector和InsideAppExporter节点:放置
ca.pem(根证书)用于验证服务端身份
2. Keycloak客户端配置
在Keycloak后台完成鉴权基础配置:
- 创建客户端:类型选
OpenID Connect,客户端ID设为otel-collector-client,访问类型选confidential,开启服务账户 - 配置角色:创建
otel-traces-writer角色,分配给该客户端的服务账户 - 权限配置:确保服务账户拥有获取令牌的权限(默认已开启,可在「客户端权限」里确认)
3. OpenTelemetry Agent(服务端)配置
编写otel-agent-config.yaml,启用OIDC鉴权和TLS加密的OTLP接收器:
extensions: oidcauth: issuer_url: "https://你的Keycloak地址/realms/你的领域名" audience: "otel-agent" tls_config: ca_file: "/path/to/ca.pem" # 之前生成的CA根证书 receivers: otlp: protocols: http: tls: cert_file: "/path/to/agent.example.com.pem" # Agent的服务端证书 key_file: "/path/to/agent.example.com-key.pem" # Agent的私钥 auth: authenticator: oidcauth # 绑定OIDC鉴权扩展 processors: batch: # 批量处理优化性能 exporters: # 替换成你实际的追踪存储服务,比如Jaeger、Zipkin等 jaeger: endpoint: "jaeger.example.com:14250" tls: insecure: false service: extensions: [oidcauth] pipelines: traces: receivers: [otlp] processors: [batch] exporters: [jaeger]
说明:OIDC扩展会验证Collector发送的JWT令牌,确保携带otel-traces-writer角色;OTLP接收器强制TLS加密,拒绝未加密的连接。
4. OpenTelemetry Collector(代理端)配置
编写otel-collector-config.yaml,启用OAuth2客户端凭证鉴权的OTLP导出器:
extensions: oauth2client: client_id: "otel-collector-client" # Keycloak里创建的客户端ID client_secret: "你的Keycloak客户端密钥" # 从Keycloak客户端详情里复制 token_url: "https://你的Keycloak地址/realms/你的领域名/protocol/openid-connect/token" scopes: ["openid", "otel-traces-writer"] # 请求的权限范围 tls_config: ca_file: "/path/to/ca.pem" # CA根证书,验证Keycloak的HTTPS证书 receivers: otlp: protocols: http: grpc: # 接收InsideAppExporter的追踪数据 processors: batch: exporters: otlp: endpoint: "agent.example.com:4318" # Agent的OTLP HTTP端点 tls: insecure: false ca_file: "/path/to/ca.pem" # 验证Agent的服务端证书 auth: authenticator: oauth2client # 绑定OAuth2客户端扩展,自动获取并携带JWT service: extensions: [oauth2client] pipelines: traces: receivers: [otlp] processors: [batch] exporters: [otlp]
说明:OAuth2客户端扩展会自动从Keycloak获取JWT令牌,每次发送数据时带上;OTLP导出器启用TLS,确保和Agent的连接加密。
5. InsideAppExporter应用配置
如果要给应用到Collector的连接也加安全,可配置OTLP导出器启用TLS(可选,根据实际需求):
以Java SDK为例,用环境变量配置:
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com:4318 OTEL_EXPORTER_OTLP_TLS_CA_FILE=/path/to/ca.pem
如果Collector也配置了鉴权,还需添加OAuth2相关配置,否则保持上述配置即可。
参考资料
- 使用Keycloak保护OpenTelemetry端点
- 保护OpenTelemetry Collector(已过时)
- 认证器 - OAuth2客户端凭证(配置客户端Collector的导出器)
- 认证器 - OIDC(配置服务端Agent的接收器)
- cfssl(生成SSL密钥)
内容的提问来源于stack exchange,提问作者lei hua
相关产品推荐
相关产品推荐

