在 Debian 9 上使用 Rsyslog 安裝一台中央日誌伺服器
在 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
= 緊急 - 0alert
= 警報 - 1err
= 錯誤 - 3warn
= 警告 - 4notice
= 提示 - 5info
= 信息 - 6debug
= 調試 - 7 (最高級別)
此外也有一些 Rsyslog 專用的關鍵字,比如星號(*
)可以用來定義所有的設備和優先順序,none
關鍵字更具體地表示沒有優先順序,等號(=
)表示僅那個優先順序,感嘆號(!
)表示取消這個優先順序。
Rsyslog 的動作部分由聲明的目的地來表示。日誌信息的目的地可以是:存儲在文件系統中的一個文件、 /var/log/
目錄下的一個文件、通過命名管道或者 FIFO 作為輸入的另一個本地進程。日誌信息也可以直達用戶,或者丟棄到一個「黑洞」(/dev/null
)中、或者發送到標準輸出、或者通過一個 TCP/UDP 協議發送到一個遠程 syslog 伺服器。日誌信息也可以保存在一個資料庫中,比如 MySQL 或者 PostgreSQL。
配置 Rsyslog 為伺服器
在大多數 Linux 發行版中 Rsyslog 守護程序是自動安裝的。如果你的系統中沒有安裝 Rsyslog,你可以根據你的系統發行版執行如下之一的命令去安裝這個服務。運行這個命令必須有 root 許可權。
在基於 Debian 的發行版中:
sudo apt-get install rsyslog
在基於 RHEL 的發行版中,比如像 CentOS:
sudo yum install rsyslog
驗證 Rsyslog 守護進程是否在你的系統中運行,根據發行版不同,可以選擇運行下列的命令:
在新的使用 systemd 的 Linux 發行版中:
systemctl status rsyslog.service
在老的使用 init 的 Linux 發行版中:
service rsyslog status
或
/etc/init.d/rsyslog status
啟動 rsyslog 守護進程運行如下的命令。
在使用 init 的老的 Linux 版本:
service rsyslog start
或
/etc/init.d/rsyslog start
在最新的 Linux 發行版:
systemctl start rsyslog.service
安裝一個 rsyslog 程序運行為伺服器模式,可以編輯主要的配置文件 /etc/rsyslog.conf
。可以使用下列所示的命令去改變它。
sudo vi /etc/rsyslog.conf
為了允許在 UDP 的 514 埠上接收日誌信息,找到並刪除下列行前面的井號(#
)以取消注釋。預設情況下,UDP 埠用於 syslog 去接收信息。
$ModLoad imudp
$UDPServerRun 514
因為在網路上使用 UDP 協議交換數據並不可靠,你可以設置 Rsyslog 使用 TCP 協議去向遠程伺服器輸出日誌信息。為了啟用 TCP 協議去接受日誌信息,打開 /etc/rsyslog.conf
文件並刪除如下行前面的井號(#
)以取消注釋。這將允許 rsyslog 守護程序去綁定並監聽 TCP 協議的 514 埠。
$ModLoad imtcp
$InputTCPServerRun 514
在 rsyslog 上可以同時啟用兩種協議。
如果你想去指定哪個發送者被允許訪問 rsyslog 守護程序,可以在啟用協議行的後面添加如下的行:
$AllowedSender TCP, 127.0.0.1, 10.110.50.0/24, *.yourdomain.com
在接收入站日誌信息之前,你需要去創建一個 rsyslog 守護程序解析日誌的新模板,這個模板將指示本地 Rsyslog 伺服器在哪裡保存入站的日誌信息。在 $AllowedSender
行後以如下示例去創建一個合適的模板。
$template Incoming-logs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?Incoming-logs
& ~
為了僅接收內核生成的日誌信息,可以使用如下的語法。
kern.* ?Incoming-logs
接收到的日誌由上面的模板來解析,它將保存在本地文件系統的 /var/log/
目錄的文件中,之後的是以客戶端主機名客戶端設備名命名的日誌文件名字:%HOSTNAME%
和 %PROGRAMNAME%
變數。
下面的 & ~
重定向規則,配置 Rsyslog 守護程序去保存入站日誌信息到由上面的變數名字指定的文件中。否則,接收到的日誌信息將被進一步處理,並將保存在本地的日誌文件中,比如,/var/log/syslog
文件中。
為添加一個規則去丟棄所有與郵件相關的日誌信息,你可以使用下列的語法。
mail.* ~
可以在輸出文件名中使用的其它變數還有:%syslogseverity%
、%syslogfacility%
、%timegenerated%
、%HOSTNAME%
、%syslogtag%
、%msg%
、%FROMHOST-IP%
、%PRI%
、%MSGID%
、%APP-NAME%
、%TIMESTAMP%
、%$year%、%$month%
、%$day%
。
從 Rsyslog 版本 7 開始,將使用一個新的配置格式,在一個 Rsyslog 伺服器中聲明一個模板。
一個版本 7 的模板應該看起來是如下行的樣子。
template(name="MyTemplate" type="string"
string="/var/log/%FROMHOST-IP%/%PROGRAMNAME:::secpath-replace%.log"
)
另一種模式是,你也可以使用如下面所示的樣子去寫上面的模板:
template(name="MyTemplate" type="list") {
constant(value="/var/log/")
property(name="fromhost-ip")
constant(value="/")
property(name="programname" SecurePath="replace")
constant(value=".log")
}
為了讓 Rsyslog 配置文件的變化生效,你必須重啟守護程序來載入新的配置。
sudo service rsyslog restart
sudo systemctl restart rsyslog
在 Debian Linux 系統上去檢查它監聽哪個套接字,你可以用 root 許可權去運行 netstat
命令。將輸出傳遞給一個過濾程序,比如 grep
。
sudo netstat -tulpn | grep rsyslog
請注意: 為了允許建立入站連接,你必須在防火牆上打開 Rsyslog 的埠。
在使用 Firewalld 的基於 RHEL 的發行版上,運行如下的命令:
firewall-cmd --permanent --add-port=514/tcp
firewall-cmd --permanent --add-port=514/tcp
firewall-cmd -reload
在使用 UFW 的基於 Debian 的發行版上,運行如下的命令:
ufw allow 514/tcp
ufw allow 514/udp
Iptables 防火牆規則:
iptables -A INPUT -p tcp -m tcp --dport 514 -j ACCEPT
iptables -A INPUT -p udp --dport 514 -j ACCEPT
配置 Rsyslog 作為一個客戶端
啟用 Rsyslog 守護程序以客戶端模式運行,並將輸出的本地日誌信息發送到遠程 Rsyslog 伺服器,編輯 /etc/rsyslog.conf
文件並增加下列的行:
*. * @IP_REMOTE_RSYSLOG_SERVER:514
*. * @FQDN_RSYSLOG_SERVER:514
這個行啟用了 Rsyslog 服務,並將輸出的所有內部日誌發送到一個遠處的 UDP 的 514 埠上運行的 Rsyslog 伺服器上。
為了使用 TCP 協議去發送日誌信息,使用下列的模板:
*. * @@IP_reomte_syslog_server:514
輸出所有優先順序的、僅與 cron 相關的日誌信息到一個 Rsyslog 伺服器上,使用如下的模板:
cron.* @ IP_reomte_syslog_server:514
在 /etc/rsyslog.conf
文件中添加下列行,可以在 Rsyslog 伺服器無法通過網路訪問時,臨時將客戶端的日誌信息存儲在它的一個磁碟緩衝文件中,當網路或者伺服器恢復時,再次進行發送。
$ActionQueueFileName queue
$ActionQueueMaxDiskSpace 1g
$ActionQueueSaveOnShutdown on
$ActionQueueType LinkedList
$ActionResumeRetryCount -1
為使上述規則生效,需要重新 Rsyslog 守護程序,以激活為客戶端模式。
via: https://www.howtoforge.com/tutorial/rsyslog-centralized-log-server-in-debian-9/
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive