让node-exporter通过nginx支持用户认证


背景描述

Node Exporter v1.0.0之前的版本不支持TLS和认证,所以默认情况下是通过http暴露的/metrics,默认没有任何访问限制。对于有些环境硬性要求不允许使用http提供访问,和对安全性要求较高必须有认证的情况下,原来只能通过额外增加一层反向代理(如nginx)来解决。但给每个node_export配1个nginx,这显然这太复杂太重了。
从 v1.0.0版本开始实验性的支持https和基本认证。 从 Node Exporter 开始到后续其他的组件,都将支持 TLS 和 basic auth, 同时也列出了最新的安全基准(默认情况下都支持 TLS v1.2 及以上)。下面让我们来看看具体配置。

  • 本文主要讲解如何基于 nginx 让 node-exporter 支持基本认证。

配置用户认证

  • 安装httpd工具,用于生成用户认证密码文件

    yum install -y httpd
  • 创建认证用户信息

    # 进入nginx配置目录,用于存放生成的密码文件
    cd /usr/local/nginx/conf
    
    # 生成 admin 账号、密码的 passwd.db 文件
    htpasswd -c -m passwd.db admin
    • 回车后会要求输入对应密码,最终会在执行命令的目录下生成 passwd.db 文件。
  • 本地照常启动 node-exporter

  • 创建 nginx 代理配置

    server {
        listen  12345;
        server_name node-exporter.nestealin.com;
        auth_basic   "login";
        auth_basic_user_file /usr/local/nginx/conf/passwd.db;
    
        location / {
            # 本地 node-exporter 端口
            proxy_pass http://127.0.0.1:12301;
        }
    }
  • Prometheus 新增 job 配置

    • 创建动态发现主机配置 ( 用于多主机动态发现,无需每次重启Prometheus )

      • vim /usr/local/prometheus/targets/vps_hosts.json
      [
        {
          "targets":  [
              "node-exporter.nestealin.com:12345"
          ],
          "labels": {
              "__idc__": "aliyun",
              "__hostname__": "ali-dev-node01"
          }
        }
      ]
    • 服务配置

      - job_name: "vps_node_exporter"
        scrape_interval: 60s
        scrape_timeout: 50s
        # 填入刚才创建的认证用户及密码
        basic_auth:
          username: admin
          password: admin-password
        file_sd_configs:
          - refresh_interval: 1m
            files:
              - /usr/local/prometheus/targets/vps_hosts.json
        relabel_configs:
          - source_labels:
              - __address__
            target_label: ip
          - source_labels:
            - "__idc__"
            regex: "(.*)"
            target_label: "idc"
            action: replace
            replacement: "$1"
          - source_labels:
            - "__hostname__"
            regex: "(.*)"
            target_label: "hostname"
            action: replace
            replacement: "$1"
  • 重新加载Prometheus配置,即可实现远端主机认证拉取。 (以下两种方式任选其一)

    • 重启 Prometheus 服务: service prometheus restart
    • Reload 配置: curl -X POST http://localhost:9090/-/reload (启动参数需要带上 --web.enable-lifecycle 才支持该功能 )


文章作者: NesTeaLin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 NesTeaLin !
  目录