配置 RSyslog 伺服器以接收 CEF 格式日誌

Published by gleetsai on

本篇文章會使用 Ubuntu 18.04 架設 RSyslog 伺服器,並且加入 Let’s Encrypt 啟用 Syslog over TLS。

準備環境

1. 使用 Linode 架設 Ubuntu 18.04

2. 準備一個網域名稱

在 Ubuntu 上安裝 RSyslog 必要服務

首先透過 SSH 連線到 Linode 上面的 Ubuntu 服務,你可以在 Linode 的面板上面,看到 SSH Access 的相關資訊。連線後執行以下指令:

  1. add-apt-repository ppa:adiscon/v8-stable
  2. apt-get update -y
  3. apt-get install rsyslog
  4. apt-get install rsyslog-gnutls
  5. apt-get install rsyslog-openssl

上面的指令全部安裝完後,可以使用 rsyslogd -N1 檢查所安裝的 Rsyslog 版本。本篇文章撰寫時,安裝的是 version 8.2110.0。也可以另外透過 apt-get list –installed,確認機器上所安裝套件都已經包含 rsyslog、rsyslog-gnutls、rsyslog-openssl。

註冊網域服務並指令 A Record

請到你的 DNS 服務商註冊一個 A Record,例如所要使用的網域名稱為 test.gleetsai.me,便在 A Record 上的 Host 填入 test,IP address 就參考 Linode 上所建立出來的 IP 位置填入,TTL 設定 30 秒即可。

在進入下一步前,使用 dig test.gleetsai.me 確認設定已經生效。若在畫面上以下這句話,就代表已完成,可進行下一步。

 ;test.gleetsai.me. IN A

在 Ubuntu 上安裝 Let’s Encrypt 與 Certbot 服務

參考 https://certbot.eff.org/instructions?ws=other&os=ubuntu-18 安裝 Let’s Encrypt 憑證服務,並利用 Certbot 申請憑證並在未來自動展延。

  1. snap install core; sudo snap refresh core
  2. snap install –classic certbot
  3. ln -s /snap/bin/certbot /usr/bin/certbot
  4. certbot certonly –standalone

在最後一個步驟,會要求填入資料以產生 TLS 憑證。完成後會看到憑證已放置在以下位置:

Certificate is saved at: /etc/letsencrypt/live/test.gleetsai.me/fullchain.pem
Key is saved at: /etc/letsencrypt/live/test.gleetsai.me/privkey.pem

上傳 CA 至 Ubuntu 伺服器

利用以下指令檢查拿到的 Let’s Encrypt 憑證的 CA 單位。

openssl x509 -in /etc/letsencrypt/live/test.gleetsai.me/fullchain.pem -text -noout

你會看到 O 資訊與 CN 資訊,例如以下的模樣:

 Certificate:
 Data:
 Version: 3 (0x2)
 Serial Number:
 ...
 Signature Algorithm: sha256WithRSAEncryption
 Issuer: C = US, O = Let's Encrypt, CN = R3

以上面的示例,我所拿到憑證的 CA 單位就來自於 O = Let’s Encrypt, CN = R3。跟著這個資訊,前往 https://letsencrypt.org/certificates/ 下載對應的 PEM 憑證,並把他放入到 /etc/letsencrypt/CA/ 位置底下。例如把 PEM 憑證下載後,使用 scp 指令從本地傳到 Ubuntu 伺服器上。

scp /Users/glee/Downloads/lets-encrypt-r3.pem root@test.gleetsai.me:/etc/letsencrypt/CA/lets-encrypt-r3.pem

配置 RSyslog.conf 以啟用 TLS 服務

使用 vi /etc/rsyslog.conf 指令開始編輯相關參數。

改變 Log 傳輸上限

module(load="imuxsock"
 SysSock.RateLimit.Interval="60"
 SysSock.RateLimit.Burst="3000")

使用 OpenSSL 模組進行 TLS 連線,並設定驗證模式為匿名模式

module(load="imtcp"
 StreamDriver.Name="ossl"
 StreamDriver.Mode="1" # run driver in TLS-only mode
 StreamDriver.Authmode="anon"
)

指定憑證位置

把剛才上傳 CA 的路徑填入到 DefaultNetstreamDriverCAFile 欄位裡,並且填入已申請到的憑證 fullchain 完整路徑與 Privkey 路徑。

global(DefaultNetstreamDriver="ossl"
 DefaultNetstreamDriverCAFile="/etc/letsencrypt/CA/lets-encrypt-r3.pem"
 DefaultNetstreamDriverCertFile="/etc/letsencrypt/live/test.gleetsai.me/fullchain.pem"
 DefaultNetstreamDriverKeyFile="/etc/letsencrypt/live/test.gleetsai.me/privkey.pem"
 )

設定 TCP 通訊埠

input(type="imtcp"
 port="6514"
 )

設定收到的 Log 儲存位置

將收到的 Log 按照來源(Hostname)分門別類的整理,並依照 Log 所收到的日期開設資料夾。

$template RemoteHost,"/var/log/hosts/%HOSTNAME%/%$YEAR%-%$MONTH%-%$DAY%/syslog.log"
 *.* ?RemoteHost

設定發送對象安全名單

設定來自「所有位置」的人都可以對這個伺服器發送 Log 資訊。或是依照需求填入對方的 IP 以設定為安全名單。

$AllowedSender TCP, *

最終 RSyslog 配置參考

#  /etc/rsyslog.conf	Configuration file for rsyslog.
#
#			For more information see
#			/usr/share/doc/rsyslog-doc/html/rsyslog_conf.html
#
#  Default logging rules can be found in /etc/rsyslog.d/50-default.conf


#################
#### MODULES ####
#################

module(load="imuxsock"
SysSock.RateLimit.Interval="60"
SysSock.RateLimit.Burst="3000")

module(load="imtcp"
StreamDriver.Name="ossl"
StreamDriver.Mode="1" # run driver in TLS-only mode
StreamDriver.Authmode="anon"
)

global(DefaultNetstreamDriver="ossl"
DefaultNetstreamDriverCAFile="/etc/letsencrypt/CA/lets-encrypt-r3.pem"
DefaultNetstreamDriverCertFile="/etc/letsencrypt/live/test.gleetsai.me/fullchain.pem"
DefaultNetstreamDriverKeyFile="/etc/letsencrypt/live/test.gleetsai.me/privkey.pem"
)

# provides TCP syslog reception
input(type="imtcp"
port="6514"
)

$template RemoteHost,"/var/log/hosts/%HOSTNAME%/%$YEAR%-%$MONTH%-%$DAY%/syslog.log"
*.* ?RemoteHost

$AllowedSender TCP, *

###########################
#### GLOBAL DIRECTIVES ####
###########################

#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# Filter duplicated messages
$RepeatedMsgReduction on

#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog

#
# Where to place spool files
#
$WorkDirectory /var/spool/rsyslog

#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf

儲存並離開

最後按一下 ESC 鍵,並輸入 :wq! 強制儲存並離開。

重啟 RSyslog 服務

使用指令:systemctl restart rsyslog 重啟 RSyslog 服務後,再使用 systemctl status rsyslog 檢查服務是否有正常啟動。

驗證 RSyslog 是否有使用 TLS 連線

回到自己的 Mac 電腦,輸入以下指令:

openssl s_client -connect test.gleetsai.me:6514 -tls1_2

你應該會看到完整的 Certificate Chain 範例如下:

Certificate chain
 0 s:/CN=test.gleetsai.me
 i:/C=US/O=Let's Encrypt/CN=R3
 1 s:/C=US/O=Let's Encrypt/CN=R3
 i:/C=US/O=Internet Security Research Group/CN=ISRG Root X1
 2 s:/C=US/O=Internet Security Research Group/CN=ISRG Root X1
 i:/O=Digital Signature Trust Co./CN=DST Root CA X3
Categories: Ubuntu