Collector 配置最佳实践
在配置 OpenTelemetry (OTel) Collector 时,请考虑以下最佳实践,以更好地保护您的 Collector 实例。
创建安全的配置
遵循以下指南来保护您的 Collector 的配置及其管道。
安全地存储您的配置
Collector 的配置可能包含敏感信息,包括
- 身份验证信息,例如 API 令牌。
- TLS 证书,包括私钥。
您应该安全地存储敏感信息,例如存储在加密的文件系统或密钥存储中。您可以使用环境变量来处理敏感和非敏感数据,因为 Collector 支持 环境变量扩展。
使用加密和身份验证
您的 OTel Collector 配置应包含加密和身份验证。
最小化组件数量
我们建议将 Collector 配置中的组件集限制为您需要的组件。最小化使用的组件数量可以减少暴露的攻击面。
- 使用 OpenTelemetry Collector Builder (
ocb) 来创建仅使用您所需组件的 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 压缩。