Tuyệt chiêu ‘trị’ chứng quên gia hạn SSL và tên miền bằng Prometheus Blackbox Exporter

Monitoring tutorial - IT technology blog
Monitoring tutorial - IT technology blog

Nỗi ám ảnh mang tên “Your connection is not private”

Chắc hẳn không ít anh em từng trải qua cảm giác sáng sớm vừa mở mắt đã thấy sếp gọi cháy máy. Khách hàng than phiền website không truy cập được. Trình duyệt thì hiện dòng thông báo đỏ chót: “Your connection is not private”. Mọi nỗ lực SEO hay quảng cáo đổ sông đổ biển chỉ vì một cái chứng chỉ SSL hết hạn.

Hồi mới vào nghề, mình từng quản lý khoảng 20 website bằng một file Excel “thần thánh”. Cứ thỉnh thoảng lại mở ra soi ngày hết hạn để đi gia hạn. Một ngày nọ, mình quên béng cái subdomain chạy API thanh toán. Kết quả là hệ thống tê liệt suốt 4 tiếng, tỷ lệ drop-off tăng vọt 30% và mình nhận ngay một vé lên “phòng trà” uống nước với sếp.

Sự cố đó dạy mình rằng: Trí nhớ con người là thứ không đáng tin nhất trong vận hành hệ thống. Để giải quyết triệt để, mình đã chuyển sang dùng Prometheus kết hợp Blackbox Exporter. Hệ thống này sẽ thay bạn canh gác 24/7.

Ba kiểu quản lý hạn SSL phổ biến: Bạn đang ở đâu?

Thực tế, giới IT thường chia làm 3 nhóm khi quản lý hạn định hệ thống:

1. Nhóm thủ công (Excel, Google Calendar)

  • Ưu điểm: Không tốn tài nguyên server, ai cũng làm được.
  • Nhược điểm: Cực kỳ dễ sót khi số lượng domain lên con số hàng chục. Nó không có tính realtime. Nếu ai đó đổi nhà cung cấp mà quên cập nhật file Excel là coi như xong.

2. Nhóm dùng Script (Bash/Python) chạy Cronjob

  • Ưu điểm: Tự động hóa tốt, có thể bắn tin nhắn Telegram.
  • Nhược điểm: Khó quản lý tập trung. Script có thể chết âm thầm mà không ai biết. Việc lưu trữ lịch sử để vẽ biểu đồ theo dõi độ ổn định (uptime) cũng rất lỉnh kỉnh.

3. Nhóm giám sát hiện đại (Prometheus & Blackbox Exporter)

  • Ưu điểm: Quản lý tập trung trên Dashboard Grafana trực quan. Cảnh báo đa kênh qua Slack, Telegram hay PagerDuty. Cơ chế kiểm tra từ bên ngoài (external check) giúp mô phỏng chính xác trải nghiệm người dùng thực tế.
  • Nhược điểm: Tốn chút thời gian setup ban đầu.

Tại sao Blackbox Exporter lại là lựa chọn tối ưu?

Nếu server của bạn đã có sẵn Prometheus để soi CPU/RAM, việc tích hợp thêm Blackbox Exporter chỉ mất đúng 5 phút.

Cách hoạt động của nó khá trực diện. Blackbox Exporter đóng vai trò như một “người dùng ảo”. Nó gửi request HTTP/HTTPS tới website rồi bóc tách dữ liệu từ chứng chỉ SSL trả về. Bạn sẽ biết chính xác ngày hết hạn hay tổ chức cấp phát mà không cần gõ lệnh thủ công.

Kinh nghiệm thực chiến: Thay vì SSH vào từng server chạy lệnh openssl x509 -enddate, giờ đây mình chỉ cần liếc qua dashboard. Mọi domain sắp hết hạn trong 30 ngày tới sẽ tự động nhảy lên top đầu danh sách ưu tiên.

Hướng dẫn triển khai nhanh

Bước 1: Cài đặt Blackbox Exporter với Docker

Dùng Docker là cách nhanh nhất để giữ môi trường sạch sẽ. Đầu tiên, hãy tạo file cấu hình:

mkdir -p /etc/blackbox_exporter
vi /etc/blackbox_exporter/blackbox.yml

Nội dung file blackbox.yml:

modules:
  http_2xx:
    prober: http
    timeout: 5s
    http:
      valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
      method: GET
      fail_if_not_ssl: true # Bắt buộc phải có SSL mới tính là pass

Khởi chạy container:

docker run -d \
  --name blackbox_exporter \
  -p 9115:9115 \
  -v /etc/blackbox_exporter:/config \
  prom/blackbox-exporter:latest \
  --config.file=/config/blackbox.yml

Bước 2: Cấu hình Prometheus thu thập dữ liệu

Tiếp theo, hãy chỉ đường cho Prometheus tìm đến Blackbox Exporter. Thêm đoạn sau vào prometheus.yml:

scrape_configs:
  - job_name: 'ssl_expiry'
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:
      - targets:
        - https://itfromzero.com
        - https://google.com
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 127.0.0.1:9115 # IP của Blackbox Exporter

Sau khi restart, hãy kiểm tra metric probe_ssl_earliest_cert_expiry. Nếu thấy xuất hiện một dãy số timestamp thì chúc mừng, bạn đã lấy dữ liệu thành công.

Bước 3: Thiết lập “còi báo động” Alertmanager

Đừng ngồi canh biểu đồ, hãy để Alertmanager làm việc đó. Tạo file ssl_rules.yml:

groups:
- name: ssl_expiry_rules
  rules:
  - alert: SSLCertExpiringSoon
    expr: (probe_ssl_earliest_cert_expiry - time()) / 86400 < 15
    for: 1h
    labels:
      severity: warning
    annotations:
      summary: "SSL sắp hết hạn: {{ $labels.instance }}"
      description: "Chứng chỉ SSL sẽ hết hạn sau chưa đầy 15 ngày. Lo gia hạn đi thôi!"

Ở đây mình dùng con số 86400 (số giây trong một ngày) để quy đổi timestamp sang số ngày cho dễ đọc. Mức cảnh báo 15 ngày là khoảng thời gian “vàng” để làm thủ tục thanh toán và gia hạn.

Bước 4: Đừng quên hạn tên miền (Domain Expiry)

Blackbox Exporter chỉ soi được SSL. Với ngày hết hạn tên miền từ WHOIS, bạn nên dùng thêm domain_exporter (ví dụ bản của caarlos0). Nó hoạt động tương tự nhưng sẽ giúp bạn tránh được cú sốc mất domain vào tay “đầu cơ” vì quên đóng tiền cho nhà đăng ký.

Lời kết

Để SSL hay tên miền hết hạn là một lỗi cực kỳ sơ đẳng nhưng cái giá phải trả thường rất đắt. Với bộ đôi Prometheus và Blackbox Exporter, bạn không chỉ giải quyết được bài toán quên gia hạn. Bạn còn theo dõi được cả tốc độ phản hồi (latency) và các mã lỗi HTTP ẩn sâu trong hệ thống.

Đừng đợi đến khi website sập mới cuống cuồng đi fix. Hãy dành 30 phút thiết lập ngay hôm nay để có những đêm ngon giấc không lo sếp gọi. Chúc anh em triển khai thành công!

Share: