安全模型

浏览 0      扫码          2019-11-23 12:09:29     码农文档      译文原文 英文原文

公告:如果您也想加入翻译队伍,或者您有相关中文文档想要贡献给大家,请联系coderdocument@163.com ,谢谢!

Prometheus是一个复杂的系统,有许多组件并与其他系统集成。它可以部署在各种受信任和不受信任的环境中。

本页描述Prometheus的一般安全假设和一些可以通过配置启用的攻击向量。

对于任何复杂的系统,都不可能保证没有bug。如果你发现了一个安全问题,请向相关仓库中的MAINTAINERS.md中列出的维护人员报告并抄送至prometheus-team@googlegroups.com。我们将修复这个问题,并与你协调发布日期,对你的努力表示感谢,如果你愿意,我们还会提到你的名字。

Prometheus

Prometheus假定不受信任的用户可以访问Prometheus HTTP端点和日志。他们可以访问数据库中包含的所有时间序列信息,以及各种操作和调试信息。

Prometheus还假定只有受信任的用户才有能力更改Prometheus和其他组件的运行时环境的命令行、配置文件、规则文件和其他组件。

Prometheus抓取的目标,频率和其他设置完全由配置文件决定。管理员可以决定是否使用来自服务发现系统的信息,这些信息与重新标记相结合,可以将部分控制权授予任何可以修改该服务发现系统中的数据的人。

被抓取的目标可能由不受信任的用户运行。在默认情况下,目标不会暴露模拟其他目标的数据。honor_labels 选项可以移除这种保护,这样可以进行某些重新标记。

从Prometheusv2.0开始, --web.enable-admin-api 选项控制对管理HTTP API的访问,其中包括删除时间序列等功能。这是默认禁用的。如果启用了,可以在/api/*/admin/路径下访问管理和修改功能。 --web.enable-lifecycle选项控制Prometheus的HTTP重新加载和关闭。在默认情况下,这也是禁用的。如果启用,它们可以通过/-/reload/-/quit路径访问。

Prometheusv1.x中,任何可以访问HTTP API的用户都可以访问/-/reload并且可以通过DELETE方法访问/api/v1/series 。默认情况下,/-/quit 端点是禁用的,但是可以使用-web.enable-remote-shutdown选项进行启用。

远程读取功能允许任何具有HTTP访问权限的用户将查询发送到远程读取端点。例如,如果PromQL查询最终直接在关系数据库上运行,那么任何能够将查询发送到Prometheus(例如通过Grafana)的用户都可以在该数据库上运行任意SQL。

Alertmanager

任何可以访问Alertmanager HTTP端点的用户都可以访问它的数据。它们可以创建和解析告警。它们可以创建、修改和删除静默策略。

将通知发送到何处由配置文件决定。在某些模板设置中,通知可能会到达告警定义的目的地。例如,如果通知使用告警标签作为目标电子邮件地址,那么任何可以向Alertmanager发送告警的用户都可以将通知发送到任何电子邮件地址。如果告警定义的目的地是一个可模板化的秘密字段,那么任何能够访问Prometheus或Alertmanager的用户都可以查看秘密(secret)。

在上面的场景中,任何可模板化的秘密字段都是用于路由通知的。它们并不是使用模板文件特性将秘密从配置文件中分离出来的一种方法。任何能够在Alertmanager配置文件中配置接收者的用户都可以窃取存储在模板文件中的秘密。例如,在大型设置中,每个团队可能有一个他们完全控制的Alertmanager配置文件片段,然后将其合并到完整的最终配置文件中。

Pushgateway

任何可以访问Pushgateway HTTP端点的用户都可以创建、修改和删除其中包含的指标。因为推送网关通常是启用honor_labels 的,这意味着任何访问推送网关的用户都可以在Prometheus中创建任意时间序列。

--web.enable-admin-api选项控制对管理HTTP API的访问,其中包括清除所有现有指标组等功能。这是默认禁用的。如果启用,可以通过 /api/*/admin/路径访问管理功能。

导出器

导出器通常只与一个带有预设命令或请求集合的已配置实例进行通信,这些命令和请求集合不能通过其HTTP端点展开。

还有SNMP和Blackbox之类的导出器,它们从URL参数获取目标。因此,任何能够访问这些导出器的用户都可以让它们将请求发送到任意端点。由于它们还支持客户端身份认证,这可能导致HTTP Basic认证的密码或SNMP社区字符串等机密信息泄露。诸如TLS之类的挑战-响应身份认证机制不受此影响。

客户端库

客户端库将包含在用户的应用程序中。

如果使用客户端库提供的HTTP处理器,那么到达该处理器的恶意请求就不可能造成过载和失败故障范围之外的问题。

认证、授权和加密

Prometheus及其组件不提供任何服务器端身份认证、授权或加密。如果需要这样做,建议使用反向代理。

由于管理端点和修改(mutating)端点是通过简单的工具(如curl)访问的,所以没有内置的CSRF保护,因为这会破坏这种使用场景。因此,在使用反向代理时,你可能希望阻塞这些路径以防止CSRF。

对于非修改端点,你可能希望在反向代理中设置CORS头,例如Access-Control-Allow-Origin,以防止XSS

如果你正在编写PromQL查询,其中包括来自不受信任的用户的输入(例如控制台模板的URL参数,或者你自己构建的一些输入),而这些用户不能运行任意的PromQL查询,那么请确保适当地转义了任何不受信任的输入,以防止注入攻击。例如,如果 <user_input>"} or some_metric{zzz=",则 up{job="<user_input>"}变为 up{job=""} or some_metric{zzz=""}

对于使用Grafana的用户,请注意仪表盘权限不是数据源权限,因此不要限制用户在代理模式下运行任意查询的权限。

各种Prometheus组件支持客户端认证和加密。如果提供了TLS客户端支持,通常还会有一个名为insecure_skip_verify的选项,用于跳过SSL认证。

Secret

非机密信息或字段可以通过HTTP API和日志获取。

在Prometheus中,从服务发现检索到的元数据并不被认为是机密的。在整个Prometheus系统中,指标并不是机密的。

配置文件中包含机密的字段(在文档中显式地标记为此类字段)不会出现在日志中或通过HTTP API进行暴露。机密信息不应该放在其他配置字段中,因为组件通常会在其HTTP端点上暴露其配置。

依赖使用的其他来源的机密信息(例如,EC2服务发现使用的AWS_SECRET_KEY环境变量)可能会由于我们控制之外的代码或由于存储它的任何地方都可能暴露的功能而最终暴露出来。

服务拒绝

对于过度负载或重级查询,有一些缓解措施。但是,如果提供了太多或重量级的查询或指标,组件就会崩溃。组件被可信用户意外取出的可能性比被恶意操作取出的可能性更大。

用户有责任确保为组件提供足够的资源,包括CPU、RAM、磁盘空间、IOPS、文件描述符和带宽。

建议监控所有组件的故障,并在故障时自动重启它们。

本文档考虑从库存源代码构建的普通二进制文件。如果你修改了Prometheus的源代码,或者在你自己的代码中使用了Prometheus的内部机制(官方客户端库API除外),那么这里提供的信息将不适用。

建构过程

Prometheus的构建管道运行在第三方提供商上,Prometheus开发团队的许多成员和这些提供商的员工都可以访问第三方提供商。如果你关心二进制文件的确切来源,建议自己构建它们,而不是依赖于项目提供的预先构建的二进制文件。

外部审计

2018年4月至6月,CNCF发起了由cure53进行的外部安全审计。

有关详情,请参阅最终审计报告

返回顶部