Giám sát mọi câu lệnh Linux: Giải pháp Snoopy Logger và Grafana Loki

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

Tại sao .bash_history là chưa đủ để giám sát?

Hồi mới đi làm, mình từng dính một vố đau điếng. Server database lăn quay ra chết vì ai đó sửa nhầm file config. Mình hí hửng SSH vào gõ history để tìm thủ phạm, nhưng kết quả chỉ là một màn hình trống trơn.

Hóa ra, thanh niên gây họa đã nhanh tay gõ history -c để xóa dấu vết. Thậm chí, chỉ cần dùng nhiều session cùng lúc, log mặc định của Linux cũng dễ dàng bị ghi đè và mất dữ liệu. Lịch sử lệnh mặc định cực kỳ mong manh.

Nếu bạn quản trị hệ thống có 5-10 người truy cập, bạn cần một giải pháp ghi log ở tầng thấp hơn. Nó phải bắt được mọi lệnh ngay cả khi người dùng cố tình che giấu. Đó là lý do mình chọn Snoopy Logger kết hợp với Grafana Loki.

Snoopy Logger – “Camera hành trình” cho Terminal

Snoopy Logger không phải một shell script hay phần mềm chạy ngầm nặng nề. Về bản chất, nó là một thư viện chia sẻ (shared library) can thiệp trực tiếp vào hàm execve() của hệ thống qua cơ chế LD_PRELOAD.

Mỗi khi một tiến trình mới khởi chạy, từ ls, rm cho đến các script chạy ngầm, Snoopy sẽ lập tức tóm lấy và đẩy thẳng vào syslog. Những ưu điểm khiến mình gắn bó với nó bao gồm:

  • Ghi lại chi tiết: User ID (UID), Terminal (TTY), thư mục làm việc (CWD) và lệnh gốc.
  • Bất khả xâm phạm: Người dùng thường không thể tắt hoặc bypass bằng cách xóa history.
  • Hiệu năng ấn tượng: Chỉ chiếm chưa tới 0.1% CPU ngay cả khi hệ thống đang xử lý hàng nghìn lệnh mỗi phút.

Mô hình triển khai tập trung

Trước đây, mình phải SSH vào từng server rồi tail -f /var/log/auth.log để soát lỗi. Cách này quá thủ công và tốn thời gian. Hiện tại, mình đẩy toàn bộ log về Grafana Loki thông qua Promtail.

Loki giúp nén log cực tốt, tiết kiệm tới 80% dung lượng so với lưu trữ văn bản thuần túy. Khi cần điều tra, mình chỉ việc mở Dashboard Grafana, lọc theo tên server hoặc tên user là mọi hành tung hiện ra rõ mồn một.

Hướng dẫn thực hiện chi tiết

Bước 1: Cài đặt Snoopy Logger

Trên Ubuntu hoặc Debian, bạn chỉ cần một câu lệnh duy nhất:

sudo apt update && sudo apt install snoopy -y

Để kiểm tra xem “camera” đã ghi hình chưa, hãy thử gõ vài lệnh rồi kiểm tra log hệ thống:

# Thử thực thi lệnh
cat /etc/passwd

# Kiểm tra log ngay lập tức
sudo tail -f /var/log/auth.log | grep snoopy

Dòng log trả về sẽ chứa đầy đủ thông tin định danh như UID của người thực hiện và câu lệnh chính xác đã chạy.

Bước 2: Cấu hình Promtail để vận chuyển log

Snoopy ghi log tại chỗ, còn Promtail đóng vai trò là shipper chuyển log về server Loki. Bạn tạo file cấu hình /etc/promtail/config-snoopy.yaml với nội dung sau:

server:
  http_listen_port: 9080

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://<LOKI_SERVER_IP>:3100/loki/api/v1/push

scrape_configs:
- job_name: snoopy_monitoring
  static_configs:
  - targets:
      - localhost
    labels:
      job: snoopy_logs
      host: prod-web-01
      __path__: /var/log/auth.log

Khởi động Promtail để bắt đầu quá trình đẩy dữ liệu lên trung tâm giám sát.

Bước 3: Truy vấn và bóc tách dữ liệu trên Grafana

Tại giao diện Grafana Explore, hãy chọn data source Loki. Bạn dùng câu lệnh LogQL đơn giản để lọc log từ Snoopy:

{job="snoopy_logs"} |= "snoopy"

Kinh nghiệm của mình là nên dùng hàm pattern trong LogQL. Nó giúp tách biệt UID, thư mục thực thi và câu lệnh thành các cột riêng. Việc này giúp bạn quan sát Dashboard trực quan hơn hẳn so với đọc text thô.

Kinh nghiệm thực chiến khi vận hành

Triển khai thực tế cho các hệ thống lớn thường phát sinh nhiều vấn đề về nhiễu dữ liệu. Dưới đây là 3 lưu ý giúp bạn tối ưu hệ thống:

1. Kiểm soát dung lượng log

Mặc định Snoopy ghi lại tất cả mọi thứ. Nếu server chạy hàng trăm cronjob mỗi phút, file log sẽ phình to rất nhanh. Bạn nên cấu hình file /etc/snoopy.ini để lọc bớt các user không cần thiết.

# Loại bỏ log từ các user hệ thống không quan trọng
[snoopy]
filter_chain = "exclude_uid:100,101"

2. Đảm bảo tính toàn vẹn của dữ liệu

Dù Snoopy rất mạnh, nhưng nếu kẻ tấn công chiếm quyền root, chúng vẫn có thể xóa log local. Việc đẩy log real-time về Loki là bắt buộc. Khi log đã rời khỏi server gốc, kẻ tấn công không còn cách nào xóa được dấu vết đã ghi trên Loki.

3. Thiết lập cảnh báo tự động

Đừng đợi đến lúc sự cố xảy ra mới vào xem log. Mình thường thiết lập Alerting trên Grafana để nhận thông báo qua Telegram ngay khi có ai đó thực thi các lệnh nhạy cảm như rm -rf /, chmod 777 hoặc truy cập vào thư mục chứa key bí mật.

Kết luận

Kết hợp Snoopy Logger và Grafana Loki mang lại sự minh bạch tuyệt đối cho hệ thống Linux của bạn. Nó không chỉ giúp truy vết sự cố mà còn là bằng chứng quan trọng trong các cuộc audit bảo mật.

Nếu bạn đang quản lý hạ tầng quan trọng, hãy thử triển khai mô hình này ngay hôm nay. Nó sẽ giúp bạn thoát khỏi những đêm mất ngủ vì không biết “ai đã làm gì” với server của mình. Chúc các bạn thành công!

Share: