이 튜토리얼에서는 Python을 사용하여 간소화된 AI 기반 SIEM 로그 분석 시스템을 구축할 것입니다. 우리의 초점은 로그 분석 및 이상 탐지에 있습니다.
로그를 수집하고, 경량 머신 러닝 모델로 이상을 탐지하며, 시스템이 자동으로 응답할 수 있는 방법에 대해서도 언급할 것입니다.
이 실습 개념 증명은 AI가 실용적이고 접근 가능한 방식으로 보안 모니터링을 어떻게 향상시킬 수 있는지를 보여줄 것입니다.
목차
SIEM 시스템이란?
보안 정보 및 이벤트 관리 (SIEM) 시스템은 현대 보안 운영의 중추신경계입니다. SIEM은 IT 환경 전체에서 보안 로그와 이벤트를 집계하고 상호 연관시켜 잠재적 사건에 대한 실시간 통찰력을 제공합니다. 이를 통해 조직은 위협을 빨리 감지하고 조기 대응할 수 있습니다.
이러한 시스템은 방화벽 경고에서 응용 프로그램 로그까지의 대량의 로그 데이터를 모아 문제의 징후를 분석합니다. 이 맥락에서의 이상 감지는 중요하며 로그의 이상한 패턴은 정적 규칙을 통과할 수 있는 사건을 밝혀낼 수 있습니다. 예를 들어, 네트워크 요청의 급증은 DDoS 공격을 나타낼 수 있으며, 여러 번의 로그인 실패 시도는 무단 접근 시도를 나타낼 수 있습니다.
AI는 SIEM 기능을 한 단계 발전시킵니다. 고급 AI 모델(예: 대규모 언어 모델)을 활용하여 AI 기반 SIEM은 로그를 지능적으로 분석하고 해석하며, “정상” 행동이 어떤 모습인지 학습하고, 주목할 만한 “이상한” 사항을 표시할 수 있습니다.
본질적으로 AI는 분석가를 위한 스마트 공동 조종사 역할을 하여 미세한 이상 현상을 포착하고 심지어 발견 사항을 간단한 언어로 요약할 수 있습니다. 최근 대규모 언어 모델의 발전 덕분에 SIEM은 인간 분석가처럼 수많은 데이터 포인트를 추론할 수 있지만, 훨씬 더 빠르고 대규모로 처리할 수 있습니다. 그 결과는 소음 속에서 진짜 위협에 집중할 수 있도록 도와주는 강력한 디지털 보안 보조 역할을 합니다.
전제 조건
시작하기 전에 다음 사항을 확인하세요:
-
시스템에 Python 3.x가 설치되어 있어야 합니다. 코드 예제는 최근 파이썬 버전에서 작동해야 합니다.
-
Python 프로그래밍(루프, 함수, 라이브러리 사용)에 대한 기본적인 이해와 로그(예: 로그 항목의 모습)에 대한 이해가 도움이 될 것입니다.
-
파이썬 라이브러리: 우리는 경량이며 특별한 하드웨어가 필요 없는 몇 가지 일반적인 라이브러리를 사용할 것입니다:
-
분석할 로그 데이터 세트입니다. 시스템 로그, 애플리케이션 로그 등의 로그 파일(일반 텍스트 또는 CSV 형식)을 사용할 수 있습니다. 데모를 위해 작은 로그 데이터 세트를 시뮬레이션하여 준비된 로그 파일이 없어도 따라 할 수 있습니다.
참고: 위의 라이브러리가 없는 경우 pip를 통해 설치하세요:
pip install pandas numpy scikit-learn
프로젝트 설정
간단한 프로젝트 구조를 설정해 봅시다. 이 SIEM 이상 탐지 프로젝트를 위한 새 디렉터리를 만들고 해당 디렉터리로 이동하세요. 여기에 파이썬 스크립트(예: siem_anomaly_demo.py
)나 코드를 단계별로 실행할 수 있는 Jupyter Notebook을 넣을 수 있습니다.
작업 디렉터리에 로그 데이터가 있거나 액세스할 수 있는지 확인하세요. 로그 파일을 사용하는 경우, 해당 프로젝트 폴더에 복사하는 것이 좋을 수 있습니다. 우리의 증명-of-concept에서는 합성 로그 데이터를 생성할 것이므로 외부 파일이 필요하지 않지만, 실제 시나리오에서는 필요할 것입니다.
프로젝트 설정 단계:
-
환경 초기화 – 원하는 경우 이 프로젝트를 위한 가상 환경을 만드세요 (선택 사항이지만 좋은 실천 방법입니다):
python -m venv venv source venv/bin/activate # Windows에서는 "venv\Scripts\activate"를 사용하세요
그런 다음 이 가상 환경에 필요한 패키지를 설치하세요.
-
데이터 원본 준비 – 분석하려는 로그 원본을 식별하세요. 이것은 로그 파일이나 데이터베이스로의 경로일 수 있습니다. 로그의 형식을 파악하세요 (예: 쉼표로 구분된 것, JSON 라인, 또는 일반 텍스트인지). 설명을 위해 몇 가지 로그 항목을 가공할 것입니다.
-
스크립트 또는 노트북 설정 – Python 파일이나 노트북을 열어주세요. 필요한 라이브러리를 가져오고 재현성을 위한 임의 시드와 같은 설정을 구성하는 것으로 시작하겠습니다.
이 설정이 완료되면, SIEM 로그 분석 코드를 실행할 준비가 된 Python 환경과 실제 로그 데이터 세트 또는 나와 함께 데이터를 시뮬레이션할 의도를 갖게 될 것입니다.
로그 분석 구현하기
전체 SIEM 시스템에서 로그 분석은 다양한 출처에서 로그를 수집하고 이를 추가 처리를 위해 통일된 형식으로 파싱하는 작업을 포함합니다. 로그에는 종종 타임스탬프, 심각도 수준, 출처, 이벤트 메시지, 사용자 ID, IP 주소 등의 필드가 포함됩니다. 첫 번째 작업은 이러한 로그를 수집하고 전처리하는 것입니다.
1. 로그 수집
로그가 텍스트 파일에 있다면, Python에서 읽을 수 있습니다. 예를 들어, 각 로그 항목이 파일의 한 줄이라면 다음과 같이 할 수 있습니다:
with open("my_logs.txt") as f:
raw_logs = f.readlines()
로그가 구조화되어 있다면(예: 열이 있는 CSV 형식), Pandas를 사용하면 읽기가 매우 간단해질 수 있습니다:
import pandas as pd
df = pd.read_csv("my_logs.csv")
print(df.head())
이렇게 하면 로그 항목이 열로 정리된 DataFrame df
를 얻을 수 있습니다. 그러나 많은 로그는 반구조적입니다(예: 공백이나 특수 문자로 구분된 구성 요소). 이러한 경우 각 줄을 구분 기호로 나누거나 정규 표현식을 사용하여 필드를 추출해야 할 수 있습니다. 예를 들어, 로그 줄을 상상해 보세요:
2025-03-06 08:00:00, INFO, User login success, user: admin
이 줄에는 타임스탬프, 로그 수준, 메시지 및 사용자 정보가 포함되어 있습니다. 우리는 Python의 문자열 메서드를 사용하여 이러한 줄을 파싱할 수 있습니다:
logs = [
"2025-03-06 08:00:00, INFO, User login success, user: admin",
"2025-03-06 08:01:23, INFO, User login success, user: alice",
"2025-03-06 08:02:45, ERROR, Failed login attempt, user: alice",
# ... (더 많은 로그 줄)
]
parsed_logs = []
for line in logs:
parts = [p.strip() for p in line.split(",")]
timestamp = parts[0]
level = parts[1]
message = parts[2]
user = parts[3].split(":")[1].strip() if "user:" in parts[3] else None
parsed_logs.append({"timestamp": timestamp, "level": level, "message": message, "user": user})
# 더 쉬운 분석을 위해 DataFrame으로 변환하기
df_logs = pd.DataFrame(parsed_logs)
print(df_logs.head())
위의 샘플 목록에서 실행하면 다음과 같은 결과가 출력됩니다:
timestamp level message user
0 2025-03-06 08:00:00 INFO User login success admin
1 2025-03-06 08:01:23 INFO User login success alice
2 2025-03-06 08:02:45 ERROR Failed login attempt alice
...
이제 로그를 테이블로 구조화했습니다. 실제 시나리오에서는 로그에서 모든 관련 필드(예: IP 주소, 오류 코드 등)를 계속 구문 분석하여 분석할 내용에 따라 다양한 작업을 수행합니다.
2. 전처리 및 특성 추출
구조화된 형식의 로그를 사용할 때 다음 단계는 이상 감지를 위한 특성을 유도하는 것입니다. 원시 로그 메시지(문자열) 자체만으로는 알고리즘이 직접 학습하기 어렵습니다. 종종 수량화할 수 있는 숫자 특성이나 범주를 추출합니다. 특성의 예는 다음과 같습니다:
-
이벤트 수: 분/시간당 이벤트 수, 각 사용자의 로그인 실패 수 등.
-
기간 또는 크기: 로그에 기간 또는 데이터 크기(예: 파일 전송 크기, 쿼리 실행 시간)가 포함된 경우 해당 숫자 값은 직접 사용될 수 있습니다.
-
범주형 인코딩: 로그 수준(INFO, ERROR, DEBUG)을 숫자로 매핑하거나 특정 이벤트 유형을 원-핫 인코딩할 수 있습니다.
이 개념 증명을 위해, 특정 사용자의 분당 로그인 시도 횟수라는 간단한 숫자 특성에 집중해 보겠습니다. 이를 우리의 특성 데이터로 시뮬레이션할 것입니다.
실제 시스템에서는 파싱된 로그 항목을 시간 창과 사용자별로 그룹화하여 이 값을 계산하게 됩니다. 목표는 각 숫자가 “주어진 분 동안 발생한 로그인 시도 횟수”를 나타내는 숫자 배열을 얻는 것입니다. 대부분의 경우 이 숫자는 낮을 것이며(정상적인 행동), 하지만 특정 분에서 비정상적으로 높은 시도가 있었다면, 이는 이상현상(아마도 무차별 대입 공격)을 의미합니다.
시뮬레이션을 위해, 정상 행동을 나타내는 50개의 값을 생성하고 그 후에 비정상적으로 높은 몇 개의 값을 추가하겠습니다:
import numpy as np
# 정상 로그인 시도 횟수를 50분 동안 시뮬레이션합니다 (평균적으로 분당 약 5회)
np.random.seed(42) # 재현 가능한 예시를 위하여
normal_counts = np.random.poisson(lam=5, size=50)
# 이상현상 시뮬레이션: 로그인 시도가 급증합니다 (예: 공격자가 분당 30회 이상 시도)
anomalous_counts = np.array([30, 40, 50])
# 데이터를 결합합니다
login_attempts = np.concatenate([normal_counts, anomalous_counts])
print("Login attempts per minute:", login_attempts)
위의 코드를 실행하면, login_attempts
는 다음과 같을 수 있습니다:
Login attempts per minute: [ 5 4 4 5 5 3 5 ... 4 30 40 50]
대부분의 값은 한 자릿수이지만, 마지막에 30, 40, 50 시도로 세 개의 분이 있습니다 – 명확한 이상치입니다. 이것이 이상 탐지를 위한 우리의 준비된 데이터입니다. 실제 로그 분석에서는 이러한 데이터가 시간이 지남에 따라 로그에서 이벤트를 계산하거나 로그 내용에서 일부 메트릭을 추출하여 얻어질 수 있습니다.
이제 데이터가 준비되었으니, 이상 탐지 모델 구축으로 넘어갈 수 있습니다.
이상 탐지 모델 구축 방법
로그 유래 데이터에서 이상을 탐지하기 위해 기계 학습 접근 방식을 사용할 것입니다. 구체적으로, 비지도 이상 탐지에 인기 있는 알고리즘인 Isolation Forest를 사용할 것입니다.
Isolation Forest는 데이터를 무작위로 분할하고 점들을 고립시키는 방식으로 작동합니다. 이상치는 다른 점들과 빠르게 고립되는 점, 즉 더 적은 무작위 분할로 분리되는 점입니다. 이는 레이블이 필요 없이 데이터 세트에서 외래값을 식별하는 데 매우 유용합니다(어떤 로그 항목이 “나쁜”지 미리 알 필요가 없습니다).
왜 Isolation Forest인가?
-
효율적이며 많은 데이터가 있어도 잘 작동합니다.
-
특정 데이터 분포를 가정하지 않습니다(일부 통계적 방법과는 다르게).
-
이상치를 점수화하는 간단한 방법을 제공합니다.
이제 login_attempts
데이터에서 Isolation Forest를 훈련해 보겠습니다:
from sklearn.ensemble import IsolationForest
# 모델이 기대하는 형태(샘플, 피처)로 데이터를 준비합니다
X = login_attempts.reshape(-1, 1) # 각 샘플은 1차원 [카운트]입니다
# 이상 탐지(Isolation Forest) 모델을 초기화합니다
model = IsolationForest(contamination=0.05, random_state=42)
# contamination=0.05는 약 5%의 데이터가 이상으로 예상된다는 것을 의미합니다
# 데이터로 모델을 학습시킵니다
model.fit(X)
코드에 대한 주요 사항 몇 가지:
-
login_attempts
를 scikit-learn이 학습(fit
)에 2차원 배열X
로 재구성했습니다. 왜냐하면 scikit-learn은 학습을 위해 2차원 배열을 요구하기 때문입니다. -
contamination=0.05
로 설정하여 모델에 대략 5%의 데이터가 이상일 수 있다는 힌트를 줬습니다. 우리의 합성 데이터에서 53개의 포인트 중 3개의 이상치를 추가했는데, 이는 약 5.7%이므로 5%는 합리적인 추측입니다. (contamination을 지정하지 않으면 알고리즘은 가정에 따라 기본값을 선택하거나 일부 버전에서는 기본값 0.1을 사용합니다.) -
random_state=42
는 재현성을 보장합니다.
이 시점에서 Isolation Forest 모델은 우리의 데이터로 훈련되었습니다. 내부적으로, 데이터의 구획을 나누는 랜덤 트리의 앙상블을 구축했습니다. 격리하기 어려운 포인트(즉, 정상 포인트의 밀집 클러스터 내에 있는)는 이러한 트리에서 깊이 위치하게 되며, 격리하기 쉬운 포인트(이상치)는 더 짧은 경로로 위치하게 됩니다.
다음으로, 이 모델을 사용하여 어떤 데이터 포인트가 이상으로 간주되는지를 식별할 것입니다.
결과 테스트 및 시각화
이제 흥미로운 부분이 왔습니다: 훈련된 모델을 사용하여 로그 데이터에서 이상을 감지하는 것입니다. 우리는 모델이 각 데이터 포인트에 대한 레이블을 예측하도록 하고, 이상치로 표시된 것들을 필터링할 것입니다.
# 모델을 사용하여 이상 감지하기
labels = model.predict(X)
# 모델은 정상 포인트에 대해 +1을, 이상치에 대해 -1을 출력합니다
# 이상치 인덱스와 값을 추출합니다
anomaly_indices = np.where(labels == -1)[0]
anomaly_values = login_attempts[anomaly_indices]
print("Anomaly indices:", anomaly_indices)
print("Anomaly values (login attempts):", anomaly_values)
우리의 경우, 우리는 삽입한 큰 숫자(30, 40, 50)가 이상치일 것으로 예상합니다. 출력은 다음과 같을 수 있습니다:
Anomaly indices: [50 51 52]
Anomaly values (login attempts): [30 40 50]
“로그인 시도”에 대해 구체적으로 아무것도 알지 못하더라도, Isolation Forest는 이러한 값을 나머지 데이터와 일치하지 않는 것으로 인식했습니다.
이것은 보안 맥락에서 이상 탐지의 힘입니다: 우리는 새로운 공격이 어떻게 생길지 항상 알 수는 없지만, 만약 그것이 정상 패턴에서 멀리 이탈하게 만든다면(예: 사용자가 갑자기 평소보다 10배 더 많은 로그인 시도를 하는 경우), 이상 탐지기는 그에 주목하게 됩니다.
결과 시각화
실제 분석에서는 데이터와 이상을 시각화하는 것이 종종 유용합니다. 예를 들어, login_attempts
값을 시간에 따라(분 단위로) 그래프로 나타내고 이상을 다른 색상으로 강조할 수 있습니다.
이 간단한 경우, 선 그래프는 대부분 3-8 로그인/분의 평탄한 선을 보여주고 마지막에 세 개의 큰 스파이크를 나타낼 것입니다. 그 스파이크가 우리의 이상입니다. 노트북에서 이를 실행하는 경우 Matplotlib을 사용하여 이를 달성할 수 있습니다:
import matplotlib.pyplot as plt
plt.plot(login_attempts, label="Login attempts per minute")
plt.scatter(anomaly_indices, anomaly_values, color='red', label="Anomalies")
plt.xlabel("Time (minute index)")
plt.ylabel("Login attempts")
plt.legend()
plt.show()
여기와 같이 텍스트 기반 출력의 경우, 인쇄된 결과는 이미 높은 값이 포착되었음을 확인합니다. 더 복잡한 경우에는 이상 탐지 모델이 각 지점에 대한 이상 점수도 제공합니다(예: 정상 범위에서 얼마나 멀리 떨어져 있는지). Scikit-learn의 IsolationForest는 예를 들어, 낮은 점수가 더 비정상적임을 의미하는 decision_function
메소드를 가지고 있습니다.
간단함을 위해 여기에서는 점수에 대해 깊이 들어가지 않겠지만, 심각도에 따라 이상을 정렬하기 위해 점수를 검색할 수 있다는 것을 아는 것이 좋습니다.
이상 탐지가 작동하고 있을 때, 우리가 이상을 발견하면 무엇을 할 수 있을까요? 이는 자동화된 응답에 대해 생각하게 합니다.
자동화된 응답 가능성
이상 탐지는 전투의 반에 불과합니다 — 다음 단계는 이에 대응하는 것입니다. 기업 SIEM 시스템에서 자동화된 응답(종종 SOAR – 보안 오케스트레이션, 자동화 및 응답과 관련됨)은 사건에 대한 반응 시간을 극적으로 줄일 수 있습니다.
AI 기반 SIEM이 이상한 점을 감지했을 때 어떤 조치를 취할 수 있을까요? 다음은 몇 가지 가능성입니다:
-
알림: 가장 간단한 조치는 보안 직원에게 알림을 보내는 것입니다. 이는 이메일, 슬랙 메시지, 또는 사건 관리 시스템에 티켓을 생성하는 형식일 수 있습니다. 알림에는 이상에 대한 세부 정보가 포함됩니다(예: “사용자 alice가 1분 내에 50회의 로그인 실패를 했습니다. 이는 비정상적입니다.”). GenAI는 여기서 분석가를 위한 사건의 명확한 자연어 요약을 생성하여 도움을 줄 수 있습니다.
-
자동화된 완화: 더 발전된 시스템은 직접적인 조치를 취할 수 있습니다. 예를 들어, IP 주소가 로그에서 악성 행동을 보일 경우, 시스템은 자동으로 방화벽에서 해당 IP를 차단할 수 있습니다. 로그인 스파이크 예제에서 시스템은 사용자 계정을 일시적으로 잠그거나 추가 인증을 요구할 수 있으며, 이는 봇 공격일 가능성이 있다고 가정합니다. 현재 AI 기반 SIEM은 실제로 특정 위협이 감지될 때 미리 정의된 응답 조치를 촉발하거나 복잡한 워크플로를 조정할 수 있습니다(자세한 내용은 AI SIEM: How SIEM with AI/ML is Revolutionizing the SOC | Exabeam을 참조하십시오).
-
조사 지원: 생성형 AI는 자동으로 맥락을 수집하는 데에도 사용될 수 있습니다. 예를 들어, 이상을 감지했을 때, 시스템은 관련 로그(주변 사건, 동일 사용자 또는 동일 IP에서의 기타 작업)를 수집하고 집계된 보고서를 제공할 수 있습니다. 이렇게 하면 분석가는 여러 데이터 소스에 대해 수동으로 쿼리를 실행할 필요가 없습니다.
자동화된 응답을 신중하게 구현하는 것이 중요합니다. 시스템이 잘못된 긍정 반응에 과민 반응하지 않도록 해야 합니다. 일반적인 전략은 계층화된 응답입니다: 낮은 신뢰도의 이상 징후는 경고를 기록하거나 낮은 우선 순위의 경고를 보낼 수 있지만, 높은 신뢰도의 이상 징후(또는 이상 징후의 조합)는 적극적인 방어 조치를 촉발합니다.
실제로 AI 기반 SIEM은 이러한 작업을 실행하기 위해 인프라(API, 스크립트 등을 통해)와 통합됩니다. Python PoC의 경우, 이상 징후가 감지될 때 메시지를 인쇄하거나 더미 함수를 호출하여 자동화된 응답을 시뮬레이션할 수 있습니다. 예를 들어:
if len(anomaly_indices) > 0:
print(f"Alert! Detected {len(anomaly_indices)} anomalous events. Initiating response procedures...")
# 여기서 사용자를 비활성화하거나 관리자에게 알리는 코드를 추가할 수 있습니다.
우리의 시연은 간단하지만, 이를 확장하는 것에 대한 상상은 쉽습니다. SIEM은 예를 들어, 이상 징후를 더 큰 생성 모델에 입력하여 상황을 평가하고 최선의 행동 방침을 결정하게 할 수 있습니다(예: 여러분의 운영 매뉴얼을 아는 챗봇 Ops 어시스턴트). AI가 더 정교해짐에 따라 자동화의 가능성은 확장되고 있습니다.
결론
이 튜토리얼에서는 로그 데이터를 수집하고, 기계 학습 모델을 사용하여 이상 징후를 분석하고, 보안 위협을 나타낼 수 있는 비정상적인 사건을 식별하는 기본 AI 기반 SIEM 구성 요소를 구축했습니다.
로그 데이터를 분석하고 준비하는 것부터 시작하여, 로그인 시도 수의 스트림에서 이상치를 감지하기 위해 Isolation Forest 모델을 사용했습니다. 이 모델은 “공격”이 어떤 모습인지에 대한 사전 지식 없이도 비정상적인 행동을 성공적으로 표시했습니다. – 이는 학습된 정상 패턴에서의 편차에만 순전히 의존했습니다.
우리는 또한 이러한 시스템이 감지된 이상 징후에 어떻게 대응할 수 있는지, 즉 인간에게 경고하거나 자동으로 조치를 취하는 방법에 대해 논의했습니다.
현대의 SIEM 시스템은 AI/ML로 강화되어 이 방향으로 나아가고 있습니다: 문제를 감지할 뿐만 아니라 이를 분류하고 대응하는 데에도 도움을 줍니다. 생성적 AI는 분석가로부터 학습하고 지능적인 요약 및 결정을 제공함으로써 보안 운영 센터에서 지칠 줄 모르는 조수 역할을 더욱 강화합니다.
다음 단계 및 개선 사항:
-
실제 로그 데이터에서 이 접근 방식을 시도해 볼 수 있습니다. 예를 들어, 시스템 로그 파일을 가져와 “시간당 오류 로그 수” 또는 “세션당 전송된 바이트 수”와 같은 특징을 추출하고 이에 대한 이상 탐지를 실행해 보세요.
-
이상 탐지를 위해 One-Class SVM 또는 Local Outlier Factor와 같은 다른 알고리즘을 실험하여 비교해 보세요.
-
로그 라인을 구문 분석하거나 이상을 설명하기 위해 간단한 언어 모델을 통합하세요. 예를 들어, LLM은 이상 로그 항목을 읽고 잘못된 점이 무엇인지 제안할 수 있습니다 (“이 오류는 일반적으로 데이터베이스에 접근할 수 없음을 의미합니다”).
-
기능 확장: 실제 SIEM에서는 여러 신호를 동시에 사용합니다(로그인 실패 횟수, 비정상적인 IP 지리 위치, 로그의 드문 프로세스 이름 등). 더 많은 기능과 데이터는 탐지를 위한 맥락을 개선할 수 있습니다.
Source:
https://www.freecodecamp.org/news/how-to-create-a-python-siem-system-using-ai-and-llms/