머신러닝을 통한 기존 NIDS의 단점 보완 및 개선
배경
기존 네트워크 침입 탐지 시스템(NIDS)은 시그니처 기반 탐지 방식으로, 미리 정의된 악성 트래픽 패턴 또는 시그니처와 네트워크 트래픽을 비교하여 위험을 탐지하는 방식이다. 이미 알려진 위협에 대해서는 높은 정확도를 제공하며, 악성 트래픽에 대해 탐지가 빠르고 신뢰성이 높다는 장점이 있다. 다만, 제로 데이 공격이나 새로운 공격에 대해서는 시그니처 업데이트가 필요하다는 단점이 존재한다. 이러한 단점을 보완하기 위해 행위 기반 탐지 NIDS 장점인 네트워크 트래픽의 비정상적인 행동 패턴을 탐지하여 위협을 식별하는 방식을 추가하기로 했다.
기획 내용
NIDS 구성도
우리의 NIDS는 Out of band 구조로, NIDS가 주시하는 도메인 서버의 부하를 최대한 줄이고자 했다. 이 과정에서 최근 떠오르는 프로세스 격리 기반 컨테이너 가상화 플랫폼인 docker를 활용하여 웹 서버 구축 및 NIDS 모델 서버를 구축하는 네트워크 인프라를 구성했다.
개발 단계
형상 관리
코드 형상 관리의 경우 깃허브를 활용했고, 개발 문서는 노션에 정리, 일반적인 소통의 경우 디스코드 채널을 활용했다.
R&R
역할 분담의 경우, 행위 기반 탐지 NIDS 개발, 시그니처 기반 탐지 NIDS 개발, 이외 네트워크 인프라 구성 및 테스트용 웹 서버 구축으로 나누었다.
개발 방법
행위 기반 탐지 NIDS 개발의 경우, NSL-KDD 데이터셋을 활용해 머신러닝을 진행하고 악성 사용자의 행위를 탐지할 수 있도록 했다.
시그니처 기반 탐지 NIDS 개발의 경우, 스노트룰을 직접 파싱하여 시그니처 DB를 구축하고 해당 성능을 검증할 수 있도록 했다.
연구용 웹 서버 개발 및 도커 인프라 구축의 경우, 도커를 활용해 네트워크를 구축하고 해당 NIDS를 정상적으로 웹 서버에 탑재할 수 있도록 준비했다.
WBS
개발 과정
도커 인프라 및 웹 서버 구축
각 NIDS를 테스트하기 위해 여러 기능이 있는 웹 서버를 구축, 해당 웹 서버를 해킹하는 악성 행위를 시도하여 NIDS가 제대로 작동하는지 검증하는 샌드박스로 활용했다.
사용한 기술 스택으로는 DB인 mysql, 웹 서버를 구축하기 위한 php, 네트워크 인프라 및 도커 컨테이너를 구축하기 위한 python, docker, bash 등이 있다.
도커 네트워크 구성으로는 nids_model_server, apache_server, mysql_server, phpmyadmin 총 4개의 컨테이너가 존재한다.
해당 컨테이너들을 docker compose를 활용하여 편리하게 실행할 수 있도록 구성했다.
구축한 웹 서버의 기능들로는 로그인 기능, 게시판 기능 등을 구현해 무차별 대입 공격, DOS, SQL injection 등의 공격 유형들을 테스트해 볼 수 있도록 했다.
행위 기반 탐지 NIDS
행위 기반 탐지 NIDS 모델 개발에 사용한 기슬 스택으로는 python, docker, shell, html 등이 있다.
NSL-KDD 데이터셋은 1999년에 만들어진 KDD Cup 99 데이터셋의 문제점을 개선한 데이터셋으로, NIDS의 성능을 평가하는 데 사용되는 대표적인 데이터셋 중 하나이다. 해당 데이터셋을 전처리해 머신러닝 모델에 학습시켰다.
데이터셋의 분포를 확인해보니, protocol_type의 경우 tcp가 82%로 상당수를 차지했고, 공격 트래픽의 경우 47%를 자치해 클래스 불균형 문제는 일어나지 않을 것이라 판단했다.
NIDS 개발 과정에서 모든 공격 유형을 반환할 수 있도록 구성하려 했지만, 프로젝트 시간 상의 문제로 공격일 시 1, 공격이 아닌 정상 트래픽일 시 0을 반환하도록 이진 클래스 분류 문제로 변경했다.
분류 문제에 사용되는 대표적인 6개의 알고리즘을 선정하여 NSL-KDD 데이터셋을 학습시켰다. 각 알고리즘의 특징은 아래와 같다.
각 알고리즘 별 특징:
위에서 선택한 6가지의 알고리즘을 NSL-KDD 데이터셋에 적용하여 머신 러닝을 시도했을 때, 성능 지표로 어떤 알고리즘이 해당 데이터셋에 더 적합한지 판단할 수 있다. 대표적인 모델 성능 테스트 지표로는 정확도, 정밀도, 재현율이 있다.
미묘하지만 랜덤 포레스트 알고리즘의 성능이 가장 높게 나와 해당 알고리즘을 채택했다.
랜덤 포레스트 알고리즘은 여러 개의 decision tree 알고리즘을 결합한 알고리즘이다. decision tree 여러 개의 결과를 보고, 최종적으로 다수결로 판단하여 결론을 내리는 방식으로 작동한다.
랜덤 포레스트 모델은 변수 중요도를 평가할 수 있다. NSL-KDD 데이터셋의 경우 변수가 42개 존재했는데, 해당 변수들을 모두 파싱하여 의미있는 데이터를 찾아내기엔 프로젝트 기간 상의 문제가 있어 최대한 변수를 줄여보고자 했다. 랜덤 포레스트 알고리즘의 변수 중요도가 높은 순서대로 1개 ~ 20개의 변수를 순서대로 늘려가며 성능을 테스트한 결과, 총 4개의 변수만으로 높은 성능을 보여 학습에는 4개의 변수만을 사용하기로 결정했다.
사용한 변수는 아래와 같다.
•
src_bytes
•
dst_bytes
•
same_srv_rate
•
dst_host_srv_count
4개의 변수를 활용해 학습시킨 모델을 .pkl 파일로 추출하여 패키징했다.
그리고 해당 .pkl 패키지를 잘 활용할 수 있도록 파이프라인을 구축했다.
위 슬라이드는 웹 서버 컨테이너에서 tcp dump를 활용해 웹 서버로 드나드는 패킷을 캡쳐하는 모습이다.
docker volumes를 활용하여 캡쳐한 패킷의 pcap 파일을 저장한다.
도커 볼륨에 저장한 pcap 파일을 같은 도커 네트워크에 있는 NIDS 컨테이너에서 읽어와 학습에 사용한 4개의 변수를 추출한다.
pcap 파일에서 추출한 4개의 변수를 통해 NIDS 모델이 예측을 수행한다.
해당 예측 결과를 웹 사이트 형식으로 구성해놓은 엔드포인트에서 로그 형식으로 확인해 볼 수 있도록 했다.
시그니처 기반 탐지 NIDS
시그니처 DB를 구축하고 NIDS화 시키는데 사용된 기술은 python이다.
스노트 룰을 활용하여 직접 룰을 파싱하는 작업을 수행했다. 그 과정에서 화살표의 방향을 통일하고, 포트 번호를 표시되게 하는 등의 룰 단순화 작업을 실시했다.
슬라이드에 나타낸 룰셋 이외에도 약 300개 이상의 스노트 룰셋을 파싱했는데, 스노트 전체 룰셋의 10% 수준 밖에 되지 않아 성능 개선이 필요하다고 판단했다. 이는 추후 진행 예정이다.
룰셋에서 파싱한 변수들을 활용하여 패킷에서 추출한 변수와 비교하는 방식으로 모델을 구성했다.
테스트의 경우, 피해자 서버는 metasploitable 2를 활용했고, 공격자 서버는 host PC의 칼리 리눅스를 활용했다. Echo Chargen bomb으로 해당 룰셋이 공격을 잘 테스트하는 지 판단했다.
탐지 결과 시그니처 기반 탐지 NIDS가 잘 작동하는 모습을 볼 수 있었다.
시연 영상
행위 기반 탐지 NIDS 시연 영상
필요한 docker 환경을 구성한 뒤, 웹 서버에 패킷을 발생시킨다. 해당 패킷을 도커 볼륨에 저장하고, 저장한 패킷 파일을 행위 기반 탐지 NIDS가 읽어와 필요한 변수를 파싱한다. 파싱한 해당 변수를 활용해 예측을 수행하고, Prediction 값을 반환한다. 해당 영상에서는 정상 패킷을 발생시켜 Prediction 값이 0으로 나타나는 모습을 볼 수 있다.
시그니처 기반 탐지 NIDS 시연 영상
공격자 서버인 칼리 리눅스에서 피해자 서버인 metasploitable 2에 echo chargen bomb을 비롯한 여러 가지 유형의 공격을 시도하고, 해당 공격 유형을 잘 감지하는지 테스트하는 영상이다. 테스트 결과, 해당 공격 유형이 잘 나타나는 모습을 볼 수 있다.
자체 피드백 및 보완점 시사
행위 기반 탐지 NIDS의 경우, 머신 러닝 단계에서 더 많은 변수들을 사용했으면 더 정확한 공격 탐지가 가능했을 것이다. 또한, 공격 유형을 사용자가 확인할 수 있으면 더 정확하고 신속한 대응이 가능하기 때문에 악성 행위가 어떤 공격 유형으로 추측되는지 사용자에게 알려줄 수 있는 기능을 구현한다면 더 완성도 있는 프로젝트가 될 것 같다.
또한, 행위 기반 탐지 NIDS와 시그니처 기반 탐지 NIDS를 통합해 하나의 NIDS를 구축하려 했으나 시간이 부족해 각각 모듈화 시켜 따로 구성했던 점, 기획 단계에서 대시보드는 시각화가 가능하게 구성하려 했지만 이 부분 또한 시간 상의 이유로 로그 형식으로 대체한 점이 아쉬웠던 부분이다.
부족한 부분이 많은 프로젝트였지만, 해당 프로젝트를 꾸준히 디벨롭해 완성도를 높이고자 한다.
WeNeeds 팀
팀장 안대현: andh1006@naver.com
팀원 양성혁: d7242500@naver.com
팀원 이효원: leader0102@nate.com
** 행위 기반 탐지 NIDS 개발 과정: NSL-KDD 데이터셋 관련 코드