네트워크 모니터링 도구 구축: scapy
를 활용한 비정상 네트워크 활동 감지 및 경고
Overview
네트워크 모니터링 도구를 구축하는 것은 IT 환경에서 보안과 성능을 유지하는 데 중요한 요소입니다. 이 글에서는 Python의 scapy
라이브러리를 사용하여 비정상적인 네트워크 활동을 감지하고 경고하는 방법에 대해 자세히 설명하겠습니다. scapy
는 패킷 생성, 분석 및 조작을 가능하게 하는 강력한 도구로, 네트워크 패킷을 쉽게 처리할 수 있습니다. 아래에서는 설치부터 기본적인 감지 기능 구현, 경고 시스템 설정까지 단계별로 안내할 것입니다.
1. scapy
설치 및 기본 사용법
먼저, scapy
를 사용하기 위해 Python이 설치되어 있어야 합니다. scapy
는 Python 패키지로 쉽게 설치할 수 있습니다.
pip install scapy
설치가 완료되면, Python 환경에서 scapy
를 임포트하여 사용할 수 있습니다.
from scapy.all import *
패킷 스니핑
네트워크 모니터링의 첫 번째 단계는 패킷을 스니핑하는 것입니다. 아래 코드는 네트워크 인터페이스에서 패킷을 캡처하는 간단한 예입니다.
def packet_callback(packet):
print(packet.show())
sniff(prn=packet_callback, count=10) # 10개의 패킷 캡처
이 코드는 패킷을 캡처하고, 각 패킷의 세부 정보를 출력합니다. sniff
함수는 패킷을 감지하는데 사용되며, prn
매개변수에 전달된 함수가 캡처된 패킷에 대해 호출됩니다.
2. 비정상적인 활동 감지하기
비정상적인 네트워크 활동을 감지하기 위해서는 몇 가지 기준을 설정해야 합니다. 예를 들어, 특정 IP 주소로부터 비정상적으로 많은 패킷을 수신하거나, 포트 스캐닝 시도 등이 있을 수 있습니다.
예제: IP 주소 기반 감지
특정 IP 주소에서 비정상적으로 많은 패킷이 수신되는 경우를 감지하는 코드는 다음과 같습니다.
from collections import defaultdict
packet_count = defaultdict(int)
def packet_callback(packet):
if IP in packet:
ip_src = packet[IP].src
packet_count[ip_src] += 1
if packet_count[ip_src] > 100: # 예를 들어, 100개 이상의 패킷 수신
print(f"[경고] 비정상적인 패킷 수신: {ip_src}가 {packet_count[ip_src]}개의 패킷을 보냄!")
sniff(prn=packet_callback, filter="ip", store=0)
위의 코드는 IP 패킷이 캡처될 때마다 출발지 IP 주소를 기록하고, 특정 임계치(예: 100)를 초과하면 경고 메시지를 출력합니다.
3. 포트 스캐닝 감지
포트 스캐닝은 공격자가 네트워크의 열린 포트를 확인하기 위해 수행하는 작업입니다. 이를 감지하기 위해서는 동일한 IP 주소에서 다수의 포트에 대한 연결 시도를 모니터링할 수 있습니다.
port_scans = defaultdict(set)
def packet_callback(packet):
if TCP in packet and packet[TCP].dport in range(1, 1024): # 주요 포트 범위
ip_src = packet[IP].src
port_scans[ip_src].add(packet[TCP].dport)
if len(port_scans[ip_src]) > 10: # 10개 이상의 포트에 대한 스캔
print(f"[경고] 포트 스캐닝 감지: {ip_src}가 {len(port_scans[ip_src])}개의 포트를 스캔했습니다.")
sniff(prn=packet_callback, filter="tcp", store=0)
이 코드는 TCP 패킷에서 목적지 포트를 확인하고, 동일한 IP 주소에서 10개 이상의 포트에 대한 연결 시도를 기록합니다. 조건을 만족하면 경고를 출력합니다.
4. 경고 시스템 구축
비정상적인 활동이 감지되었을 때, 시스템 관리자에게 경고를 보내는 것이 중요합니다. 이메일, 슬랙 메시지 또는 기타 통신 수단을 통해 경고를 보낼 수 있습니다. 여기서는 간단한 이메일 경고 시스템을 구현해보겠습니다.
이메일 경고 설정
이메일을 통해 경고를 보내기 위해 Python의 smtplib
라이브러리를 사용할 수 있습니다. 아래는 Gmail SMTP 서버를 사용하는 예제입니다.
import smtplib
from email.mime.text import MIMEText
def send_alert(ip_address):
msg = MIMEText(f"비정상적인 활동이 감지되었습니다: {ip_address}")
msg['Subject'] = '네트워크 경고'
msg['From'] = 'your_email@gmail.com'
msg['To'] = 'admin_email@example.com'
with smtplib.SMTP('smtp.gmail.com', 587) as server:
server.starttls()
server.login('your_email@gmail.com', 'your_email_password')
server.send_message(msg)
# 경고 감지 시 이메일 전송
if len(port_scans[ip_src]) > 10:
send_alert(ip_src)
이 코드에서는 비정상적인 활동이 감지되면 send_alert
함수를 호출하여 이메일을 전송합니다. Gmail 계정에서 "보안 수준이 낮은 앱" 허용 설정을 해야 할 수 있습니다.
5. 에러 처리 및 개선점
패킷 스니핑이나 이메일 전송 중 여러 가지 에러가 발생할 수 있습니다. 아래는 몇 가지 일반적인 에러와 그 해결책입니다.
패킷 스니핑 중 발생할 수 있는 에러
PermissionError: 패킷 스니핑을 위해 관리자 권한이 필요할 수 있습니다. 프로그램을 관리자 권한으로 실행해 보세요.
ScapyException: Scapy가 네트워크 인터페이스를 찾지 못하는 경우 발생할 수 있습니다. 올바른 인터페이스 이름을 확인하고, 인터페이스가 활성화되어 있는지 확인하세요.
이메일 전송 중 발생할 수 있는 에러
smtplib.SMTPAuthenticationError: 이메일 인증에 실패한 경우입니다. 사용자 이름과 비밀번호를 다시 확인하고, "보안 수준이 낮은 앱" 허용 설정을 확인하세요.
smtplib.SMTPConnectError: SMTP 서버에 연결할 수 없는 경우 발생합니다. 인터넷 연결을 확인하거나 SMTP 서버 주소가 올바른지 확인하세요.
결론
이러한 방법을 통해 scapy
를 활용하여 비정상적인 네트워크 활동을 감지하고, 경고를 전송하는 네트워크 모니터링 도구를 구축할 수 있습니다. 물론, 이 시스템은 기본적인 예제일 뿐이며, 실제 환경에서는 더 복잡한 로직과 기능을 추가하여 더욱 강력한 보안 시스템을 만들 수 있습니다.
참고문서
'Study Information Technology' 카테고리의 다른 글
텍스트 매칭 자동화 fuzzywuzzy를 이용한 데이터베이스 중복 항목 정리 (0) | 2024.10.22 |
---|---|
자동 대화 로그 분석기 구현하기 (0) | 2024.10.22 |
Apache Airflow로 데이터 파이프라인 구축하기 ETL 프로세스 자동화 (0) | 2024.10.22 |
레시피 스크래퍼 만들기 다양한 웹사이트에서 요리 레시피 자동 수집 및 정리하기 (0) | 2024.10.22 |
Flask와 Plotly를 이용한 자동 새로 고침 데이터 시각화 대시보드 구현하기 (0) | 2024.10.22 |