当前位置: 首页 > Linux

为PrometheusNodeExporter添加认证

时间:2023-04-06 06:49:22 Linux

本文主要是为了庆祝NodeExporterv1.0.0版本上线。Prometheus是SoundCloud开源的最早的监控告警解决方案。并且已经成长为继Kubernetes之后第二个从CNCF毕业的项目。随着云原生概念的普及和Kubernetes等技术的发展,Prometheus在监控领域也取得了长足的进步。其主要组件包括Prometheus、Alertmanager、NodeExporter、BlackboxExporter和Pushgateway等。这篇文章主要是为了庆祝NodeExporter终于迎来了v1.0.0版本,所以重点主要放在与安全相关的问题上受到批评,特别是使用TLS和BasicAuth来提高其安全性。BackgroundNodeExporter是Prometheus官方发布的,用于收集节点的系统信息,如CPU、内存、磁盘和网络信息。通常情况下,如果我们使用Prometheus作为监控方案,基本都会用到NodeExporter。在Promethues监控系统中,社区一直存在一种观点,认为Metrics中不包含过于隐私的信息。所以正如你所看到的,大部分/metrics接口都是直接暴露的,没有特殊的安全措施。但随着Prometheus在生产中的广泛应用,安全问题变得更加重要。大家第一个想到的方案就是为Prometheus和监控目标的连接开启TLS。但是由于各种exporter本身并不支持TLS连接,所以我们通常会选择配合反向代理来完成。这种方法可以满足需要,但是稍微复杂一些。最近,Prometheus修改了它的安全模型。从NodeExporter到后续的其他组件,都会支持TLS和basicauth,同时还列出了最新的安全基准(默认支持TLSv1.2及以上版本)UsingTLS这里我们直接练习看看如何开启TLS。准备证书(MoeLove)?~mkdir-pprometheus-tls(MoeLove)?~cdprometheus-tls(MoeLove)?prometheus-tlsopensslreq-new-newkeyrsa:2048-days365-nodes-x509-keyoutnode_exporter.key-outnode_exporter.crt-subj"/C=CN/ST=Beijing/L=Beijing/O=Moelove.info/CN=localhost"正在生成RSA私钥...............................................++++..++++将新私钥写入“node_exporter.key'-----(MoeLove)?prometheus-tlslsnode_exporter.crtnode_exporter.key通过以上步骤,我们得到了node_exporter.crt和node_exporter.key这两个文件。NodeExporter使用TLS下载v1.0.0版本的NodeExporter并解压(MoeLove)?/tmptar-zxvfnode_exporter-1.0.0.linux-amd64.tar.gznode_exporter-1.0.0.linux-amd64/node_exporter-1.0.0.linux-amd64/node_exporternode_exporter-1.0.0.linux-amd64/NOTICEnode_exporter-1.0.0.linux-amd64/LICENSE(萌爱)?/tmpcdnode_exporter-1.0.0.linux-amd64(萌爱)?node_exporter-1.0.0.linux-amd64lsLICENSEnode_exporterNOTICE将之前生成的node_exporter.crt和node_exporter.key这两个文件复制到当前目录。(MoeLove)?node_exporter-1.0.0.linux-amd64cp~/prometheus-tls/node_exporter.*.(MoeLove)?node_exporter-1.0.0.linux-amd64lsLICENSEnode_exporternode_exporter.crtnode_exporter.key注意写入配置文件,并将其保存为config.yaml(随机命名):tls_server_config:cert_file:node_exporter.crtkey_file:node_exporter.key接下来,使用--web.config将配置文件传递给NodeExporter(MoeLove)?node_exporter-1.0.0。linux-amd64./node_exporter--web.config=config.yamllevel=infots=2020-05-26T17:50:12.123Zcaller=node_exporter.go:177msg="Startingnode_exporter"version="(version=1.0.0,branch=HEAD,revision=b9c96706a7425383902b6143d097cf6d7cfd1960)"level=infots=2020-05-26T17:50:12.124Zcaller=node_exporter.go:178msg="Buildcontext"build_user=="(go=3,go1.root@3e55cc20ccc0,date=20200526-06:01:48)"level=infots=2020-05-26T17:50:12.130Zcaller=node_exporter.go:105msg="Enabledcollectors"...level=infots=2020-05-26T17:50:12.135Zcaller=tls_config.go:200msg="TLS已启用而且不能即时关闭。”http2=true当你看到日志的最后一句时,说明你的NodeExporter开启了TLS连接当然,我们也可以选择手动验证:#直接curl请求(MoeLove)?prometheus-tlscurllocalhost:9100/metricsClient向HTTPS服务器发送HTTP请求。(萌爱)?prometheus-tlscurlhttps://localhost:9100/metricscurl:(60)SSL证书问题:自签名证书更多详情此处:https://curl.haxx.se/docs/sslcerts.htmlcurl无法验证服务器的合法性,因此可能会注意到与它的安全连接。要了解有关此情况的更多信息以及如何修复它,请访问上面提到的网页,可以看到不能直接使用curl请求,我们可以将证书传给curl来验证刚才的配置是否正确。(MoeLove)?prometheus-tlscurl-s--cacertnode_exporter.crthttps://localhost:9100/metrics|grepnode_exporter_build_info#HELPnode_exporter_build_info具有常量“1”值的指标,由版本、修订、分支和政府标记#TYPEnode_exporter_build_infogaugenode_exporter_build_info{branch="HEAD",goversion="go1.14.3",revision="b9c96706a7425383902b6143d097cf6d7cfd1960",version="1.0exceptthecertificatepassed"当然}1.0。除了传递给curl,还可以传递-k参数来忽略证书检查。(MoeLove)?prometheus-tlscurl-s-khttps://localhost:9100/metrics|grepnode_exporter_build_info#HELPnode_exporter_build_info具有常量“1”值的指标,由node_exporter所在的版本、修订、分支和治理标记built.#TYPEnode_exporter_build_infogaugenode_exporter_build_info{branch="HEAD",goversion="go1.14.3",revision="b9c96706a7425383902b6143d097cf6d7cfd1960",version="1.0.0"}1通过HTTPS配置PrometheusPrometheus从NodeExporter获取指标。安装过程很简单,直接下载最新的二进制版本,或者直接使用Docker镜像即可。注意,我把上面颁发的证书复制到了当前目录下。(MoeLove)?prometheus-2.18.1.linux-amd64cp~/prometheus-tls/node_exporter.crt.(MoeLove)?prometheus-2.18.1.linux-amd64lsconsole_libraries控制台许可证node_exporter.crt接下来,您需要修改配置文件,以便Prometheus可以捕获NodeExporter公开的指标。全局:scrape_interval:15sevaluation_interval:15sscrape_configs:-job_name:'prometheus'static_configs:-目标:['localhost:9090']-job_name:'node_exporter'方案:httpstls_config:ca_file:node_exporter.crtstatic_configs:[-目标'localhost:9100']这里额外添加scheme:https表示通过HTTPS建立连接,使用的证书文件在tls_config中指定。完整配置请参考官方文档中tls_config的说明。最后启动Prometheus,在浏览器中访问/targets。如果您在端点中看到https://localhost:9100/metrics,那么恭喜您,Prometheus和NodeExporter已经通过TLS连接。添加基本??身份验证上面,我已经介绍了如何在Prometheus和NodeExporter之间使用TLS连接。接下来,我将向您介绍如何添加基本身份验证。这里需要注意的是BasicAuth和TLS并不是强依赖的。您可以在不启用TLS的情况下使用BasicAuth,但我个人的建议是彻底完成并同时启用它。为NodeExporter配置密码,我们可以直接使用htpasswd生成bcrypt密码哈希(这个工具想必大家都很熟悉)。(MoeLove)?prometheus-tlshtpasswd-nBC12''|tr-d':\n'Newpassword:Re-typenewpassword:$2y$12$WLw2sYa.NYZoBVoCOE84qe3xNm7kbSoKVIBXP.PvqNDna60vnZhEW这里我只用它来生成密码哈希,没有传递用户名。接下来修改上面提到的NodeExporter使用的配置文件,如下:tls_server_config:cert_file:node_exporter.crtkey_file:node_exporter.keybasic_auth_users:#当前设置的用户名为prometheus,可以设置多个prometheus:$2y$12$WLw2sYa.NYZoBVoCOE84qe3xNm7kbSoKVIBXP.PvqNDna60vnZhEW再次启动NodeExporter,使用curl请求metrics接口,可以看到当前返回的是401。(MoeLove)?prometheus-tlscurl-Ikhttps://127.0.0.1:9100/metricsHTTP/1.1401UnauthorizedContent-Type:text/plain;charset=utf-8Www-Authenticate:BasicX-Content-Type-Options:nosniffDate:Wed,27May202011:45:16GMTContent-Length:13打开Prometheus的Targets页面,也会看到当前提示401,无法获取指标。配置Prometheus使用BasicAuth接下来只要修改Prometheus配置文件,在其中添加basic_auth配置项即可。全局:scrape_interval:15sevaluation_interval:15sscrape_configs:-job_name:'prometheus'static_configs:-目标:['localhost:9090']-job_name:'node_exporter'方案:httpstls_config:ca_file:node_exporter。:moelove.infostatic_configs:-targets:['localhost:9100']修改配置文件后,让Prometheus重新加载配置文件即可:(MoeLove)?killall-HUPprometheus现在刷新PrometheusTargets页面,可以看到Metrics有被正常捕获。总结本文介绍如何开启Prometheus与NodeExporter的TLS连接,以及开启NodeExporter的BasicAuth认证。在此之前,可能有小伙伴会通过添加逆向生成来完成,例如:为NodeExporter添加Basicauthentication在生产中使用时,建议进行更规范的操作,例如CA选择,密码管理等,例如作为NodeExporter的BasicAuth实际上支持配置多个用户名和密码。接下来,在Prometheus官方提供的基础组件中,会逐步推进对本文提到的安全特性的支持,包括Prometheus、Alertmanager、Pushgateway和官方exporter,后续社区提供的exporter可能会逐步跟进。进入。最后再次恭喜NodeExporter迎来v1.0.0版本。欢迎订阅我的文章公众号【MoeLove】