为 Prometheus Node Exporter 加上认证

2023-11-09

这篇文章主要是为了庆祝 Node Exporter 终于迎来了 v1.0.0 版本。

Prometheus ( https://prometheus.io/ ) 是最早由 SoundCloud 开源的监控告警解决方案。并已经成长为继 Kubernetes 之后,第二个从 CNCF 毕业的项目。伴随着云原生理念的普及和 Kubernetes 等技术的发展, Prometheus 在监控领域也有了长足的发展。

其主要组件包括 Prometheus,Alertmanager,Node Exporter,Blackbox Exporter 和 Pushgateway 等。

本文主要是为了庆祝 Node Exporter 终于迎来了 v1.0.0 版本, 所以重点主要放在一直被人诟病的安全性相关上,具体而言就是利用 TLS 和 Basic Auth 提升其安全性。

1

   

背景

Node Exporter 是 Prometheus 官方发布的,用于采集节点的系统信息,比如 CPU,内存,磁盘和网络等信息。通常情况下,如果我们在使用 Prometheus 作为监控方案,那 Node Exporter 基本都会用到的。

在 Promethues 的监控体系中,社区中一直存在的一个观点是,Metrics 不包含过于私密的信息。所以你可以看到,大多数的 /metrics 接口都是直接暴露出来的,没什么特别的安全措施。

但随着 Prometheus 在生产中的大量应用,安全问题变得更加重要。

大家最先想到的解决办法就是,为 Prometheus 与监控目标之间的连接启用 TLS。但由于各类 exporter 并不原生支持 TLS 连接,所以通常情况下我们会选择配合反向代理 ( https://prometheus.io/docs/guides/tls-encryption/ )来完成。

这种方式能满足需求,但未免复杂了些。近期 Prometheus 对其安全模型做了修改 , 从 Node Exporter 开始到后续其他的组件,都将支持 TLS 和 basic auth, 同时也列出了最新的安全基准(默认情况下都支持 TLS v1.2 及以上)

2

   

使用 TLS

这里我们直接实践下看看如何启用 TLS 。

2.1

   

准备证书

(MoeLove) ➜  ~ mkdir -p prometheus-tls
(MoeLove) ➜  ~ cd prometheus-tls
(MoeLove) ➜  prometheus-tls openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout node_exporter.key -out node_exporter.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=Moelove.info/CN=localhost"
Generating a RSA private key
...........................................+++++
..+++++
writing new private key to 'node_exporter.key'
-----
(MoeLove) ➜  prometheus-tls ls
node_exporter.crt  node_exporter.key

通过上面的步骤,我们得到了 node_exporter.crt 和node_exporter.key 这两个文件。

2.2

   

Node Exporter 使用 TLS

下载 v1.0.0 版本的 Node Exporter ( https://github.com/prometheus/node_exporter/releases/tag/v1.0.0 ), 并对其进行解压等操作

(MoeLove) ➜  /tmp tar -zxvf node_exporter-1.0.0.linux-amd64.tar.gz 
node_exporter-1.0.0.linux-amd64/
node_exporter-1.0.0.linux-amd64/node_exporter
node_exporter-1.0.0.linux-amd64/NOTICE
node_exporter-1.0.0.linux-amd64/LICENSE
(MoeLove) ➜  /tmp cd node_exporter-1.0.0.linux-amd64 
(MoeLove) ➜  node_exporter-1.0.0.linux-amd64 ls
LICENSE  node_exporter  NOTICE

复制前面生成的 node_exporter.crt 和node_exporter.key 这两个文件到当前目录下。

(MoeLove) ➜  node_exporter-1.0.0.linux-amd64 cp ~/prometheus-tls/node_exporter.* .
(MoeLove) ➜  node_exporter-1.0.0.linux-amd64 ls
LICENSE  node_exporter  node_exporter.crt  node_exporter.key  NOTICE

编写配置文件,并保存为 config.yaml (命名随意):

tls_server_config:
  cert_file: node_exporter.crt
  key_file: node_exporter.key

接下来就使用 --web.config 将配置文件传递给 Node Exporter

(MoeLove) ➜  node_exporter-1.0.0.linux-amd64 ./node_exporter --web.config=config.yaml
level=info ts=2020-05-26T17:50:12.123Z caller=node_exporter.go:177 msg="Starting node_exporter" version="(version=1.0.0, branch=HEAD, revision=b9c96706a7425383902b6143d097cf6d7cfd1960)"
level=info ts=2020-05-26T17:50:12.124Z caller=node_exporter.go:178 msg="Build context" build_context="(go=go1.14.3, user=root@3e55cc20ccc0, date=20200526-06:01:48)" 
level=info ts=2020-05-26T17:50:12.130Z caller=node_exporter.go:105 msg="Enabled collectors"
...
level=info ts=2020-05-26T17:50:12.135Z caller=tls_config.go:200 msg="TLS is enabled and it cannot be disabled on the fly." http2=true

当你看到最后这句日志时,就说明你的 Node Exporter 已经启用了 TLS 连接。

当然,我们也可以选择手动验证下:

# 直接 curl 请求
(MoeLove) ➜  prometheus-tls curl localhost:9100/metrics
Client sent an HTTP request to an HTTPS server.


(MoeLove) ➜  prometheus-tls curl https://localhost:9100/metrics                 
curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.haxx.se/docs/sslcerts.html


curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

可以看到不能直接 curl 进行请求了,我们可以将证书传递给 curl ,用来验证刚才的配置是否正确。

(MoeLove) ➜  prometheus-tls curl -s  --cacert node_exporter.crt https://localhost:9100/metrics  |grep node_exporter_build_info
# HELP node_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, and goversion from which node_exporter was built.
# TYPE node_exporter_build_info gauge
node_exporter_build_info{branch="HEAD",goversion="go1.14.3",revision="b9c96706a7425383902b6143d097cf6d7cfd1960",version="1.0.0"} 1

当然,除了通过 --cacert 参数将证书传递给 curl 外,也可以通过 -k 参数来忽略证书检查。

(MoeLove) ➜  prometheus-tls curl -s  -k https://localhost:9100/metrics  |grep node_exporter_build_info        
# HELP node_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, and goversion from which node_exporter was built.
# TYPE node_exporter_build_info gauge
node_exporter_build_info{branch="HEAD",goversion="go1.14.3",revision="b9c96706a7425383902b6143d097cf6d7cfd1960",version="1.0.0"} 1

2.3

   

配置 Prometheus 使用 TLS

接下来,我们就要配置 Prometheus 通过 HTTPS 从 Node Exporter 获取指标了。安装过程很简单,无论直接下载最新的二进制版本,或是直接使用 Docker 镜像均可。

注意,我这里把上文中签发的证书复制到了当前目录中。

(MoeLove) ➜  prometheus-2.18.1.linux-amd64 cp ~/prometheus-tls/node_exporter.crt .
(MoeLove) ➜  prometheus-2.18.1.linux-amd64 ls
console_libraries  consoles  LICENSE  node_exporter.crt  NOTICE  prometheus  prometheus.yml  promtool  tsdb

接下来,需要修改下配置文件,让 Prometheus 可以抓取 Node Exporter 暴露的 metrics 。

global:
  scrape_interval:     15s 
  evaluation_interval: 15s


scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']


  - job_name: 'node_exporter'
    scheme: https
    tls_config:
      ca_file: node_exporter.crt
    static_configs:
    - targets: ['localhost:9100']

这里额外增加了 scheme: https 表示通过 HTTPS 建立连接,tls_config 中指定了所用的证书文件。完整的配置可以参考 官方文档中对 tls_config 的说明 ( https://prometheus.io/docs/prometheus/latest/configuration/configuration/#tls_config ) 。

最后,启动 Prometheus 并在浏览器中访问 ( http://127.0.0.1:9090/targets ) ,如果你在 endpoint 中看到 https://localhost:9100/metrics 了,那么恭喜你,Prometheus 和 Node Exporter 已经通过 TLS 连接了。

3

   

添加 Basic Auth

上文中,我已经为你介绍了如何使用让 Prometheus 和 Node Exporter 间使用 TLS 连接了,接下来,我为你介绍如何增加 Basic Auth 。

这里需要注意的是,Basic Auth 和 TLS 并不是强依赖的。你可以在不开启 TLS 的情况下使用 Basic Auth ,但我个人建议,要做就做彻底点,同时启用好了。

3.1

   

为 Node Exporter 配置密码

我们直接可以使用 htpasswd 来生成 bcrypt 密码 hash (这个工具想必大家不会太陌生)。

(MoeLove) ➜  prometheus-tls htpasswd -nBC 12 '' | tr -d ':\n'       
New password:
Re-type new password:                                              
$2y$12$WLw2sYa.NYZoBVoCOE84qe3xNm7kbSoKVIBXP.PvqNDna60vnZhEW

这里我只用它来生成了密码 hash , 没有传递用户名。

接下来,修改上文中提到的 Node Exporter 所用的配置文件,如下:

tls_server_config:
  cert_file: node_exporter.crt
  key_file: node_exporter.key
basic_auth_users:
  # 当前设置的用户名为 prometheus , 可以设置多个
  prometheus: $2y$12$WLw2sYa.NYZoBVoCOE84qe3xNm7kbSoKVIBXP.PvqNDna60vnZhEW

再次启动 Node Exporter,并使用 curl 请求 metrics 接口,可以看到当前返回 401 。

(MoeLove) ➜  prometheus-tls curl -Ik https://127.0.0.1:9100/metrics 
HTTP/1.1 401 Unauthorized
Content-Type: text/plain; charset=utf-8
Www-Authenticate: Basic
X-Content-Type-Options: nosniff
Date: Wed, 27 May 2020 11:45:16 GMT
Content-Length: 13


打开 Prometheus 的 Targets 页面,也会看到当前提示 401 ,无法抓取 metrics 。

3.2

   

配置 Prometheus 使用 Basic Auth

接下来,只要修改 Prometheus 的配置文件,为其增加 basic_auth 的配置项即可。

global:
  scrape_interval:     15s 
  evaluation_interval: 15s


scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']


  - job_name: 'node_exporter'
    scheme: https
    tls_config:
      ca_file: node_exporter.crt
    basic_auth:
      username: prometheus
      password: moelove.info
    static_configs:
    - targets: ['localhost:9100']

修改配置文件后,只要让 Prometheus 重新加载配置文件即可:

(MoeLove) ➜  killall -HUP prometheus

现在刷新 Prometheus 的 Targets 页面,就可以看到已经正常抓取 metrics 了。

4

   

总结

本文介绍了如何开启 Prometheus 和 Node Exporter 之间的 TLS 连接, 以及开启 Node Exporter 的 Basic Auth 认证。在此之前,可能有小伙伴是通过加反代来完成的,比如:[给 Node Exporter 加上 Basic 认证](https://blog.fleeto.us/post/node_exp_basic_auth/)。

在生产中使用时,建议更加规范化操作,比如 CA 的选择,密码的管理等,比如 Node Exporter 的 Basic Auth 其实支持配置多个用户名密码的。

接下来,在 Prometheus 官方提供的基础组件中,都将逐步推进本文中所提到的这类安全特性的支持,包括 Prometheus,Alertmanager, Pushgateway 和官方 exporter ,后续社区提供的 exporter 大概率也会逐步跟进的。

最后,再次恭喜 Node Exporter 迎来了 v1.0.0 版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为 Prometheus Node Exporter 加上认证 的相关文章

  • echart旭日图_ECharts 旭日图

    ECharts 旭日图 旭日图 Sunburst 由多层的环形图组成 在数据结构上 内圈是外圈的父节点 因此 它既能像饼图一样表现局部和整体的占比 又能像矩形树图一样表现层级关系 ECharts 创建旭日图很简单 只需要在 series 配
  • 检测到“RuntimeLibrary”的不匹配项

    1 gt libCGAL vc140 mt 4 4 I 900 lib all files obj error LNK2038 检测到 RuntimeLibrary 的不匹配项 值 MT StaticRelease 不匹配值 MD Dyna
  • golang处理execl文件

    1 引入execl依赖包 go get github com xuri excelize v2 2 打开execl文件 并获取句柄 打开文件 获取句柄 f err excelize OpenFile path if err nil fmt
  • elasticsearch全文检索流程

    elasticsearch全文检索流程 elasticsearch全文检索流程 索引过程 创建索引 获得原始文档 创建文档对象 分析文档 创建索引 查询索引 elasticsearch全文检索流程 索引过程 索引过程 对要搜索的原始内容进行
  • java中包装类的作用

    Java中包装类的作用 一 包装类是什么 包装类就是解决java的八种基本数据类型不面向对象的缺陷 而设计出来的一个个与每一个与基本类型相对应的类 这八种基本数据类型对应的类统称包装类 Wrapper Class 包装类均位于java la
  • 升级到spring security5遇到的坑-密码存储格式

    遇到的问题 将spring security oauth2 包括spring security 升级到最新 代码没有改动 运行项目没有报错 但是页面登陆时报错 There is no PasswordEncoder mapped for t
  • 火猴之图片立体翻转效果展示(firemonkey)

    结果 思路 1 使用firemonkey之3d应用 2 layout3d image3d textlayer3d 3 使用floatanimation改变image3d的rotation的角度实现 4 运用floatanimation的fi
  • Python自动化测试框架:Pytest和Unittest的区别

    pytest和unittest是Python中常用的两种测试框架 它们都可以用来编写和执行测试用例 但两者在很多方面都有所不同 本文将从不同的角度来论述这些区别 以帮助大家更好地理解pytest和unittest 1 原理 pytest是基
  • Nginx上线一个项目并简操

    Nginx上线一个项目 上线一个商场项目 第一步 将项目源码和数据库文件上传至html文件中 第二步 解压项目源码和导入数据文件 第三步 修改Nginx配置文件 配置server 虚拟机 第四步 在项目代码文件中配置连接MySQL的用户密码
  • 听说你Pycharm都不会用?这篇快速上手指南你必须拥有!

    0 前言 大家好 欢迎来到今天的基础入门编辑器Pycharm的使用篇 Pycharm 作为一款针对 Python 的编辑器 配置简单 功能强大 使用起来省时省心 对初学者友好 这也是为什么编程教室一直推荐新手使用 Pycharm 的原因 本
  • CTF之逆向之阿里巴巴

    题目地址 http www shiyanbar com ctf 13 题目预览 解题过程 1 下载附件发现是exe文件 2 使用PEid和Detect It Easy查壳 和 开发语言 发现没有加壳 都是用C 开发的 3 C 和Java P
  • 打开方式中选择默认方式无反映_系统小技巧:找回丢失的文件“打开方式”

    无论你在使用最经典的Windows 7 还是最主流的Windows 10 当某种文档可以用多个不同程序打开时 在文件的右键菜单中会出现 打开方式 的菜单项 从中可选择打开文档的程序 但有时我们会发现 明明程序在电脑中并未被卸载 但右键菜单中
  • 腾讯云域名解析

    腾讯云域名解析 外链图片转存失败 img 7ZtbvWq2 1562133684211 http shp qpic cn txdiscuz pic 0 bbs qcloud com common cf 163844rpqz5g6g6p6qf
  • 动态代理步骤

    实现动态代理的步骤 1 创建接口 定义目标类要完成的方法 2 创建目标类实现接口 3 创建InvocationHandler接口的实现了类 在invoke方法中完成代理类的功能 1 调用目标方法 2 增强功能 4 使用Proxy类的静态方法
  • jdk动态代理与CGLib的区别

    昨天被人问及动态代理与CGlib的区别 赶紧回顾一下 什么是代理 静态代理与动态代理 静态代理实例 JDK动态代理实例 CGLib 简介 CGLib 与JDK动态代理的区别 代理模式是Java中常见的一种模式 英文名字叫走Proxy或者Su
  • 基于 TiDB 的 Apache APISIX 高可用配置中心的最佳实践

    项目背景 什么是 Apache APISIX API 网关作为微服务架构中的重要组件 是流量的核心出入口 用于统一处理和业务相关的请求 可有效解决海量请求 恶意访问等问题 保障业务安全性与稳定性 作为开源的云原生 API 网关 Apache
  • SQL Server Powershell 开源数据库管理工具 dbatools

    在 Windows 中开发自动化运维 除了 python 就是 powershell了 powershell 与 windows 相关产品关联紧密 Windows 环境下的自动化开发一般使用 powershell sql server 亦是
  • 高效液相色谱分析的基本原理

    一 高效液相色谱分析法 百度百科 高效液相色谱以经典的液相色谱为基础 是以高压下的液体为流动相的色谱过程 通常所说的柱层析 薄层层析或纸层析就是经典的液相色谱 所用的固定相为大于100um 的吸附剂 硅胶 氧化铝等 这种传统的液相色谱所用的
  • Dubbo 3.x源码(10)—Dubbo初始化导出/引用模块配置源码

    基于Dubbo 3 1 详细介绍了Dubbo初始化导出 引用模块配置的源码 此前我们学习了Dubbo配置的加载与覆盖的一系列源码 Dubbo 3 x源码 7 Dubbo配置的加载入口源码 Dubbo 3 x源码 8 Dubbo配置中心的加载
  • JeecgBoot Vue2前端国际化语言切换

    JeecgBoot antd Vue2前端国际化语言切换 jeecg官方文档 参考 jeecg前端的国际化解决方案 参考 一 需求场景 后台管理系统 放置一个中英文切换选择按钮 页面切换所选语言后 系统会重新加载 获取对应的语言数据 并且下

随机推荐

  • Git 的origin和master分析

    lt lt 关键是 中英文切换着打字太辛苦了转载请注明出处 gt gt http lishicongli blog 163 com blog static 1468259020132125247302 首先要明确一点 对git的操作是围绕3
  • ArcGIS Maritime Server 开发教程(三)Maritime Service 功能解读

    ArcGIS Maritime Server 开发教程 三 Maritime Service 功能解读 本章导读 ArcGIS Maritime Server 能够以极简的方式发布海图服务 其服务的标准与传统的 MapService 对齐
  • 小白数学建模模型入门(二)

    数学建模模型入门 二 1 图论模型 Dijkstra算法 应用于求初始点到其他所有顶点的最短路径 本质是一种标号法 给赋权图的每一个顶点记一个数 称为顶点的标号 临时标号 称T标号 固定标号 称为P标号 T标号表示从始顶点到该标点的最短路长
  • The last packet sent successfully to the server was 0 milliseconds ago

    今天在弄数据库迁移及部署到客户服务器时 发现启动成功了 但是数据请求超时 赶紧打开日志看一下 报了这样的错 The last packet sent successfully to the server was 0 milliseconds
  • &和&&的区别(单与和双与的区别)

    和 都可以用作逻辑与的运算符 为短路与 不是短路与 可以作为整数的位运算符 举两个例子 1 对于if str null str equals 这个表达式 当str null 时 后面的表达式就不会执行 也不会出现NullPointerExc
  • 跨平台编程开发工具Xojo 2023 Release mac中文版功能介绍

    Xojo mac是一款跨平台的软件开发工具 它允许开发人员使用一种编程语言来创建应用程序 然后可以在多个操作系统上运行 Xojo 2023是Xojo开发工具的最新版本 它提供了许多功能和改进 以帮助开发人员更轻松地构建高质量的应用程序 Xo
  • 转载super resolution 超分辨率 的一些论文和代码

    1 CVPR 2019 神奇的超分辨率算法DPSR 应对图像模糊降质 code 2 从SRCNN到EDSR 总结深度学习端到端超分辨率方法发展历程 3 超分辨率在人脸识别中的工业应用 商汤算法一骑绝尘 打造公安人脸识别智能核心 4 人脸超分
  • linux开放端口命令tcp,linux开放端口命令

    linux系统中控制端口的开启与关闭可以由命令来执行 下面由学习啦小编为大家整理了linux下开放端口命令的相关知识 希望对大家有所帮助 linux开放端口命令1 打开指定端口 sbin iptables I INPUT p tcp dpo
  • 数据、常量和变量 2014-3-19总结

    今天学习了数据 常量和变量 一 数据 数据分为两种 静态数据和动态数据 1 静态数据 1 概念 静态数据是指一些永久性的数据 硬盘内存比较大 所以一般的存储在硬盘中 2 存储的时长 计算机关闭之后再开启 这些数据依旧还在 只要你不主动删掉或
  • Backtrader量化&回测11——策略信号Indicator

    对于程序来讲 该有的代码一行都不会少 但是把代码分块就可以很直观的阅读或修改代码 使用Indicator可以将策略的信号从策略类Strategy中脱离出来 方便策略进行协调与控制 文章目录 策略信号 示例代码 策略信号 官网中对于Indic
  • Pycharm 的使用技巧( 启动界面弹出Tips的内容翻译)

    Pycharm 启动界面弹出Tips的部分内容翻译 1 ctrl N 打开类的查找框 2 在拼写类的名字时可以用ctrl 空格来补充未写完的部分 活着弹出可选项 在两次点击ctrl 空格时 将在补充完类的拼写的同时自动添加导入该类的语句 3
  • 手撕boost/buck

    手撕Boost Boost公式推导及实验验证 手撕Buck Buck公式推导过程 Boost Boost的拓扑结构 在开关导通的时候 电感两端电压U Vi不变 电感量L也是常数 di dt U L 常数 电流随时间线性变化 如果我们规定电流
  • MySQL高级篇之视图

    视图 1 介绍 视图 View 是一种虚拟存在的表 视图中的数据并不在数据库中实际存在 行和列数据来自定义视图的查询中使用的表 并且是在使用视图时动态生成的 通俗的讲 视图只保存了查询的SQL逻辑 不保存查询结果 所以我们在创建视图的时候
  • IDEA创建mybatis的xml文件

    当我们用IDEA写项目写mybatis的mapper 直接去新建xml文件的时候发现没有这个选项 我们需要去创建一个xml的file模板 这样我们去新建的时候就很方便了 1 File gt Settings 2 Editor gt File
  • Opencv画图函数整理 及 cvCircle cvLine 只能画出黑白两种颜色问题 解决

    一句话 用这些画图函数在RGB图上画 则能画出来彩色 如果您在灰度图上画 则无论怎么设置color都只能画出黑白两种颜色 就这一句话搞了我一个晚上 惭愧 Opencv绘图函数 http www opencv org cn index php
  • C语言函数大全--h开头的函数

    h开头的函数或宏 1 hypot hypotf hypotl 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 HUGE VAL HUGE VALF HUGE VALL 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 ha
  • linux安装gitlab并修改gitlab默认端口号

    安装系统 centos 6 5 官网安装地址 https about gitlab com install centos 6 可以先根据官网安装步骤进行安装 分别执行以下命令 1 打开http访问和ssh访问 sudo yum instal
  • Premiere Pro 2022

    第1章 视频编辑的基础知识 1 1 视频编辑术语 帧 视频的基础单位 可以理解为一张静态图片就是一帧 关键帧 是素材中的特定帧 标记为进行特殊的编辑或其他操作 以便控制完成动画的流 回放或其他特性 帧速率 代表每秒播放帧的数量 单位是每秒多
  • 机器学习、计算机视觉和深度学习

    机器学习 计算机视觉和深度学习 1 什么是机器学习 2 机器学习的类型 3 什么是计算机视觉 4 计算机视觉的机器学习应用 5 总结 参考 这篇博客将简要介绍 机器学习和用于计算机视觉的机器学习 想象一下 你可以使用人脸检测算法在图像或视频
  • 为 Prometheus Node Exporter 加上认证

    这篇文章主要是为了庆祝 Node Exporter 终于迎来了 v1 0 0 版本 Prometheus https prometheus io 是最早由 SoundCloud 开源的监控告警解决方案 并已经成长为继 Kubernetes