2020년 4월 27일 월요일

엘라스틱 지도학습으로 IDS 정오탐 구분해보기

엘라스틱 머신러닝이 7.6 버전부터 드디어 지도학습(supervised learning)을 지원한다. 얼마나 잘 동작하는지 IDS 로그에 적용해보자. 다음 글을 참고했다.

학습 데이터는 1로 라벨링된 887개의 정탐과 0으로 라벨링된 6,700여 개의 오탐이 섞인 제일 만만한 sql injection 탐지 로그.

정탐
오탐

모델 학습

학습 데이터를 sqland-learning이란 인덱스에 저장 후, Machine Learning > Data Frame Analysis > Create analytics job 메뉴 클릭.

① 작업 유형은 classification(decision tree 알고리즘 사용), ⑤ dependent variable(종속 변수)은 라벨링 필드를 선택. 참고로 classification은 문자형, ourlier/regression은 숫자형 데이터에 적용 가능한 듯하다.


작업 완료 후, view 메뉴를 클릭하면 학습 결과를 볼 수 있다. 1을 1로 판단한 정탐률은 27%, 0을 1로 판단한 오탐률은 7%. 1을 0으로 판단한 미탐률은 73%. 일일이 라벨링 해줘도 많이 어려운 모양(..)


모델 테스트

테스트 데이터는 14개의 정탐이 포함된 2,009개의 sql injection 탐지 로그. CSV 형식 데이터는 로그스태시 없이도 Machine Learning > Data Visualizer(Import data) 기능을 이용해서 간단하게 연동할 수 있다.


① Override settings 메뉴를 이용해서 필드 이름 수정, ② Advanced 메뉴를 이용해서 학습 모델 적용을 위한 ingest pipeline 설정 추가 후 임포트.


ingest pipeline에 사용된 학습 모델 정보는 Dev Tools 메뉴에서 확인할 수 있다.


테스트 결과

sqland-test라는 인덱스를 만들면서 sql injection 학습 모델을 적용했으며, 그 결과는 ml.inference.predicted_value 필드에 기록된다.


sql injection 14개 모두 놓침. -_-


학습 데이터가 너무 오탐(정상 uri)에 치중돼서 그런가?

학습 데이터 수정

IDS 로그의 정오탐 비율을 1:1로(각각 887개) 수정 후, 바뀐 데이터로 재학습. 0을 1로 판단한 오탐률만 7%에서 3%로 감소.


혹시나 하면서 새 모델을 적용했지만 역시나(..)


sql injection 로그 14개만으로 테스트해도 결과는 마찬가지. 기계가 보기엔 sql injection 패턴이 포함된 uri나, 정상 uri나 다 비슷해보이는 모양.


학습 데이터가 너무 적나? sql injection 패턴이 삽입되는 변수 영역만 따로 분리해볼까?

관련 글

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스