침입탐지시스템(Intrusion Detection Sys tem)은 시스템과 네트워크에서 자료를 수집해 시스템의 침입이나 오용(misuse) 사실을 탐지하는 시스템을 말한다. 쉽게 말해, 해커가 침입했다는 사실을 알려주는 소프트웨어다. 일반적으로 IDS는 (그림 1)과 같은 모델로 설명할 수 있다.
Audit Data Sources는 IDS가 분석에 활용하는 데이터의 종류를 의미한다. 크게 시스템 내부의 각종 서비스 운영에 대한 기록을 담고 있는 시스템 로그와 네트워크 TCP/IP 패킷을 캡처한 패킷 데이터로 나눌 수 있다.
(그 림 1)의 가운데 부분에 있는 Pattern Matcher는 IDS의 핵심 모듈로, 자신이 갖고 있는 정책 기반의 룰(rule, 흔히 알려져 있는 해커의 공격 기법들을 규칙화 해 둔 자료)을 바탕으로 데이터 소스들을 검사해 침입인지 아닌지를 판단한다.
또 다른 방법인 Abnomaly Detector는 과거 사용자 데이터 소스를 가지고 프로파일을 만들어 비정상적인 행위를 탐지한다. 즉, 특정 사용자가 언제 로그인 해서, 어떤 작업을 하는지에 대해 장기간의 프로파일을 만들어 이 프로파일과 일치하지 않는 비정상 사용자를 찾아낸다.
전자의 분석 방법은 침입이라고 알려진 패턴을 찾는 오용 탐지(misuse detection)라 부르며, 후자는 기존의 프로파일과 다른 이상 탐지(abnomaly detection)라고 한다.
전 자에 비해 후자의 방법이 알려지지 않은 새로운 형태의 공격에 대한 탐지와 잘못된 알람 등의 오류는 상대적으로 적으나, 구현하기 어렵다는 단점을 가지고 있다. 현재 대부분의 IDS는 전자에 속하는데, 최근 들어 2가지 기법을 혼용한 하이브리드 형태의 IDS 개발도 이뤄지고 있다.
IDS는 어떤 데이터를 가지고 분석하느냐에 따라 호스트 기반 IDS, 네트워크 기반 IDS, 애플리케이션 기반 IDS로 구분한다.
또한 데이터 소스에 따라 IDS가 보호할 수 있는 영역의 범위도 달라진다. 호스트 기반 IDS는 설치돼 있는 시스템 만을 보호할 수 있는 반면, 네트워크 기반 IDS는 비교적 넓은 네트워크 내의 시스템을 보호할 수 있다.
그러나 후자의 경우 시스템 내부에서 발생할 수 있는 공격 등에는 대응할 수 없는 한계점도 있다. 따라서 최근에는 두 데이터 소스를 혼용하는 형태의 IDS가 개발되고 있는 상황이다.
Snort IDS
리눅스에서 손쉽게 사용할 수 있는 공개 IDS인 Snort를 설치해 보자. Snort는 마틴 로이쉬란 개발자가 만든 IDS로, IP 네트워크의 패킷들을 캡처해 자체 룰과 비교해 침입을 탐지한다. 네트워크 기반의 오용 탐지 시스템인 Snort는 리눅스를 포함해 대부분의 유닉스 운영체제에서 동작한다.
Snort는 프로토콜 분석, 내용 검색/매칭을 수행하고, 오버 플로우, 스텔스(Stealth) 포트스캔, CGI 공격, SMB 탐색, OS 확인 시도 등의 다양한 공격과 스캔 공격을 탐지할 수 있다. 자체적으로 그래픽 유저 인터페이스(GUI)는 가지고 있지 않지만, 플러그인 형태로 웹 방식의 GUI가 제공된다. 특히 탐지 규칙이 비교적 간단해 사용자가 직접 새로운 형태의 규칙을 기술할 수도 있으며, 새롭게 기술되는 규칙을 쉽게 공유할 수 있다는 것이 큰 장점이다.
한 가지 염두에 둬야 할 점은 Snort를 활용하면 기본적인 침입탐지 기능을 이용할 수 있지만, 여러 형태의 잘못된 메시지들이 생성될 수도 있으므로 탐지 규칙에 대한 상세한 검토가 뒷받침돼야 한다는 것이다.
·설치
최신 버전을 다운로드 받아 실제로 설치해 보자. Snort를 설치하기 위해서는 먼저 libpcap이라는 라이브러리가 시스템에 설치돼 있어야 한다. libpcap는 TCP/IP 패킷을 수집해 주는 네트워크 스니퍼 프로그램으로, 대부분의 IDS는 이 라이브러리를 이용해야 자신이 보호하고자 하는 네트워크 내의 시스템들이 받는 패킷이 어떤 것인지 알 수 있다.
libpcap이 설치돼 있는지 먼저 확인해 보자.
#rpm -q libpcap
만약 설치돼 있지 않다면, 다음과 같은 메시지가 나타나고 설치돼 있다면, 패키지 버전이 표시된다.
[security@superbg ~]$ rpm -q libpcap
package libpcap is not installed
[security@sweetlie ~]$ rpm -q libpcap
libpcap-0.4-29
libpcap 라이브러리가 시스템에 없다면, ftp://ftp.ee.lbl.gov/libp cap.tar.Z에서 다운로드 받아서 설치한다.
# uncompress libpcap.tar.Z
# tar xvf libpcap.tar
설치 방법은 압축 해제한 파일 중에 README 혹은 INSTALL 파일을 보면 잘 설명돼 있다.
# ./configure
# make
# make install
libpcap을 설치했으면 http://www.snort.org에서 최신 버전인 snort-1.8p1을 다운로드 받는다. 리눅스에서 쉽게 설치할 수 있도록 친절하게도 rpm으로도 만들어져 있으므로, 다운로드 받아 rpm -ivh와 같은 명령어를 이용해 설치한다.
http://www.snort.org/Files/snort-1.8p1-0.i386.rpm
rpm이 아닌 소스 압축 파일(.tar.gz형태)로 다운로드 받았다면 libpcap과 마찬가지로 압축을 해제하고 설치한다.
·실행
libpcap과 Snort가 제대로 설치됐다면 실행해도 되지만, 더 많은 탐지 규칙을 받아보자. IDS의 탐지율은 얼마나 정확하고 많은 탐지 규칙을 수집해 가지고 있느냐와 직결되기 때문에, 관리자는 항상 정확하고 최근의 공격 성향을 반영한 규칙 업데이트에 신경을 써야 한다.
탐지 규칙 파일은 http://snort.sourceforge.net/snortrules.tar.gz을 받아 압축을 풀면 된다. 압축을 풀면 30여 개로 구분된 탐지 규칙 파일들이 생긴다.
압 축을 푼 탐지 규칙 파일 중에 snort.conf라는 환경 설정 파일이 있다. 이 환경 설정 파일에 Snort를 실행하는데 필요한 여러 시스템과 네트워크 정보를 기술해 줘야 한다. 환경 설정 파일에는 크게 다음과 같은 4가지 내용이 담겨있다.
·네트워크 변수 세팅
·프리프로세서 환경 설정
·출력 플러그인 환경 설정
·탐지 규칙 커스터마이징
우선, 초기 실행을 위해 네트워크 변수 세팅만 하자. 네트워크 변수 세팅에서는 홈넷(Snort가 보호하고자 하는 Snort가 위치하고 있는 네트워크) 설정을 해야 한다.
초기 값은 다음과 같이 주어진다,
var HOME_NET 10.1.1.0/24
Snort가 143.248.188.x 네트워크에 설치돼 있다면, var HOME_NET 143.248.188.0/24와 같이 설정한다. 그리고 DNS 서버 정보도 설정해 준다. DNS 서버 정보를 기술하지 않을 경우, DNS로부터의 쿼리를 포트 스캔 공격으로 간주해 잘못된 경고 메시지를 생성할 수 있다. DNS 서버 IP가 164.124.101.2와 143.248.1. 177이라면 다음과 같이 설정한다.
var DNS_SERVERS [164.124.101.2/32,143.248.1.177/32]
이제 여러 옵션을 선택해 Snort를 실행해 보자. Snort의 실행 옵션은 여러 가지인데, 대표적인 것만 알아도 사용에는 문제가 없을 것이다(표 1).
로그 디렉토리를 log라는 설정 파일로 해서 snort를 백그라운드 모드로 실행시킨다.
[root@sweetlie /home/security/Software/rule]# snort -d -l log -c snort.conf -A full -D
Initializing daemon mode
다음과 같이 ps 명령어로 제대로 동작하고 있는지 확인할 수 있다.
[root@sweetlie /home/security/Software/rule]# ps -elf | grep snort
140 R root 1021 1 0 79 0 - 2023 - 19:41 ? 00:00:00 snort -d -l log -c snort.conf -A full -D
log 디렉토리로 이동해 보면, alert과 portscan.log라는 파일이 있다. Snort가 탐지하는 공격은 경고 파일에 기록된다.
drwxr-xr-x 2 root root 4096 7월 17 19:41 .
drwxr-xr-x 3 root root 4096 7월 17 19:40 ..
-rw------- 1 root root 0 7월 17 19:41 alert
-rw------- 1 root root 0 7월 17 19:41 portscan.log
NMAP 포트 스캐닝 공격 탐지
해커들이 많이 쓰는 포트 스캐닝 프로그램으로는 nmap이 있다. nmap 공격을 위해 다른 시스템의 http://www.nmap.org/nmap/ nmap_download.html에서 nmap 버전 2.53을 받아 설치해 보자. Rpm 패키지로 쉽게 설치할 수 있도록 준비돼 있다.
Nmap에도 스캐닝 기법에 따라 여러 가지 옵션이 있다. 우선, TCP 스캐닝 기법 중에서 가장 많이 쓰이는 스텔스 TCP 스캐닝(half-open)을 해보자
# nmap -sS -O target
Snort의 동작을 확인하기 위해 Snort가 설치된 리눅스 시스템에 스캐닝을 시도해 보자.
# nmap -sS -O 143.248.188.11
이 컴퓨터에 미리 snort를 설치해 두고, nmap 스캐닝을 한 후, 로그 디렉토리를 살펴보자. 공격자의 IP 주소별 디렉토리의 생성과 함께 경고 파일에는 공격자가 nmap으로 스캐닝 공격을 하고 있다는 경고 메시지가 포함돼 있을 것이다. 경고 파일 외에도 스캐닝 공격에 대해서는 portscan.log 파일에 공격 기록이 나타난다.
[**] ICMP Nmap2.36BETA or HPING2 Echo [**]
07/17-19:56:39.507358 143.248.188.39 -> 143.248.188.11
ICMP TTL:40 TOS:0x0 ID:63870 IpLen:20 DgmLen:28
Type:8 Code:0 ID:30615 Seq:0 ECHO
·플러그인
Snort는 자체 GUI 모듈을 가지고 있지 않으나, 여러 형태의 플러그인이 개별적으로 구현돼 활용되고 있다. 대표적으로 웹 브라우저에서 Snort의 경고 메시지 내용을 살펴볼 수 있게 해주는 도구로 Snort Snarf가 있다. SnortSnarf는 Snort에 의해 생성되는 alert 파일, Syslog 파일, portscan 파일들을 변환해 출력해 준다. 이밖에도 (표 2)와 같은 여러 종류의 플러그인 프로그램을 이용할 수 있다.
·분석
Snort IDS는 쉽게 설치하고, 새로운 공격에 대한 탐지 규칙이 공유될 수 있다는 장점을 가지고 있다. IDS 자체도 비교적 작은 모듈로 구성돼 있어 설치된 시스템의 성능에도 크게 영향을 주지 않는다.
하지만 앞서 설명했듯이 Snort는 패킷 모니터링을 통해 특정 패턴이 있는지 검사하는 방식으로 침입을 탐지하고 있기 때문에 잘못된 경고 메시지를 만들기 쉽다. Snort의 몇 가지 탐지 규칙을 살펴보자.
icmp.rules:alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:”ICMP Nmap2.36BETA or HPING2 Echo “;itype:8;dsize:0; reference:arachnids,162;)
위의 규칙은 icmp에 관련된 규칙으로, 프로토콜 타입이 8(ICMP)이고 데이터 크기가 0이면 ICMP Nmap 2.36BETA 공격이라는 메시지를 생성한다. Nmap과 같은 스캐닝 프로그램을 실행시켜서 스캐닝 시도할 때 탐지되는 경고 메시지 중의 하나다.
alert tcp $EXTERNAL_NET any -> $HOME_NET 27665 (msg:”DDOS Trin00:Attacker to Master default startup password”;flags: A+; content:”betaalmostdone”; reference:arachnids,197;)
위의 규칙은 TrinOO 분산 서비스 거부 공격을 탐지하는 규칙이다. 공격자가 공격 대상 시스템의 27665번 포트로 ‘betaalmostdone’라는 내용을 담은 TCP 패킷을 보낼 경우, TrinOO 공격이라고 규정한다. 이런 규칙은 실제 공격 발생시의 상황을 분석해 얻어졌기 때문에 정확도는 비교적 높으나, 악의로 공격자가 사용하는 포트나 주고받는 메시지의 내용을 임의로 수정할 경우 Snort가 전혀 침입을 탐지 못할 수도 있다.
반대로, Snort와 같은 IDS는 그 규칙이 공개돼 있어 이를 역이용하는 형태의 공격도 나타날 수 있다. 즉 Snort가 탐지하는 규칙대로 패킷을 만들어 Snort에게 전달함으로써 오류 경고를 낼 수도 있다. 다량의 오류 경고를 유도하게 되면 공격 대상 시스템의 관리자는 Snort의 경고에 대해서 무감각해 질 수 있고, 그 사이에 실제 공격이 일어날 경우 이를 무시할 수 있다.
RTSD(Real-time Scan Detector)
스캐닝 공격은 대부분 공격의 첫 단계에서 행해진다. 따라서 스캐닝 공격 사실을 탐지하는 것은 상당히 중요한 보안 관리라고 볼 수 있다.
스캐닝 공격의 탐지는 실시간 스캐닝 공격 탐지 도구를 활용해 할 수 있다. RTSD는 여러 프로그램이 배포되고 있으나, 대표적으로 정보보호진흥원에서 배포하고 있는 프로그램을 사용해 보자. http://www. certcc.or.kr/cvirc/y2kvirus/down/RTSD/register.html에서 다운로드 받을 수 있으며, 솔라리스와 리눅스에서 설치할 수 있다.
RTSD 를 설치한 후 외부로부터의 스캐닝 공격이 있을 경우 해당 IP를 출력함으로써 주기적으로 시스템의 노출 정도(침입 시도가 많은지)를 확인할 수 있다. 물론 RTSD에서 출력해 주는 IP 주소들이 반드시 공격자라고 보기는 어려운 경우가 있다. PC 등에서 프린터 서버를 찾을 때의 포트 접근 시도라든가, 스누핑된 형태의 공격 시도 등이 있을 수 있기 때문이다.
RTSD의 설치와 실행은 다운로드 받은 압축 파일 내에 설치 안내 파일을 참조해 쉽게 설치할 수 있다. 이런 도구의 활용이 보안을 100% 보장해 주는 충분조건이라고는 생각해서는 안된다. 어디까지나 기본적으로 해줘야 하는 필요조건일 뿐이다.
5회에 걸쳐 방어적인 관점에서의 리눅스 보안 관리 기법을 살펴봤다. 리눅스 초기 설치시의 보안 관리부터 시작해 안전한 시스템 설정, 로그 분석 기법 등을 살펴봤고, 구체적인 보안 관리 도구 활용으로 Tcp wrapper, Ipchain, Snort, RTSD 등을 다뤘다.
관 리자들은 이런 기법들을 바탕으로 지속적인 보안 관리 업데이트와 관심을 가져야할 것이다. 아무리 훌륭한 보안 도구를 많이 가지고 있고 겹겹으로 보안벽을 쌓았다하더라도 방심해서는 안 된다. 보안 취약성은 아주 사소한 부주의에서 발생하기 때문이다.

Comments List