원격 로그 서버 만들기 완벽 가이드
좀 오래된 문서이기는 하나 괜찮은 문서 같아서 올려 봅니다.
좀 오랫된 문서라서 설치 설명에 사용되는 명령어나 패키지들의 버전이 낮지만 설정하는데에는 크게 문제가 되지 않을 겁니다.
이문서를 토대로 혹 최신 버전에서 설치를 하시는 분들은 성공기/체험기나 제가 메일을 주시면 해당 성공기를 올려 드리도록 하겠습니다. 원격 로그 서버 만들기 완벽 가이드
(Complete Reference Guide to Creating a Remote Log Server) 번역 : 이국현 (errai@hitel.net)
영문원문링크:http://www.linuxsecurity.com/feature_stories/remote_logserver-1.html
한글원문링크:http://www.linuxlab.co.kr/docs/01-01-1.htm 이 문서는 Eric Hines에 의해 쓰여진 것으로, 원격 로그서버를 만들기 위한 자세한 설명과 설정방법등을 다룰 것이다. 소개(INTRODUCTOIN)
우선 본 문서에서 언급하고 있는 유틸리티들의 README 화일들에 대해서 열심히 공부해 볼 것을 권한다. 그리고 문서를 읽다 보면 나오는 단어 중 SERVER는 원격 머신(CLIENTS)들로부터 log를 받도록 설정되어진 컴퓨터이고, CLIENT는 원격 로그 서버(REMOTE LOG SERVER)에게 log를 보내도록 설정 되어진 컴퓨터임을 나타낸다. A. 원격 로그 서버란 무엇인가?(WHAT IS A REMOTE LOG SERVER)
원격 로그서버는 다른 시스템들의 log들을 저장할 하드 드라이브 공간을 제공하도록 미리 설정되어진 시스템일 뿐 그 이상도 이하도 아니다.
이 시스템은 완벽한 보안으로 차단되어 있어야만 한다. 모든 RPC 데몬들이나 다른 기타 서비스들도 암호화되지 않고서는 절대 접근이 허락되지 않는다. 데이타들은 오직 UDP/Port 514 번을 통해서만 전송이 허락된다.
로그서버에 대한 자세한 설정 및 설치등에 대해서 하나씩 하나씩 접근해 보기로 하자.
([역자주] : UDP port 514번은 syslog가 사용하고 있다) B. SYSLOGD
syslogd의 재 컴파일(Recompiling syslogd) 여러분 컴퓨터에서 원격으로 로그를 남기는 능력을 작동시키기 위해서 첫번째로 할 일은 syslogd의 재 컴파일이다. 이것은 보안상의 이유로써 syslog.conf 화일이 아닌 다른 화일을 읽도록 하기 위함이다. 자세한 내용은 나중에 다루겠다. NOTES : 이 아이디어는 Lance Spitzner가 쓴 "To Build a Honeypot"이란 whitepaper를 통해 얻게 되었다. 보안 공동체를 위해 공헌을 한 Lance에게 감사의 말을 전한다.
이 뛰어난 아이디어는 침입자가 이 시스템에는 원격 로그를 남기는 기능이 없다고 착각하게 만드는 것이다. 이전에 사용한 /etc/syslog.conf 화일을 남겨놓음으로써 예기치 못한 크래커를 속이는데 도움을 줄 것이다. STEP 1 : 새로운 버젼으로 컴파일하기 (COMPILING OUR NEW VERSION)
우선 여러분의 운영체제에는 기본적으로 syslogd가 설치되어 있을 것이고 소스코드는 함께 들어있지 않을 것이다. 여러분은 우선 RedHat 이나 Joey's FTP site(syslogd의 개발자)를 통해 소스 코드를 다운로드 받아야 한다. 여러분의 배포판에서 소스 코드를 제공하지 않는다면 오픈 소스 정책에 위반되는 것이다. 그러므로 아래의 링크에서 소스를 다운받길 원하지 않는다면 여러분의 OS vender에서 소스코드를 얻기 바란다. SITE 1:ftp://ftp.infodrom.north.de/pub/people/joey/sysklogd/
혹은
SITE 2:ftp://ftp.sourceforge.net/pub/mirrors/redhat/redhat/redhat-6.2/SRPMS/SRPMS/sysklogd-1.3.31-16.src.rpm 만약 RedHat계열의 사용자일 때 rpm-iv-vsysklogd-1.3.31-16.src.rpm 라고 실행한다면 /usr/src/redhat/SOURCES/sysklogd-1.3-31 에 인스톨 될 것이다. STEP 2 : 기본 설정 화일 위치 변경하기(CHANGING THE DEFAULT CONFIG FILE LOCATION)
여기는 재미있는 부분이다. 이것은 침입자가 여러분의 log화일이 local에 저장된다고 생각하게끔 속인다. 우리는 syslogd가 다른 설정 화일을 읽도록 재컴파일을 할 것이다. 기본으로 설정되어있는 옛 화일은 침입자가 원격 로그가 기록되는지 cat 등을 실행해서 /etc/syslog.conf를 들여다 보았을 때 속일 수 있을 것이다. 재컴파일해서 새로운 바이너리를 얻더라도 옛 설정화일은 남겨놓도록 하자. 기본 설정인 /etc/syslog.conf 를 고친다. [ehines@myhost sysklogd-1.3-31]$ cd /usr/src/redhat/SOURCES/sysklogd-1.3-31
[ehines@myhost sysklogd-1.3-31]$ vi syslogd.c syslog.conf 부분을 찾는다.
#define _PATH_LOGCONF "/etc/syslog.conf" 이제 여러분이 원하는데로 설정 값을 고치면 된다. 여러분은 /etc/.sys/CORE.conf 같이 독창적으로 설정하기 바란다.
새로운 syslogd 바이너리가 생겼다면 이전 것 위에 덮어쓴다.
(대부분은 /sbin/syslogd)이 부분을 실행하기 전에 옛날 버젼은 백업 해두자. 관리자라면 이미 알고 있겠지만, 그렇죠? :) NOTES : 간단하게 예전 syslogd를 가지고 (-f 설정화일)형식으로 실행하지 않은 이유는, 침입자가 ps 등으로 프로세스 리스트를 볼 경우 뒤에 붙은 옵션들이 다 보여서 설정화일을 무엇으로 바꾸었는지 다 알게 될 것이다.
그러므로 이와 같은 형식으로 하는게 좋다. 필자는 /etc/syslog.conf 파일을 교묘하게 놔두고, 재컴파일을 통해 설정화일을 바꾸는 것을 추천한다.
그리고 위치만 변경하고 이름은 그대로 두는 것은 위험하다.
간단하게 find / -name "syslog.conf" 로 찾아낼 수 있다. STEP 3 : 진짜 syslog 설정화일 고치기(MODIFY THE (REAL) SYSLOG CONFIG FILE)
예를 들어, 다음의 syslog.conf 는 모든 메세지를 원격 호스트로 포워딩 하는 것이다. # 간단하게 모든 메세지를 원격 호스트로 포워딩.
*.* @hostname # 모든 커널 메세지를 원격 호스트로 포워딩.
kern.* @hostname # 로컬에도 기록하면서 원격으로도 기록을 남김 (실패할 경우 대비)
kern.crit @finlandia
kern.crit /dev/console 기타등등 여러분이 원하는데로 모든 로그화일을 설정한다. C. THE CLIENT ( REMOTE LOG SERVER )
클라이언트 서버(혹은 모든 원격 로그들을 수용하는 컴퓨터)는 원격 로그를 남기기 위해서 syslogd에 -r 스위치를 줘서 실행시켜야 한다. 그리고 /etc/services화일에 syslog 514/udp 가 적혀져 있어야 한다. D. 원격 로그 서버 차단하기(LOCKING DOWN THE REMOTE LOG SERVER)
모든 로그들을 받아들이는 컴퓨터는 완벽하게 외부와 차단되어 있어야 한다. 1. 모든 서비스 종료시키기 (Turn off(ALL SERVICES)) 이 컴퓨터는 오직 로그 서버일 뿐이므로 다른 서비스들을 실행시킬 필요가 없다. 다음과 같이 실행한다. [root@myhost /etc]# cd /etc
[root@myhost /etc]# vi inetd.conf 1) 모든 INETD 서비스 종료시키기 (TURN OFF ALL INETD SERVICES) 여러분은 이 화일에서 '#' 를 추가시킴으로써 주석으로 처리를 할 것이
다. 아래의 모든 서비스들을 주석처리하기 바란다. a. echo
b. discard
c. daytime
d. chargen
e. time
f. ftp
g. telnet
h. shell
i. login
j. exec
k. comsat
l. talk
m. ntalk
n. dtalk
o. pop-2
p. pop-3
q. imap
r. uucp
s. tftp
t. bootps
u. finger
v. cfinger
w. systat
x. netstat
y. auth
z. linuxconf
zz. swat 2) 모든 RPC 서비스 종료시키기 (DISABLE ALL RPC SERVICES) [root@myhost /etc]# cd /etc/rc.d 디렉토리를 살펴보면 대문자 "S"로 시작하는 화일들이 보일 것이다. 이것은 시스템이 부팅할 때 시작되는 서비스들이다. 여러분은 mv 명령어를 이용해서 소문자 s로 바꿔주면 된다. 예를 들어 mv S11portmap s11portmap 이라고 해주면 부트 타임때 portmapper 를 시작하지 않게 된다. 아마도 nfslock, apmd, netfs, identd, autofs, portmap, atd, pcmcia 와 isdn, sendmail, gpm, httpd, vmware, xfs,linuxconf, local 같은 서비스들을 꺼주면 될 것이다. rc0.d 에서부터 rc6.d 까지 다 종료시켜 주어야 한다. 2. 계정 삭제(DISABLE ACCOUNTS) [root@myhost /etc]# vi /etc/passwd 여러분의 패스워드 화일에서 사용하지 않는 계정을 삭제해야 한다. 필자는 /bin/noshell(http://www.
cerias.purdue.edu/coast/archive/data/categ50.html)라는 툴을 다운받을 것을 제안한다.
이것은 계정을 추가하거나 삭제할 때 관리자에게 유용한 프로그램이다. 3. SSH의 설치 (INSTALL SSH) telnet을 사용하면 sniffing 당할 위험이 있다. 하지만 우리에겐 GNU 오픈소스 공동체의 산물인 OpenSSH이 있다. 자 이제 OpenSSH를 설치해보자. 1) OPENSSH 다운로드 받기 (DOWNLOADING OPENSSH) 여러분의 웹브라우져로 www.openssh.com에 접속한다. 이문서가 쓰여질 때 최신버젼은 version 2.1.1로 SSH1과 SSH2 프로토콜을 둘 다 지원한다. 소스를 다운받고 다음과 같이 한다. [root@myhost ]# gzip -d openssh-2.1.1p2.tar.gz
[root@myhost ]# tar -xvf openssh-2.1.1p2.tar 모든 사항을 똑같이 할 수는 없을 것이다. 계속 진행하기 전에 INSTALL 화일을 꼭 읽어보기 바란다. 필자는 여러분 각각 시스템이 요구하는 사항까지 이야기 해 줄 수 없다. 이것은 단지 필자의 인스톨을 여러분이 지켜보는 것 일 뿐이다.
우선 Zlib와 OpenSSL을 인스톨을 해야 한다. Zlib: http://www.freesoftware.com/pub/infozip/zlib/
OpenSSL 0.9.5a or greater:
http://www.openssl.org/ RPM버젼의 OpenSSL은
http://violet.ibs.com.au/openssh/files/support GNUmake가 설치되어 있다면 다음과 같이 하면 설치가 될 것이다. [root@myhost ]# ./configure && make && make install 만약 PAM을 사용한다면 /etc/pam.d/sshd 과 같은 PAM control file도 필요로 할 것이다. 일반적으로는 conrtib/sshd.pam.generic 에 포함하고 있다. 사용하기 전에 여러분의 시스템에 맞게 편집해야 할 것이다. 만약 레
드햇 리눅스 6.2를 사용한다면 contrib/redhat/sshd.pam 이 더 유용할 것이다.
필자는 configure 할 때 --without-pam으로 PAM 지원을 끄는 것을 좋아한다. 만약 발견된다면 PAM은 자동적으로 스위치가 켜질 것이다.
--without-pam 옵션은 대신에 RSA 인증을 사용할 경우에 사용된다. [root@myhost ]# tar -xvf zlib.tar
[root@myhost ]# cd zlib-1.1.3
[root@myhost zlib-1.1.3]# ./configure && make && make install 설치도중에러가 발생한다면 미안하지만 README 화일을 읽기 바란다. 필자는 에러가 발생하면 README 화일들에서 error에 관련된 사항을 찾아보곤 한다. OpenSSL을 인스톨 하기 위해서는 다음과 같은 것이 필요하다.
* Perl 5
* an ANSI C compiler
* a supported Unix operating system [root@myhost ]# tar -xvf openssl-0.9.5a.tar
[root@myhost ]# ./config && make && make test && make install 이제 OpenSSH를 설치한다. [root@myhost ]# cd openssh-2.1.1p2
[root@myhost ]# ./configure --without-PAM && make && make install 성공적으로 OpenSSH를 컴파일 했다면 다음과 같은 메세지를 보게 된다.
Key generation complete.
Your identification has been saved in /usr/local/etc/ssh _host_key.
Your public key has been saved in /usr/local/etc/ssh _host_key.pub.
The key fingerprint is:
d5:74:83:d0:3f:c4:b4:d6:c5:39:1d:94:ee:9b:a8:61 root
@soc1.priv.nuasis.com
Generating DSA parameter and key.
Your identification has been saved in /usr/local/etc/ssh
_host_dsa_key.
Your public key has been saved in /usr/local/etc/ssh
_host_dsa_key.pub.
The key fingerprint is:
ed:58:65:b9:8b:fe:05:81:c2:8c:06:c9:cb:ac:bb:e6 root
@soc1.priv.nuasis.com 2) OPENSSH의 설정 (CONFIGURING OPENSSH) 기본적으로 설정되어진 것을 사용하더라도 나중에 변경할 때를 대비해서라도 ssh config화일을 봐두자. 설정화일
은 /usr/local/etc/ssh_config, /usr/local/etc/sshd _config 가 있다.
설치가 끝난 후에는 host key와 DSA key가 생성될 것이다. 여러분은 SSH 배포판의 문서를 참조해서 설정을 하기 바란다. 4. 방화벽 (THE FIREWALL) 패킷 필터링은 여러분의 시스템에 어떤 취약점이 발견되지 전까지는 필요하지 않을 것이다. syslog port(514/udp)를 필터링 하는 이유는 syslog server가 쓰레기 값을 전송했을 때 멈출 수 없기 때문이다. 그러나 더 중요한 것은 udp값이 쉽게 spoof될 수 있게 때문이다.
이것은 적어도 여러분이 여러 대의 컴퓨터에서 모든 로그가 하나의 인터페이스로 들어올 때 여러분이 외부로부터 들어오는 모든 것을 안전하게 필터링 하게 해준다. 아래는 리눅스 머신에서 ipchains를 이용한 쉘 스크립트이다. #!/bin/sh PATH=/usr/sbin:/sbin:/bin:/usr/sbin LOCAL_INTERFACE="192.168.1.1/32"
# put your real IP address
LOCAL_NETWORK="192.168.1.0/24"
# put your local net IP address/mask here
SSH_PERMITTED="192.168.1.2/32 192.168.2.3/32"
# who allowed to ssh
SYSLOG_PERMITTED="192.168.1.5/32 192.168.5.2/32"
# who allowed to log syslog messages # deny everything
ipchains -P input DENY
ipchains -P output DENY
ipchains -P forward DENY
ipchains -F #permit ssh
for ipaddr in $SSH_PERMITTED;
do
ipchains -A input -p tcp -s $ipaddr -d 0/0 22 -i $LOCAL_INTERFACE -j
ACCEPT
done # permit outgoing tcp
ipchains -A output -p tcp -i $LOCAL_INTERFACE -j ACCEPT
ipchains -A input -p tcp ! -y -i $LOCAL_INTERFACE -j ACCEPT # permit syslog
for ipaddr in $SYSLOG_PERMITTED;
do
ipchains -A input -p udp -s $ipaddr -d $LOCAL_INTERFACE 514 -i \
$LOCAL_INTERFACE -j ACCEPT
done
# if you would like to log all the other connection
#attempts, uncommend these...
#ipchains -A input -p tcp -i $LOCAL_INTERFACE -l -j DENY
#ipchains -A input -p udp -i $LOCAL_INTERFACE -l -j DENY
#ipchains -A input -p icmp -i $LOCAL_INTERFACE -l -j DENY 만약 IP filter 패키지를 이용한다면 대체로 다음과 같을 것이다.
# close everything on local interface
# block in all on le0 from any to any # pass secureshell
pass in on le0 proto tcp from 192.168.1.2/32 to 192.168.1.1/32 port= 22
pass out on le0 proto tcp from 192.168.1.2/32 to 192.168.1.1/32 port = 22 # or you can replace these two rules with
#pass in on le0 proto tcp from 192.168.1.2/32 to
#192.168.1.1/32 port = 22 keep state
#pass SYSLOG
pass in on le0 proto udp from 192.168.1.2/32 to 192.168.1.1/32 port = 514 5. LOG REPORTING 아무리 좋은 원격 로그 서버를 만들어놔도 여러분이 직접 모니터링 할 수 없으면 무용지물이다. 필자는 다음과 같은 유틸리티를 추천한다.
* Logcheck - www.psionic.com
* Swatch - www.swatch.org 아래는 간단한 쉘 스크립트(Mr. Bill Pennington)이다. 이것은 매 일/시간/분 로그화일들을 지정된 이름과 장소에 보관한다. #!/bin/bash
#Simple script to rotate the log files on a daily basis
#Bill Pennington 1/19/2000 #Set the date variable
date=`date +%m-%d-%Y` #Rename the messages file
mv /var/log/messages /var/log/messages.$date
#HUP the syslog daemon so it writes to a new file
killall -HUP syslogd #Compress the file
/bin/gzip /var/log/messages.$date
#Rename the secure file
mv /var/log/secure /var/log/secure.$date #HUP the syslog daemon so it writes to a new file
killall -HUP syslogd #Compress the file
/bin/gzip /var/log/secure.$date #Rename mail file
mv /var/log/maillog /var/log/maillog.$date #HUP the syslog daemon so it writes to a new file
killall -HUP syslogd #Compress the file
/bin/gzip /var/log/maillog.$date #Then scp them somewhere 6. 시간 (TIME) 서버는 언제나 정확한 시간과 날짜를 가지고 있어야 한다. xntpd를 설치한 후에 "ntpdate timeservername"이란 명령을 하루에 적어도 한번정도 실행시켜 줘야 한다.
필자는 하루에 두 번 씩 이 작업을 시킨다. 물론 여러분이 가진 모든 서버에 해야 한다. 7. 다른 SYSLOG 장치 (OTHER SYSLOG DEVICES) 여기에 syslog가 기록하는 것을 설정할 수 있는 CISCO와 같은 다른 장치들이 있다. 여러분의 네트워크와 서버에서 정확한 값을 얻기 위해서는 syslog에서 기록하는 것을 위해 여러분의 모든 장치를 설정해야 한다. Cisco
모든 Cisco 장치들은 syslog를 지원한다. 아래에 몇 가지 예제가 있지만 직접 여러분의 Cisco 문서를 확인해보기 바란다. Routers
In config mode... logging <server ip address or name>
logging facility <facility> defaults to LOCAL7 Pix Firewall
In config mode... logging host <ip address of syslog server>
logging facility
<facility> defaults to LOCAL4 logging trap <level> from
emergencies to debug , be carefull with debug you will get a
ton of traffic! Switches
In config mode... set logging server enable
set logging server <ip address of log server>
set logging session enable
set logging level all 1 default Windows NT
여러분은 NT server로 syslog server로 특정작업을 포워딩 시킬 수 있다.
이와 관련된 여러 개의 shareware /freeware 패키지가 있다.
http://www.bhs.com 에서 syslog를 검색해보라. E. RESOURCES
* Swatch - http://www.stanford.edu/~atkins/swatch/
* OpenSSH - http://www.openssh.com
* LogCheck - http://www.psionic.com/abacus/logcheck/
* xntp and list of public NTP servers -
http://www.eecis.udel.edu/~ntp/
* Cisco - http://www.cisco.com
* Windows NT software - http://www.bhs.com
* Robert Graham's sniffing FAQ (hints to build `receive-only
device'
http://www.robertgraham.com/pubs/sniffing-faq.html
* IP Filter - TCP/IP filtering package:
http://coombs.anu.edu.au/~avalon/ F. 역자 주 개인적으로 판단해서 꼭 필요하지 않다고 하는 내용은 삭제 또는 변경하였습니다. 필자(Eric Hines)가 언급한 번역되지 않은 내용은 원문을 참조하시기 바랍니다. :) |
0