BigAdmin System Administration Portal
특집 기사
Print-friendly VersionPrint-friendly Version

syslog-ng 및 Stunnel을 사용하여 중앙 집중식 보안 로그 서버 만들기

Amy Rich, 2004년 9월

목차:

UNIX 시스템 관리자라면 syslog 데몬에 대해 잘 알고 있겠지만 문제가 보고되지 않으면 데몬에서 수집하는 정보가 처리되지 않은 상태로 유지되는 경우가 종종 있습니다. 다수의 시스템이 있는 사이트에서는 어느 누구도 매일(심지어는 매달) 로그인하고 여러 개의 로그 파일을 확인하는 데 시간을 쏟지 않습니다. 이러한 시스템에 데이터를 상호 연관시킬 수 있는 자동화된 스크립트는 각 시스템에 개별적으로 액세스해야 하므로 이러한 스크립트를 작성하는 것은 쉽지 않습니다. 자동 및 수동 데이터 처리의 부담을 줄이기 위해 많은 사이트에서는 UNIX 서버, Windows 및 Mac 데스크톱과 라우터 및 스위치와 같은 네트워킹 장비를 포함하여 네트워크에 있는 모든 시스템(주로 NTP를 실행하여 시간/날짜를 쉽게 동기화할 수 있음)의 데이터를 수집하는 중앙 로그 서버를 구현합니다. 중앙 집중식 로깅은 대부분의 스톡 UNIX syslog 데몬에서는 별것 아니지만 syslogd는 초기 버전에서 변경된 것이 거의 없으며, 몇 가지 결함이 있습니다.

표준 UNIX syslog 데몬은 UDP를 통해 메시지를 명확하게 전달합니다. 즉, 잠재적으로 민감한 데이터가 노출될 수 있습니다. facility.level 모델은 매우 제한적이며, 대부분의 운영 체제에 제공되는 기본 /etc/syslog.conf 파일에서는 관리자가 관심을 가질 수 있는 많은 메시지의 기록이 누락됩니다. 사람이 읽기에 적당하거나 자동화된 데이터 마이닝에 적당한 방식으로 로그를 구문 분석하는 작업은 매우 어렵습니다. 예를 들어 UNIX syslog 데몬을 사용하면 호스트별로 로그 파일을 분리하거나 정규 표현식별로 로그 메시지를 일치시키는 작업을 쉽게 수행할 수 없습니다. 따라서 스톡 syslog 데몬을 사용하는 대부분의 중앙 집중식 로그 서버는 모놀리식 로그 파일을 사용하여 프로세스를 마무리합니다. 단, 해당 파일은 syslog 프로세스에서 닫아야만 처리됩니다.

그 결과 로깅을 중앙 집중화하는 대부분의 사이트도 스톡 syslog 데몬을 Metalog, msyslog 또는 이와 비슷하게 좀 더 보안이 확보되고 좀 더 유연한 것으로 교체하고 있습니다. 보편적으로 많이 사용되는 한 가지 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 플랫폼 버전)를 실행 중인 시스템에서 syslog-ngStunnel을 설치하고 구성하는 내용에 대해 다룹니다. 하지만 이 절차는 일반적으로 SPARC 및 x86 플랫폼에서의 Solaris OS의 기존 버전 및 새 버전 모두에 적용됩니다. 아래에서 논의되는 각 참조 시스템은 OpenSSL, tcp 래퍼, Solaris 8 /dev/urandom 패치와 GNU 개발 환경(gcc 등) 및 기타 여러 가지 프리웨어 패키지와 함께 설치됩니다. 또한 로그 서버 역할을 하는 시스템은 네트워크에 있는 모든 시스템의 민감한 보안 관련 정보를 저장하므로 철저하게 강화되었습니다. 이러한 참조 시스템은 모두 서브넷이 192.168.1이고 로그 서버의 IP 주소가 192.168.1.10인 위치에 있습니다.


Stunnel 설치

보안 로그 서버를 구현하는 첫 번째 단계는 서버와 각 클라이언트에 Stunnel을 설치하는 작업입니다. syslogsyslog-ng로 바꾸지 않고 스톡 syslog 데몬과 함께 Stunnel을 사용할 수도 있지만 다음 작업에 필요한 유연성을 갖출 수 없게 됩니다. 아래의 지침에서는 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 디렉토리를 로컬로 설치된 기타 doc 설치와 함께 /usr/local에 보관합니다. 또한 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-ngStunnel만 실행할 것이므로 고유 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 및 각 클라이언트(이 예에서는 3개의 syslog-ng 클라이언트)의 인증서(crt 파일에 있음)만 있는 클라이언트 pem 파일인 syslog-ng-client.pem도 필요합니다.

-----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-----

그리고 서버와 서명 CA의 인증서만 들어 있는 pem 파일 syslog-ng-server.pem도 필요합니다.

-----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-----

보안상의 이유로 각 시스템의 루트에서만 인증서 파일을 읽을 수 있는지 확인합니다.

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

syslog-ng와 함께 사용할 Stunnel 구성

서버에서 아래와 비슷한 정보가 들어 있는 syslog-ng 전용 Stunnel 구성 파일인 /usr/local/etc/stunnel/stunnel.conf를 만듭니다. 이 예제 파일에서는 로컬의 cert/key와 서버의 cert, 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을 테스트하려면 stunnel 예제 페이지에서 설명한 대로 IMAP 또는 telnet과 같이 다른 TCP 포트 또는 서비스를 대신 사용하여 구성하십시오.

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 wrappers에 대한 지원도 추가합니다. 다른 데몬에서 설치되어 현재 활발하게 사용 중이기 때문입니다.

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 wrappers에서 적절한 포트가 열렸는지 확인하십시오. 로그 호스트가 암호화되지 않은 syslog 메시지를 사용하는 경우에도 서버는 TCP 포트 5140, UDP 포트 514에서 클라이언트의 연결을 수락해야 합니다. tcp wrappers 확장 구문을 지원하려면 다음을 서버의 /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 OS의 syslog 시작 스크립트를 기반으로 하며, stunnelsyslog-ng를 시작할 뿐 아니라 savecore도 수행합니다.

#!/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의 유연성은 구성 파일에서 기인합니다. 조작을 기록하는 데 중요한 구성 지시어는 source, filter, destinationlog입니다. source 지시어는 로그 메시지가 로컬 또는 원격 로그 메시지인지 나타내며, filter 지시어는 기능, 수준/우선 순위, 프로그램 이름, 호스트 이름 또는 정규 표현식 일치를 기반으로 하는 로그 메시지의 분리를 허용합니다. destination은 파일, 파이프, 스트림 및 데이터그램, UDP 또는 TCP 연결, tty나 프로그램일 수 있습니다. log 지시어는 일치하는 로그 메시지를 처리하는 방법을 정의하는 source, filterdestination 지시어의 집합입니다. 사용 가능한 모든 지시어에 대한 논의는 syslog-ng 참조 매뉴얼에서 찾아볼 수 있으며, 다양한 예제가 syslog-ng FAQ에 나열되어 있습니다.

다음 예에서는 /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의 좀 더 심화된 사용에는 메시지의 중요도를 기준으로 데이터 마이닝 소프트웨어, 데이터베이스, 전자 메일 또는 프린터에 직접 로그 메시지를 전달하는 작업이 포함됩니다. 또 다른 유용한 팁은 우선 순위가 높은 로그 메시지를 실시간 로그 분석기(예: swatch, logsurfer, Log Tool 또는 Logwatch)로 감시할 수 있는 파일 하나에 전송하는 것입니다. 로그 항목은 여러 가지 방법으로 구성되고 처리될 수 있으므로 자동화된 데이터 마이닝 및 모니터링은 광범위하게 확장될 수 있습니다.


자원

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