返回文章列表

Linux 系統日誌管理與集中式安全收集

本文介紹 Linux 系統日誌管理工具的使用,包含 Logwatch 簡化日誌審核、設定遠端日誌伺服器以及使用 stunnel 建立加密連線,保護日誌資料傳輸安全。文章涵蓋客戶端與伺服器端的 stunnel 設定步驟、rsyslog

系統管理 資安

在 Linux 系統中,有效管理日誌對於系統維護和安全至關重要。本文將探討如何使用 Logwatch 簡化日誌審核流程,並建立集中式日誌伺服器,以提升管理效率和安全性。此外,我們將介紹如何使用 stunnel 對日誌傳輸進行加密,確保日誌資料的機密性。首先,我們會說明如何安裝和組態 Logwatch,使其每日自動傳送日誌摘要。接著,將逐步講解如何設定一台集中式的日誌伺服器,接收來自多個客戶端的日誌資料。最後,我們將重點介紹如何使用 stunnel 建立安全的加密連線,保護日誌資料在傳輸過程中的安全。

使用 journalctl 管理日誌

在瞭解了 rsyslog 和 journald 的基本使用方法之後,我們來介紹一個實用的工具——Logwatch,它可以簡化日誌審核的工作。

使用 Logwatch 簡化日誌審核

每天進行日誌審核非常重要,但這項工作既枯燥又耗時。幸運的是,有多種工具可以使這項工作變得更容易。在常見的 Linux 發行版倉函式庫中,Logwatch 是筆者最喜歡的工具。

Logwatch 雖然沒有第三方日誌聚合器那樣華麗的功能,但仍然非常實用。每天早上,你都會在郵件帳戶中收到前一天的日誌摘要。根據你的郵件系統組態,你可以將摘要傳送到本地機器的使用者帳戶,或者傳送到任何可以存取的電子郵件帳戶。設定 Logwatch 非常簡單,讓我們透過一個實踐實驗來演示。

實作實驗:安裝 Logwatch

為了傳送訊息,Logwatch 需要機器上執行一個郵件伺服器守護程式。根據安裝作業系統時選擇的選項,你可能已經安裝了 Postfix 郵件伺服器。當 Postfix 組態為本地伺服器時,它會將系統訊息傳送到 root 使用者的本地帳戶。

要在本地機器上檢視 Logwatch 摘要,你還需要安裝一個文字模式的郵件閱讀器,例如 mutt。

對於這個實驗,你可以使用任何虛擬機器:

  1. 安裝 Logwatch、mutt 和 Postfix。在 Ubuntu 上,安裝 Postfix 時選擇本地選項。在 CentOS 或 AlmaLinux 上,本地選項是預設值。

    • 在 Ubuntu 上執行:
      sudo apt install postfix mutt logwatch
      
    • 在 CentOS 7 上執行:
      sudo yum install postfix mutt logwatch
      
    • 在 AlmaLinux 上執行:
      sudo dnf install postfix mutt logwatch
      
  2. 僅在 Ubuntu 上,為你的使用者帳戶建立一個郵件池檔案:

    sudo touch /var/mail/your_user_name
    
  3. 使用你喜歡的文字編輯器開啟 /etc/aliases 檔案。透過在檔案底部新增以下行,將 root 使用者的郵件轉發到你自己的正常帳戶:

    root: your_user_name
    
  4. 儲存檔案,然後將檔案中的資訊複製到系統可以讀取的二進位制檔案中。使用以下命令:

    sudo newaliases
    
  5. 此時,你已經有了一個完全可用的 Logwatch 實作,它將每天傳送低階別的日誌摘要。要檢視預設組態,請檢視預設組態檔案:

    less /usr/share/logwatch/default.conf/logwatch.conf
    
  6. 要更改組態,請在 CentOS 和 AlmaLinux 上編輯 /etc/logwatch/conf/logwatch.conf 檔案,或在 Ubuntu 上建立該檔案。透過新增以下行,將日誌詳細程度更改為中級別:

    Detail = Med
    

    Logwatch 是一個 Python 指令碼,每天晚上按計劃執行。因此,無需重啟守護程式即可使組態更改生效。

  7. 執行一些操作以生成一些日誌條目。你可以透過執行系統更新、安裝一些軟體包以及使用 sudo fdisk -l 檢視分割槽組態來實作。

  8. 如果可能,讓你的虛擬機器執行一整夜。第二天早上,透過以下命令檢視你的日誌摘要:

    mutt
    

    當提示在你的主目錄中建立一個郵件目錄時,按 y 鍵。

內容解密:

  1. 安裝必要的套件:首先,我們需要在我們的 Linux 系統上安裝 Logwatch、Postfix 和 mutt。根據不同的 Linux 發行版(Ubuntu、CentOS 或 AlmaLinux),我們使用不同的套件管理器(apt、yum 或 dnf)來安裝這些套件。
  2. 組態 Postfix 和郵件別名:我們需要確保 Postfix 正確組態,以便能夠在本機上傳送和接收郵件。同時,我們還需要編輯 /etc/aliases 檔案,將 root 使用者的郵件轉發到我們自己的使用者帳戶。
  3. 建立郵件池檔案(僅限 Ubuntu):在 Ubuntu 系統上,我們需要手動建立一個郵件池檔案,以便系統能夠正確處理郵件。
  4. 更新別名資料函式庫:使用 newaliases 命令更新別名資料函式庫,以使我們對 /etc/aliases 檔案所做的更改生效。
  5. 組態 Logwatch:透過編輯或建立 Logwatch 的組態檔案,我們可以自定義 Logwatch 的行為,例如設定日誌詳細程度。
  6. 驗證 Logwatch 功能:透過執行一些會生成日誌條目的操作,並檢查第二天早上收到的 Logwatch 日誌摘要,來驗證 Logwatch 是否正常工作。

設定遠端日誌伺服器

到目前為止,我們只處理了本地機器的日誌檔案。但是,如果能夠將所有機器的日誌檔案集中儲存在一台伺服器上,而不是登入到每台機器上去審核日誌檔案,那將會非常方便。事實上,這是可以做到的,而且非常簡單。

為什麼需要集中式日誌管理?

  1. 方便性:集中式日誌管理允許我們從單一位置審核多台機器的日誌,大大簡化了日誌管理工作。
  2. 安全性:如果將日誌檔案分散儲存在各個主機上,網路入侵者更容易找到並修改這些檔案,以刪除有關其惡意活動的記錄。透過集中儲存日誌檔案,可以提高日誌的安全性。

實作實驗:設定基本的日誌伺服器

在 Ubuntu、CentOS 和 AlmaLinux 上設定日誌伺服器的步驟是相同的,只是在設定客戶端時有一個小小的差異。為了獲得最佳結果,請確保伺服器虛擬機器和客戶端虛擬機器具有不同的主機名。

  1. 在日誌收集伺服器虛擬機器上,使用你喜歡的文字編輯器開啟 /etc/rsyslog.conf 檔案,並找到以下幾行(位於檔案頂部附近):

    # Provides TCP syslog reception
    #module(load="imtcp") # needs to be done just once
    #input(type="imtcp" port="514")
    

    取消最後兩行的註解,並儲存檔案。該部分現在應該如下所示:

    # Provides TCP syslog reception
    module(load="imtcp") # needs to be done just once
    input(type="imtcp" port="514")
    
  2. 重啟 rsyslog 守護程式:

    sudo systemctl restart rsyslog
    
  3. 如果機器上啟用了防火牆,請開啟 514/tcp 埠。

內容解密:

  1. 啟用 rsyslog 的 TCP 接收模組:透過編輯 /etc/rsyslog.conf 檔案並取消相關行的註解,我們啟用了 rsyslog 的 TCP 接收模組,使其能夠接收來自其他主機的日誌訊息。
  2. 重啟 rsyslog 服務:為了使對 /etc/rsyslog.conf 檔案所做的更改生效,我們需要重啟 rsyslog 守護程式。
  3. 組態防火牆:如果伺服器上啟用了防火牆,我們需要組態防火牆規則,以允許其他主機透過 TCP 514 埠傳送日誌訊息到伺服器。

透過上述步驟,我們成功地設定了一個基本的遠端日誌伺服器,用於收集和管理多台機器的日誌檔案。

設定集中式日誌伺服器與加密傳輸

在現代的 IT 環境中,集中式日誌管理是確保系統安全性和故障排除的關鍵組成部分。本文將指導您如何設定一個集中式日誌伺服器,並使用加密連線來保護日誌資料的傳輸。

客戶端組態

首先,您需要在客戶端機器上進行組態。對於 Ubuntu 系統,您需要在 /etc/rsyslog.conf 檔案的底部新增一行,指定日誌伺服器的 IP 地址:

@@192.168.0.161:514

對於 CentOS 和 AlmaLinux,您需要修改 /etc/rsyslog.conf 檔案中的範例轉發規則部分,移除註解符號並新增日誌伺服器的 IP 地址和埠號:

# ### sample forwarding rule ###
action(type="omfwd"
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
queue.filename="fwdRule1" # unique name prefix for spool files
queue.maxdiskspace="1g" # 1gb space limit (use as much as possible)
queue.saveonshutdown="on" # save messages to disk on shutdown
queue.type="LinkedList" # run asynchronously
action.resumeRetryCount="-1" # infinite retries if host is down
# Remote Logging (we use TCP for reliable delivery)
# remote_host is: name/ip, e.g. 192.168.0.1, port optional e.g. 10514
Target="192.168.0.161" Port="514" Protocol="tcp")

內容解密:

  • @@192.168.0.161:514:指定日誌伺服器的 IP 地址和埠號,將日誌訊息轉發到該伺服器。
  • action(type="omfwd":定義一個轉發動作,將日誌訊息傳送到遠端主機。
  • queue.filename="fwdRule1":指定佇列檔案的名稱字首,用於在遠端主機不可用時臨時儲存日誌訊息。
  • Target="192.168.0.161" Port="514" Protocol="tcp":指定遠端日誌伺服器的 IP 地址、埠號和使用的協定(TCP)。

完成組態後,請儲存檔案並重新啟動 rsyslog 服務。

建立加密連線

為了保護日誌資料的傳輸安全,我們將使用 stunnel 軟體建立加密連線。以下是針對 AlmaLinux 和 Ubuntu 的設定步驟。

在 AlmaLinux 上設定 stunnel(伺服器端)

  1. 安裝 stunnel

    sudo dnf install stunnel
    
  2. 組態 stunnel:在 /etc/stunnel/ 目錄下建立 stunnel.conf 檔案,並新增以下內容:

    cert=/etc/stunnel/stunnel.pem
    fips=yes
    [hear from client]
    accept=30000
    connect=127.0.0.1:6514
    

    內容解密:

    • cert=/etc/stunnel/stunnel.pem:指定 stunnel 使用的憑證檔案。
    • fips=yes:啟用 FIPS 模式,以符合特定的安全標準。
    • [hear from client]:定義一個服務區塊,用於監聽來自客戶端的連線。
    • accept=30000:指定 stunnel 監聽的埠號,用於接收來自客戶端的加密連線。
    • connect=127.0.0.1:6514:將接收到的加密連線轉發到本機的 6514 埠,與 rsyslog 服務進行通訊。
  3. 生成憑證檔案

    sudo openssl req -new -x509 -days 3650 -nodes -out stunnel.pem -keyout stunnel.pem
    
  4. 組態防火牆:開啟 30000 埠並關閉 514 埠。

    sudo firewall-cmd --permanent --add-port=30000/tcp
    sudo firewall-cmd --permanent --remove-port=514/tcp
    sudo firewall-cmd --reload
    
  5. 啟動 stunnel 服務

    sudo systemctl enable --now stunnel
    
  6. 修改 rsyslog 組態:將監聽埠從 514 改為 6514。

  7. 重啟 rsyslog 服務

    sudo systemctl restart rsyslog
    

在 AlmaLinux 上設定 stunnel(客戶端)

  1. 安裝 stunnel

  2. 組態 stunnel:建立 /etc/stunnel/stunnel.conf 檔案,並新增以下內容:

    client=yes
    fips=yes
    [speak to server]
    accept=127.0.0.1:6514
    connect=192.168.0.161:30000
    

    內容解密:

    • client=yes:指定此 stunnel 組態為客戶端模式。
    • fips=yes:啟用 FIPS 模式。
    • [speak to server]:定義一個服務區塊,用於與伺服器建立加密連線。
    • accept=127.0.0.1:6514:監聽本機的 6514 埠,接收來自 rsyslog 的日誌訊息。
    • connect=192.168.0.161:30000:將日誌訊息透過加密連線轉發到指定的伺服器 IP 地址和埠號。
  3. 啟動 stunnel 服務

  4. 修改 rsyslog 組態:將日誌轉發目標改為本機的 6514 埠。

  5. 重啟 rsyslog 服務

  6. 測試組態:使用 logger 命令傳送測試訊息到日誌檔案,並在伺服器上驗證是否成功接收。

設定 stunnel 實作安全的日誌伺服器連線

在本章中,我們將探討如何使用 stunnel 來建立一個安全的日誌伺服器連線。首先,我們需要在伺服器端進行設定。

伺服器端設定

  1. 安裝 stunnel:在 AlmaLinux 或 Ubuntu 伺服器上安裝 stunnel。

    sudo apt install stunnel4  # Ubuntu
    sudo dnf install stunnel  # AlmaLinux
    
  2. 組態 stunnel:在 /etc/stunnel/ 目錄下建立 stunnel.conf 檔案,並新增以下內容:

    fips=yes  # AlmaLinux
    cert = /etc/stunnel/stunnel.pem
    
    [rsyslog]
    accept = 30000
    connect = 6514
    

    在 Ubuntu 上,由於無法使用 FIPS 模式,因此設定為 fips=no

  3. 建立安全憑證:使用 OpenSSL 建立所需的安全憑證。

    openssl req -new -x509 -days 365 -nodes -out stunnel.pem -keyout stunnel.pem
    
  4. 啟動 stunnel:啟動 stunnel 服務。

    sudo service stunnel4 start  # Ubuntu
    sudo systemctl start stunnel  # AlmaLinux
    
  5. 設定開機自動啟動:建立 cron job 使 stunnel 在系統重啟時自動啟動。

    sudo crontab -e -u root
    @reboot service stunnel4 start  # Ubuntu
    
  6. 修改 rsyslog 組態:編輯 /etc/rsyslog.conf 檔案,將輸入埠更改為 6514。

    input(type="imtcp" port="6514")
    
  7. 重啟 rsyslog:儲存更改後,重啟 rsyslog 服務。

    sudo systemctl restart rsyslog
    
  8. 防火牆設定:開啟防火牆上的 30000/tcp 埠,並關閉 514 埠。

程式碼解密:

以上步驟中的程式碼和組態檔案的修改,都是為了使 stunnel 和 rsyslog 能夠協同工作,實作安全的日誌傳輸。

使用者端設定

  1. 安裝 stunnel:在 Ubuntu 使用者端上安裝 stunnel。

    sudo apt install stunnel
    
  2. 組態 stunnel:在 /etc/stunnel/ 目錄下建立 stunnel.conf 檔案,並新增以下內容:

    client=yes
    fips=no
    [speak to server]
    accept = 127.0.0.1:6514
    connect=192.168.0.161:30000
    
  3. 啟動 stunnel:啟動 stunnel 服務。

    sudo service stunnel4 start
    
  4. 設定開機自動啟動:建立 cron job 使 stunnel 在系統重啟時自動啟動。

  5. 修改 rsyslog 組態:編輯 /etc/rsyslog.conf 檔案,將日誌伺服器的 IP 地址更改為 @@127.0.0.1:6514

  6. 重啟 rsyslog:儲存更改後,重啟 rsyslog 服務。

  7. 測試連線:使用 logger 命令傳送測試訊息到日誌伺服器。

程式碼解密:

使用者端的組態使日誌訊息能夠透過 stunnel 安全地傳輸到日誌伺服器。

將使用者端訊息分離到獨立的檔案

為了將不同使用者端的訊息分離到獨立的檔案中,需要對日誌伺服器的 rsyslog 組態檔案進行修改。

  1. 編輯 rsyslog 組態檔案:在 /etc/rsyslog.conf 檔案中,新增範本和規則,將不同使用者端的訊息寫入不同的檔案中。

    $template Rmessages,"/var/log/%HOSTNAME%/messages"
    *.info;mail.none;authpriv.none;cron.none ?Rmessages
    
    $template Rauth,"/var/log/%HOSTNAME%/secure"
    auth.*,authpriv.* ?Rauth
    
  2. 重啟 rsyslog:儲存更改後,重啟 rsyslog 服務。

圖表翻譯:

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 圖表翻譯:

rectangle "日誌訊息" as node1
rectangle "加密訊息" as node2
rectangle "儲存訊息" as node3
rectangle "儲存認證訊息" as node4

node1 --> node2
node2 --> node3
node3 --> node4

@enduml

此圖表顯示了使用者端如何透過 stunnel 將日誌訊息安全地傳輸到日誌伺服器,並根據主機名稱將訊息儲存在不同的檔案中。