Quản lý nhật ký tập trung trên Linux: Hướng dẫn Rsyslog và Logrotate của bạn

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Vấn đề: Nỗi đau đầu từ nhật ký phân tán

Ngay cả việc vận hành một vài máy chủ Linux, hoặc chỉ một ứng dụng quan trọng, cũng đồng nghĩa với việc phải xử lý nhật ký (log). Và điều đó có thể nhanh chóng trở thành một vấn đề lớn. Hãy tưởng tượng việc gỡ lỗi một kiến trúc microservice nơi nhật ký nằm rải rác trên hàng chục container! Việc sàng lọc từng tệp nhật ký trên mỗi máy để khắc phục sự cố hoặc kiểm tra bảo mật là cực kỳ kém hiệu quả. Nó cũng dễ bỏ sót thông tin quan trọng.

Hãy nghĩ theo cách này: bạn đang cố gắng hiểu một cuộc trò chuyện phức tạp, nhưng bạn chỉ có thể nghe những đoạn hội thoại nhỏ từ các phòng khác nhau cùng lúc. Bạn cần tập hợp tất cả những cuộc trò chuyện đó vào một nơi trung tâm. Điều này giúp chúng dễ dàng giám sát, phân tích và quản lý hiệu quả hơn nhiều.

Các khái niệm cốt lõi: Rsyslog và Logrotate giải cứu

Chúng ta sẽ giải quyết vấn đề quản lý nhật ký phân tán bằng cách sử dụng hai tiện ích Linux mạnh mẽ, được tích hợp sẵn. Khi kết hợp, các công cụ này tạo ra một giải pháp đáng ngạc nhiên hiệu quả và đáng tin cậy cao.

Rsyslog: Bộ sưu tập và chuyển tiếp nhật ký của bạn

Rsyslog là một hệ thống ghi nhật ký hiệu suất cao, được coi là tiêu chuẩn công nghiệp. Nó là tiện ích ghi nhật ký mặc định trên hầu hết các bản phân phối Linux hiện đại. Nhưng nó không chỉ là một trình ghi nhật ký cục bộ. Rsyslog có thể hoạt động như cả một client, siêng năng gửi nhật ký, và một server, nhận nhật ký từ nhiều nguồn. Khả năng client-server linh hoạt này chính xác là điều làm cho việc quản lý nhật ký tập trung trở nên thực tế.

Nó hoạt động dựa trên một tập hợp các quy tắc rõ ràng. Bạn định nghĩa các quy tắc này trong /etc/rsyslog.conf và các tệp bổ sung trong /etc/rsyslog.d/. Các quy tắc này chỉ định chính xác những thông báo nào cần ghi, nơi gửi chúng (đến một tệp cục bộ, một máy chủ từ xa, hoặc thậm chí là một cơ sở dữ liệu), và trong những điều kiện cụ thể nào. Dưới đây là các khái niệm chính của nó:

  • Facilities (Tiện ích): Chúng phân loại thông báo nhật ký theo ứng dụng nguồn hoặc thành phần hệ thống của chúng. Ví dụ bao gồm mail cho nhật ký máy chủ thư, auth cho thông báo xác thực, hoặc kern cho thông báo kernel.
  • Priorities (Ưu tiên): Ưu tiên chỉ ra mức độ nghiêm trọng của một thông báo nhật ký. Các ví dụ phổ biến là info (thông tin), warning (cảnh báo), err (lỗi), và crit (nghiêm trọng).

Logrotate: Trình duy trì nhật ký của bạn

Nếu không được quản lý, các tệp nhật ký có thể phát triển vô tận. Chúng sẽ nhanh chóng chiếm dụng không gian đĩa quý giá và biến việc phân tích nhật ký thành một cơn ác mộng. Đây là lúc logrotate xuất hiện. Mục đích chính của logrotate là đơn giản hóa việc quản trị các hệ thống tạo ra khối lượng lớn tệp nhật ký. Nó tự động xoay vòng, nén, xóa và thậm chí gửi thư các tệp này.

Thông thường, logrotate chạy như một tác vụ cron hàng ngày. Tệp cấu hình chính của nó, /etc/logrotate.conf, thường bao gồm các tệp cấu hình khác được tìm thấy trong /etc/logrotate.d/. Những tệp này thường chứa các cài đặt cụ thể của ứng dụng. Các khái niệm chính cần hiểu bao gồm:

  • Rotation frequency (Tần suất xoay vòng): Tần suất nhật ký được xoay vòng. Các tùy chọn phổ biến là hàng ngày, hàng tuần hoặc hàng tháng.
  • Compression (Nén): Điều này giúp tiết kiệm đáng kể không gian đĩa bằng cách nén các tệp nhật ký cũ hơn.
  • Retention policy (Chính sách lưu giữ): Chỉ định số lượng tệp nhật ký cũ cần giữ trước khi xóa chúng.
  • Pre/post-rotation scripts (Script trước/sau xoay vòng): Đây là các lệnh tùy chỉnh bạn có thể chạy trước hoặc sau khi xoay vòng nhật ký, chẳng hạn như khởi động lại dịch vụ hoặc gửi cảnh báo.

Thực hành: Thiết lập hệ thống nhật ký tập trung của bạn

Đã đến lúc thực hành. Tôi sẽ hướng dẫn bạn cấu hình một client rsyslog để gửi nhật ký của nó đến một máy chủ trung tâm. Sau đó, chúng ta sẽ thiết lập logrotate trên cả client và server để giữ mọi thứ được tổ chức và ngăn ngừa các vấn đề về không gian đĩa.

Điều kiện tiên quyết:

  • Hai máy Linux (ảo hoặc vật lý) cho bản trình diễn này. Chỉ định một máy làm “Client” (Máy khách) và máy còn lại làm “Server” (Máy chủ).
  • Bạn sẽ cần quyền sudo trên cả hai máy.

Bước 1: Cấu hình máy chủ Rsyslog

Trước hết, hãy chuẩn bị máy chủ nhật ký trung tâm của bạn để nhận nhật ký đến.

  1. Mở cấu hình Rsyslog:
    Trên máy chủ được chỉ định của bạn, mở tệp cấu hình rsyslog chính bằng trình soạn thảo văn bản bạn yêu thích:

    sudo nano /etc/rsyslog.conf
  2. Bật tính năng nhận UDP và TCP:
    Bỏ ghi chú các dòng này (hoặc thêm chúng nếu chúng bị thiếu) để bật rsyslog nhận thông báo syslog qua UDP và TCP. UDP thường nhanh hơn nhưng ít tin cậy hơn, trong khi TCP chậm hơn nhưng đảm bảo việc phân phối. Đối với nhật ký quan trọng, TCP thường là lựa chọn tốt hơn. Tôi thường bật cả hai.

    # Cung cấp tính năng nhận syslog qua UDP
    module(load="imudp")
    input(type="imudp" port="514")
    
    # Cung cấp tính năng nhận syslog qua TCP
    module(load="imtcp")
    input(type="imtcp" port="514")

    Lưu các thay đổi của bạn và thoát (Ctrl+X, Y, Enter).

  3. Tạo một mẫu nhật ký từ xa (Rất được khuyến nghị):
    Để giữ nhật ký từ các client khác nhau được tổ chức gọn gàng, việc tạo một mẫu tùy chỉnh là một chiến lược tuyệt vời. Thiết lập ví dụ này sẽ ghi tất cả các thông báo từ các máy chủ từ xa vào các tệp riêng biệt. Các tệp này sẽ được đặt tên theo hostname của chúng và được lưu trữ trong cấu trúc thư mục như /var/log/remote/HOSTNAME/PROGRAMNAME.log.
    Để rõ ràng hơn, hãy tạo một tệp cấu hình mới dành riêng cho mục đích này:

    sudo nano /etc/rsyslog.d/remote-logs.conf

    Thêm nội dung sau:

    $template RemoteHostLog,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
    *.* ?RemoteHostLog
    & stop

    Hãy nhanh chóng phân tích từng phần:

    • $template RemoteHostLog,...: Điều này định nghĩa một mẫu có tên RemoteHostLog.
    • %HOSTNAME%: Biến này đại diện cho hostname của máy gửi nhật ký.
    • %PROGRAMNAME%: Điều này xác định chương trình đã tạo thông báo nhật ký.
    • *.*: Điều này hoạt động như một ký tự đại diện, bắt tất cả các tiện ích và ưu tiên.
    • ?RemoteHostLog: Điều này áp dụng định dạng được định nghĩa trong mẫu RemoteHostLog.
    • & stop: Chỉ thị quan trọng này dừng xử lý thông báo này sau khi áp dụng mẫu. Nó ngăn nhật ký được ghi vào các tệp nhật ký mặc định khác trên máy chủ, tránh trùng lặp.

    Lưu và thoát.

  4. Tạo thư mục nhật ký:
    Đảm bảo thư mục đích cho nhật ký từ xa của bạn tồn tại. Nếu không, hãy tạo nó ngay bây giờ:

    sudo mkdir -p /var/log/remote
  5. Điều chỉnh tường lửa (nếu có):
    Bạn hoàn toàn nên chạy tường lửa! Nếu bạn đang sử dụng, hãy cho phép lưu lượng truy cập đến trên cổng 514 cho cả UDP và TCP. Đây là cách thực hiện cho các tường lửa phổ biến:

    Đối với ufw (Uncomplicated Firewall):

    sudo ufw allow 514/tcp
    sudo ufw allow 514/udp
    sudo ufw reload

    Đối với firewalld:

    sudo firewall-cmd --add-port=514/tcp --permanent
    sudo firewall-cmd --add-port=514/udp --permanent
    sudo firewall-cmd --reload
  6. Khởi động lại dịch vụ Rsyslog:
    Cuối cùng, khởi động lại dịch vụ rsyslog để áp dụng các thay đổi của bạn. Ngoài ra, hãy đảm bảo nó được đặt để tự động khởi động khi boot và kiểm tra trạng thái của nó:

    sudo systemctl restart rsyslog
    sudo systemctl enable rsyslog
    sudo systemctl status rsyslog

    Xác minh rằng nó đang chạy trơn tru và không có bất kỳ lỗi nào.

Bước 2: Cấu hình Client Rsyslog

Với máy chủ đã sẵn sàng, hãy cấu hình một máy client để gửi nhật ký của nó đến chúng ta.

  1. Mở cấu hình Rsyslog:
    Trên máy client, bạn có thể sửa đổi tệp cấu hình mặc định hoặc, để thiết lập gọn gàng hơn, tạo một tệp mới:

    sudo nano /etc/rsyslog.d/50-default.conf
    # Hoặc, tạo một tệp mới, ví dụ: /etc/rsyslog.d/remote.conf
  2. Thêm đích máy chủ từ xa:
    Ở cuối tệp, thêm một dòng để chuyển tiếp tất cả nhật ký đến địa chỉ IP của máy chủ trung tâm của bạn. Hãy nhớ thay thế YOUR_SERVER_IP bằng địa chỉ IP thực của máy chủ nhật ký của bạn:

    # Gửi tất cả các thông báo đến máy chủ rsyslog từ xa
    *.* @YOUR_SERVER_IP:514   # UDP (một @ cho UDP)
    # *.* @@YOUR_SERVER_IP:514 # TCP (sử dụng hai @@ cho TCP)

    Tôi thường bắt đầu với UDP vì tính đơn giản của nó, sau đó chuyển sang TCP (sử dụng @@) cho các hệ thống quan trọng nơi ngay cả việc mất mát thông báo tối thiểu cũng không thể chấp nhận được.
    Lưu tệp của bạn và thoát.

  3. Khởi động lại dịch vụ Rsyslog:
    Khởi động lại dịch vụ rsyslog trên client để kích hoạt cấu hình mới. Sau đó, kiểm tra trạng thái của nó:

    sudo systemctl restart rsyslog
    sudo systemctl status rsyslog
  4. Kiểm tra cấu hình client:
    Bây giờ là khoảnh khắc của sự thật! Trên client, tạo một thông báo nhật ký kiểm tra:

    logger "Đây là một thông báo kiểm tra từ client $(hostname) đến máy chủ nhật ký trung tâm."

    Sau đó, chuyển sang máy chủ trung tâm của bạn và kiểm tra thư mục /var/log/remote/. Bạn sẽ thấy một thư mục mới được tạo với tên hostname của client của bạn. Bên trong, bạn sẽ tìm thấy một tệp như logger.log chứa thông báo kiểm tra của bạn.

    sudo ls /var/log/remote/$(hostname)/
    sudo cat /var/log/remote/$(hostname)/logger.log

    Với kinh nghiệm cá nhân quản lý hơn 10 phiên bản Linux VPS trong hơn ba năm, tôi không thể nhấn mạnh đủ điều này: luôn kiểm tra kỹ lưỡng trước khi đưa vào sản xuất. Nó tiết kiệm vô số giờ gỡ lỗi! Hãy tạo thói quen xác minh nhật ký của bạn đang đến đúng nơi cần đến.

Bước 3: Cấu hình Logrotate cho cả Client và Server

Bây giờ các nhật ký đang lưu chuyển vui vẻ, chúng ta cần đảm bảo chúng không chiếm hết không gian đĩa của chúng ta. Logrotate là câu trả lời của chúng ta. Chúng ta sẽ cấu hình nó trên cả client (cho nhật ký cục bộ của nó) và, quan trọng nhất, trên server (để quản lý các nhật ký từ xa đến).

  1. Xem lại cấu hình Logrotate toàn cục:
    Trên cả client và server của bạn, hãy xem /etc/logrotate.conf. Tệp này chứa các cài đặt toàn cục và thường bao gồm tất cả các tệp được tìm thấy trong /etc/logrotate.d/.

    sudo cat /etc/logrotate.conf

    Bạn sẽ thấy các chỉ thị như weekly, rotate 4, create, compress, và include /etc/logrotate.d, chúng kiểm soát cách xoay vòng nhật ký hoạt động trên toàn hệ thống.

  2. Tạo cấu hình Logrotate tùy chỉnh cho nhật ký từ xa (phía Server):
    Bước này hoàn toàn quan trọng đối với máy chủ nhật ký trung tâm của bạn. Chúng ta cần hướng dẫn rõ ràng logrotate cách xử lý các nhật ký đang tích lũy trong /var/log/remote/.
    Tạo một tệp cấu hình mới cho mục đích này:

    sudo nano /etc/logrotate.d/remote-rsyslog

    Thêm cấu hình sau. Cứ thoải mái điều chỉnh rotate, size, hoặc tần suất (daily/weekly/monthly) để phù hợp với chính sách lưu giữ và nhu cầu lưu trữ cụ thể của bạn.

    /var/log/remote/*/*.log {
        daily
        rotate 7
        compress
        delaycompress
        missingok
        notifempty
        create 0640 syslog adm
        sharedscripts
        postrotate
            systemctl reload rsyslog > /dev/null 2>&1 || true
        endscript
    }

    Hãy phân tích từng chỉ thị:

    • /var/log/remote/*/*.log: Điều này chỉ định rằng cấu hình áp dụng cho tất cả các tệp .log được tìm thấy trong bất kỳ thư mục con nào dưới /var/log/remote/.
    • daily: Nhật ký sẽ được xoay vòng hàng ngày. Các tùy chọn khác bao gồm weekly (hàng tuần) hoặc monthly (hàng tháng), tùy thuộc vào khối lượng và nhu cầu lưu giữ của bạn.
    • rotate 7: Chỉ thị này hướng dẫn logrotate giữ bảy tệp nhật ký đã xoay vòng. Tệp cũ nhất sẽ bị xóa khi một tệp mới được tạo.
    • compress: Sau khi xoay vòng, các tệp nhật ký cũ sẽ được nén, tiết kiệm không gian đĩa.
    • delaycompress: Việc nén bị trì hoãn cho đến chu kỳ xoay vòng *tiếp theo*. Điều này hữu ích vì nó cho phép tệp nhật ký mới được xoay vòng, nhưng vẫn chưa được nén, được xử lý bởi các công cụ khác thêm một ngày nữa.
    • missingok: Nếu một tệp nhật ký bị thiếu, logrotate sẽ không than phiền hoặc đưa ra lỗi.
    • notifempty: Điều này ngăn logrotate xoay vòng một tệp nếu nó hoàn toàn trống rỗng.
    • create 0640 syslog adm: Sau khi xoay vòng, một tệp nhật ký mới, trống rỗng được tạo với các quyền cụ thể (mode 0640) và quyền sở hữu (syslog:adm).
    • sharedscripts: Nếu nhiều tệp nhật ký khớp với mẫu ký tự đại diện, các script prerotatepostrotate sẽ chỉ chạy một lần, thay vì cho mỗi tệp.
    • postrotate ... endscript: Các lệnh này thực thi ngay sau quá trình xoay vòng nhật ký. Trong trường hợp này, nó tải lại rsyslog. Điều này đảm bảo rằng rsyslog bắt đầu ghi vào tệp nhật ký trống mới được tạo. Phần > /dev/null 2>&1 || true ngăn chặn bất kỳ đầu ra nào từ lệnh tải lại và ngăn script thất bại nếu việc tải lại rsyslog không thực sự cần thiết hoặc gặp một vấn đề nhỏ.

    Lưu và thoát.

  3. Kiểm tra cấu hình Logrotate:
    Bạn có thể kiểm tra cấu hình logrotate của mình ở chế độ gỡ lỗi mà không thực sự thực hiện bất kỳ sửa đổi tệp nào:

    sudo logrotate -d /etc/logrotate.conf

    Để buộc xoay vòng thực tế (cực kỳ hữu ích để kiểm tra, nhưng hãy thận trọng trong môi trường sản xuất):

    sudo logrotate -f /etc/logrotate.d/remote-rsyslog

    Sau khi xoay vòng bắt buộc, điều hướng đến /var/log/remote/. Bạn sẽ thấy các tệp nhật ký mới được xoay vòng và nén ở đó.

Những cân nhắc thêm:

  • Security (Bảo mật): Luôn ưu tiên bảo mật máy chủ nhật ký trung tâm của bạn. Chỉ mở các cổng cần thiết (514 UDP/TCP) và, nếu có thể, hạn chế quyền truy cập vào danh sách các IP client cụ thể.
  • Storage (Lưu trữ): Lập kế hoạch cho không gian lưu trữ dồi dào trên máy chủ nhật ký trung tâm của bạn. Ví dụ, một máy chủ web bận rộn có thể tạo ra vài gigabyte nhật ký hàng ngày. Hãy xem xét bộ nhớ đối tượng hoặc các công cụ phân tích nhật ký chuyên dụng cho các chiến lược lưu giữ dài hạn.
  • Monitoring (Giám sát): Chủ động thiết lập giám sát mức sử dụng không gian đĩa của máy chủ nhật ký và trạng thái hoạt động của dịch vụ rsyslog.
  • Advanced Rsyslog (Rsyslog nâng cao): Tìm hiểu sâu hơn về các tính năng nâng cao của rsyslog. Chúng bao gồm các bộ lọc mạnh mẽ, khả năng sửa đổi thông báo và các tùy chọn chuyển tiếp đến cơ sở dữ liệu hoặc hệ thống Quản lý Thông tin và Sự kiện Bảo mật (SIEM) để phân tích tinh vi hơn.

Kết luận: Nền tảng cho các hệ thống bền vững

Việc triển khai hệ thống quản lý nhật ký tập trung với rsyslog và logrotate là một thực hành nền tảng để duy trì môi trường Linux mạnh mẽ và an toàn. Nó biến một tập hợp các tệp nhật ký phân tán, thường hỗn loạn thành một tài nguyên có tổ chức, dễ truy cập và dễ quản lý.

Bằng cách làm theo các bước được nêu trong hướng dẫn này, bạn sẽ có được khả năng hiển thị vượt trội vào các hệ thống của mình, hợp lý hóa đáng kể các nỗ lực khắc phục sự cố và củng cố tư thế bảo mật tổng thể của bạn. Thiết lập này là một phần cơ sở hạ tầng thực sự có giá trị tiếp tục mang lại lợi ích khi hoạt động của bạn mở rộng.

Share: