配置 RSyslog 伺服器以接收 CEF 格式日誌
本篇文章會使用 Ubuntu 18.04 架設 RSyslog 伺服器,並且加入 Let’s Encrypt 啟用 Syslog over TLS。
準備環境
1. 使用 Linode 架設 Ubuntu 18.04
2. 準備一個網域名稱
在 Ubuntu 上安裝 RSyslog 必要服務
首先透過 SSH 連線到 Linode 上面的 Ubuntu 服務,你可以在 Linode 的面板上面,看到 SSH Access 的相關資訊。連線後執行以下指令:
- add-apt-repository ppa:adiscon/v8-stable
- apt-get update -y
- apt-get install rsyslog
- apt-get install rsyslog-gnutls
- 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 申請憑證並在未來自動展延。
- snap install core; sudo snap refresh core
- snap install –classic certbot
- ln -s /snap/bin/certbot /usr/bin/certbot
- 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