ML

(AI_신경망 활용)보안 이벤트 로그 분류-비정상(해킹시도) / 정상

치타뱅뱅 2024. 11. 4. 12:51
728x90

재직시절 그룹사에 웹취약점 진단을 수행한 적이 있습니다.

 

앞서 수행했던 방법은 선형을 가정했지만,

이번엔 비선형을 가정하여 신경망을 활용하여 학습해보았습니다.

 

<가정>

 - 해킹 시도 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))

 

감사합니다.