前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenTelemetry(05): Otel Collector Contrib 添加鉴权支持,增加安全

OpenTelemetry(05): Otel Collector Contrib 添加鉴权支持,增加安全

作者头像
老麦
发布2023-10-09 18:09:12
3580
发布2023-10-09 18:09:12
举报
文章被收录于专栏:Go与云原生Go与云原生

大家好, 我是 老麦, 一个运维老兵, 现在专注于 Golang,DevOps,云原生基础设施建设。

OpenTelemetry(05): Otel Collector Contrib 添加鉴权支持,增加安全

建议点击 查看原文 查看最新内容。

原文链接: https://typonotes.com/posts/2023/10/07/otel-collector-contrib-with-auth-supportive/

之前我在 OpenTelemetry(1): Golang 接入 OpenTelemetry 完整过程和思路(附源码)- Gin Demo 中提到过, 使用 Otel Collector Contrib 作为中间件 解耦 应用和数据平台。

1. 遇到的困境

此前并没有提到 Otel Collector Contrib 限制接入的问题。

测试的时候在 K8S 集群内部, 服务不对外, 无需鉴权。但在团队内部推广并上线之后, 就遇到了各种各样的新需求。最直接的是 Otel 服务要对外暴露到公网

由于没有之前的配置没有鉴权限制, 因此 只要知道服务的地址和端口, 就能给发数据, 这是一个严重的隐患。

2. 解决的方法

在研究了 opentelemetry-collector-contrib[1] 的代码后, 发现其提供多种鉴权方式。

所有支持鉴权方式都在 extension 目录下, 这里列举部分

  1. basic auth extension
  2. bearer token auth extension
  3. oauth2client auth extension
  4. oidc auth extension
  5. 其他 ...

每种鉴权方式的配置不一样, 详细的可以参考各自目录下的 README.md 中的内容。

下面说一下 basic 和 token 两种鉴权方式

2.1. Basic Auth Extension

Basic Auth Extension[2] 这种方法就是 http basic 鉴权, 就是我们通常遇到的 账号:密码 鉴权。

2.1.1 服务端配置

支持两种方式将提供 鉴权账号: 文件文本

代码语言:javascript
复制
extensions:
  basicauth/server:
    htpasswd: 
      file: .htpasswd   # 来自文件
      inline: |         # 来自文本
        ${env:BASIC_AUTH_USERNAME}:${env:BASIC_AUTH_PASSWORD} 

Demo 配置如下

代码语言:javascript
复制
# 1. 添加扩展, 制定 basicauth 扩展的 “名称”, 设置账号密码
extensions:
  basicauth/server:
    htpasswd: 
      inline: |
        ${AUTH_USER}:${AUTH_PASS}

# 2. 在 recivers 中使用 “扩展名称”
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: "0.0.0.0:${GRPC_PORT}"
        auth:
          authenticator: basicauth/server
      http:
        endpoint: "0.0.0.0:${HTTP_PORT}"
        auth:
          authenticator: basicauth/server

# 3. 启用对应名称的 扩展
service:
  extensions: [basicauth/server]

2.1.2. 客户端配置

由于使用的是 http basic 规则, 因此账号密码。

  1. 需要满足使用 冒号 user:pass 连接。
  2. authorization 的值为 Basic base64(value)。类型为 Basic, 值须要使用 base64 编码。

关于 Authorizaion Header 可以参考扩展文章 API 授权为啥要在 Authorization 标头里加个 Bearer?[3]

以下是代码客户端部分代码提示

代码语言:javascript
复制
// golang
var (
    UserPass = "auth_user:auth_pass_123"
    base64userpass = fmt.Sprintf("Basic %s", base64.StdEncoding.EncodeToString([]byte(UserPass)))
)

在客户端发送请求的时候需要加上 authorizationAuthorization 请求头。请求头 首字母使用大小写都可以, 服务端有兼容判断。

在客户端创建 Exporter 的时候, 需要使用 WithHeader 方法添加对应的值

代码语言:javascript
复制
// golang

// GRPC demo: Set up a trace exporter
traceExporter, err := otlptracegrpc.New(
    ctx,
    otlptracegrpc.WithGRPCConn(conn),
    otlptracegrpc.WithHeaders(
        map[string]string{
            "authorization": base64userpass,
        },
    ),
)


// HTTP demo: Set up a trace exporter
opts := []otlptracehttp.Option{
    otlptracehttp.WithTimeout(5 * time.Second),
    otlptracehttp.WithEndpoint(endpoint),
    otlptracehttp.WithInsecure(),
    otlptracehttp.WithHeaders(
        map[string]string{
            "authorization": base64userpass,
        },
    ),
}

traceExporter, err := otlptracehttp.New(ctx, opts...)

2.2. Bearer Token Auth Extension

Bearer Token Auth Extension[4] 也是常见的鉴权方法。

注意:BearerTokenAuthExtension 目前(v0.86.0) 只能在 GRCP 协议成功生效。用于 HTTP 协议的时候始终返回 401 Unauthorized 错误, 经探查 请求数据根本没有到达本扩展

2.2.1. 服务端配置

本扩展支持 默认、自定义 Schema, 以达到兼容目的。

代码语言:javascript
复制
extensions:
  bearertokenauth:  # 默认 Schema: Bearer
    token: "somerandomtoken"            # 文本指定
    filename: "file-containing.token"   # 来自文件
  bearertokenauth/withscheme: # 支持用户自定 Schema 
    scheme: "Bearer" 
    token: "randomtoken"

其他配置与 2.1.1. 服务端配置 相似, 不赘述。

2.2.2. 客户端配置

客户端配置与 2.1.2. 客户端配置 相似, 不赘述。

代码语言:javascript
复制
// golang

var (
    BearerAuthToken = "random-token"
    bearertoken     = fmt.Sprintf("Bearer %s", BearerAuthToken)
)

// GRPC: Set up a trace exporter
traceExporter, err := otlptracegrpc.New(
    ctx,
    otlptracegrpc.WithGRPCConn(conn),
    otlptracegrpc.WithHeaders(
        map[string]string{
            "authorization": bearertoken,
        },
    ),
)
// HTTP: Set up a trace exporter
opts := []otlptracehttp.Option{
    otlptracehttp.WithTimeout(5 * time.Second),
    otlptracehttp.WithEndpoint(endpoint),
    otlptracehttp.WithInsecure(),
    otlptracehttp.WithHeaders(
        map[string]string{
            "authorization": bearertoken,
        },
    ),
}

参考资料

[1]

opentelemetry-collector-contrib: https://github.com/open-telemetry/opentelemetry-collector-contrib

[2]

Basic Auth Extension: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/extension/basicauthextension

[3]

API 授权为啥要在 Authorization 标头里加个 Bearer?: https://learnku.com/articles/68715

[4]

Bearer Token Auth Extension: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/extension/bearertokenauthextension

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 熊猫云原生Go 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • OpenTelemetry(05): Otel Collector Contrib 添加鉴权支持,增加安全
  • 1. 遇到的困境
  • 2. 解决的方法
    • 2.1. Basic Auth Extension
      • 2.1.1 服务端配置
      • 2.1.2. 客户端配置
    • 2.2. Bearer Token Auth Extension
      • 2.2.1. 服务端配置
      • 2.2.2. 客户端配置
      • 参考资料
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档