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功能了