18.8.6 安全与可用性监控告警方案

本节聚焦 Jenkins 在高可用场景下的安全与可用性监控告警方案,覆盖监控指标、日志审计、权限安全、告警策略与联动处理,并提供可执行示例与排错练习。

监控体系设计#

  • 基础可用性:控制器与代理节点存活、Web 健康检查、队列长度、构建耗时、失败率、并发执行数。
  • 资源与容量:CPU/内存/磁盘/IO、JENKINS_HOME 使用率、构建工件增长速度、插件数量与版本漂移。
  • 集成依赖:Git、Artifact、容器仓库、K8s、数据库/Redis 等外部依赖的可用性与延迟。
  • 安全态势:登录失败率、权限变更、敏感凭据访问、API Token 使用与滥用风险。

监控与告警架构原理草图:

文章图片

日志与审计(安装与验证)#

  • 启用 Audit Trail / Simple Audit Log 插件记录登录、配置变更、Job 变更、权限变更。
  • 关键日志集中采集到 ELK/EFK 或 Loki,建立变更审计索引与追溯能力。
  • 对敏感操作(凭据变更、插件安装、系统配置)设置二次确认与审计告警。

安装插件(Jenkins CLI 示例)

# 前置:获取 Jenkins CLI
wget -O /usr/local/bin/jenkins-cli.jar http://jenkins.example.com/jnlpJars/jenkins-cli.jar

# 安装 Audit Trail 插件(示例)
java -jar /usr/local/bin/jenkins-cli.jar -s http://jenkins.example.com/ \
  -auth admin:admin123 \
  install-plugin audit-trail

# 重启 Jenkins 使插件生效
java -jar /usr/local/bin/jenkins-cli.jar -s http://jenkins.example.com/ \
  -auth admin:admin123 safe-restart

配置审计日志输出到文件

# Jenkins 系统配置 -> Audit Trail:
# Log File: /var/log/jenkins/audit.log
# 下面为文件路径与权限准备
mkdir -p /var/log/jenkins
chown jenkins:jenkins /var/log/jenkins

验证审计日志

# 预期:执行 Job 或修改配置后产生日志
tail -f /var/log/jenkins/audit.log

安全配置与告警触发点(示例+命令解释)#

  • 权限与凭据:基于角色的最小权限、凭据访问范围控制、定期轮换与失效策略。
  • 插件安全:监控插件版本、CVE 通告与更新窗口,禁用高风险插件。
  • 接口安全:API Token 管理、IP 白名单、CSRF 保护、强制 HTTPS 与反向代理安全头。

反向代理安全头(Nginx 示例)

server {
  listen 443 ssl;
  server_name jenkins.example.com;

  # 安全头
  add_header X-Frame-Options "DENY";
  add_header X-Content-Type-Options "nosniff";
  add_header Referrer-Policy "no-referrer";
  add_header Content-Security-Policy "default-src 'self'";

  location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto https;
  }
}

可用性告警策略(阈值示例)#

  • SLA 告警:控制器不可达、关键作业失败率突增、构建队列积压超过阈值。
  • 资源阈值告警:JENKINS_HOME 磁盘 > 80%、CPU/内存 > 85%、GC 频繁。
  • 依赖链告警:SCM 拉取超时、制品上传失败、K8s API 不可用。
  • 安全告警:异常登录、配置变更、插件安装、凭据读取异常。

Prometheus 告警规则(示例)

# /etc/prometheus/rules/jenkins.yml
groups:
- name: jenkins.rules
  rules:
  - alert: JenkinsDown
    expr: up{job="jenkins"} == 0
    for: 1m
    labels:
      severity: P1
    annotations:
      summary: "Jenkins 控制器不可用"
      description: "Jenkins 已持续 1 分钟不可达"

  - alert: JenkinsQueueBacklog
    expr: jenkins_queue_size > 50
    for: 5m
    labels:
      severity: P2
    annotations:
      summary: "构建队列积压过多"
      description: "队列长度超过 50 持续 5 分钟"

  - alert: JenkinsHomeDiskHigh
    expr: (node_filesystem_avail_bytes{mountpoint="/var/lib/jenkins"} / node_filesystem_size_bytes{mountpoint="/var/lib/jenkins"}) < 0.2
    for: 10m
    labels:
      severity: P2
    annotations:
      summary: "JENKINS_HOME 磁盘不足"
      description: "可用空间低于 20%"

监控实现建议(安装与配置示例)#

  • Prometheus + Node Exporter + Jenkins Exporter 采集关键指标。
  • Grafana 提供可用性看板:构建成功率、队列长度、节点状态、依赖接口延迟。
  • Alertmanager 告警分级:P1(不可用)、P2(性能退化)、P3(风险提示)。

Jenkins Exporter 安装(容器示例)

# 运行 Jenkins Exporter(依赖 Jenkins 的用户名/Token)
docker run -d --name jenkins-exporter -p 9118:9118 \
  -e JENKINS_URL="http://jenkins.example.com:8080" \
  -e JENKINS_USER="monitor" \
  -e JENKINS_API_TOKEN="xxxxxxxx" \
  justwatch/jenkins-exporter:latest

# 验证指标接口
curl -s http://127.0.0.1:9118/metrics | head

Prometheus 抓取配置

# /etc/prometheus/prometheus.yml
scrape_configs:
  - job_name: 'jenkins'
    static_configs:
      - targets: ['jenkins.example.com:8080']
  - job_name: 'jenkins-exporter'
    static_configs:
      - targets: ['127.0.0.1:9118']
  - job_name: 'node'
    static_configs:
      - targets: ['127.0.0.1:9100']

重载 Prometheus 配置

# 方式一:发送 SIGHUP
kill -HUP $(pidof prometheus)

# 方式二:启用 --web.enable-lifecycle 后热更新
curl -X POST http://127.0.0.1:9090/-/reload

告警联动与处置流程(配置示例)#

  • 与企业 IM/短信/电话联动,支持分组与值班轮换。
  • 自动化处置:如清理历史构建、扩容代理节点、短期限流。
  • 事件闭环:告警→确认→定位→恢复→复盘,沉淀 SOP 与知识库。

Alertmanager 路由与企业 IM 示例

# /etc/alertmanager/alertmanager.yml
route:
  group_by: ['alertname']
  receiver: 'im'
  routes:
  - match:
      severity: P1
    receiver: 'phone'
receivers:
- name: 'im'
  webhook_configs:
  - url: 'https://im.example.com/webhook/jenkins'
- name: 'phone'
  webhook_configs:
  - url: 'https://call.example.com/webhook/p1'

基线与演练(演练脚本示例)#

  • 定义可用性与安全基线:核心作业最大失败率、恢复时间(RTO)、数据损失(RPO)。
  • 定期演练:模拟控制器宕机、磁盘满、插件故障,验证告警触达与恢复流程。

模拟磁盘满(演练)

# 在 JENKINS_HOME 下创建大文件模拟磁盘压力
dd if=/dev/zero of=/var/lib/jenkins/fill.img bs=100M count=20
# 预期:Prometheus 触发 JenkinsHomeDiskHigh 告警

清理历史构建(自动化处置示例脚本)

#!/usr/bin/env bash
# /usr/local/bin/jenkins_cleanup.sh
# 清理 30 天前的构建目录,释放磁盘
find /var/lib/jenkins/jobs -type d -name builds -mtime +30 -exec rm -rf {} \;

常见排错清单(含命令解释)#

  1. 告警未触发
    - 检查规则是否加载:
    bash curl -s http://127.0.0.1:9090/api/v1/rules | jq '.data.groups[].name'
    - 检查目标是否 UP:
    bash curl -s http://127.0.0.1:9090/api/v1/targets | jq '.data.activeTargets[] | {job: .labels.job, health: .health}'

  2. Jenkins Exporter 无数据
    - 检查 Token 权限:确保具备 Overall/Read
    - 测试接口:
    bash curl -s http://127.0.0.1:9118/metrics | grep jenkins

  3. 审计日志为空
    - 确认插件启用并重启
    - 检查文件权限:
    bash ls -l /var/log/jenkins/audit.log

练习#

  1. 部署 Jenkins Exporter 并在 Grafana 中展示 构建成功率队列长度 两个面板。
  2. 编写 1 条告警规则:当构建失败率 > 20% 持续 10 分钟触发 P2 告警。
  3. 通过一次模拟磁盘满演练,验证告警到 IM 的闭环流程,输出复盘记录。