재직시절 그룹사에 웹취약점 진단을 수행한 적이 있습니다.
앞서 수행했던 방법은 선형을 가정했지만,
이번엔 비선형을 가정하여 신경망을 활용하여 학습해보았습니다.
<가정>
- 해킹 시도 ip를 알고, 신경망을 이용해 분석
<가설>
- 신경망을 이용할 경우 해킹 시도 ip들을 명확히 분류할 수 있다.
1. 서버 애러 로그 다운로드
2. 결과값
분류 보고서:
precision recall f1-score support
Not Suspicious 0.99 1.00 0.99 198
Suspicious 0.00 0.00 0.00 2
accuracy 0.99 200
macro avg 0.49 0.50 0.50 200
weighted avg 0.98 0.99 0.99 200
혼동 행렬:
[[198 0]
[ 2 0]]
- random으로 만든 로그이기에 Suspicious의 정밀도/재현율/F1-score등이 낮다.
- KISA같은 곳에서 위의 사례들을 DB를 구축한다면, 충분한 TEST 및 의미있는 결과를 나타 낼 듯 합니다.
3. 방법
#3.1 신경망 관련 여러 모듈 로드
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.metrics import classification_report, confusion_matrix
# 엑셀 파일 로드
file_path = r"본인의 파일위치 기재\server_error_logs.xlsx"
excel_data = pd.ExcelFile(file_path)
# 시트 로드
incident_df = pd.read_excel(excel_data, sheet_name='장애발생일지')
error_log_df = pd.read_excel(excel_data, sheet_name='error log')
# 의심스러운 IP 리스트
suspicious_ips = ["241.206.184.49", "26.189.99.59", "120.175.229.185"]
# 데이터 전처리: timestamp 및 레이블 생성
incident_df['timestamp'] = pd.to_datetime(incident_df['timestamp'])
error_log_df['timestamp'] = pd.to_datetime(error_log_df['timestamp'])
error_log_df['is_suspicious'] = error_log_df['ip_address'].apply(lambda x: 1 if x in suspicious_ips else 0)
# 에러 타입과 에러 메시지 인코딩
label_encoder_type = LabelEncoder()
label_encoder_message = LabelEncoder()
error_log_df['error_type_encoded'] = label_encoder_type.fit_transform(error_log_df['error_type'])
error_log_df['error_message_encoded'] = label_encoder_message.fit_transform(error_log_df['error_message'])
# 입력(X)과 출력(y) 데이터 분리
X = error_log_df[['error_type_encoded', 'error_message_encoded']]
y = error_log_df['is_suspicious']
# 훈련 데이터와 테스트 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
#3.2 신경망 모델 생성 및 학습
# 신경망 모델 생성
model = Sequential()
model.add(Dense(64, input_dim=X_train.shape[1], activation='relu')) # 은닉층 1
model.add(Dense(32, activation='relu')) # 은닉층 2
model.add(Dense(1, activation='sigmoid')) # 출력층 (이진 분류이므로 sigmoid 사용)
# 모델 컴파일
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 모델 학습
model.fit(X_train, y_train, epochs=50, batch_size=10, validation_data=(X_test, y_test))
# 모델 평가
loss, accuracy = model.evaluate(X_test, y_test)
print(f"\n테스트 세트 정확도: {accuracy:.2f}")
# 예측값 생성
y_pred = (model.predict(X_test) > 0.5).astype("int32")
# 정밀도, 재현율, F1-score 및 혼동 행렬 출력
print("\n분류 보고서:")
print(classification_report(y_test, y_pred, target_names=["Not Suspicious", "Suspicious"]))
print("\n혼동 행렬:")
print(confusion_matrix(y_test, y_pred))
감사합니다.
'ML' 카테고리의 다른 글
문장,단어로 3D 이미지 만들기(openai의 shape-e 모델 활용) (0) | 2024.11.18 |
---|---|
ML(Isolation Forest)로 해킹 시도 의심 IP 찾기 (0) | 2024.11.07 |
보안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 |