提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
1. 介绍
- node_exporter是监控主机所部署的探针程序,需要部署到每台主机上,prometheus端才能对主机进行监控
- 监控每个应用需要单独安装对应node_exporter,比如node_exporter_mysql是用于监控MySQL指标,本次安装的程序为node_exporter,对主机指标进行监控(cpu、内存之类的)。
2. 安装
-
下载Releases · prometheus/node_exporter (github.com)
找到合适的版本下载即可
下载下来的node_exporter是go语言编译好的可执行程序(类似于Windows系统的.exe文件)可以直接使用,无需再编译安装。
3. 配置为系统服务:
vi /usr/lib/systemd/system/node_exporter.service
---------------------输入内容--------------------------
[Unit]
Description=node_exporter service
[Service]
#User=yunwei
# 默认端口为9100,可以改成其他
ExecStart=/data/node_exporter-1.8.1.linux-amd64/node_exporter --web.listen-address=:9100
TimeoutStopSec=10
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
---------------------输入内容--------------------------
# 启动服务
systemctl start node_exporter.service && systemctl enable node_exporter.service
systemctl status node_exporter.service
4. 开启认证(修复未授权访问问题)
重点来了!!!
在实际生产环境中,使用Prometheus监控必须要考虑安全问题;
有两种方式:
- 通过配置主机防火墙,仅允许指定主机的流量通过:临时方案,由于每次增加节点都要调整防火墙配置,过于麻烦!
- 开启认证方式:通过账号密码方式加以认证,本文方案
4.1 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'
——————————————————————————————————————
# 得到node_exporter.crt、node_exporter.key两个文件
ll
——————————————————————————————————————
total 19960
-rw-r----- 1 yunwei yunwei 10 Jul 10 2023 a.sh
drwxrwxrwx 6 201 201 4096 Mar 29 2023 cronolog-1.6.2
-rw-rw-r-- 1 yunwei yunwei 133591 Mar 21 2023 cronolog-1.6.2.tar.gz
-rw-r----- 1 yunwei yunwei 14 Nov 20 2023 g.sh
drwxr-x--- 5 yunwei yunwei 287 May 19 2023 java
-rwxr----x 1 yunwei yunwei 19124796 Jun 18 11:45 node_exporter
drwxr-xr-x 2 yunwei yunwei 56 Nov 30 2022 node_exporter-1.5.0.linux-amd64
-rw-r----- 1 yunwei yunwei 1289 Jul 1 10:37 node_exporter.crt
-rw-r----- 1 yunwei yunwei 1704 Jul 1 10:37 node_exporter.key
drwxr-x--- 3 yunwei yunwei 999424 Oct 23 2023 sgjzfile
-rw-r----- 1 yunwei yunwei 22 Jan 28 2023 ssh.sh
-rw-r--r-- 1 yunwei yunwei 1022 Jun 29 2023 taglib.jsp
——————————————————————————————————————
4.2 basic auth 认证生成
安装 htpasswd 来生成密码 hash
#centos
yum install httpd-tools -y
在 Node_exporter 目录下执行
htpasswd -nBC 12 '' | tr -d ':\n'
New password:
# 7T#5pF9!2L
Re-type new password:
# 7T#5pF9!2L
$2y$12$Yp3MSfhhdCHBpYiK0Yf25unAuCZyiCai.NffOzQLyIuu27EyiZNbq
4.3 编写配置文件
编写配置文件,并保存为 config.yaml
(命名随意):
tls_server_config:
cert_file: /app/yunwei/node_exporter.crt
key_file: /app/yunwei/node_exporter.key
basic_auth_users:
# 当前设置的用户名为 prometheus , 可以设置多个
prometheus: $2y$12$ujLJwPBvmtxElNNTWDUZgOQ8pLjfVkwdH5sKa1VEwp578pGe38OHu
4.4 配置为系统服务
每个节点配置服务:
- 将
node_exporter.crt
、node_exporter.key
、node_web_cfg.yaml
三个文件传输到各个主机
[root@x86-wgyunwei-web03 ~]# cat /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=node_exporter service
After=network.target
After=syslog.target
[Service]
User=yunwei
ExecStart=/app/yunwei/node_exporter --web.config=/app/yunwei/node_web_cfg.yaml
TimeoutStopSec=10
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
4.5 验证
修复效果如下:
# python2
import urllib2
print urllib2.urlopen('http://localhost:9100/metrics').read()
# python3
前端页面也会显示:Bad Request
4.6 配置到Prometheus
-
将前面生成的
node_exporter.crt
和node_exporter.key
文件复制到Prometheus路径下 -
在Prometheus加入内容
- job_name: "ng_node_1" # 任意名字 scheme: https tls_config: ca_file: /usr/local/prometheus/node_exporter.crt insecure_skip_verify: true basic_auth: username: prometheus password: 7T#5pF9!2L static_configs: - targets: ["192.168.56.21:9100"]
-
修改启动参数
vi /etc/systemd/system/promethues.service ------------------------------------------------------ [Unit] Description=promethues After=network.target [Service] User=root Group=root WorkingDirectory=/usr/local/prometheus ExecStart=/usr/local/prometheus/prometheus --web.enable-lifecycle --config.file=/usr/local/prometheus/prometheus.yml [Install] ------------------------------------------------------ systemctl daemon-reload systemctl restart promethues.service systemctl status promethues.service
-
验证
status>Target
节点状态为up,配置成功
5. pprof漏洞修复
实际上,经过上文步骤4的密码认证加密后,是无法直接访问这个路径,就不会扫描出来这个漏洞。
但现在golang这么火,我们还是学习一下吧!
5.1 漏洞说明
和之前的pprof类似,都是国产的安全工具扫出来的莫名其妙的东西,这次也是报的node-exporter存在这个漏洞,又归我处理。当访问node-exporter的/debug/vars
路由时能获取程序的部分运行时信息,如下:
这是因为在代码中导入了expvar
包,只要导入了这个包就会自动的产生 一个/debug/vars路由。
5.2 修复方法
对于node-exporter,本身的代码中是没有引入expvar包的,但是node-exporter引用了github.com/prometheus/client_golang/prometheus包,在prometheus包的expvar_collector.go中有引用expvar包,因此我们要去修改这里。
-
下载源码
-
golang环境配置
Go下载 - Go语言中文网 - Golang中文社区 (studygolang.com)
选个版本下载
.msi
文件,安装到指定位置配置环境变量
-
下载IDE:liteidex
下载地址:https://sourceforge.net/projects/liteide/files/X28/
下载的是最新版 x28二进制包 liteidex28.windows-qt4.zip
解压出来就能用
-
编译环境配置
- 由于我们用的是win系统进行开发,所以选cross-linux64,交叉编译为linux64执行文件
- 在工具栏中选择“工具”→“编译当前环境”,初始配置如下:
#GOBIN= GOARCH=amd64 GOOS=linux CGO_ENABLED=0 PATH=%GOROOT%\bin;%PATH% LITEIDE_GDB=gdb LITEIDE_MAKE=mingw32-make LITEIDE_TERM=%COMSPEC% LITEIDE_TERMARGS= LITEIDE_EXEC=%COMSPEC% LITEIDE_EXECOPT=/C
-
删除文件
文件>打开node_exporter目录
找到并删除
expvar_collector.go
文件 -
build
-
编译成功