LGCNS 재직시절 그룹사의 보안관제를 수행하였습니다.
그때 SIEM에 하루에만 수백만개의 로그가 있는데 의심 IP만 어떻게 판별할까? 였습니다.
좋은방법은 아래와 같이 있으나, 모두 수작업이 많이 들어가고 수시로 업데이트해야합니다.
1. signature를 고도화해서 WAF나 IPS에서 탐지해서 찾는다.
2. malicious ip를 db에 업데이트해서 source ip기준 판별
그래서 어떻게 ML이나 AI를 이용해서 해결해 볼 수 있을까 고민해보았습니다.
앞에 블로그 글에서 수행했던 방법은
1. 이벤트별 가중치를 부과하여 판별하기
2. ML이나 AI로 training후 평가 방식이었습니다.
다만 이번엔 랜덤포레스트와 유사한 방식의 무작위 트리 분류구조 분석인 Isolation Forest 모델로 비정상 IP를 찾아봤습니다.
이 기법은 정상/비정상보단 튀는? 비부류의 데이터를 찾는 방식으로 보면됩니다.
비지도 학습 기반의 이상 탐지(anomaly detection) 기법으로, 특히 고차원 데이터에서도 효과적입니다.
다만 추후에 지도 학습기반과 병행해서 동시에 사용하면 좀더 고도화해서 사용할 수 있습니다.
<가설>
- 해킹시도는 무작위로 들어오나, 정상적인 서비스요청시의 애러로그 및 기타(port,method)와 다른 형태로 접근하는 경우가 많다.
- 가설 설정 사유 : 실제로 의외로 해킹이 쉽게 뚫리는 부분은 외부에서 내부로 ftp,telnet과 같은 직접 tunneling으로 유입하는 경우가 종종 있습니다.
<결과> 해킹 의심 IP 판별
Anomalous Source IPs:
['254.225.144.255', '2.194.166.247', '210.40.89.167', '254.248.140.85', '218.191.252.226']
<참고사항>
Isolation Forest 검증시에는 Contamination 과 같은 파라미터를 수정하여 미세조정하여 좀더 비정상의 범위를 늘릴 수도 있고 축소할 수도 있습니다.
1. 서버 애러 로그 다운로드 : 임의로 5000개 발생
<애러로그형태>
2. 결과값 해석
- contamination=0.01, random_state=42로 파라미터를 설정하여 수행하였습니다. 좀더 정밀하게 찾고 싶다면 좌측 파라미터를 수정하면서 하면 좋습니다. contamination이나 random_state가 너무 높을경우 오히려 해킹의심 IP를 놓칠 수도 있습니다.
실무에 적용한다면 20~100개정도의 anomal 결과 값이 나오게 한다음 정밀 분석(WAF,IPS의 상세 로그 분석 등)하는 것을 추천드립니다.
- 위에 log는 임의 생성이어서 실제 해킹시도 or 모의해킹 시기의 log들을 로드하셔서 수행하여 실제 해킹 시도 or 의심IP가 맞다면 적극적으로 활용하시기 바랍니다.
3. 방법
#3.1 로그파일 업로드 및 Isolation 모델로 분석
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest
# 텍스트 파일 경로
uploaded_file_path = './security_logs.txt' #이부분이 위 첨부한 파일입니다. 본 소스코드를 같은 디렉토리에 놓고 수행하면 디렉토리 변경이 필요없습니다.
df = pd.read_csv(uploaded_file_path, sep='\t')
# IP 주소를 숫자 형식으로 변환
def ip_to_numeric(ip):
parts = list(map(int, ip.split('.')))
return parts[0] * 256**3 + parts[1] * 256**2 + parts[2] * 256 + parts[3]
df['source_ip_num'] = df['source_ip'].apply(ip_to_numeric)
df['destination_ip_num'] = df['destination_ip'].apply(ip_to_numeric)
# method, url, response_code를 추가하여 feature로 사용
df['method_encoded'] = df['method'].astype('category').cat.codes
df['url_encoded'] = df['url'].astype('category').cat.codes
# Isolation Forest 모델 훈련
features = df[['source_ip_num', 'destination_ip_num', 'port', 'method_encoded', 'url_encoded', 'response_code']]
model = IsolationForest(contamination=0.001, random_state=42)
model.fit(features)
#3.2 이상치 분리 및 기존 확인된 malicious ip와의 대조
# 이상치 탐지
df['anomaly'] = model.predict(features)
df['anomaly'] = df['anomaly'].map({1: 0, -1: 1})
# 이상치와 정상치 분리
normal = df[df['anomaly'] == 0]
anomalies = df[df['anomaly'] == 1]
# 비정상치를 나타내는 source_ip들을 리스트업
anomalous_source_ips = anomalies['source_ip'].tolist()
# 위협 인텔리전스 피드와 대조
known_malicious_ips = ["192.168.1.1", "10.0.0.1", "172.16.0.1"] # 기존 알려진 malicious ip로 웹취약점진단,모의해킹 등의 시도가 있었던 ip를 기입하여 정말 맞는지 대조해보심이 좋습니다.
malicious_detected = [ip for ip in anomalous_source_ips if ip in known_malicious_ips]
# 분석 결과 출력
print("Anomalous Source IPs:")
print(anomalous_source_ips)
print("\nDetected Malicious IPs:")
print(malicious_detected)
#3.3 결과 시각화
# 결과 시각화 - 점도표
plt.figure(figsize=(12, 8))
plt.scatter(normal['source_ip_num'], normal['destination_ip_num'], c='blue', s=10, label='Normal Data')
plt.scatter(anomalies['source_ip_num'], anomalies['destination_ip_num'], c='red', s=10, label='Anomalies')
plt.xlabel('Source IP (numeric)')
plt.ylabel('Destination IP (numeric)')
plt.legend()
plt.title('IP Address Distribution - Normal Data vs. Anomalies')
plt.show()
# 이상치 탐지 비율 시각화
total_count = len(df)
anomaly_count = df['anomaly'].sum()
normal_count = total_count - anomaly_count
# Pie chart for anomaly and normal data distribution
labels = ['Normal', 'Anomaly']
sizes = [normal_count, anomaly_count]
colors = ['blue', 'red']
explode = (0, 0.1) # slightly explode the anomaly slice
plt.figure(figsize=(8, 8))
plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=140)
plt.title('Anomaly Detection Distribution')
plt.show()
<참고>
감사합니다.
'ML' 카테고리의 다른 글
문장,단어로 3D 이미지 만들기(openai의 shape-e 모델 활용) (0) | 2024.11.18 |
---|---|
(AI_신경망 활용)보안 이벤트 로그 분류-비정상(해킹시도) / 정상 (0) | 2024.11.04 |
보안log기반 SIEM내 중요 이벤트 가중치 계산(with stats 모델) (0) | 2024.11.04 |
AI로 장애 예방하기(feat. Transformer Bert) (0) | 2024.10.28 |
ML(Machine Learning)으로 서버 장애 사전감지하기(feat. 랜덤포레스트,KFold 교차검증) (0) | 2024.10.25 |