Collector 配置最佳实践

在配置 OpenTelemetry (OTel) Collector 时,请考虑以下最佳实践,以更好地保护您的 Collector 实例。

创建安全的配置

遵循以下指南来保护您的 Collector 的配置及其管道。

安全地存储您的配置

Collector 的配置可能包含敏感信息,包括

  • 身份验证信息,例如 API 令牌。
  • TLS 证书,包括私钥。

您应该安全地存储敏感信息,例如存储在加密的文件系统或密钥存储中。您可以使用环境变量来处理敏感和非敏感数据,因为 Collector 支持 环境变量扩展

使用加密和身份验证

您的 OTel Collector 配置应包含加密和身份验证。

  • 有关通信加密,请参阅 配置证书
  • 有关身份验证,请使用 OTel Collector 的身份验证机制,如 身份验证 中所述。

最小化组件数量

我们建议将 Collector 配置中的组件集限制为您需要的组件。最小化使用的组件数量可以减少暴露的攻击面。

谨慎配置

某些组件可能会增加您的 Collector 管道的安全风险。

  • 接收器、导出器和其他组件应通过安全的通道建立网络连接,并可能进行身份验证。
  • 接收器和导出器可能通过配置参数暴露缓冲区、队列、负载和工作进程设置。如果这些设置可用,您在修改默认配置值之前应谨慎行事。不当地设置这些值可能会使 OpenTelemetry Collector 面临额外的攻击向量。

仔细设置权限

避免以 root 用户运行 Collector。但是,某些组件可能需要特殊权限。在这种情况下,请遵循最小权限原则,确保您的组件仅拥有完成工作所需的访问权限。

观察器

观察器作为扩展来实现。扩展是一种组件,它可以在 Collector 的主要功能之上添加功能。扩展不需要直接访问遥测数据,也不属于管道的一部分,但如果它们需要特殊权限,仍然可能带来安全风险。

观察器代表 接收器创建者 发现网络端点,例如 Kubernetes pod、Docker 容器或本地监听端口。为了发现服务,观察器可能需要更大的访问权限。例如,k8s_observer 需要 Kubernetes 中的 基于角色的访问控制 (RBAC) 权限

管理特定的安全风险

配置您的 Collector 以阻止这些安全威胁。

防止拒绝服务攻击

对于类服务器接收器和扩展,您可以通过将这些组件的端点绑定到限制连接到授权用户的地址来保护您的 Collector 免受公共互联网或比必需更广泛网络的暴露。尽量始终使用特定接口,例如 pod 的 IP 或 localhost,而不是 0.0.0.0。有关更多信息,请参阅 CWE-1327:绑定到不受限制的 IP 地址

从 Collector v0.110.0 开始,所有 Collector 组件中所有服务器的默认主机是 localhost。对于早期版本的 Collector,通过启用 功能门 component.UseLocalHostAsDefaultHost,将所有组件的默认端点从 0.0.0.0 更改为 localhost

如果由于您的 DNS 设置,localhost 解析为不同的 IP,则显式使用回环 IP:IPv4 为 127.0.0.1,IPv6 为 ::1。例如,以下是使用 gRPC 端口的 IPv4 配置

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 127.0.0.1:4317

在 IPv6 设置中,请确保您的系统支持 IPv4 和 IPv6 回环地址,以便网络在双栈环境和应用程序(其中使用两种协议版本)中正常运行。

如果您在具有非标准网络设置的环境中工作,例如 Docker 或 Kubernetes,localhost 可能无法按预期工作。以下示例显示了 OTLP 接收器 gRPC 端点的设置。其他 Collector 组件可能需要类似的配置。

Docker

您可以通过绑定到正确的地址在 Docker 中运行 Collector。以下是 Docker 中 OTLP 导出器的 config.yaml 配置文件

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: my-hostname:4317 # Use the same hostname from your docker run command

在您的 docker run 命令中,使用 --hostname 参数将 Collector 绑定到 my-hostname 地址。您可以从该 Docker 网络外部(例如,在主机上运行的常规程序)访问 Collector,方法是连接到 127.0.0.1:4567。以下是一个 docker run 命令示例

docker run --hostname my-hostname --name container-name -p 127.0.0.1:4567:4317 otel/opentelemetry-collector:0.142.0

Docker Compose

与普通 Docker 类似,您可以通过绑定到正确的地址在 Docker 中运行 Collector。

Docker compose.yaml 文件

services:
  otel-collector:
    image: otel/opentelemetry-collector-contrib:0.142.0
    ports:
      - '4567:4317'

Collector config.yaml 文件

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: otel-collector:4317 # Use the service name from your Docker compose file

您可以通过连接到 otel-collector:4317 从同一网络中运行的其他 Docker 容器连接到此 Collector。您可以从该 Docker 网络外部(例如,在主机上运行的常规程序)访问 Collector,方法是连接到 127.0.0.1:4567

Kubernetes

如果您将 Collector 作为 DaemonSet 运行,您可以使用类似以下的配置

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: collector
spec:
  selector:
    matchLabels:
      name: collector
  template:
    metadata:
      labels:
        name: collector
    spec:
      containers:
        - name: collector
          image: otel/opentelemetry-collector:0.142.0
          ports:
            - containerPort: 4317
              hostPort: 4317
              protocol: TCP
              name: otlp-grpc
            - containerPort: 4318
              hostPort: 4318
              protocol: TCP
              name: otlp-http
          env:
            - name: MY_POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP

在此示例中,您使用 Kubernetes Downward API 来获取您自己的 Pod IP,然后绑定到该网络接口。然后,我们使用 hostPort 选项来确保 Collector 在主机上公开。Collector 的配置应如下所示

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: ${env:MY_POD_IP}:4317
      http:
        endpoint: ${env:MY_POD_IP}:4318

您可以通过访问 ${MY_HOST_IP}:4317(用于通过 gRPC 发送 OTLP)和 ${MY_HOST_IP}:4318(用于通过 HTTP 发送 OTLP)来从节点上的任何 Pod 向此 Collector 发送 OTLP 数据,其中 MY_HOST_IP 是节点的 IP 地址。您可以从 Downward API 获取此 IP

env:
  - name: MY_HOST_IP
    valueFrom:
      fieldRef:
        fieldPath: status.hostIP

擦除敏感数据

处理器是位于接收器和导出器之间的 Collector 组件。它们负责在遥测数据被分析之前对其进行处理。您可以使用 OpenTelemetry Collector 的 redaction 处理器在将其导出到后端之前混淆或擦除敏感数据。

redaction 处理器会删除不匹配允许属性列表的 span、log 和 metric 数据点属性。它还会屏蔽与阻止值列表匹配的属性值。不在允许列表中的属性在进行任何值检查之前就会被删除。

例如,以下是一个屏蔽包含信用卡号的配置

processors:
  redaction:
    allow_all_keys: false
    allowed_keys:
      - description
      - group
      - id
      - name
    ignored_keys:
      - safe_attribute
    blocked_values: # Regular expressions for blocking values of allowed span attributes
      - '4[0-9]{12}(?:[0-9]{3})?' # Visa credit card number
      - '(5[1-5][0-9]{14})' # MasterCard number
    summary: debug

请参阅 文档,了解如何将 redaction 处理器添加到您的 Collector 配置中。

保护资源利用

在您的 托管基础架构 中实施资源利用安全措施后,请考虑将这些安全措施也添加到您的 OpenTelemetry Collector 配置中。

对遥测数据进行批处理并限制 Collector 的可用内存可以防止出现内存不足错误和使用量激增。您还可以通过调整队列大小来管理内存使用,同时避免数据丢失,从而应对流量峰值。例如,使用 exporterhelper 来管理 otlp 导出器的队列大小

exporters:
  otlp:
    endpoint: <ENDPOINT>
    sending_queue:
      queue_size: 800

过滤不需要的遥测数据是保护 Collector 资源的另一种方法。过滤不仅可以保护您的 Collector 实例,还可以减少后端负载。您可以使用 filter 处理器 来丢弃您不需要的日志、指标和 span。例如,这是一个丢弃非 HTTP span 的配置

processors:
  filter:
    error_mode: ignore
    traces:
      span:
        - attributes["http.request.method"] == nil

您还可以为组件配置适当的超时和重试限制。这些限制应允许您的 Collector 在不累积过多内存数据的情况下处理故障。有关更多信息,请参阅 exporterhelper 文档

最后,考虑使用导出器的压缩功能来减小数据的发送大小,并节省网络和 CPU 资源。默认情况下,otlp 导出器 使用 gzip 压缩。