by 칼 콘스탄틴(Carl Constantine), 역 한빛 리포터 1기 서광열
이번 기사에서는 보안 구멍과 잠재적인 문제점을 발견하고 시스템의 보안을 강화하는 데 도움을 줄, 잘 알려진 몇 가지 보안 도구를 살펴 볼 것이다.
지난 기사에서는 tcpdump와 트립와이어(Tripwire)를 간단하게 살펴보았다. 이번에는 syslog와 매우 중요한 보안 도구인
snort를 살펴보려고 한다.
Syslog
/var/log 디렉토리를 살펴보고 "이 많은 로그 파일들이 도대체 어디서 온 것일까" 하고 궁금해한 적이 있을 것이다. 로그는 시스템 로깅 기능을 하는
syslog가 만들었을 가능성이 크다. 사실
syslog는 원래 BSD 배포본의 한 부분으로서 각기 다른 기능을 하는 몇 개의 도구로 구성되어 있다.
syslog는 리눅스와 여러 유닉스 운영체제(솔라리스, HP-UX 등)에 포팅되었고, 원래 시스템의 모든 기능을 그대로 유지하고 있다. 어떤 경우에는 몇 가지 기능이 추가되기도 하였으나 제거된 기능은 없다. 필자는
syslog를 단순히 도구라기보다는 하나의 시스템으로 생각하고 있다.
syslog는
syslogd 데몬 프로세스와
klogd 데몬 프로세스, 프로그래밍 인터페이스인
syslog.h, 전체 시스템에 적용되는 열쇠가 되는
/etc/syslog.conf 설정 파일 등 네 가지 부분으로 이루어져 있다. 프로그래밍 인터페이스는 시스템의 활동을 기록하기 위하여 트립와이어를 비롯한 많은 프로그램에서 사용하고 있다. 보안 도구를 만드는 것이 아니거나 다른 애플리케이션에서
syslog를 사용하고자 한다면 프로그래밍 인터페이스는 사용할 일이 없을 것이다.
syslog 시스템의 가장 중요한 부분은
/etc/syslog.conf 파일이다. 이 파일은 언제 어떤 로그를 남길 것인지 결정한다(실제로
syslog이 일부분이어야 하지만).
syslog에 포함되지 않은 또 다른 도구인
logrotate는 로그 파일을 압축하고 하루 단위나 설정에 따라 새로운 로그 파일을 만든다. 그 결과는 다음 화면과 같다.
syslog의 설정 파일은 비교적 읽고 수정하기에 간편하다. 간단히 살펴보도록 하자.
syslog.conf
syslog.conf 파일은
syslogd와
klogd 양쪽에서 모두 사용한다. 이 파일은 세 가지 부분으로 구성되어 있다. 보존하고자 하는 로그 파일의 타입, 이벤트의 로그를 남길 때의 레벨(우선 순위), 그리고 이때 취해야 할 행동(기본적으로 어디에 이 로그를 남길 것인지)을 지정하는 것이다.
타입과 우선 순위는 대소문자 구분을 명확히 해야 하기 때문에 타이핑할 때 주의하도록 한다. 로그 타입(기능)은 다음 중 하나이다.
- auth
- auth-priv
- cron
- daemon
- kern
- lpr
- mail
- news
- syslog
- user
- uucp
- local0 to local7
이 외에도 몇 가지가 더 있지만 사용하지 않는 것이 좋다. 로그 레벨은 다음 중의 하나가 된다.
- debug
- info
- notice
- warning
- err
- crit
- alert
- emerg
여기에도 몇 가지 다른 레벨이 존재하나 사용하지 않는 것이 좋다.
syslog는 또한 설정 파일에서 와일드카드(*) 사용을 지원한다. 따라서 메일 로그를 로그 레벨에 관계 없이 남길 수도 있고, 로그 타입에 관계 없이 모든 레벨을 남길 수도 있다. 간단한 예제로 살펴보자.
# /etc/syslog.conf Configuration file for syslogd.
# First some standard logfiles. Log by facility.
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none /var/log/syslog
#cron.* /var/log/cron.log
daemon.* /var/log/daemon.log
kern.* /var/log/kern.log
lpr.* /var/log/lpr.log
mail.* /var/log/mail.log
user.* /var/log/user.log
uucp.* /var/log/uucp.log
|
이 예제에서는 인증 로그를
/var/log/auth.log에, 메일 로그를
/var/log/mail.log에 남기고 있다. 그러나
cron 메시지는 주석 처리하여 로그를 남기지 않고 있다. 부가적으로 모든 로그(*.*)를
/var/log/syslog 파일에 남기고 있다.
이 설정도 괜찮지만 모든 로그가 로컬 시스템에 기록되고 있다는 문제점이 있다. 블랙햇(black hat)이 시스템에 침입한다면, 시스템을 빠져나가면서 마지막으로 그가 남긴 모든 로그를 삭제할 것이다. 이러한 일이 일어나지 않게 하려면, 로그의 액션 섹션에 "@hostname"의 형식으로 외부의 호스트에 로그를 남기면 된다.
# /etc/syslog.conf Configuration file for syslogd.
# First some standard logfiles. Log by facility.
auth,authpriv.* @logger
kern.* @logger
lpr.* @logger
mail.* @logger
|
여기에서는 모든 인증, 커널, 프린팅, 메일 로그를 외부 머신인 logger에 남기고 있다. logger는
/etc/hosts 파일에 지정되어 있어야 한다. 이러한 방법으로 네트워크의 여러 머신에서 한 대의 로그 서버로 로깅을 할 수 있다.
정말로 침입을 하려는 크래커를 막기에는 중앙 로그 호스트만으로는 충분치 않다. 이 때엔 로그 파일을 하드 카피로 프린팅하거나, 로그 파일을 여러 ID의 이메일로 보내는 등의 추가적인 보안을 취해야 한다.
cron을 사용하거나
logrotate와 같은 유틸리티를 사용하면 된다. 필자는
logrotate를 적극 추천한다.
syslog에는 사용자들이 하려는 것 이상의 기능이 많다. 특정 로그를 남기는 것을 제한하는 것도 가능하다. 여기에는 완벽한
syslog.conf 파일이 있다.
syslog.config파일의 맨 페이지를 보고 검토한 후에 어떠한 기능을 하는지 살펴보기 바란다.
# /etc/syslog.conf Configuration file for syslogd.
# First some standard logfiles. Log by facility.
auth,authpriv.* @logger
*.*;auth,authpriv.none @logger
#cron.* /var/log/cron.log
daemon.* -/var/log/daemon.log
kern.* @logger
lpr.* -/var/log/lpr.log
mail.* /var/log/mail.log
user.* root, joeuser
uucp.* -/var/log/uucp.log
#
# Logging for the mail system. Split it up so that
# it is easy to write scripts to parse these files.
#
mail.info -/var/log/mail.info
mail.warn -/var/log/mail.warn
mail.err /var/log/mail.err
# Logging for INN news system
#
news.crit /var/log/news/news.crit
news.err /var/log/news/news.err
news.notice -/var/log/news/news.notice
#
# Some `catch-all" logfiles.
#
*.=debug;₩
auth,authpriv.none;₩
news.none;mail.none -/var/log/debug
*.=info;*.=notice;*.=warn;₩
auth,authpriv.none;₩
cron,daemon.none;₩
mail,news.none @logger
#
# Emergencies are sent to everybody logged in.
#
*.emerg *
#
# I like to have messages displayed on the console,
# but only on a virtual console I usually leave idle.
#
#daemon,mail.*;₩
# news.=crit;news.=err;news.=notice;₩
# *.=debug;*.=info;₩
# *.=notice;*.=warn /dev/tty8
# The named pipe /dev/xconsole is for the `xconsole"
# utility. To use it, you must invoke `xconsole"
# with the `-file" option:
#
# $ xconsole -file /dev/xconsole [...]
#
# NOTE: adjust the list below, or you"ll go crazy if
# you have a reasonably busy site..
#
daemon.*;mail.*;₩
news.crit;news.err;news.notice;₩
*.=debug;*.=info;₩
*.=notice;*.=warn |/dev/xconsole
|
syslog 소개를 마치기 전에, 트립와이어나
snort와 같은 많은 보안 도구들 또한
syslog의 기능을 사용한다는 것을 잊지 말자. 어떤 보안 도구를 사용하고자 했다면 그 도구가 어떠한 방법으로 로깅 기능을 구현했는지 살펴보기를 권한다.
Snort
마지막으로 매우 중요한 보안 도구인
snort를 소개할 차례다.
snort는 마티 뢱(Marty Roesch)이 개발해서, 지금은 다른 많은 개발들이 함께 참여하고 있는
tcpdump와 마찬가지로
lipcap 유틸리티에 바탕을 두고 있다. 모든 유닉스에서도 동작하며 윈도우 클라이언트도 있다.
snort의 막강함과 유연성 때문에 빠른 속도로 많은 사람이 선택하는 침입 탐지 시스템이 되고 있다.
snort는 강력한 기능을 제공하는 가벼운 유틸리티이다. 실시간으로 트래픽(traffic)을 분석할 수 있으며, IP 네트워크에서 패킷의 로깅 기능, 프로토콜 분석, 내용 검색/매칭을 제공하고 여러 가지 공격과 스캔을 감지할 수 있게 해준다. 다른 여러 유틸리티처럼,
snort는 어떤 정보는 수집하고 어떤 정보는 흘려보낼지를 정의하는 룰베이스(rule-based) 언어를 제공하고,
snort의 기능을 더욱 더 확장할 수 있는 플러그인 설계의 탐지 엔진을 포함하고 있다.
www.snort.org 웹사이트는 룰을 만들어주는 시스템을 제공하기 때문에 사용자는 자신만의 룰셋(rule sets)을 만들 수 있다. 또한 보안 커뮤니티에서 만든 말 그대로 수천가지의 필터를 웹사이트에서 다운로드 받을 수 있다.
snort는 세 가지 다른 방법으로 사용할 수 있는데,
tcpdump와 같은 패킷 스니퍼(packet sniffer), 패킷 로거(packker logger), 완전한 기능을 제공하는 침입 탐지 시스템(IDS)이 이에 해당한다.
snort는
tcpdump의 이진 형식이나 자체적인 ASCII 포맷으로 파일을 만들 수 있으며, XML 파일로 로그를 남길 수도 있다. 게다가 snort가 로깅하고 이 데이터를 처리하는 것을 도와주는 몇 가지 에드온(add-on) 또한 제공한다.
간단한
snort 명령은 다음과 같다.
snort -i eth1 -A fast -l logdir -F filterfile -c rulefile
|
가장 먼저 알아야 할 것은
snort는 루트로만 실행될 수 있다는 점이다. 나머지 명령은 다음과 같이 따로 살펴보면 된다.
- -i
- 읽어 들일 인터페이스. 지정되지 않으면 기본 인터페이스(보통 eth0)가 사용된다.
- -A
- "Alert Mode"를 의미한다. snort는 fast, full, non, unsock의 네 가지 모드를 사용한다. "Fast"는 한 줄에 하나씩 쓰는 방식으로, 기본 "alert" 파일에 경보를 기록한다. "Full"도 같은 기능을 하지만 경보 메시지 뿐만 아니라 디코드된 완전한 헤더 내용도 기록한다. "None"은 경보 기능을 끄는 것이고, "Unsock"은 유닉스 소켓을 말하는데 경보 메시지를 표준 유닉스 소켓을 통해 다른 머신으로 보내는, 아직 테스트 중인 실험적인 모드다. 주의: syslog로 로그를 남기고 syslog가 원격 머신으로 로그를 보내게 함으로써 같은 기능을 구현할 수 있다.
- -l
- snort가 모든 출력을 logdir에 설정된 디렉토리에 남기도록 만든다. 모든 경보와 패킷 로그는 이 디렉토리에 들어간다. 기본 디렉토리는 /var/log/snort로 지정되어 있다.
- -F
- filter 파일에 지정된 필터 파일을 쓰도록 한다. 필터 파일은 tcpdump 필터 파일과 같은 포맷(BDF 혹은 Berkeley Packet Filter로 불리는)이다.
- -c
- 룰 파일에 지정된 룰셋을 읽어 들인다.
tcpdump나
tcpdump 이진 형식을 지원하는 다른 도구로 캡처한 패킷이 있다면, 다음과 같은 명령으로 파일을 처리한다.
snort -A fast -l logdir -F filterfile -c rulefile -r TCPdumpfile
|
이 예제에서
snort는
-r 옵션을 보고 지정된 이더넷 인터페이스가 아닌
TCPdumpfile에서 입력 값을 읽어 들인다.
Snort rules
snort는 모든 설정 파일을 기본적으로
/etc/snort 파일에 저장한다. 모든 룰이 이 디렉토리에 저장되어 있다. 몇 가지 룰을 살펴보자.
alert tcp 24.80.0.0/17 any -> 48.0.0.0/16 666 (msg:"The beast is coming!!!";)
|
이 룰은 소스 IP 주소가 24.80.0.0에서 24.80.127.55의 범위이고, 목적 IP가 48.0.0.0에서 48.0.255.255(포트 666)인 모든 패킷에 대하여 경보를 발생시킨다. 경보 기록은 "The beast is coming!!!"이라고 표시된다.
왜 이런 일을 할까? 크래커가 시스템에 침입하고자 시도할 것임을 알고 있다고 하자. 그러나 침입자는 절대로 같은 머신을 두 번 이상 사용하지 않는다(이번엔 DHCP를 사용하고 있다). 그러나 소스 IP의 어떤 범위에서 여러 접속 시도가 들어오는 것을 알 수 있다. 그것 뿐만 아니라 침입자는 시스템의 특정 범위의 여러 머신에 비슷한 공격을 시도하고 있다. 여기에
snort 배포본에 포함된 것이 하나 있다.
alert tcp any any -> $HOME_NET 25 (msg:"Happy 99 Virus"; content:"X-Spankska₩: Yes"; flags: PA;)
|
이 룰은 사용자 홈 네트워크 25번 포트에 들어오는 패킷을 감시하고 있다.
$HOMENET은
/etc/snort/snort.conf 파일에 지정되어 있다. 또한 패킷은 "X-Spankska$: Yes"라는 문자열을 포함하고 있어야 하고 TCP 플래그는
PUSH-ACK여야 한다. 이 경보는 "Happy 99 Virus"라고 되어 있다. 이러한 룰은 이메일에 첨부되어 들어오는 여러 바이러스를 탐지해 낼 수 있다.
snort 웹사이트에서 어떻게 룰을 만들고 모든 상황에 대처할 수 있는지에 관한 문서를 볼 수 있다.
Snort 필터
이미 언급했듯이,
snort 필터는 BDF 필터이고
tcpdump에서 사용하는 것과 같다. 필터는 명령 행에서 지정할 수도 있고, 필터 파일에서
-F 옵션을 사용해서 지정할 수도 있다.
좋은 필터를 만들기 위해서는
- 필터를 만들고자 하는 공격의 시그너처(signature)를 알아야 한다.
- 필터 프로그래밍 언어에 해박하고 IP의 기본적에 대한 이해가 있어야 한다.
- 필터의 설치 과정에 숙달되어 있어야 한다.
결론
시스템 보안은 하루 24시간을 모두 소비하는 일이다. 항상 뭔가 할 일이 있는 것이다. 일단 시스템을 모두 최신으로 패치하는 것부터 시작하자. 열려 있을지 모르는 잠재적인 보안 구멍을 막고 시스템에 침입하고자 하는 사람들 잡아내려고 한다면, 시스템에 정기적인 감사를 수행하는 것이 좋다.
SHADOW, portsentry, ACID와 같은 많은 보안 도구가 있으므로,
freshmeat.net이나
securityportal.com을 살펴보길 바란다. 각각의 도구에는 장점과 단점이 있다. 네트워크를 잠그고, telnet, FTP, BSD r-계열 명령어를 닫고 안전한 도구로 대체하기 위해 적절한 수단을 취하자. 네트워크를 전반적으로 살펴보고 싶다면 이 기사를 통해 언급한 보안 도구를 다운로드받아 컴파일하고 설치해 보길 바란다.
무엇보다도, 시스템을 최신으로 유지하길 바란다. 또한 포기하지 말아야 한다. 예비 조치를 취했더라도 침입 당할 여지는 여전히 있다. 침울해 하지 말고, 이를 통해 배우고 구멍을 메우길 바란다.
추적(tracking)하는 것도 행복할 수 있다!
칼 콘스탄틴(Carl Constantine)은 Open Source Solutions社(www.os-s.com)의 리눅스 강사이자 프로그래머로 일한다.
서광열님은 한빛 리포터 1기로 활동 중이며, 포항공대 PLUS의 회원입니다.