머신러닝을 활용한 네트워크 공격 탐지
설명
이 프로젝트는 머신러닝 기법을 활용하여 포트 스캐닝, 서비스 거부(DoS), 악성코드와 같은 네트워크 공격을 분류합니다. 입력 데이터는 Cisco에서 사용하는 표준 형식인 Netflow V9 형식입니다.
분류는 다음 모델을 사용하여 수행됩니다:
- K-최근접 이웃 (KNN)
- RBF(방사형 기저 함수) 커널을 사용한 서포트 벡터 머신 분류기 (SVC)
- 주성분 분석(PCA)과 서포트 벡터 머신 분류기(SVC)를 사용한 파이프라인
- 배깅 분류기 (RBF 커널 기반 SVC)
- 랜덤 포레스트 분류기
- 엑스트라 트리 분류기
- 신경망 (MLPClassifier)
이 프로젝트는 Python으로 구현되었으며, Jupyter Notebook과 UMAP, Pandas, NumPy, Scikit-Learn, Matplotlib, Seaborn을 포함한 여러 인기 라이브러리를 사용합니다.
노트북
노트북은 여기에서 GitHub에서 직접 볼 수 있습니다. 또는 NbViewer를 통해 이 링크에서 확인할 수 있습니다.
발표 자료
PDF 형식의 Keynote 발표 자료는 여기에서 확인할 수 있습니다.
데이터셋
이 프로젝트에 사용된 데이터셋은 NetFlow V9 형식입니다 (Cisco 문서, 여기 참조). 두 개의 파일로 구성됩니다: train_net.csv와 test_net.csv.
train_net.csv 파일은 특정 알림이 발생할 가능성이 있는 시기에 대한 정보를 제공하며, test_net.csv 파일은 테스트 목적으로만 사용되며 모델 성능 평가를 위한 목표 변수를 포함하지 않습니다.
데이터셋은 상당히 큽니다:
train_net.csv: 약 4백만 개의 패킷 (14,066개의 고유 네트워크 호스트)
test_net.csv: 약 2백만 개의 패킷 (6,186개의 고유 네트워크 호스트)
데이터셋 특징
- FLOW_ID: 플로우의 고유 식별자
- PROTOCOL_MAP: 플로우에서 사용된 프로토콜을 나타내는 문자열, 가능한 값은 "ICMP", "TCP", "UDP", "IGMP", "GRE", "ESP", "AH", "EIGRP", "OSPF", "PIM", "IPV6-ICMP", "IPV6-IP", "IPV6-ROUTE", "IPV6-FRAG", "IPV6-NONXT", "IPV6-OPTS" 등이 있습니다.
- L4_SRC_PORT: 플로우의 소스 포트 번호, 가능한 값은 0에서 65535 사이입니다.
- IPV4_SRC_ADDR: 플로우의 소스 IPv4 주소, 점으로 구분된 10진 표기법의 문자열 (예: "192.168.0.1").
- L4_DST_PORT: 플로우의 대상 포트 번호, 가능한 값은 0에서 65535 사이입니다.
- IPV4_DST_ADDR: 플로우의 대상 IPv4 주소, 점으로 구분된 10진 표기법의 문자열 (예: "192.168.0.2").
- FIRST_SWITCHED: 플로우가 시작된 시간, epoch(1970년 1월 1일) 이후 초 단위.
- FLOW_DURATION_MILLISECONDS: 플로우의 지속 시간(밀리초).
- LAST_SWITCHED: 플로우가 종료된 시간, epoch(1970년 1월 1일) 이후 초 단위.
- PROTOCOL: 플로우에서 사용된 프로토콜, 가능한 값은 1(ICMP), 6(TCP), 17(UDP) 등입니다.
- TCP_FLAGS: 플로우에서 설정된 TCP 플래그, 이진 문자열로 표시 (예: "100101").
- TCP_WIN_MAX_IN: 수신 트래픽에 대해 알려진 최대 창 크기(바이트).
- TCP_WIN_MAX_OUT: 송신 트래픽에 대해 알려진 최대 창 크기(바이트).
- TCP_WIN_MIN_IN: 수신 트래픽에 대해 알려진 최소 창 크기(바이트).
- TCP_WIN_MIN_OUT: 송신 트래픽에 대해 알려진 최소 창 크기(바이트).
- TCP_WIN_MSS_IN: 수신 트래픽의 최대 세그먼트 크기(바이트).
- TCP_WIN_SCALE_IN: 수신 트래픽의 창 크기 조정 계수.
- TCP_WIN_SCALE_OUT: 송신 트래픽의 창 크기 조정 계수.
- SRC_TOS: 소스 IP 주소의 서비스 유형(ToS) 값.
- DST_TOS: 대상 IP 주소의 서비스 유형(ToS) 값.
- TOTAL_FLOWS_EXP: 예상되는 총 플로우 수.
- MIN_IP_PKT_LEN: 플로우 내 IP 패킷의 최소 길이(바이트).
- MAX_IP_PKT_LEN: 플로우 내 IP 패킷의 최대 길이(바이트).
- TOTAL_PKTS_EXP: 플로우 내 예상되는 총 패킷 수.
- TOTAL_BYTES_EXP: 플로우 내 예상되는 총 바이트 수.
- IN_BYTES: 플로우에서 수신된 바이트 수.
- IN_PKTS: 플로우에서 수신된 패킷 수.
- OUT_BYTES: 플로우에서 전송된 바이트 수.
- OUT_PKTS: 플로우에서 전송된 패킷 수.
- ANALYSIS_TIMESTAMP: 플로우가 분석된 시간, epoch(1970년 1월 1일) 이후 초 단위.
- ANOMALY: 플로우에 이상이 있는지 여부를 나타내는 이진 플래그 (1 = true, 0 = false).
- ALERT: (훈련 세트에서만 사용 가능) 현재 플로우에서 탐지된 공격 유형. 가능한 값은 다음과 같습니다:
- None: 공격이 탐지되지 않음
- Port scanning: 플로우가 포트 스캐닝 공격
- Denial of Service: 플로우가 DoS 공격
- Malware: 플로우가 악성코드 공격
- ID: 플로우의 고유 식별자.
데이터셋 저자
Maria-Elena Mihailescu, Darius Mihai, Mihai Carabas, Mikolaj Komisarek, Marek Pawlicki, Witold Holubowicz, Rafal Kozik:
The Proposition and Evaluation of the RoEduNet-SIMARGL2021 Network Intrusion Detection Dataset. Sensors 21(13): 4319 (2021)
Kaggle 링크