歡迎光臨
每天分享高質量文章

在 Debian 9 上使用 Rsyslog 安裝一臺中央日誌伺服器 | Linux 中國

在 Linux 中,可以配置執行一個 Rsyslog 伺服器來中央化管理日誌,在流行的服務端—客戶端樣式中,透過 TCP 或者 UDP 傳輸協議基於網路來傳送日誌資訊,或者從網路裝置、伺服器、路由器、交換機、以及其它系統或嵌入式裝置中接受生成的日誌。
— Matt Vas


致謝
編譯自 | https://www.howtoforge.com/tutorial/rsyslog-centralized-log-server-in-debian-9/
 作者 | Matt Vas
 譯者 | qhwdw ? ? ? ? ? 共計翻譯:102 篇 貢獻時間:154 天

在 Linux 上,日誌檔案包含了系統功能的資訊,系統管理員經常使用日誌來確認機器上的問題所在。日誌可以幫助管理員還原在過去的時間中在系統中發生的事件。一般情況下,Linux 中所有的日誌檔案都儲存在 /var/log 目錄下。在這個目錄中,有儲存著各種資訊的幾種型別的日誌檔案。比如,記錄系統事件的日誌檔案、記錄安全相關資訊的日誌檔案、核心專用的日誌檔案、使用者或者 cron 作業使用的日誌檔案。日誌檔案的主要作用是系統除錯。Linux 中的大部分的日誌檔案都由 rsyslogd 服務來管理。在最新的 Linux 發行版中,日誌檔案也可能是由 journald 系統服務來管理和控制的。journald 服務是 systemd 初始化程式的一部分。journald 以二進位制的格式儲存日誌,以易失性的方式寫入到記憶體和 /run/log/journal/中的環狀緩衝區中,但是,journald 也可以配置為永久儲存到 syslog 中。

在 Linux 中,可以配置執行一個 Rsyslog 伺服器來中央化管理日誌,在流行的服務端—客戶端樣式中,透過 TCP 或者 UDP 傳輸協議基於網路來傳送日誌資訊,或者從網路裝置、伺服器、路由器、交換機、以及其它系統或嵌入式裝置中接受生成的日誌。

Rsyslog 守護程式可以被同時配置為以客戶端或者服務端方式執行。配置作為伺服器時,Rsyslog 將預設監聽 TCP 和 UDP 的 514 埠,來收集遠端系統基於網路傳送的日誌資訊。配置為客戶端執行時,Rsyslog 將透過相同的 TCP 或 UDP 埠基於網路來傳送內部日誌資訊。

Rsyslog 可以根據選定的屬性和動作來過濾 syslog 資訊。Rsyslog 擁有的過濾器如下:

☉ 裝置或者優先順序過濾器
☉ 基於特性的過濾器
☉ 基於運算式的過濾器

裝置過濾器代表了生成日誌的 Linux 內部子系統。它們目前的分類如下:

◈ auth/authpriv = 由驗證行程產生的資訊
◈ cron = cron 任務相關的日誌
◈ daemon = 正在執行的系統服務相關的資訊
◈ kernel = Linux 核心資訊
◈ mail = 郵件伺服器資訊
◈ syslog = syslog 或者其它守護程式(DHCP 伺服器傳送的日誌在這裡)相關的資訊
◈ lpr = 印表機或者列印伺服器資訊
◈ local0 ~ local7 = 管理員控制下的自定義資訊

優先順序或者嚴重程度級別分配如下所述的一個關鍵字或者一個數字。

◈ emerg = 緊急 – 0
◈ alert = 警報 – 1
◈ err = 錯誤 – 3
◈ warn = 警告 – 4
◈ notice = 提示 – 5
◈ info = 資訊 – 6
◈ debug = 除錯 – 7 (最高階別)

此外也有一些 Rsyslog 專用的關鍵字,比如星號(*)可以用來定義所有的裝置和優先順序,none 關鍵字更具體地表示沒有優先順序,等號(=)表示僅那個優先順序,感嘆號(!)表示取消這個優先順序。

Rsyslog 的動作部分由宣告的目的地來表示。日誌資訊的目的地可以是:儲存在檔案系統中的一個檔案、 /var/log/ 目錄下的一個檔案、透過命名管道或者 FIFO 作為輸入的另一個本地行程。日誌資訊也可以直達使用者,或者丟棄到一個“黑洞”(/dev/null)中、或者傳送到標準輸出、或者透過一個 TCP/UDP 協議傳送到一個遠端 syslog 伺服器。日誌資訊也可以儲存在一個資料庫中,比如 MySQL 或者 PostgreSQL。

配置 Rsyslog 為伺服器

在大多數 Linux 發行版中 Rsyslog 守護程式是自動安裝的。如果你的系統中沒有安裝 Rsyslog,你可以根據你的系統發行版執行如下之一的命令去安裝這個服務。執行這個命令必須有 root 許可權

在基於 Debian 的發行版中:

  1. sudo apt-get install rsyslog

在基於 RHEL 的發行版中,比如像 CentOS:

  1. sudo yum install rsyslog

驗證 Rsyslog 守護行程是否在你的系統中執行,根據發行版不同,可以選擇執行下列的命令:

在新的使用 systemd 的 Linux 發行版中:

  1. systemctl status rsyslog.service

在老的使用 init 的 Linux 發行版中:

  1. service rsyslog status

  1. /etc/init.d/rsyslog status

啟動 rsyslog 守護行程執行如下的命令。

在使用 init 的老的 Linux 版本:

  1. service rsyslog start

  1. /etc/init.d/rsyslog start

在最新的 Linux 發行版:

  1. systemctl start rsyslog.service

安裝一個 rsyslog 程式執行為伺服器樣式,可以編輯主要的配置檔案 /etc/rsyslog.conf。可以使用下列所示的命令去改變它。

  1. sudo vi /etc/rsyslog.conf

為了允許在 UDP 的 514 埠上接收日誌資訊,找到並刪除下列行前面的井號(#)以取消註釋。預設情況下,UDP 埠用於 syslog 去接收資訊。

  1. $ModLoad imudp

  2. $UDPServerRun 514

因為在網路上使用 UDP 協議交換資料並不可靠,你可以設定 Rsyslog 使用 TCP 協議去向遠端伺服器輸出日誌資訊。為了啟用 TCP 協議去接受日誌資訊,開啟 /etc/rsyslog.conf 檔案並刪除如下行前面的井號(#)以取消註釋。這將允許 rsyslog 守護程式去系結並監聽 TCP 協議的 514 埠。

  1. $ModLoad imtcp

  2. $InputTCPServerRun 514

在 rsyslog 上可以同時啟用兩種協議

如果你想去指定哪個傳送者被允許訪問 rsyslog 守護程式,可以在啟用協議行的後面新增如下的行:

  1. $AllowedSender TCP, 127.0.0.1, 10.110.50.0/24, *.yourdomain.com

在接收入站日誌資訊之前,你需要去建立一個 rsyslog 守護程式解析日誌的新模板,這個模板將指示本地 Rsyslog 伺服器在哪裡儲存入站的日誌資訊。在 $AllowedSender 行後以如下示例去建立一個合適的模板。

  1. $template Incoming-logs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log" 

  2. *.*  ?Incoming-logs

  3. & ~

為了僅接收核心生成的日誌資訊,可以使用如下的語法。

  1. kern.*   ?Incoming-logs

接收到的日誌由上面的模板來解析,它將儲存在本地檔案系統的 /var/log/ 目錄的檔案中,之後的是以客戶端主機名客戶端裝置名命名的日誌檔案名字:%HOSTNAME% 和 %PROGRAMNAME% 變數。

下麵的 & ~ 重定向規則,配置 Rsyslog 守護程式去儲存入站日誌資訊到由上面的變數名字指定的檔案中。否則,接收到的日誌資訊將被進一步處理,並將儲存在本地的日誌檔案中,比如,/var/log/syslog 檔案中。

為新增一個規則去丟棄所有與郵件相關的日誌資訊,你可以使用下列的語法。

  1. mail.* ~

可以在輸出檔案名中使用的其它變數還有:%syslogseverity%%syslogfacility%%timegenerated%%HOSTNAME%%syslogtag%%msg%%FROMHOST-IP%%PRI%%MSGID%%APP-NAME%%TIMESTAMP%、%$year%、%$month%%$day%

從 Rsyslog 版本 7 開始,將使用一個新的配置格式,在一個 Rsyslog 伺服器中宣告一個模板。

一個版本 7 的模板應該看起來是如下行的樣子。

  1. template(name="MyTemplate" type="string"

  2.          string="/var/log/%FROMHOST-IP%/%PROGRAMNAME:::secpath-replace%.log"

  3.         )

另一種樣式是,你也可以使用如下麵所示的樣子去寫上面的模板:

  1. template(name="MyTemplate" type="list") {

  2.     constant(value="/var/log/")

  3.     property(name="fromhost-ip")

  4.     constant(value="/")

  5.     property(name="programname" SecurePath="replace")

  6.     constant(value=".log")

  7.     }

為了讓 Rsyslog 配置檔案的變化生效,你必須重啟守護程式來載入新的配置。

  1. sudo service rsyslog restart

  1. sudo systemctl restart rsyslog

在 Debian Linux 系統上去檢查它監聽哪個套接字,你可以用 root 許可權去執行 netstat 命令。將輸出傳遞給一個過濾程式,比如 grep

  1. sudo netstat -tulpn | grep rsyslog

請註意: 為了允許建立入站連線,你必須在防火牆上開啟 Rsyslog 的埠。

在使用 Firewalld 的基於 RHEL 的發行版上,執行如下的命令:

  1. firewall-cmd --permanent --add-port=514/tcp

  2. firewall-cmd --permanent --add-port=514/tcp

  3. firewall-cmd -reload

在使用 UFW 的基於 Debian 的發行版上,執行如下的命令:

  1. ufw allow 514/tcp

  2. ufw allow 514/udp

Iptables 防火牆規則:

  1. iptables -A INPUT -p tcp -m tcp --dport 514 -j ACCEPT

  2. iptables -A INPUT -p udp --dport 514 -j ACCEPT

配置 Rsyslog 作為一個客戶端

啟用 Rsyslog 守護程式以客戶端樣式執行,並將輸出的本地日誌資訊傳送到遠端 Rsyslog 伺服器,編輯 /etc/rsyslog.conf 檔案並增加下列的行:

  1. *. * @IP_REMOTE_RSYSLOG_SERVER:514

  2. *. * @FQDN_RSYSLOG_SERVER:514

這個行啟用了 Rsyslog 服務,並將輸出的所有內部日誌傳送到一個遠處的 UDP 的 514 埠上執行的 Rsyslog 伺服器上。

為了使用 TCP 協議去傳送日誌資訊,使用下列的模板:

  1. *. *  @@IP_reomte_syslog_server:514

輸出所有優先順序的、僅與 cron 相關的日誌資訊到一個 Rsyslog 伺服器上,使用如下的模板:

  1. cron.* @ IP_reomte_syslog_server:514

在 /etc/rsyslog.conf 檔案中新增下列行,可以在 Rsyslog 伺服器無法透過網路訪問時,臨時將客戶端的日誌資訊儲存在它的一個磁碟緩衝檔案中,當網路或者伺服器恢復時,再次進行傳送。

  1. $ActionQueueFileName queue

  2. $ActionQueueMaxDiskSpace 1g

  3. $ActionQueueSaveOnShutdown on

  4. $ActionQueueType LinkedList

  5. $ActionResumeRetryCount -1

為使上述規則生效,需要重新 Rsyslog 守護程式,以啟用為客戶端樣式。


via: https://www.howtoforge.com/tutorial/rsyslog-centralized-log-server-in-debian-9/

作者:Matt Vas[2] 譯者:qhwdw 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

贊(0)

分享創造快樂