BigAdmin System Administration Portal
專文
Print-friendly VersionPrint-friendly Version

使用 syslog-ng 和 Stunnel 建立集中式安全記錄伺服器

Amy Rich,2004 年 9 月

目錄:

UNIX 系統管理員都相當熟悉 syslog 常駐程式,但是除非有人報告發生問題,否則通常不會處理此常駐程式所收集的資訊。如果是機器很多的站點,根本就不會有人花時間每天 (甚至每個月) 登入檢查多個記錄檔。想撰寫能找出這些機器上所有資料關聯的自動化程序檔並非易事,因為這些程序檔必須個別存取每部電腦。為了減輕自動和手動資料處理的負擔,許多站點都會實作用來收集網路上所有機器資料的中央記錄伺服器 (最好執行 NTP 以簡化時間/日期的相互關聯),而這些機器則包括 UNIX 伺服器、Windows 和 Mac 桌上型電腦,甚至路由器和交換器這類網路設備。集中式記錄對大部分現成的 UNIX syslog 常駐程式而言都很簡單,但是 syslogd 與早期版本有些不同,而且有幾個缺點。

標準 UNIX syslog 常駐程式會透過 UDP 以純文字格式傳輸訊息,這表示任何人都可以看到可能機密的資料。facility.level 模型也相當受限,而大部分作業系統所提供的預設 /etc/syslog.conf 檔案不會記錄管理員可能感興趣的許多訊息。要以適合人閱讀的方式剖析記錄以及讓資料挖掘自動化,並非簡單的事。例如,UNIX syslog 常駐程式就無法讓人依據主機輕易分割記錄檔,或透過常規表示式比對記錄訊息。因此,使用現成 syslog 常駐程式的大部分集中式記錄伺服器最後都會具有龐大的記錄檔,而這些記錄檔只有在 syslogd 程序關閉它們之後才會進行處理。

因此,大部分集中記錄的站點最後會將常備 syslog 常駐程式取代為更安全且更具彈性的程式 (如 Metalogmsyslog 或類似項目)。一個十分常用的 syslog 替代項目是開放原始碼程式,稱為 syslog-ng。組織可以在每個 UNIX 主機或只在 syslog 伺服器本身上執行 syslog-ng。如果 syslog-ng 只在記錄主機上執行,則用戶端會如常透過 UDP 連接埠 514 來傳送資料,但在伺服器上進行整理和操作的效果較好。

在每個 UNIX 主機上執行 syslog-ng 的優點是可以使用 IPSec 或公用程式 Stunnel 來加密記錄通道,讓一般偵測程式無法讀取資料。與 Stunnel 合併作為傳輸機制時,組織就有安全的方式可以集中來自所有想要 UNIX 主機的記錄訊息,以進一步處理。如果是 syslog-ng,則 Stunnel 的運作方式是接受本機連接埠上的記錄連線,並將它們包裝在 SSL 階段作業中,然後將這些記錄連線重新導向至遠端記錄主機上的安全連接埠。遠端記錄主機上的 stunnel 程序接著會解密 SSL 階段作業,並透過標準連接埠將資訊送回給 syslog 伺服器。一旦在記錄伺服器上,就會使用 syslog-ng 的彈性來組織和剖析記錄檔。

下面涵蓋如何在執行 Solaris 8 作業系統 (SPARC Platform Edition) 的機器上安裝和配置 syslog-ngStunnel,但是這些程序一般也適用於 SPARC 和 x86 平台上的新舊版 Solaris 作業系統。下面討論的每部參考機器都已安裝 OpenSSLtcp 包裝程式、Solaris 8 /dev/urandom 修補程式,以及 GNU 開發環境 (gcc 等) 和數種其他免費套裝軟體。作為記錄伺服器的機器會儲存網路上所有機器的機密和安全性相關資訊,因此也已徹底強化。這些參考機器都是位在子網路 192.168.1 上,而記錄伺服器的 IP 位址是 192.168.1.10


安裝 Stunnel

實作安全記錄伺服器的第一個步驟是將 Stunnel 安裝在伺服器和每個用戶端上。Stunnel 也可以與現成的 syslog 常駐程式搭配使用 (而不是將 syslog 取代為 syslog-ng),但如此一來就沒有我們所要的彈性。在下面的指示中,會將 stunnel 配置和建置為以自己的使用者和群組執行,並以 chroot 切換到自己的私有目錄。作法是先建立 stunnel 群組和使用者 (隨機挑選 UID 和 GID):

/usr/sbin/groupadd -g 122 stunnel
/usr/sbin/useradd -c stunnel -d /nonexistent -m -g 122 -u 122 stunnel

現在下載 Stunnel 原始碼、將它解壓縮,並進行配置。在這些特定主機上,OpenSSL 憑證會保留在 /usr/local/etc/openssl/certs 中,而我想要將 doc 目錄保留在 /usr/local 中,其中也保留其他本機安裝的 doc 安裝。我也將 localstatedir 設定為 /var/run/stunnel,因為它不需要在重新開機後持續存在,而且我希望它位於執行 chroot 後所在的目錄內。

wget http://www.stunnel.org/download/stunnel/src/stunnel-4.05.tar.gz
tar zxf stunnel-4.05.tar.gz
cd stunnel-4.05

./configure --localstatedir=/var/run/stunnel \
 --with-pem-dir=/usr/local/etc/openssl/certs --datadir=/usr/local

make
make install

透過 Stunnel 建立 syslog-ng 的憑證檔案

Stunnel 安裝程序會建立您可選擇使用的自我簽署憑證。因為我執行自己的憑證授權單位,而且只針對 syslog-ng 執行 Stunnel,所以會產生和簽署我自己的 syslog-ng 專用憑證。有關設定您自己 CA 和簽署憑證的詳細資訊,請參閱 SSL certificates HOWTO

假設您已設定自己的 CA 或您將對公認的 CA 發出憑證請求,請建立伺服器的 pem 檔案:

openssl req -new -days 3650 -nodes -config stunnel.cnf -out serverreq.pem \
 -keyout syslog-ng-server.pem

也請建立每個用戶端的對應 pem 檔案:

openssl req -new -days 3650 -nodes -config stunnel.cnf -out clientreq.pem \
 -keyout syslog-ng-client.pem

使用本機 CA 簽署每個 pem 檔案,或由公開 CA 簽署它們。我使用 apache mod_ssl 發行軟體隨附的 sign.sh 程序檔:

sign.sh /tmp/serverreq.pem 
sign.sh /tmp/client1req.pem 
sign.sh /tmp/client2req.pem
sign.sh /tmp/client3req.pem

產生的 crt 檔案包括每個對應 pem 檔案的憑證。伺服器需要提供具有伺服器私密金鑰和憑證 (從 /tmp/serverreq.pem.crt 檔案複製而來) 的伺服器 pem 檔案 (syslog-ng-server.pem):

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDSAJ0kULvKxIhFtz1ctXlDWY0CcTpIscEAXy90nAuwwvshji39
abZH5Z9PfTOoT/zO6ZyQ0lOJ2LzYcS/JQmR+4wLggf5yi8K3BrBIwaAHbfAya8C9
5g9oINTkjM5Y3zdkMhvPwmivMV+lBa07Qk0SZg8xYblUiafisQplGzjWvwIDAQAB
AoGAEqYzTlJNGwixAV/wdxc2maCOQTVE88e1WA8b68Mf1qa6HpS9yM9mfKQLrcd0
mvHfhZCBcur6uDcjLiV/FORsgB7/3wRF0a08ZJdwlMSn9844jeRlSDbEE1wqAcyj
pnHwcxnErzA0REDuD+EmH0xsh23/Rn/mv7gBpm5Am/UK86ECQQDs5RmiJzQOprsT
ArcTQq3VTmHLtfu7HAQ7+You7XDL+iOVOsbJZWgBKc0oTcNNBpJzkHPrvaOBbFpg
dQZKE3BLAkEA4vBLWsojb0tosXiZuFxzMBrcMhzanzzXerOt0v6BbeZKMTXMaJX+
/4wyVc6lanZc/793S4aHY0/VvCDMLp7y3QJBAKPnX3Tx6vK4KXddyY1p9RxAvylT
IHi1Sbif49DpAkIfL79wi1mM8AjeAzR/mUER6wJKT+orq5VAgsd6MH/QM0ECQHvw
YDclTlTqCjNiehGF7CLJiJiVyZBN2iDZIIWrGWS78KkPiKNVx/4owxS51v1dx0yl
dLF6t1Y1s7Ua9GhBxsECQD3+/khj/lzYUC9KaDIHItO7LHkO1IcxZUZJ0YNaukUB
v1Vh9B3IK5m2bSsOYtOYxbpjoHL8pZG1Bf1lLH32dqw=
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICZDCCAc0CAQIwDQYJKoZIhvcNAQEEBQAwcTELMAkGA1UEBhMCVVMxFjAUBgNV
BAgTDU1hc3NhY2h1c2V0dHMxEDAOBgNVBAcTB0JldmVybHkxFTATBgNVBAoTDE9j
ZWFud2F2ZSBDQTEhMB8GCSqGSIb3DQEJARYScm9vdEBvY2VhbndhdmUuY29tMB4X
DTA0MDcxOTEzNTExNVoXDTA1MDcxOTEzNTExNVowgYMxCzAJBgNVBAYTAlVTMRYw
FAYDVQQIEw1NYXNzYWNodXNldHRzMRAwDgYDVQQHEwdCZXZlcmx5MSMwIQYDVQQK
ExpPY2VhbndhdmUgQ29uc3VsdGluZywgSW5jLjElMCMGA1UEAxMcbG9naG9zdC5v
ZmZpcdaub2NlYW53YXZlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
0gCdJFC7ysSIRbc9XLV5Q1mNAnE6SLHBAF8vdJwLsML7IY4t/Wm2R+WfT30zqE/8
zumckNJTidi82HEvyUJkfuMC4IH+covCtwawSMGgB23wMmvAveYPaCDU5IzOWN83
ZDIbz8JorzFfpQWtO0JNEmYPMWG5VImn4rEKZRs41r8CAwEAATANBgkqhkiG9w0B
AQQFAAOBgQAvaaoVvP267QbxBOeBDBeP3CCpOskT5YJUHWQE2QmH5wR/5iwQqvrU
Fo8V2JbaaauN9sa5CQutthUK1D3Ub+nHuHgGPFfdkL0Ll+5+LVf1swKXy8H1Q8CA
Aiq0dK0EJQ+taQTw+KD7MBOzIJk0OF76uwdNxgaATQEVjxi6M0MG5g==
-----END CERTIFICATE-----

也需要只具有簽署 CA 和每個用戶端憑證 (來自 crt 檔案) 的用戶端 pem 檔案 syslog-ng-client.pem (此範例假設有三個 syslog-ng 用戶端):

-----BEGIN CERTIFICATE-----
MIIDJzCCApCgAwIBAgIBADANBgkqhkiG9w0BAQQFADBxMQswCQYDVQQGEwJVUzEW
MBQGA1UECBMNTWFzc2FjaHVzZXR0czEQMA4GA1UEBxMHQmV2ZXJseTEVMBMGA1UE
ChMMT2NlYW53YXZlIENBMSEwHwYJKoZIhvcNAQkBFhJyb290QG9jZWFud2F2ZS5j
b20wHhcNMDIwNjIzMjIyODIxWhcNMTIwNjIwMjIyODIxWjBxMQswCQYDVQQGEwJV
UzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEQMA4GA1UEBxMHQmV2ZXJseTEVMBMG
A1UEChMMT2NlYW53YXZlIENBMSEwHwYJKoZIhvcNAQkBFhJyb290QG9jZWFud2F2
ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMSqIDhWZDLO2ptG9ebx
FUycmXoMNPCLWmsFgRBQKG5vgOQruX8jpXqHOFCxjhO4ZsSUWwd8eO4J/4A9kTao
VFzi4P63A8xyN92Gbh4BfvmFecDhLaoZ+5zMNclNOlom2Rda75Fj8iYhtSIrbOcq
Mc8KkRriG3+Hl6ptW0XibqznAgMBAAGjgc4wgcswHQYDVR0OBBYEFDlBMdhKkmEm
pQkan14xNA3a646MMIGbBgNVHSMEgZMwgZCAFDlBMdhKkmEmpQkan14xNA3a646M
oXWkczBxMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEQMA4G
A1UEBxMHQmV2ZXJseTEVMBMGA1UEChMMT2NlYW53YXZlIENBMSEwHwYJKoZIhvcN
AQkBFhJyb290QG9jZWFud2F2ZS5jb22CAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG
9w0BAQQFAAOBgQB8Xzn/UioFZV2Osyt0oz8/3Eu1GmQx4Cpaw4o7GBKg52IQA0Sv
qfvUmeuFZ6sSDYEI6bC/u6MkyvRwV7pOtqzUoGbvtGDhnFIxdiyiEOfZosdvadBx
ilXHU/tYDXffxFBcBoeoFHkYyX1vAY4uFsPBEywF3NBUGuoP5Ed5+AS+rQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICZTCCAc4CAQMwDQYJKoZIhvcNAQEEBQAwcTELMAkGA1UEBhMCVVMxFjAUBgNV
BAgTDU1hc3NhY2h1c2V0dHMxEDAOBgNVBAcTB0JldmVybHkxFTATBgNVBAoTDE9j
ZWFud2F2ZSBDQTEhMB8GCSqGSIb3DQEJARYScm9vdEBvY2VhbndhdmUuY29tMB4X
0510MDcxOTEzNTc0M1oXDTA1MDcxOTEzNTc0M1owgYQxCzAJBgNVBAYTAlVTMRYw
FAYDVQQIEw1NYXNzYWNodXNldHRzMRAwDgYDVQQHEwdCZXZlcmx5MSMwIQYDVQQK
ExpPY2VhbndhdmUgQ29uc3VsdGluZywgSW5jLjEmMCQGA1UEAxMdcmVhbHNvb24u
b2ZmaWNlLm9jZWFud2F2ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB
AKKXR7OTQYKDWHvh0jCYSM2Y6gx+Lh2iE1hEVR4xE5UnGNv+/LzgGIYalmD86Vok
KkwdI+5cVp0JhF3gIUgL2+OoerE68AEQwv+tpzx4Px4Ze1pRjw9f6UW+17C3PICG
P4SpC6avMljj8lnv9Rmb300/Yz8ZzyAIzt8CjNu7lTCFAgMBAAEwDQYJKoZIhvcN
AQEEBQADgYEAleB5Xk0BnHu3g6ron5qcjBtDgnOnvzsX3v+KVaFGZiufdWtILCMn
58HrXCV2zoUlUcbnrqHgov47qvZBlh2HR7fT7MQYXFTKOFDXwCdSDfXHTUmmQHzq
cctX025yo45obGgI9LWDjip0/PW0k3r4IuVRtfOz+gHf1ZyEVjIuXkE=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICZDCCAc0CAQQwDQYJKoZIhvcNAQEEBQAwcTELMAkGA1UEBhMCVVMxFjAUBgNV
BAgTDU1hc3NhY2h1c2V0dHMxEDAOBgNVBAcTB0JldmVybHkxFTATBgNVBAoTDE9j
ZWFud2F2ZSBDQTEhMB8GCSqGSIb3DQEJARYScm9vdEBvY2VhbndhdmUuY29tMB4X
DTA0MDcxOTE0MTUwNloXDTA1MDcxOTE0MTUwNlowgYMxCzAJBgNVBAYTAlVTMRYw
FAYDVQQIEw1NYXNzYWNodXNldHRzMRAwDgYDVQQHEwdCZXZlcmx5MSMwIQYDVQQK
ExpPY2VhbndhdmUgQ29uc3VsdGluZywgSW5jLjElMCMGA1UEAxMcbGl6YXJkby5v
ZmZpY2Uub2NlYW53YXZlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
ogtXoF+49I/CoSP+CUZ4jX+pLMsIXvta/MqqKlTuvEgauRSw385Aict7rGIR6B3u
BUEBFN4Q+WzuYVJfbBMsUq/A6bilMpq/vbBrPAB9s/BkC5FAx2tMuMpgWn6ZXs/W
iRiEWULAHa4k7rgmonXk47r0bBuSVrozdgKd4u2iB6sCAwEAATANBgkqhkiG9w0B
AQQFAAOBgQBCCMhUdlfRk5owxpUIgtNLQ6/wfPgyUtIm7M4Mg0tHLD2ILCiaJLie
x+Di5+09nciadYxn7fZhFdvnSpsthDX0/P6/H/iLTZnyK3k0PegzYx8Mwo4mnS/X
Bt1cOuciRrd1tPHZ+st2Zqz/UO1jhbtEx7RNjtpxypChFQ2SB63wuA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICYzCCAcwCAQUwDQYJKoZIhvcNAQEEBQAwcTELMAkGA1UEBhMCVVMxFjAUBgNV
BAgTDU1hc3NhY2h1c2V0dHMxEDAOBgNVBAcTB0JldmVybHkxFTATBgNVBAoTDE9j
ZWFud2F2ZSBDQTEhMB8GCSqGSIb3DQEJARYScm9vdEBvY2VhbndhdmUuY29tMB4X
DTA0MDcxOTE0MTUyMFoXDTA1MDcxOTE0MTUyMFowgYIxCzAJBgNVBAYTAlVTMRYw
FAYDVQQIEw1NYXNzYWNodXNldHRzMRAwDgYDVQQHEwdCZXZlcmx5MSMwIQYDVQQK
ExpPY2VhbndhdmUgQ29uc3VsdGluZywgSW5jLjEkMCIGA1UEAxMbc2Vrcml0Lm9m
ZmljZS5vY2VhbndhdmUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDG
+OMOU6o3rCSyXMRRzwPKO/Yi9SjcT/5uwJh4x4a/iPlVNhbcG15PLpwmIiEvaKQe
PTwJNEWAMnDBWyT6bmdN9xa0X1pzCDiLGMKJ2PFzoL6b9VwQSx9zp9fTPinh+mVw
484Hf8nQOSs+HKVAltCvJWcFq04aqbauE817Og369wIDAQABMA0GCSqGSIb3DQEB
BAUAA4GBAJ6feAOv8bvGdk01QyupdIJVvp8IBv5ZJD1VLofoj/C4JYLsHWTV0IZI
rhw37hI9y9wAiiZVrbEM88N0FgFfHN2hoymvRmvg0Y7l7OuMQWz2vSMJYIyeI2Wb
uMWGN+klM77OxRXWseUOWaPp0RqW3MGqMV7+SU8sN9gVdEZdLxnj
-----END CERTIFICATE-----

每個用戶端都需要在 pem 檔案 (syslog-ng-client.pem) 中有它自己的憑證和私密金鑰:

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCil0ezk0GCg1h74dIwmEjNmOoMfi4dohNYRFUeMROVJxjb/vy8
4BiGGpZg/OlaJCpMHSPuXFadCYRd4CFIC9vjqHqxOvABEML/rac8eD8eGXtaUY8P
X+lFvtewtzyAhj+EqQumrzJY4/JZ7/UZm99NP2M/Gc8gCM7fAozbu5UwhQIDAQAB
AoGAGhMErqm44cNKl2NZn+1sD3ysXCCIKLxrOcaLl/Hq4AqLFAzKX0fY5viwkRE+
IvSVy+sIbhtk0H5MOfnNnI46TwCvgelMbb8FtRDpZrwA7AgH9+scnjfpuibVZdoW
9fR2HoOOevffDU9ZfFlthsOKJp+xb7PRFcsxlV3ihla9aKkCQQDNt3gcE9goGyBj
kWkgB1Ydmov155xC1ozGpeyEVm3fGtD+sfgIxYuaV1xFhQKZMR2QeEnX3v5mqP31
zf5dnj47AkEAylVB95ZGvG91H4uUXrSW53djD2a5GtVjXNoDWLs7Hp7sbUkbRexa
5cSZ7EFqbyXHYx1xKMgYwqgIhbV1CU2gPwJAZBnMtkzpt8pLXmfZcZ5gRxN223eS
T+u6oMcIafTsjc2suOK8wPfvUHEGE0X/169QpYYC2KpHvIiq2zsbdU6VFQJAYibZ
yXFs/xxShOsBHrAcREz2ERKT2SCLAw//b5vkIgaWSq2cPV9a+PtWb/WL3D9Hah1u
N4pZ+JPrDnHoRIsToQJBAJ4IG4AAgIPkmIVbROXXpt/2YBbP1WQI1suKzWy6r4V4
E0fiwYh1REik4+WRCRBabzjFA7GIDiD2QQGzTa8m0nQ=
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICZTCCAc4CAQMwDQYJKoZIhvcNAQEEBQAwcTELMAkGA1UEBhMCVVMxFjAUBgNV
BAgTDU1hc3NhY2h1c2V0dHMxEDAOBgNVBAcTB0JldmVybHkxFTATBgNVBAoTDE9j
ZWFud2F2ZSBDQTEhMB8GCSqGSIb3DQEJARYScm9vdEBvY2VhbndhdmUuY29tMB4X
0510MDcxOTEzNTc0M1oXDTA1MDcxOTEzNTc0M1owgYQxCzAJBgNVBAYTAlVTMRYw
FAYDVQQIEw1NYXNzYWNodXNldHRzMRAwDgYDVQQHEwdCZXZlcmx5MSMwIQYDVQQK
ExpPY2VhbndhdmUgQ29uc3VsdGluZywgSW5jLjEmMCQGA1UEAxMdcmVhbHNvb24u
b2ZmaWNlLm9jZWFud2F2ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB
AKKXR7OTQYKDWHvh0jCYSM2Y6gx+Lh2iE1hEVR4xE5UnGNv+/LzgGIYalmD86Vok
KkwdI+5cVp0JhF3gIUgL2+OoerE68AEQwv+tpzx4Px4Ze1pRjw9f6UW+17C3PICG
P4SpC6avMljj8lnv9Rmb300/Yz8ZzyAIzt8CjNu7lTCFAgMBAAEwDQYJKoZIhvcN
AQEEBQADgYEAleB5Xk0BnHu3g6ron5qcjBtDgnOnvzsX3v+KVaFGZiufdWtILCMn
58HrXCV2zoUlUcbnrqHgov47qvZBlh2HR7fT7MQYXFTKOFDXwCdSDfXHTUmmQHzq
cctX025yo45obGgI9LWDjip0/PW0k3r4IuVRtfOz+gHf1ZyEVjIuXkE=
-----END CERTIFICATE-----

每個用戶端也需要 pem 檔案 (syslog-ng-server.pem),其中只包含來自伺服器和簽署 CA 的憑證:

-----BEGIN CERTIFICATE-----
MIIDJzCCApCgAwIBAgIBADANBgkqhkiG9w0BAQQFADBxMQswCQYDVQQGEwJVUzEW
MBQGA1UECBMNTWFzc2FjaHVzZXR0czEQMA4GA1UEBxMHQmV2ZXJseTEVMBMGA1UE
ChMMT2NlYW53YXZlIENBMSEwHwYJKoZIhvcNAQkBFhJyb290QG9jZWFud2F2ZS5j
b20wHhcNMDIwNjIzMjIyODIxWhcNMTIwNjIwMjIyODIxWjBxMQswCQYDVQQGEwJV
UzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEQMA4GA1UEBxMHQmV2ZXJseTEVMBMG
A1UEChMMT2NlYW53YXZlIENBMSEwHwYJKoZIhvcNAQkBFhJyb290QG9jZWFud2F2
ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMSqIDhWZDLO2ptG9ebx
FUycmXoMNPCLWmsFgRBQKG5vgOQruX8jpXqHOFCxjhO4ZsSUWwd8eO4J/4A9kTao
VFzi4P63A8xyN92Gbh4BfvmFecDhLaoZ+5zMNclNOlom2Rda75Fj8iYhtSIrbOcq
Mc8KkRriG3+Hl6ptW0XibqznAgMBAAGjgc4wgcswHQYDVR0OBBYEFDlBMdhKkmEm
pQkan14xNA3a646MMIGbBgNVHSMEgZMwgZCAFDlBMdhKkmEmpQkan14xNA3a646M
oXWkczBxMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEQMA4G
A1UEBxMHQmV2ZXJseTEVMBMGA1UEChMMT2NlYW53YXZlIENBMSEwHwYJKoZIhvcN
AQkBFhJyb290QG9jZWFud2F2ZS5jb22CAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG
9w0BAQQFAAOBgQB8Xzn/UioFZV2Osyt0oz8/3Eu1GmQx4Cpaw4o7GBKg52IQA0Sv
qfvUmeuFZ6sSDYEI6bC/u6MkyvRwV7pOtqzUoGbvtGDhnFIxdiyiEOfZosdvadBx
ilXHU/tYDXffxFBcBoeoFHkYyX1vAY4uFsPBEywF3NBUGuoP5Ed5+AS+rQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICZDCCAc0CAQIwDQYJKoZIhvcNAQEEBQAwcTELMAkGA1UEBhMCVVMxFjAUBgNV
BAgTDU1hc3NhY2h1c2V0dHMxEDAOBgNVBAcTB0JldmVybHkxFTATBgNVBAoTDE9j
ZWFud2F2ZSBDQTEhMB8GCSqGSIb3DQEJARYScm9vdEBvY2VhbndhdmUuY29tMB4X
DTA0MDcxOTEzNTExNVoXDTA1MDcxOTEzNTExNVowgYMxCzAJBgNVBAYTAlVTMRYw
FAYDVQQIEw1NYXNzYWNodXNldHRzMRAwDgYDVQQHEwdCZXZlcmx5MSMwIQYDVQQK
ExpPY2VhbndhdmUgQ29uc3VsdGluZywgSW5jLjElMCMGA1UEAxMcbG9naG9zdC5v
ZmZpcdaub2NlYW53YXZlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
0gCdJFC7ysSIRbc9XLV5Q1mNAnE6SLHBAF8vdJwLsML7IY4t/Wm2R+WfT30zqE/8
zumckNJTidi82HEvyUJkfuMC4IH+covCtwawSMGgB23wMmvAveYPaCDU5IzOWN83
ZDIbz8JorzFfpQWtO0JNEmYPMWG5VImn4rEKZRs41r8CAwEAATANBgkqhkiG9w0B
AQQFAAOBgQAvaaoVvP267QbxBOeBDBeP3CCpOskT5YJUHWQE2QmH5wR/5iwQqvrU
Fo8V2JbaaauN9sa5CQutthUK1D3Ub+nHuHgGPFfdkL0Ll+5+LVf1swKXy8H1Q8CA
Aiq0dK0EJQ+taQTw+KD7MBOzIJk0OF76uwdNxgaATQEVjxi6M0MG5g==
-----END CERTIFICATE-----

基於安全性理由,請確定在每部機器上只有 root 使用者才能讀取憑證檔案:

chmod 400 /usr/local/etc/openssl/certs/syslog-ng-*
chown root:other /usr/local/etc/openssl/certs/syslog-ng-*

配置 Stunnel 以與 syslog-ng 搭配使用

在伺服器上,建立 syslog-ng 專用的 Stunnel 配置檔案 (/usr/local/etc/stunnel/stunnel.conf),其中包含的資訊與下面的資訊類似。此檔案範例會指定本機憑證/金鑰和伺服器憑證、stunnel 使用者和群組,以及 chroot 目錄。verify 值 3 則確保 stunnel 會使用本機安裝的憑證來驗證對等端。Stunnel 預設會關閉驗證,因此請務必在此處開啟驗證。配置檔案的最後一個區段會指定已包裝 SSL 階段作業的連接埠號碼,以及接受和重新導向連線的 IP 連接埠。連接埠 514 是標準 syslog 連接埠,而 5140 則是隨機挑選的未用連接埠。有關其他資訊和配置選項,請務必閱讀 stunnel 線上手冊。

cert = /usr/local/etc/openssl/certs/syslog-ng-server.pem
CAfile = /usr/local/etc/openssl/certs/syslog-ng-client.pem
chroot = /var/run/stunnel
pid = /run/stunnel.pid
setuid = stunnel
setgid = stunnel
verify = 3
[5140]
   accept = 192.168.1.10:5140
   connect = 127.0.0.1:514

在每個用戶端上,syslog-ng 專用的 /usr/local/etc/stunnel/stunnel.conf 檔案包含與伺服器 stunnel.conf 檔案類似的指令。系統會交換 certCAfile 值以及 acceptconnect 值,並新增 client 指令:

client = yes
cert = /usr/local/etc/openssl/certs/syslog-ng-client.pem
CAfile = /usr/local/etc/openssl/certs/syslog-ng-server.pem
chroot = /var/run/stunnel
pid = /run/stunnel.pid
setuid = stunnel
setgid = stunnel
verify = 3
[5140]
   accept = 127.0.0.1:514
   connect = 192.168.1.10:5140

Stunnel 現在已配置完成,因此我們可以進行 syslog-ng 安裝和配置。如果您想要在此時測試 Stunnel,請將它配置為改用另一個 TCP 連接埠或服務 (如 IMAPtelnet),如 Stunnel 範例頁面所述。

安裝 syslog-ng

穩定版的 syslog-ng 需要先安裝或至少先建置程式庫 libol。下載、解壓縮和安裝程式庫 (如此處所示):

wget http://www.balabit.com/downloads/libol/0.3/libol-0.3.14.tar.gz
tar zxf libol-0.3.14.tar.gz
cd libol-0.3.14

./configure
make
make install

現在擷取 syslog-ng 的原始碼,並對它進行解壓縮、配置和安裝。配置時,我也增加 tcp 包裝程式的支援,因為我已安裝它,而且經常用於其他常駐程式:

wget http://www.balabit.com/downloads/syslog-ng/1.6/src/syslog-ng-1.6.5.tar.gz
tar zxf syslog-ng-1.6.5.tar.gz
cd ../syslog-ng-1.6.5

./configure --enable-tcp-wrapper
make
make install

務必開啟所有封包篩選和 (或) tcp 包裝程式中的適當連接埠。伺服器需要接受 TCP 連接埠 5140 的用戶端連線,而如果記錄主機也接受未加密的 syslog 訊息,則是接受 UDP 連接埠 514 的連線。若要支援 tcp 包裝程式的延伸語法,請將下列內容新增至伺服器上的 /etc/hosts.deny

syslog-ng : LOCAL 127.0.0.1 192.168.1. : ALLOW

並將下列內容新增至用戶端上的 /etc/hosts.deny

syslog-ng : LOCAL 127.0.0.1 : ALLOW

現在建立 stunnel/syslog-ng 啟動程序檔 (/etc/init.d/syslog-ng),這個程序檔會在每部機器開機時執行。下面的程序檔是以 Solaris 8 作業系統的 syslog 啟動程序檔為依據,它也會執行 savecore 以及啟動 stunnelsyslog-ng

#!/sbin/sh
#

case "$1" in
'start')
	if [ -f /usr/local/etc/syslog-ng/syslog-ng.conf -a -x \
             /usr/local/sbin/syslog-ng ]; then
		#
		# Before syslogd starts, save any messages from previous
		# crash dumps so that messages appear in chronological order.
		#
		/usr/bin/savecore -m
		if [ -r /etc/dumpadm.conf ]; then
			. /etc/dumpadm.conf
			[ "x$DUMPADM_DEVICE" != xswap ] && \
			    /usr/bin/savecore -m -f $DUMPADM_DEVICE
		fi
		#
                # Start stunnel so logs are sent encrypted
                #
                if [ -f /usr/local/etc/stunnel/stunnel.conf \
                     -a -x /usr/local/sbin/stunnel ]; then
                   echo "Starting stunnel"
                   mkdir -p /var/run/stunnel/run
                   chown stunnel:stunnel /var/run/stunnel/run
		   /usr/local/sbin/stunnel 
                   echo "Starting syslog-ng"
                   /usr/local/sbin/syslog-ng 
                fi
	fi
	;;

'stop')
	if [ -f /var/run/syslog-ng.pid ]; then
		syspid=`/usr/bin/cat /var/run/syslog-ng.pid`
		[ "$syspid" -gt 0 ] && kill -15 $syspid && \
                echo "Killed syslog-ng"
	fi
        if [ -f /var/run/stunnel/run/stunnel.pid ]; then
                syspid=`/usr/bin/cat /var/run/stunnel/run/stunnel.pid`
                [ "$syspid" -gt 0 ] && kill -15 $syspid && \
                echo "Killed stunnel"
        fi

	;;

*)
	echo "Usage: $0 { start | stop }"
	exit 1
	;;
esac

移除原生 Solaris syslog 啟動和關機程序檔的連結,並將它們取代為新 syslog-ng 程序檔的連結:

rm /etc/rc*.d/???syslog
ln -s /etc/init.d/syslog-ng /etc/rc0.d/K40syslog-ng
ln -s /etc/init.d/syslog-ng /etc/rc1.d/K40syslog-ng
ln -s /etc/init.d/syslog-ng /etc/rc2.d/S74syslog-ng
ln -s /etc/init.d/syslog-ng /etc/rcS.d/K40syslog-ng

配置 syslog-ng

syslog-ng 的彈性來自它的配置檔案。用於記錄處理的重要配置指令為 sourcefilterdestinationlogSource 指令指出本機和遠端記錄訊息的出處。Filter 指令允許根據設備、層級/優先權、程式名稱、主機名稱或常規表示式比對來區隔記錄訊息。destination 可以是檔案、管道、串流和資料封、UDP 或 TCP 連線、tty 或程式。log 指令是 sourcefilterdestination 指令的集合,用以定義如何處理符合的記錄訊息。您可以在 syslog-ng 參考手冊中找到所有可用指令的討論,而各種範例則列在 syslog-ng 常見問題集 中。

下列範例會顯示儲存在每個本地主機 /var/log 中的記錄檔,以及儲存在中央記錄伺服器 /var/log/clients/$YEAR/$MONTH/$HOST 中的記錄檔。記錄主機上的下列 /usr/local/etc/syslog-ng/syslog-ng.conf 支援來自本地主機、stunnel 加密主機,以及標準 UDP 主機 (如無法使用 stunnel 的路由器和交換器) 的訊息。篩選則是根據設備和層級、程式名稱比對以及上述項目的組合。

# Options
options {
          use_fqdn(yes);
          sync(0);
          keep_hostname(yes);
          chain_hostnames(no);
	  create_dirs(yes);
        };

# Sources of syslog messages (both local and remote messages on the server)
source s_local   { 
                   sun-streams("/dev/log" door("/etc/.syslog_door")); 
                   internal();
                 };
source s_stunnel { 
                   tcp(ip("127.0.0.1")
                   port(514)
                   max-connections(1));
                 };

source s_udp     { udp(); };

# Level Filters
filter f_emerg   { level (emerg);            };
filter f_alert   { level (alert .. emerg);   };
filter f_crit    { level (crit .. emerg);    };
filter f_err     { level (err .. emerg);     };
filter f_warning { level (warning .. emerg); };
filter f_notice  { level (notice .. emerg);  };
filter f_info    { level (info .. emerg);    };
filter f_debug   { level (debug .. emerg);   };

# Facility Filters
filter f_kern   { facility (kern);   };
filter f_user   { facility (user);   };
filter f_mail   { facility (mail);   };
filter f_daemon { facility (daemon); };
filter f_auth   { facility (auth);   };
filter f_syslog { facility (syslog); };
filter f_lpr    { facility (lpr);    };
filter f_news   { facility (news);   };
filter f_uucp   { facility (uucp);   };
filter f_cron   { facility (cron);   };
filter f_local0 { facility (local0); };
filter f_local1 { facility (local1); };
filter f_local2 { facility (local2); };
filter f_local3 { facility (local3); };
filter f_local4 { facility (local4); };
filter f_local5 { facility (local5); };
filter f_local6 { facility (local6); };
filter f_local7 { facility (local7); };

# Custom Filters
filter f_user_none     { not facility (user);                     };
filter f_kern_debug    { filter (f_kern) and filter (f_debug);    };
filter f_daemon_notice { filter (f_daemon) and filter (f_notice); };
filter f_mail_crit     { filter (f_mail) and filter (f_crit);     };
filter f_mesg          { filter (f_kern_debug) or 
                         filter (f_daemon_notice) or 
                         filter (f_mail_crit);                    };
filter f_authinfo      { filter (f_auth) or program (sudo);       };

# Destinations: local files, the console, and the client files
destination l_authlog  { file ("/var/log/authlog");   };
destination l_messages { file ("/var/log/messages");  };
destination l_maillog  { file ("/var/log/maillog");   };
destination l_ipflog   { file ("/var/log/ipflog");    };
destination l_imaplog  { file ("/var/log/imaplog");   };
destination l_syslog   { file ("/var/log/syslog");    };

destination l_console  { file ("/dev/console");       };

destination r_authlog  { file
  ("/var/log/clients/$YEAR/$MONTH/$HOST/authlog");    }; 
destination r_messages { file 
  ("/var/log/clients/$YEAR/$MONTH/$HOST/messages");   }; 
destination r_maillog  { file 
  ("/var/log/clients/$YEAR/$MONTH/$HOST/maillog");    }; 
destination r_ipflog   { file 
  ("/var/log/clients/$YEAR/$MONTH/$HOST/ipflog");     }; 
destination r_imaplog  { file 
  ("/var/log/clients/$YEAR/$MONTH/$HOST/imaplog");    }; 
destination r_console  { file 
  ("/var/log/clients/$YEAR/$MONTH/$HOST/consolelog"); }; 
destination r_syslog   { file
  ("/var/log/clients/$YEAR/$MONTH/$HOST/syslog");     };
destination r_fallback { file
  ("/var/log/clients/$YEAR/$MONTH/$HOST/$FACILITY-$LEVEL"); };

# Log statements
# Local sources
log { source (s_local); filter (f_authinfo)  destination (l_authlog);  };
log { source (s_local); filter (f_mail);     destination (l_maillog);  };
log { source (s_local); filter (f_local0);   destination (l_ipflog);   };
log { source (s_local); filter (f_local1);   destination (l_imaplog);  };
log { source (s_local); filter (f_syslog);   destination (l_syslog);   };
log { source (s_local); filter (f_emerg); filter (f_user_none); 
                                             destination (l_console);  };
log { source (s_local); filter (f_mesg);  filter (f_user_none);
                                             destination (l_messages); }; 

# All sources, since we want to archive local and remote logs
log { source (s_local); source (s_stunnel); filter (f_authinfo);
     destination (r_authlog);   };
log { source (s_local); source (s_stunnel); filter (f_mail);
     destination (r_maillog);   };
log { source (s_local); source (s_stunnel); filter (f_local0);
   destination (r_ipflog);      };
log { source (s_local); source (s_stunnel); filter (f_local1);
   destination (r_imaplog);     };
log { source (s_local); source (s_stunnel); filter (f_syslog);
   destination (r_syslog);      };
log { source (s_local); source (s_stunnel); filter (f_emerg); 
      filter (f_user_none);
      destination (l_console);  };
log { source (s_local); source (s_stunnel); filter (f_mesg);
   filter (f_user_none);
      destination (l_messages); };

在此用戶端範例 syslog-ng.conf 中,篩選會保持相同,但是配置的其他部分多半已變更以反映用戶端狀態,要不然就是遭到移除:

# Options
options { 
          sync(0);
          use_fqdn(yes);
        };

# Sources of syslog messages (only local on clients)
source s_local { 
                 sun-streams("/dev/log" door("/etc/.syslog_door")); 
                 internal();
               };

# Destinations: local files, the console, and the remote syslog server
destination l_authlog  { file ("/var/log/authlog");   };
destination l_messages { file ("/var/log/messages");  };
destination l_maillog  { file ("/var/log/maillog");   };
destination l_ipflog   { file ("/var/log/ipflog");    };
destination l_imaplog  { file ("/var/log/imaplog");   };
destination l_console  { file ("/dev/console");       };
destination l_syslog   { file ("/var/log/syslog");    };
destination stunnel    { tcp ("127.0.0.1", port(514)); };

# Level Filters
filter f_emerg   { level (emerg);            };
filter f_alert   { level (alert .. emerg);   };
filter f_crit    { level (crit .. emerg);    };
filter f_err     { level (err .. emerg);     };
filter f_warning { level (warning .. emerg); };
filter f_notice  { level (notice .. emerg);  };
filter f_info    { level (info .. emerg);    };
filter f_debug   { level (debug .. emerg);   };

# Facility Filters
filter f_kern   { facility (kern);   };
filter f_user   { facility (user);   };
filter f_mail   { facility (mail);   };
filter f_daemon { facility (daemon); };
filter f_auth   { facility (auth);   };
filter f_syslog { facility (syslog); };
filter f_lpr    { facility (lpr);    };
filter f_news   { facility (news);   };
filter f_uucp   { facility (uucp);   };
filter f_cron   { facility (cron);   };
filter f_local0 { facility (local0); };
filter f_local1 { facility (local1); };
filter f_local2 { facility (local2); };
filter f_local3 { facility (local3); };
filter f_local4 { facility (local4); };
filter f_local5 { facility (local5); };
filter f_local6 { facility (local6); };
filter f_local7 { facility (local7); }; 

# Custom Filters
filter f_user_none     { not facility (user);                     };
filter f_kern_debug    { filter (f_kern) and filter (f_debug);    };
filter f_daemon_notice { filter (f_daemon) and filter (f_notice); };
filter f_mail_crit     { filter (f_mail) and filter (f_crit);     };
filter f_mesg          { filter (f_kern_debug) or 
                         filter (f_daemon_notice) or 
                         filter (f_mail_crit);                    };
filter f_authinfo      { filter (f_auth) or program (sudo);       };

# Log statements
# Log things locally
log { source (s_local); filter (f_authinfo); destination (l_authlog);  };
log { source (s_local); filter (f_mail);     destination (l_maillog);  };
log { source (s_local); filter (f_local0);   destination (l_ipflog);   };
log { source (s_local); filter (f_local1);   destination (l_imaplog);  };
log { source (s_local); filter (f_syslog);   destination (l_syslog);   };
log { source (s_local); filter (f_emerg); filter (f_user_none); 
                                             destination (l_console);  };
log { source (s_local); filter (f_mesg); filter (f_user_none);
                                             destination (l_messages); }; 

# Log everything remotely via stunnel
log { source (s_local);                      destination (stunnel);    };

syslog-ng 的其他進階使用包括根據訊息的重要性,將記錄訊息直接傳送至資料挖掘軟體、資料庫、電子郵件或印表機。另一個有用提示是將優先權高的記錄訊息傳送給一個檔案,而這個檔案可以透過即時記錄分析程式 (如 swatchlogsurferLog ToolLogwatch) 觀看。因為可以透過各種方式組織和處理記錄項目,所以自動化資料挖掘和監視的方式非常多。


資源

Comments (latest comments first)

Discuss and comment on this resource in the BigAdmin Wiki

Unless otherwise licensed, code in all technical manuals herein (including articles, FAQs, samples) is provided under this License.


BigAdmin