Bảo mật Log với Grafana Loki: Tự động ẩn Password và API Key trong 5 phút

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Rủi ro từ những dòng log “vô hại”

Chỉ một phút lơ là khi đặt console.log hoặc để mức log DEBUG, bạn có thể khiến toàn bộ API Key AWS hay mật khẩu database phơi bày trên dashboard. Thực tế, nhiều vụ rò rỉ dữ liệu lớn không đến từ các cuộc tấn công phức tạp. Chúng bắt nguồn từ chính những dòng log mà anh em DevOps vẫn xem hàng ngày.

Log là tài nguyên dùng chung để debug. Tuy nhiên, việc để lộ Plaintext Password cho bất kỳ ai có quyền truy cập Grafana là một lỗ hổng nghiêm trọng. Thay vì cấm log (điều gần như bất khả thi), giải pháp tối ưu là Data Masking (ẩn dữ liệu) ngay tại nguồn trước khi đẩy vào Grafana Loki.

Sức mạnh của Pipeline Stages trong Grafana Loki

Để xử lý dữ liệu trước khi lưu trữ, chúng ta sử dụng Promtail hoặc Grafana Alloy. Công cụ này sở hữu tính năng pipeline_stages cực kỳ linh hoạt. Hãy tưởng tượng nó như một bộ lọc thông minh: Log đi vào, được rà soát qua các quy tắc, và chỉ những dữ liệu “sạch” mới được đi tiếp.

Trong bộ công cụ này, stage replace là thành phần then chốt nhất. Nó sử dụng Regex (biểu thức chính quy) để quét các chuỗi khớp với định dạng nhạy cảm. Sau đó, hệ thống sẽ ghi đè chúng bằng các ký tự như ******** hoặc [MASKED].

Kinh nghiệm thực chiến: Khi thiết lập hệ thống, mình luôn ưu tiên tạo mật khẩu ngẫu nhiên có độ phức tạp cao. Mình thường dùng toolcraft.app/vi/tools/security/password-generator. Công cụ này xử lý hoàn toàn tại trình duyệt, giúp tránh rủi ro lộ pass qua môi trường mạng.

Thực hành: Cấu hình Promtail để bảo mật dữ liệu

Bước 1: Xác định các mẫu dữ liệu cần bảo vệ

Đầu tiên, hãy liệt kê các định dạng dữ liệu nhạy cảm thường xuất hiện trong ứng dụng của bạn. Thông thường sẽ bao gồm:

  • Các biến môi trường: DB_PASSWORD=admin123
  • Cấu trúc JSON: "api_token": "secret-key-99"
  • Header xác thực: Authorization: Bearer xyz123

Bước 2: Cấu hình file promtail-config.yaml

Dưới đây là mẫu cấu hình mình đã tối ưu cho các dự án thực tế. Bạn hãy chèn đoạn pipeline_stages này vào phần scrape_configs.

scrape_configs:
- job_name: app_services
  static_configs:
  - targets:
      - localhost
    labels:
      job: nodejs_app
      __path__: /var/log/app/*.log

  pipeline_stages:
    # Stage 1: Xử lý Password trong query string hoặc body
    - replace:
        expression: "(?i)(password|passwd|pwd)=\"?([^\\s&;\"']+)\"?"
        replace: "$1=********"

    # Stage 2: Ẩn API Key định dạng đặc thụ (ví dụ của OpenAI hoặc Stripe)
    - replace:
        expression: "(sk-[a-zA-Z0-9]{20,})"
        replace: "[MASKED_KEY]"

    # Stage 3: Bảo mật Token trong Header
    - replace:
        expression: "(?i)(Authorization: Bearer )([^\\s]+)"
        replace: "$1********"

Lưu ý kỹ thuật:

  • Flag (?i) giúp Regex không phân biệt chữ hoa chữ thường, tránh bỏ sót Passwordpassword.
  • Sử dụng $1 trong phần replace giúp giữ lại tên field, chỉ ẩn giá trị bên trong.

Bước 3: Áp dụng và kiểm tra

Khởi động lại service để Promtail nhận cấu hình mới:

sudo systemctl restart promtail

Bạn có thể kiểm tra ngay bằng cách đẩy một dòng log giả lập vào hệ thống:

echo "Error: Connection failed for user=admin password=secret_pass" >> /var/log/app/test.log

Khi kiểm tra trên Grafana, dòng log sẽ hiển thị an toàn là: user=admin password=********.

Những lưu ý sống còn khi triển khai

1. Kiểm soát hiệu năng CPU

Mỗi dòng log đều phải đi qua bộ lọc Regex trước khi được lưu. Nếu hệ thống của bạn đẩy ra hàng trăm GB log mỗi ngày, các Regex quá phức tạp có thể khiến CPU tăng thêm 10-15%. Hãy giữ các pattern đơn giản nhất có thể.

2. Ẩn tại Ingest-time hay Query-time?

Nhiều người chọn cách dùng LogQL để ẩn dữ liệu khi xem trên Grafana. Đây là sai lầm chết người. Nếu chỉ ẩn khi query, dữ liệu gốc vẫn nằm trong database Loki. Bất kỳ ai có quyền truy cập trực tiếp vào storage đều có thể đọc được. Hãy luôn thực hiện masking tại Promtail (Ingest-time).

3. Thứ tự của các Stage

Nếu ứng dụng log dạng nhiều dòng (Multiline), bạn phải đặt stage multiline lên trước replace. Nếu không, bộ lọc sẽ bỏ sót các cặp key-value bị ngắt dòng, khiến dữ liệu nhạy cảm lọt lưới.

Lời kết

Bảo mật log không chỉ là kỹ thuật, đó là trách nhiệm với người dùng và tuân thủ pháp lý. Chỉ mất 5 phút cấu hình nhưng bạn sẽ tránh được những rủi ro pháp lý và thiệt hại danh tiếng khổng lồ. Đừng để đến khi “mất bò mới lo làm chuồng”, hãy rà soát lại hệ thống logging của bạn ngay hôm nay!

Share: