To Design A Virtual Ids With Machinelearning 2
안녕하세요. MadHat
팀의 Koon
입니다.
저번 달에 작성하고자 했던 “IDS 만들기” 2편 진행 하겠습니다.
동작 원리
제가 생각하는 전체 적인 그림은 4단계로 구분 할 수 있습니다.
“연결 - 특징 추출 - 머신러닝을 이용한 탐지 - 탐지 후 처리”
- 연결
“연결” 단계 에서는 기본적으로 네트워크환경으로 구성한 모든 가상 시스템에 제대로 연결을하고, 연결이 되었는지 확인하는 과정입니다.
연결된 vm으로부터 계속해서 정보를 받습니다. 그렇기 때문에 연결이 끊어지거나, 오류가 생길 경우, 전체적인 문제로 이루어 질 수 있기 때문에 이러한 과정을 처리해야합니다.
- 특징 추출
“특징 추출”의 단계에서는 말그대로 특징을 추출하는 단계입니다.
그러면 여기서 말하는 “특징”이란 무엇을 말하는 걸까요?
다음 단계에서 이루어지는 “머신러닝” 이용 시 들어가지는 Input 값을 의미합니다.
특징 = 머신 러닝의 Input 값
그리고 이러한 특징은 그 상황이 일어 났을 시, 그 상황이라는 것을 인지할 수 있는 정보 들을 의미합니다.
보통 그 상황이 일어났을 시, 확연히 달라지는 정보들을 “특징”이라 말 할 수 있습니다.
- 머신 러닝을 이용한 탐지
이 단계에서는 머신 러닝에 쓰인 모델 또는 알고리즘을 결정해야합니다. 그리고 input값으로 쓰이는 정보들을 가공 처리 하는 과정이 있어야 합니다.
사실 그 전 단계에서 이미 Input 값을 결정해놓았습니다.
그렇기에 이러한Input값을 어떠한 모델 및 알고리즘에 넣어 제대로된 결과를 나타 내는지 확인 해야합니다.
머신러닝에 쓰이는 여러 모델 및 알고리즘이 있지만, 그러한 모델 및 알고리즘에 대해 일일이 설명하는 것은 “머신러닝 및 딥러닝” 쪽으로 너무 깊숙히 들어가기 때문에 여기서 설명은 안하겠습니다.
다만 , 머신러닝에서 저는 여기서 “Classification” 사용하였습니다.
사실 딥러닝을 사용하기 위해서는 특징 추출 부분이 따로 필요 없습니다. 딥러닝 자체가 여러 정보를 넣음으로써, 특징 추출 및 자체적인 판단 알고리즘을 형성하는 단계이기 때문에 특징을 임의로 추출 할 필요없습니다.
(저는 개인적인 이유 및 초기 방향에서 머신러닝 및 딥러닝을 쓸 생각을 하지 않았다가 급하게 넣었기 때문에, 딥러닝을 따로 사용할 수 없었습니다.)
- 탐지 후 처리
“탐지 후 처리” 단계에서는 머신러닝에 들어간 정보에 의해 나온 결과로 나타내면 됩니다.
사실 저희가 구상하는 것은 IDS 이기 때문에 따로 조치를 취하는 방법을 넣지 않아도 되기 때문에, 이 부분에는 머신러닝의 결과를 출력하거나, 그 결과를 조건문으로 판단하여, 생각해논 조치 방법을 적용시키면 됩니다.
설계
이제 위에서 생각했던 것들을 구현해봅시다.
(직접적으로 코드를 적는 것은 안하겠습니다.)
- 연결
저희 환경은 kvm을 사용하였습니다. kvm으로 만들어진 가상 vm들에 대해 연결 및 정보들을 얻어 올 수 있는 패키지들이 있습니다.
그것을 사용해야 합니다. 직접적으로 가상 vm들로부터 연결 및 정보들을 받아 오는 코드를 만드는 것은 학부생 수준으로는 할 수 없습니다.
LibVirt 모듈을 설치 후, 적용하여 LibVirt 함수들을 사용하면 됩니다.
대표적으로 사용 할 수 있는 것들이…
libvirt.open | 가상환경 연결 |
.lookupByName | 가상환경의 정보를 얻어 올 수 있는 객체 생성(=Dom) |
연결이 안되었을시 또는 끊어 졌을 시 처리는 이러한 함수들의 결과과 -1이 나오면, 그 것을알 수 있기에
조건문으로 처리를 하시면 됩니다.
- 특징 추출
위에서 “Dom”이라는 정보를 받아올 수 있는 객체를 생성하였습니다.
이것을 통해 Cpu 사용률 및 메모리 정보 또는 메모리 사용량을 얻어 올 수 있습니다.
다만 네트워크 환경에서 패킷 및 흐름들을 파악하기 위해서는 다른 것이 필요 합니다.
Scapy와 Psutil을 설치하여 그 모듈에 저장된 함수들을 사용합니다.
이 두가지 모듈에 의해 저는 패킷의 갯수 및 패킷의 정보들을 알아 낼 수 있습니다.
이제 위에서 말했던 것들로 자기가 생각하는 “특징”에 대한 정보들을 뽑아내면 됩니다.
저의 경우 1초마다 cpu 사용률 ,패킷의 갯수, 1초전의 패킷의 차이, syn과 ack의 갯수 이렇게 4개의 정보를 추출 하였습니다.
- 머신러닝을 통한 탐지
여기서는 딱히 설명할 것이 없습니다. 자신이 원하는 모델 및 알고리즘을 가져와 그대로 적용 시키면 됩니다.
머신 러닝 모델의 경우 이미 유명한 것이 많기 때문에, 그대로 텐서플로우를 통해 구현하시면 됩니다.
그리고 그 머신러닝의 모델에 맞게 정보들을 가공 처리하여 input 값으로 만들면 됩니다.
- 탐지 후 처리
탐지 후 처리에서 저의 경우, openvSwitch의 기능을 이용하여 Policing을 하는 것으로 구현하였습니다.
Policing의 경우, 임의적으로 허용하는 대역폭을 줄여 아무리 많은 패킷들이 와도, 허용된 패킷의 수만 들어오게 하는 것입니다.
물론 이것 또한 임시적 조치일 뿐입니다. DDos에는 완벽한 조치가 있을 수 없기 때문에, 임시적으로 막는 조치법을 쓸수 밖에 없었습니다.
결과
찍어 놓은 사진으로 대체 하겠습니다.
이걸로 IDS 설계에 대해 끝마치겠습니다.