LIDS를 중심으로 정리한
Intrusion Detection System
1. IDS란 무엇인가?
“컴퓨터는 네트워크에 접속되는 순간 보안적 위협에 노출된다.”
ARPANET을 시작으로 전 세계적인 네트워크가 구성되고 이용의 범주가 넓어지면서 네트워크 보안이라는 부분은 마치 꼬리말처럼 우리를 따라다닌다.
특히 요즘처럼 인터넷을 통해 다양한 서비스들이 봇물처럼 쏟아져 나오는 시대에는 보안이라는 말의 의미는 우리에게 더욱 크게 작용한다. 그만큼 컴퓨터와 네트워크가 일반화되었고, 이들 둘은 이제는 떼어낼 수 없는 강한 결속력을 가지고 있기 때문이다.
컴퓨터는 네트워크에 접속하는 순간 보안적 위협에 노출되게 된다.
만약 누군가가 우리 서버에 침입해서 좋지 않은 행위를 했다고 생각해보자.
이것은 정말 기분 나쁜 일이 될 것이다.
이에 따라 당연히 보안 시스템의 필요성이 증가하게 되었고 VPN, Firewall, IDS 등의 다양한 형태의 보안 시스템들이 나타나게 되었다. 이 보안 시스템들 중에서 중요한 부분을 차지하고 있는 것 중의 하나가 바로 침입 탐지 시스템, 즉 IDS(Intrusion Detection System)이다.
침입탐지시스템(IDS : intrusion Detection System)은 로컬 네트워크나 단일 호스트에 위치하면서 네트워크와 시스템의 감시를 통해 외부로부터의 침입이나 불법적인 행위를 탐지해내고, 이에 대한 대응 방안을 세울 수 있게 해주는 역할을 한다. 최근의 IDS들은 침입에 대한 시도를 차단하는 역할을 제공하기도 한다.
2. IDS의 종류
IDS는 기본적으로 패턴 인식을 통한 침입 탐지 기법과 시스템의 비정상적인 동작을 감시하면서 침입을 탐지해내는 기법을 활용한다. 패턴 인식 기법은 패턴 인식시스템으로의 침입이 가능한 다양한 패턴들을 미리 인식 시켜 놓고, 네트워크를 소통하는 패킷 혹은 시스템의 로그 파일을 감시하면서 패턴에 일치하는지의 여부를 파악하는 형식을 취한다.
시스템의 비정상적인 작동을 통해 침입의 여부를 판단하는 방식은 시스템의 외부에서 뿐만 아니라 내부에서의 침입 시도 역시 탐지해 낼 수 있다는 장점이 존재하기에 역시 많이 활용되는 방식이다.
IDS는 위의 침입 탐지 기법을 어떻게 적용시키느냐에 따라 수많은 종류의 IDS가 존재하지만, 핵심적인 요소로 구분한다면 다음의 세 가지 정도로 구분할 수 있다.
네트워크 기반의 침입 탐지 시스템(NIDS: Network based Intrusion Detection System), 호스트 기반의 침입 탐지 시스템(HIDS: Host based Intrusion Detection System), 커널에 다양한 접근 계층을 둠으로써 침입을 탐지해내는 커널 기반의 침입 탐지 시스템(KIDS: Kernel based Intrusion Detection System)이 바로 그것이다. 이들은 각각 나름대로의 장단점 및 특성을 가지고 다양한 부분에서 널리 사용되고 있다.
2-1. NIDS(Network based Intrusion Detection System)
NIDS는 네트워크를 통해 전달되는 패킷을 모니터링 하면서 침입의 여부를 결정한다.
이 시스템은 구현할 수 있는 방법이 쉽고, NIDS가 물려있는 모든 시스템들에 대해 작용할 수 있으며, 특정 운영체제에 의존적이지 않아서 현재 가장 인기가 많은 침입 탐지 시스템으로, 현재까지는 IDS의 주류를 이루고 있다.
2-2. HIDS(Host based Intrusion Detection System)
HIDS는 주로 실시간으로 로그를 감시하면서, 또한 포트를 주시하면서 침입에 대한 여부를 결정한다.
HIDS역시 네트워크를 감시하지만 네트워크를 지나가는 전체적인 패킷이 아닌 HIDS가 설치된 시스템으로 들어오는 패킷에 대해서만 감사를 한다는 점에서 NIDS와 차이점을 가진다.
HIDS는 해당 호스트의 네트워크를 감시하기 때문에 전체 네트워크의 속도 저하에는 영향을 미치지 않고, 호스트의 로그파일을 검사하기 때문에 정확한 탐지를 해낼 수 있으며, 무엇보다 내부 사용자의 행위 역시 감시할 수 있기 때문에 효과적인 시스템 감시가 이루어질 수 있다는 장점이 있다.
그러나, 주요 활동이 로그파일을 분석하는 것이고, 이것은 이미 침입이 발생한 이후에 파악할 수 있다는 문제점과 역시나 패턴을 꾸준히 갱신 해 주어야 하며, 호스트의 운영체제에 의존적이다. 그리고 IDS가 필요한 모든 시스템에 설치해야 한다는 단점이 존재한다.
2-3. KIDS(Kernel based Intrusion Detection System)
KIDS는 전통적인 IDS시스템들과는 달리 커널에 기반 한 IDS로 주로 리눅스를 기반으로 해서 개발이 활발하게 진행중이다. KIDS는 정해진 정책에 따라 운영체제의 핵심인 커널을 통해서 네트워크를 감시하고, 시스템의 비정상적인 동작의 여부를 감시한다. 만약, 정책에 어긋나는 행동을 했다면, 이를 탐지하고 알려주는 기능을 포함할 뿐만 아니라 파일 시스템과 민감한 프로세스들을 보호하기위해 능동적으로 대응한다.
커널 기반의 IDS는 위와 같이 NIDS처럼 방화벽 바로 다음에 위치시킴으로써 IDS 센서로서 활용할 수 있으며, 단일 호스트에서도 활용할 수 있다.
또한, 가장 바탕이 되는 커널에서 정해진 정책에 따라 침입 여부를 결정하고, 파일시스템 및 프로세스 보호, 접근 권한에 대한 변경과 파일들에 대한 inode 변경 등을 통해 해당 시스템에 대한 파괴 행위 자체를 원천적으로 봉쇄하는 형태를 취하고, 무엇보다 패턴에 의존적이지 않기 때문에 IDS 관리에 대한 부분에 있어서는 매우 큰 장점을 가지고 있다.
하지만, 로그 메시지가 엄청나게 발생한다는 것과 고의와 실수에 대한 부분에 있어서 명확한 판단 기준을 가질 수 없다는 문제점과 운영체제에 매우 의존적이라는 문제점을 가지고 있다.
3. 무료이면서도 강력한 KIDS인 LIDS
리눅스 시스템에서 완벽한 보안이라는 것은 있을 수 없다. 다만 여러 가지 보안 관련 도구들을 활용하여 보안 위협을 최소화 시킬 수 있을 뿐이다. 실제 리눅스에서 활용할 수 있는 많은 훌륭한 보안 시스템들이 존재한다. 하지만 이들은 뛰어난 성능에도 불구하고 최소한 두 가지 문제에 있어서 만큼은 어쩔 수 없다.
3-1. 로컬에서의 위협!
누군가 나의 리눅스 시스템에 접근하여 root로 로그인을 했다고 생각해보자. 그렇다면 그 사람은 내 리눅스 시스템에서 무엇이든지 할 수 있다. 만약 여기서 나쁜 마음을 먹어버린다면..... 결과는 너무나도 자명하다.
3-2. 익스플로잇 등에 의해 공격자에게 root를 빼앗겼을 때의 위협!
리눅스는 공개되어 있다. 그래서 우리가 원하는 데로 변형이 가능하고, 만약 버그가 발견된다면 빠른 시간 안에 패치 될 수 있다. 이것은 곧 관리자가 해야 할 일이 많아지기 때문에 그만큼 부지런해야 한다는 것을 알려준다. 하지만 아무리 부지런하다 할지라도 인간인 이상 실수를 할 수 있고, 약간의 부주의로 공격자에게 root를 빼앗기게 된다면 그 시스템은 역시 공격자의 손아래에서 놀아나게 될 것이다.
하지만, LIDS가 설치된 리눅스 시스템에서는 심지어 root의 권한을 가지고 있다 하더라도 시스템을 제어하는데 한계가 있다. 그 한계라는 것은 리눅스 커널 패치를 통해 커널 차원에서 리눅스 시스템의 보안등급을 높여주고, LIDS관리 도구를 통해 정책을 세워 커널에 갱신 시켜줌으로써 규정할 수 있다. 이를 통해 매우 중요하고 민감한 내용이 들어있는 파일과 디렉토리에 특성을 부여하여 그것들을 보호할 수 있다.
또한 다른 침입 탐지 시스템들과 마찬가지로 누군가가 규정에 어긋나는 행동을 했을 때 관리자에게 바로 통보를 해준다. 심지어 SYN 스텔스 포트 스캔, half-open 스캔, Null 스캔 등도 탐지할 수 있다. 그리고 정책에 어긋나는 행동을 했을 때 사용자 콘솔을 닫아버릴 수도 있다. 이와 같이 LIDS는 리눅스 커널의 보안을 강화시켜주기 위해 커널에 새로운 Layer를 생성하고, 이를 활용하기 위한 정책을 세워 내외부로부터의 침입을 탐지해내고, 거기에 따른 능동적 대응을 해주는 커널기반의 침입 탐지 시스템을 말한다.
4. LIDS의 파일과 디렉토리 보호 방식
LIDS는 모두 다섯 가지의 파일 보호 방식을 제공한다. 이 보호 방식은 해당 파일이나 디렉토리가 어떠한 속성을 가지고 있는지, 어떻게 서로 의존되는지에 따라 각각 달리 설정된다.
이제 그 방식들에 대해 한 번 알아보겠다.
4-1. 접근거부(DENY)
만약 어떤 파일 혹은 디렉토리를 DENY로 설정해 둔다면 누구도 해당 파일 혹은 디렉토리에 접근할 수 없다. 여기서 접근할 수 없다는 말은 퍼미션 상의 문제 같은 것이 아니다. LIDS 시스템이 돌아가고 있는 상황 하에서는 그 파일은 없는 것으로 인식되는 것이다. 만약, ‘/etc/shadow’를 DENY로 설정해 두었다면, 이 파일은 ‘ls’ 혹은 ‘find’ 명령으로 아무리 찾아봐도 발견할 수 없다. 이것이 바로 LIDS의 첫 번째 보호 방식인 접근거부(DENY) 라는 것이다.
4-2. 읽기 전용(READ)
어떤 파일이 LIDS시스템에서 READ로 설정되었다는 것은 누구도 파일의 내용을 바꿀 수 없음을 의미한다. 이는 마치 ‘chattr +i’로 파일의 속성을 바꿔주는 것과 똑같은 역할을 한다. 차이점이 있다면 ‘chattr +i’ 같은 경우에는 ‘chattr –i’로 언제든지 그 속성을 바꿔줄 수 있지만 LIDS 시스템에서는 바꿀 수 없다.
4-3. 로그파일 보호(APPEND)
APPEND는 방식은 로그파일을 위한 특별한 보호 방식이다. APPEND로 설정된 로그 파일들은 지속적으로 라인이 증가하는 것(쓰기 모드)만 가능하지 파일 내의 내용을 삭제한다거나 줄이지 못한다. 이것은 누군가 시스템의 취약성을 타고 내부로 침입한 후 빠져나갈 때 로그파일에 남은 흔적을 절대 지우지 못하게 하는 기능을 가진다.
4-4. 쓰기 전용(WRITE)
WRITE라는 보호 방식은 말 그대로 쓰기 전용의 보호 방식이다. 그런데 이 보호방식은 다른 세 가지 방식들과는 달리 일반적으로 독자적으로 사용되지 않는다. 어떠한 주체에 대해 객체에 쓰기가 가능하도록 정의하는데 사용된다.
4-5. 퍼미션 무시(IGNORE)
Object에 걸려 있는 속성(Permission)을 무시한다. 이전에 걸려 있던 READ, APPEND, DENY등의 속성을 무시하게 된다.
5. 프로세스 보호
LIDS가 보호 할 수 있는 것은 디렉토리, 파일 등으로만 한정되는 것은 아니다. MBR영역을 포함한 파일시스템, 프로세스 등도 역시 보호할 수 있다. LIDS에서 제공하는 프로세스 보호 방식은 두 가지가 있다. 이제 그것에 대해 한 번 알아보자.
5-1. UN-killable process
이 보호 방식은 ‘/etc/lids/lids.conf’ 내에 들어있는 정책으로 설정하는 것이 아니라 ‘/etc/lids/lids.cap’ 내에 있는 시스템 속성으로 설정을 해 줄 수 있다. 이 보호방식으로 시스템을 설정해 주면 부모 프로세스가 init(pid=1)인 모든 프로세스를 보호하여 강제로 프로세스를 죽이지 못하게 만든다.
5-2. 프로세스 숨기기(Hidden process)
이 보호 방식은 민감한 프로세스에 설정 해주면 상당한 효과를 볼 수 있다. HIDDEN으로 설정해 둔 프로세스는 누군가 로그인을 해서 ‘ps’ 명령을 내려도 그 프로세스에 대한 정보는 절대 표시되지 않는다. 심지어, ‘/proc’ 디렉토리에도 그 정보가 남지 않게 된다.
6. 그 외의 기능들
위에 기술한 보호방식들 이외에도 LIDS는 추가적으로 몇가지 기능을 더 제공한다. 여기서 설명할 기능들은 일반적인 침입탐지 시스템(HIDS, NIDS)들에 포함되어있는 것도 있고, LIDS에서만 제공하는 기능도 있다. 어떤 것들이 있는지 한 번 알아보자.
6-1. 스캐너 탐지
누군가가 우리의 서버를 공격하기에 앞서 먼저 포트 스캐닝을 했다고 생각해보자. 일반적인 스캐 방법은 스캔 하는 즉시 서버의 로그파일에 그 흔적이 남게 되어있다. 하지만 SYN 스텔스 스캔, 스텔스 FIN 등과 같은 방법들은 흔적이 남지 않는다. 하지만 LIDS에는 커널 차원의 스캐너 탐지기가 있어 이런 방식의 포트 스캔 역시도 감지 해낸다.
6-2. 침입에 따른 반응(Hangup the Console)
일반적인 침입탐지 시스템들은 침입에 대한 탐지와 그 결과를 관리자에게 보내주는 역할 만을 가지고 있는 반면 LIDS는 그 기능들과 함께 능동적인 반응도 하게된다. 가장 대표적인 예가 사용자 세션을 닫아버리는 기능이다. 누군가 시스템에 침입해 정책에 어긋나는 행동을 한다면 LIDS는 그 사용자의 콘솔을 즉각적으로 닫아버리고, 그 내용을 경고 메시지의 형태로 관리자에게 보내준다.
6-3. 방화벽과의 연동을 통한 LIDS의 활용
LIDS는 이것만을 설치해서 사용하면 해당 호스트에서만 작용한다. 하지만, LIDS에는 이를 보완하기위한 강력한 기능이 한 가지 있는데, 바로 다른 방화벽 시스템과의 연동이 가능하다는 것이다. 이 기능을 활용하게 되면, NIDS처럼 IDS 센서로서의 역할을 하면서, 정책에 따르지 않는 내용들에 대해서는 바로 방화벽 차원에서의 차단과 같은 대응을 할 수 있다.
7. 정리하며
지금까지 IDS가 무엇이고, 종류가 어떻게 되고, 특히 LIDS에 대해 주로 특성과 기능성을 중심으로 정리해 보았다. 이 부분은 이전부터 관심을 가지고 봐왔던 부분이지만, 아직도 해결되어야 할 부분이 많다는 것을 다시 한 번 알게 되었다.
침입탐지의 중요성은 누구나 다 알고 있고, 그에 따라 수많은 종류의 제품들이 쏟아져 나오고 있으나 핵심이 되는 탐지 기법 자체는 기존의 테두리를 벗어나지 못하고 있다. 그리고 내부 사용자에 의한 공격이나 DoS, Ddos 등과 같은 공격기법에는 무용지물이 되어버리기 일쑤다. 뿐만 아니라 IDS 자체가 공격의 대상이 될 수 있다는 것 역시 큰 문제이다. 그나마 NIDS와 HIDS가 혼합된 형태가 가장 진보적이라 할 수 있겠지만, 문제점은 여전하다.
KIDS 같은 경우는 아직 연구 단계이고, 약간은 새로운 개념이기에 조금의 기대를 가지고는 있지만 아직은 기능성에 있어서 문제가 있다는 것을 부인할 수 없다. 특히 LIDS가 그렇다. IDS 센서로서 활용이 가능하다 하지만 일단 고유의 기능이 아니고, 제대로 돌아가는지조차 확인할 수 없다.
그럼에도 불구하고 여기서 다룬 이유는, 조금은 새로운 개념의 IDS를 소개하고 싶었고, 적어도 개인용 호스트에서는 매우 막강한 성능을 발휘할 수 있는 IDS를 공짜로 사용할 수 있었기 때문이다. 원래 리눅스에서의 설치와 활용법에 대해서 중점적으로 다루려 하였지만, 과제의 성격에 맞지 않을 것 같아서 소개만 하는 것으로 끝내고자 한다.
참고 사이트
1. LIDS 공식 홈페이지 (http://www.lids.org)
2. Security Focus (http://www.securityfocus.com)
3. Linux Security (http://www.linuxsecurity.com)
4. SANS (http://www.sans.org)
5. 그 외 다른 사이트들
출처 : http://blog.naver.com/cadline
댓글