엘라스틱 지도학습으로 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 기능을 이용해서 간단하게 연동할 수 있다.
① Override settings 메뉴를 이용해서 필드 이름 수정, ② Advanced 메뉴를 이용해서 학습 모델 적용을 위한 ingest pipeline 설정 추가 후, 임포트.
ingest pipeline에 사용된 학습 모델 정보는 Dev Tools 메뉴에서 확인할 수 있다.
테스트 결과
sqland-test라는 인덱스를 만들면서 sql injection 학습 모델을 적용했으며, 그 결과는 ml.inference.predicted_value 필드에 기록된다.
sql injection 14개 모두 놓침. -_-
학습 데이터가 너무 오탐(정상 uri)에 치중돼서 그런가?
Your training dataset should be approximately balanced which means the number of data points belonging to the various classes should not be widely different, otherwise the classification analysis may not provide the best predictions.
학습 데이터 수정
IDS 로그의 정오탐 비율을 1:1로(각각 887개) 수정 후, 바뀐 데이터로 재학습. 0을 1로 판단한 오탐률만 7%에서 3%로 감소.
혹시나 하면서 새 모델을 적용했지만 역시나(..)
sql injection 로그 14개만으로 테스트해도 결과는 마찬가지. 기계가 보기엔 sql injection 패턴이 포함된 uri나, 정상 uri나 다 비슷해보이는 모양. 학습 데이터가 너무 적나? sql injection 패턴이 삽입되는 변수 영역만 따로 분리해볼까?
학습 데이터 수정(2차)
학습 데이터 필드 구성을 4개 유형으로 나누고, 각각 모델을 만들어봤다.
① uri + label
② parameter + label
③ url + parameter + label
④ url + parameter + pattern + label
url + parameter + pattern + label |
완성된 모델 |
학습 결과
① uri + label, ② parameter + label
class1, class2 |
③ url + parameter + label
uri를 url과 parameter로 분리했을 때 정확도가 극적으로 높아진다. 오탐/미탐률은 각각 7%, 정탐률은 93%.
class3 |
④ url + parameter + pattern + label
class4 |
parameter를 다시 parameter와 (sql injection) pattern으로 분리하면 정확도가 좀 더 높아진다.
여기서 통계의 중요한 특징 하나를 알 수 있다. 그 특징은 바로 상태를 쪼개면 쪼갤수록 그 상태에 대해서 더 잘 알게 된다는 것. - 엘라스틱서치로 알아보는 이상징후 분석 (13페이지)
모델 테스트
정탐률 98%의 네 번째 모델을 테스트 데이터(14개의 sql injection이 포함된 2009개의 IDS 로그)에 적용해봤다. 드디어 하나 탐지(..)
테스트 데이터 변경
학습 패턴과 테스트 패턴의 유사도가 많이 낮은 모양. 짱나서 학습에 사용했던 데이터(정오탐 각각 887개)로도 테스트해봄.
정탐 |
오탐이 10개 포함됐지만 공격은 거의 놓치지 않는다. 한 번 봤던 애들은 잘 기억하는구나.
오탐 |
미탐 |
그런데 왜 다른 데이터로 테스트하면 헤맬까? 이게 말로만 듣던 과적합이란 건가? 이미지 인식 제대로 하려면 백만 장 학습이 필요하다더니. (최소 만 장은 필요하다고) 학습량을 더 늘려야하나?
학습 데이터 수정(3차)
학습 데이터를 정오탐 각각 3천여 개로 늘렸다. 정오탐 각각 8백여 개일 때와 큰 차이 없는 학습 결과.
테스트1
다음은 학습에 사용했던 데이터를 이용한 모델 테스트 결과. 딱 학습 결과만큼의 정확도를 보여준다.
정탐 |
오탐 |
미탐 |
테스트2
다음은 학습 데이터의 sql injection 패턴을 살짝 변형('%20and%20' -> '%20or%20')해서 테스트한 결과. 패턴이 달라지니 정탐률이 감소한다. 그래도 학습량 늘리니 모델이 조금은 유연해진 느낌? 하지만 23%의 오탐과 6%의 미탐 때문에 욕먹겠지? 돈 벌어다 주는 영화 추천 모델은 좀 틀려도 칭찬 받을텐데
정탐(94%) |
오탐(23%) |
미탐(6%) |
테스트3
과거 테스트 데이터(14개 정탐이 포함된 데이터 2009개)에도 적용해봤다. 과거 모델(정오탐 각 8백여 개, 정탐률 98%)을 사용했을 때는 겨우 정탐 하나 건졌었는데, 새 모델(정오탐 각 3천여 개, 정탐률 97%)로 바꾸니 하나 빼고 다 탐지.
정탐 |
문제는 오탐도 대박(..)
오탐 |
테스트 결과는 머신러닝이 학습한 데이터에 대해서는 제법 잘 동작한다는 사실을 보여준다. 학습을 얼마나 많이, 잘 하느냐가 관건. 하지만 재미로 보는 영화 추천 시스템도 아니고 명색이 보안 시스템인데 100% 정확도를 보장하지 못한다면 어떻게 해야 할까?
어차피 사람도 실수를 하니 그냥 운에 맡겨? 아니면 사람이 최종 검증하는 프로세스 추가? 결국 사람이 하던 일은 계속 하게 되지 않을까 싶다. 문제 터졌을 때 총대 매겠다는 사람 나오지 않는 이상(..) 기계 속도 따라가려면 많이 바빠지겠네.
룰은 계속 만들어질테니, 스스로 학습하는 인공지능이 나오기 전까지 학습 데이터는 계속 만들어줘야겠군. 그런데 이왕 만든 학습 데이터로 룰도 개선해보면 어떨까? 룰이 정확해지면 오탐이 줄테고, 덩달아 로그양도 줄테고, 그러면 수백, 수천 만 개의 로그에서 공격을 찾아 헤매는 일도 줄텐데. 가만 그러면 인공지능 할 일이 없어지겠네!?