1、监控系统被扫除pprof漏洞:
1、pprof功能是go中用于性能分析的,但总部非说是漏洞让关闭。只能修改源码关闭pprof功能。
2、通过docker compose部署的,给docker传命令关闭不了。
2、在源码中关闭pprof功能:
2.1、服务器安装环境:
2.1.1、系统:
1、Rocky linux 8 optimized for GCP2024-07-25
2.1.2、安装环境、依赖:
yum install -y git
yum install -y wget
yum install -y go # 版本在1.17及以上
yum install -y npm # 版本在7及以上
yum install -y nodejs # 版本在16及以上 官网安装地址:https://nodejs.org/zh-cn/download/package-manager
yum install -y bzip2
2.1.3、开启\关闭模块支持:
1、开启模块支持:
export GO111MODULE=on # 执行
2、关闭模块支持:
export GO111MODULE=off
2.1.4、国内代理:
1、七牛 CDN
go env -w GOPROXY=https://goproxy.cn,direct
2、阿里云
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
3、官方
go env -w GOPROXY=https://goproxy.io,direct
2.1.5、下载go环境依赖:
go mod download # 1、服务器在国外 2、源代码中有go.mod 和 go.sum文件,所需依赖都在这2个文件中 3、go mod download 是拉取go环境所有的依赖 4、国内服务器拉取依赖和第3方库,要配置代理
2.2、安装docker、docker compose:
1、安装docker:
# 添加Docker官方仓库
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
# 更新DNF缓存以包含新添加的仓库
dnf makecache
# 安装Docker Engine、CLI工具和containerd
dnf install docker-ce docker-ce-cli containerd.io
# 启动Docker服务并设置开机启动
sudo systemctl start docker
sudo systemctl enable docker
2、安装docker compose:
# 国外安装:下载Docker Compose的最新版本
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 国内安装:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 赋予执行权限
chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
2.3、通过prometheus源码构建docker镜像:
2.3.1、修改prometheus源码:
1、进入服务器
2、进入promethues GitHub仓库:
https://github.com/prometheus/prometheus/tree/v2.53.1
3、克隆promethues源码:
git clone https://github.com/prometheus/prometheus.git
4、进入克隆下载的仓库:
cd promethues目录中
5、修改 /root/prometheus/cmd/prometheus/main.go文件:
将// _ "net/http/pprof" // Comment this line to disable pprof endpoint. 注释掉
有这段代码就有debug功能,注释掉就没有debug功能了
import (
"context"
"errors"
"fmt"
"math"
"math/bits"
"net"
"net/http"
// _ "net/http/pprof" // Comment this line to disable pprof endpoint. 注释掉
"net/url"
"os"
"os/signal"
"path/filepath"
"runtime"
"runtime/debug"
"strconv"
"strings"
"sync"
"syscall"
"time"
6、修改/root/prometheus/web/web.go文件:
import (
// "net/http/pprof" 这条注释掉
func New(logger log.Logger, o *Options) *Handler {
...
// router.Get("/debug/*subpath", serveDebug) 这条注释掉
// router.Post("/debug/*subpath", serveDebug) 这条注释掉
...
}
// func serveDebug(w http.ResponseWriter, req *http.Request) {
// ctx := req.Context()
// subpath := route.Param(ctx, "subpath")
// if subpath == "/pprof" {
// http.Redirect(w, req, req.URL.Path+"/", http.StatusMovedPermanently)
// return
// }
// if !strings.HasPrefix(subpath, "/pprof/") {
// http.NotFound(w, req)
// return
// }
// subpath = strings.TrimPrefix(subpath, "/pprof/")
// switch subpath {
// case "cmdline":
// pprof.Cmdline(w, req)
// case "profile":
// pprof.Profile(w, req)
// case "symbol":
// pprof.Symbol(w, req)
// case "trace":
// pprof.Trace(w, req)
// default:
// req.URL.Path = "/debug/pprof/" + subpath
// pprof.Index(w, req)
// }
// }
7、构建二进制文件:
cd 到prometheus目录下
通过 make build 生成二进制文件
二进制文件有 prometheus(绿色)、promtool(绿色)、npm_licenses.tar.bz2(压缩包)
8、测试二进制文件是否能正常启动:
prometheus 二进制文件启动参考地址
https://www.cnblogs.com/fanqisoft/p/17047641.html
9、查看二进制文件的服务是否启动:
netstat -lnpt | grep 9090
看到 9090端口 说明服务正常启动
2.3.2、通过dockerfile构建prometheus docker镜像:
2.3.2.1、登录docker hub web界面
2.3.2.2、创建 自己的仓库:
创建 prometheus仓库:
create repository
仓库名为 prometheus
给仓库写个简介
Visibility 为 Public 公开的
创建
2.3.2.3、promethues通过 Dockerfile文件 构建docker镜像:
1、cd 到git拉取源码的那个目录下
2、在该目录下创建 Dockerfile文件:
FROM quay.io/prometheus/busybox:latest
MAINTAINER The Prometheus Authors <[email protected]>
COPY prometheus /bin/prometheus
COPY promtool /bin/promtool
COPY documentation/examples/prometheus.yml /etc/prometheus/prometheus.yml
COPY console_libraries/ /etc/prometheus/
COPY consoles/ /etc/prometheus/
EXPOSE 9090
VOLUME [ "/prometheus" ]
WORKDIR /prometheus
ENTRYPOINT [ "/bin/prometheus" ]
CMD [ "-config.file=/etc/prometheus/prometheus.yml", \
"-storage.local.path=/prometheus", \
"-web.console.libraries=/etc/prometheus/console_libraries", \
"-web.console.templates=/etc/prometheus/consoles" ]
3、构建镜像 名字为my_prometheus,tag版本为 v2.53.1,. 当前目录:
docker build -f 源文件路径 -t my_prometheus:v2.53.1 .
docker build -f /root/prometheus/Dockerfile -t my_prometheus:v2.53.1 .
4、提交已存在的镜像:
docker commit <existing-container> <hub-user>/<repo-name>[:<tag>] # 这个没执行,反正最后能正常使用镜像,也不知道有啥用
5、查看镜像:
docker images
2.3.2.3、将Linux服务器本地的promethues镜像推送到docker hub 上的prometheus仓库:
1、查看镜像:
docker images
2、对已经存在的镜像打标签:
docker tag 镜像ID/REPOSITORY:TAG 命名空间/仓库名:tag版本
docker tag 6174d76bef8a zorn0zhao/prometheus:v2.53.1
docket tag my_prometheus:v2.53.1 zorn0zhao/prometheus:v2.53.1 # 这2条命令效果一样
3、推送镜像:
docker push <hub-user>/<namespace>:<tag>
docker push zorn0zhao/prometheus:v2.53.1
4、查看镜像是否推送到仓库:
登录docker hub 的prometheus仓库查看镜像
2.3.2.4、部署prometheus docker镜像,验证是否关闭pprof功能:
1、运行容器
2、容器起来后,使用IP:端口的方式进入web界面
3、验证pprof功能是否关闭:
IP:端口/debug/pprof/ 返回值为404页面或metrics页面,说明成功关闭pprof功能了
2.4、通过alertmanager源码构建docker镜像:
2.4.1、修改alertmanager源码:
1、进入服务器
2、进入promethues GitHub仓库:
https://github.com/prometheus/alertmanager/tree/v0.27.0
3、克隆alertmanager源码:
git clone https://github.com/prometheus/alertmanager.git
4、进入克隆下载的仓库:
cd alertmanager目录中
5、修改 /root/alertmanager/ui/web.go文件:
将// _ "net/http/pprof" // Comment this line to disable pprof endpoint. 注释掉
有这段代码就有debug功能,删除就没有debug功能了
6、构建二进制文件:
make build 或者 go build 也能构建,效果一样
二进制文件 alertmanager(绿色的)、amtool(绿色的)
7、测试二进制文件能否正常使用:
8、查看二进制文件是否启动:
netstat -lnpt |grep 9093
看到有 9093 端口 说明服务正常启动
2.4.2、通过dockerfile构建alertmanager docker镜像:
2.4.2.1、登录docker hub
2.4.2.2、创建 alertmanager仓库:
创建 alrtmanager仓库:
create repository
仓库名为 alertmanager
给仓库写个简介
Visibility 为 Public 公开的
创建
2.4.2.3、通过dockerfile文件构建alertmanager镜像:
1、cd 到alertmanager目录下
2、在该目录下创建Dockerfile文件:
# 使用官方Alertmanager镜像作为基础镜像
FROM amd64/busybox:1.35
COPY amtool /bin/amtool
COPY alertmanager /bin/alertmanager
COPY examples/ha/alertmanager.yml /etc/alertmanager/alertmanager.yml
RUN mkdir -p /alertmanager && \
chown -R nobody:nobody etc/alertmanager /alertmanager
USER nobody
EXPOSE 9093
VOLUME [ "/alertmanager" ]
WORKDIR /alertmanager
ENTRYPOINT [ "/bin/alertmanager" ]
CMD [ "--config.file=/etc/alertmanager/alertmanager.yml", \
"--storage.path=/alertmanager" ]
3、构建名字为 my_alertmanager,tag版本为 v0.27.0 的镜像,. 在当前目录:
docker build -f 源文件路径 -t my_alertmanager:v0.27.0 .
docker build -f /root/node_exporter/Dockerfile -t my_alertmanager:v0.27.0 .
4、查看镜像:
docker images
2.4.2.4、将Linux服务器上的alertmanager镜像推送到docker hub 的alertmanager仓库:
1、查看本地镜像:
docker images
2、对已存在的镜像打标签:
docker tag 镜像ID 命名空间/仓库名:tag版本
docker tag 8786b21dae23 zorn0zhao/alertmanager:v0.27.0
3、推送镜像:
docker push <hub-user>/<namespace>:<tag>
docker push zorn0zhao/alertmanager:v0.27.0
2.4.2.5、部署alertmanager docker镜像,验证是否关闭pprof功能:
1、运行容器
2、容器起来后,使用IP:端口的方式进入web界面
3、验证pprof功能是否关闭:
IP:端口/debug/pprof/ 返回值为404页面或metrics页面,说明成功关闭pprof功能了
2.5、通过node_exporter源码构建docker镜像:
2.5.1、修改node_exporter源码:
1、进入服务器
2、进入node_exporter GitHub仓库:
https://github.com/prometheus/node_exporter/tree/v1.8.2
3、克隆node_exporter源码:
git clone https://github.com/prometheus/node_exporter.git
4、进入克隆的仓库中:
cd node_exporter 目录中
5、修改 node_exporter.go文件:
// _ "net/http/pprof" 这是掉这段代码就关闭pprof功能,没有debug功能了
6、构建二进制文件:
make build 或者 go build ,都能构建,效果一样
生成二进制文件 node_exporter(绿色)
7、测试二进制文件是否能正常运行:
./node_exporter &
8、查看node_exporter二进制文件服务是否正常启动:
netstat -lnpt |grep ":9100"
2.5.2、通过dockerfile构建node_export docker镜像:
2.5.2.1、登录docker hub web界面
2.5.2.2、创建node_exporter仓库:
创建 node_exporter仓库:
create repository
仓库名为 node_exporter
给仓库写个简介
Visibility 为 Public 公开的
创建
2.5.2.3、通过dockerfile文件构建node_exporter镜像:
1、cd 到node_exporter目录下
2、创建Dockerfile文件:
# 需要什么环境,就下载什么环境的基础镜像。我现在需要的是go环境的基础镜像
FROM golang:latest
LABEL maintainer="The Prometheus Authors <[email protected]>"
# cd到存有二进制文件的目录下,找到二进制文件。将当前目录下的node_exporter文件 复制到镜像的 /bin目录下 【我这里的二进制文件是node_exporter(绿色的可执行二进制文件)】
COPY ./node_exporter /bin/node_exporter
EXPOSE 9100
USER nobody
ENTRYPOINT [ "/bin/node_exporter" ]
3、构建镜像 名字为my_node_exporter,tag版本为 v1的镜像, . 是当前目录:
docker build -f 源文件路径 -t my_node_exporter:v1 .
docker build -f /root/node_exporter/Dockerfile -t my_node_exporter .
4、查看镜像:
docker iamges
5、给my_node_exporter镜像打标签:
docker tag 镜像ID 命名空间/仓库名:tag版本
docker tag 7d3051873112 zorn0zhao/node_exporter:v1.8.2
6、推送镜像到node_exporter仓库:
docker push <hub-user>/<namespace>:<tag>
docker push zorn0zhao/node_exporter:v1.8.2
2.5.2.4、部署node_exporter docker镜像,验证是否关闭pprof功能:
1、运行容器
2、容器起来后,使用IP:端口的方式进入web界面
3、验证pprof功能是否关闭:
IP:端口/debug/pprof/ 返回值为404页面或metrics页面,说明成功关闭pprof功能了