最近发现个可以将证书有效期可视化展示的 Grafana Dashboard, 体验了一下还不错。配置简单,聚合了多个站点证书有效期,序列号,签发者等信息,一目明了,水篇博客分享给大家。

SCR-20240908-kpfk

SSL Exporter

众所周知,Prometheus 和 Grafana 是没法直接获取证书信息的,需要结合一些 Exporter 将信息转换成数据指标给到 Prometheus 后,再通过 PromQL 查询,最在 Grafana 报表中展示。这里就需要用到大佬开发的 ssl_exporter

ssl-exporter 可以从多个渠道获取SSL证书:

  1. TCP: 自动嗅探是什么协议,然后获取证书。看了一下源码,支持smtp ftp,imap,postgres,pop3
  2. HTTPS:这就是HTTPS站点的证书了。
  3. FILE: 从 ssl-exporter 本地的文件中获取证书。
  4. HTTP FILE:通过一个 url 获取证书文件。
  5. k8s:从k8s kubernetes.io/tls 类型的 secrets 中获取证书。
  6. KubeConfig:从指定的 kubeconfig 文件中获取证书。

获取 SSL 证书后,会将其转换成具体的指标(具体看官方README)。

同时项目中也提供了仪表盘配置,导入 Grafana 就可以使用。

下面介绍一下具体操作。

配置

直接使用docker-compose快速启动。

  • 文件 docker-compose.yml
services:
  ssl-exporter:
    image: 'ribbybibby/ssl-exporter:latest'
    container_name: ssl-exporter
    restart: always

  prometheus:
    image: 'prom/prometheus:latest'
    restart: always
    container_name: prometheus
    ports:
      - '19090:9090'
    volumes:
      - './prometheus.yml:/etc/prometheus/prometheus.yml'
      - './promwal:/prometheus'

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    volumes:
      - './grafana/data:/var/lib/grafana'
    ports:
      - '3000:3000'
    restart: always
  • 文件 ./prometheus.yml

    这里示例了 httpstcp 的模式,改下 targets中的 域名:端口 就好了,如下我写了一些示例站点。

    如果需要从 k8s等其他的服务中获取证书,可按照官方文档示例配置

scrape_configs:
  - job_name: "https"
    metrics_path: /probe
    params:
      module: ["https"] # <-----
    static_configs:
      - targets:
          - razeen.me:443
          - bing.com:443
          - expired.badssl.com:443
          - revoked.badssl.com:443
          - untrusted-root.badssl.com:443
          - self-signed.badssl.com:443
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: ssl-exporter:9219

  - job_name: "startssl"
    metrics_path: /probe
    static_configs:
      - targets:
          - smtp.qq.com:587
          - smtp.office365.com:587
          - smtp.163.com:587
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: ssl-exporter:9219 # SSL exporter.

docker-compose up -d启动后,稍等会,就可以在prometheus Status > Targets 中看到都UP了。

image-20240908110008619

访问 Grafana,初始化的用户名密码都是admin。 第一次登陆会引导更新密码。

  • Connections > Add new connection 中搜索的 prometheus , 点击添加;
  • 输入NameURL , 我们都在一个 docker 网络内,直接用标签加端口就能连接了, 即 http://prometheus:9090

SCR-20240907-uhia-2

接下来导入仪表盘就好了。

  • Dashboards中导入,选择 Import a dashboard
  • 复制 dashboard.json 粘贴并 Load, 然后在 Import

image-20240908112934039

到这里就可以看到博客开头的那个仪表盘了。

总结

通过这个仪表盘,将站点的证书信息方便的进行聚合展示,如果出现了到期,一眼就能看到。同时,如果有需要的话,可以通过到期时间的指标来设置告警规则,做到证书的到期通知。

但,也有一些不足,我加了一些已经吊销的证书,和自签发的站点,这里没法去区别出来,不能依靠其做很专业的监控。要专业的管理与监控可以试试 CertCloud