기술

모델, 데이터, 안전 — 숨김없이

내부에 무엇이 있는지, 어떤 공개 데이터셋을 지원하는지(그리고 어떤 것이 벤치마크 전용인지), 판정을 어떻게 설명하는지, 탐지와 조치 사이에 어떤 안전장치가 있는지 공개합니다.

AI 모델

NIDS 모델 앙상블

모든 모델은 같은 전처리를 공유합니다: 부호 보존 log1p 변환 후 StandardScaler(꼬리가 긴 바이트·횟수 값을 압축).

모델학습점수임계값강점 / 약점
Isolation Forest비지도 — 정상 데이터만−score_samples정상 점수의 99 백분위수라벨 불필요, 빠름 / SYN 플러드처럼 밀집한 공격은 놓칠 수 있음
Random Forest지도 — 정상 + 공격공격 확률0.5높은 정확도, 특징 중요도 / 학습에 없던 공격에 약함
LightGBM지도공격 확률0.5대용량에서 빠름 / 라벨 의존
Autoencoder (PyTorch)비지도 — 정상만재구성 MSE정상 오차의 99 백분위수비선형 이상 포착 / 분포 변화에 민감(오탐 가능)

그 밖의 모델: HIDS = Isolation Forest(특징 26개), 정적 악성코드 = XGBoost(PE 특징 55개) + SHAP, 행위 = Random Forest(샌드박스 보고서 특징 39개). 모델은 joblib 번들(탐지기 + 전처리기 + 임계값 + 특징 목록 + 지표)로 저장됩니다.

특징

모델이 보는 것

  • 33 + 20NIDS 플로우 특징common(NSL-KDD 호환) 33개, extended 는 총 53개
  • 26HIDS 로그 특징시간, 길이, 토큰, 키워드, 희소도, IP별 창
  • 55정적 PE 특징헤더, 섹션, 엔트로피, 임포트, 문자열
  • 39행위 특징Cuckoo/CAPE 보고서 기반, 샘플은 실행하지 않음

페이로드 내용 기반 특징(예: hot, num_failed_logins)은 의도적으로 제외하며, 플로우 통계만 저장합니다.

데이터셋

지원 데이터셋과 각각의 용도

데이터셋마다 특징 체계가 달라, 실시간·pcap 탐지에 쓸 수 있는 모델과 오프라인 벤치마크 모델을 분리해 둡니다.

데이터셋용도특징 체계실시간 / pcap 탐지
NSL-KDD
(UNB CIC)
NIDS 학습·벤치마크. 학습 125,973건 / 시험(KDDTest+) 22,544건common 33개(변환)가능
UNSW-NB15
(UNSW Canberra)
오프라인 벤치마크. 학습 175,341건 / 시험 82,332건native(원본 숫자 컬럼)불가 — 특징 불일치, 로드 시 차단
CIC-IDS2017
(UNB CIC)
오프라인 벤치마크. 요일별 CSV 8개, 약 280만 플로우native(CICFlowMeter 컬럼)불가 — CICFlowMeter 를 캡처 엔진으로 쓰면 준실시간 채점 가능
EMBER 2017/2018
(Elastic)
원시 특징 JSONL 로 정적 악성코드 학습(바이너리 없음)PE 특징 55개(변환, 결측 = NaN)스캐너에서 사용
SOREL-20M
(Sophos / ReversingLabs)
대규모 정적 학습: EMBER v2 특징의 약 2천만 PE. LMDB → JSONL 로 내보내고 라벨은 meta.db 에서EMBER v2 원시 JSON스캐너에서 사용. 특징만 사용 — 바이너리는 실제 악성코드
합성 · 자체 기준선파이프라인 검증, 자체 정상 pcap / 로그로 만드는 비지도 기준선extended 53 / common 33가능

합성 데이터는 파이프라인 검증용일 뿐입니다. 높은 점수(100%도)는 단순한 패턴을 반영할 뿐 실제 성능이 아닙니다. 운영 전에 반드시 자체 정상 트래픽으로 기준선을 다시 학습하고 오탐률을 측정하세요.

설명 가능성

모든 경보는 이유를 말합니다

NIDS

공격 유형 힌트, 투표 수에 따른 심각도, 모델별 점수와 임계값, 핵심 특징(count, serror_rate, rerror_rate, src_unique_dst_ports …).

HIDS

점수와 임계값, 표준화된 상위 3개 특징. 예: ip_fail_window + ip_unique_users_window → 무차별 대입.

정적 악성코드

로그오즈 단위의 SHAP 기여도: 양수는 악성 쪽, 음수는 정상 쪽. 일치한 YARA 규칙과 사유도 함께.

방어 정책

모든 차단에 위험 점수와 근거(예: 10초 내 distinct_ports 20, 60초 내 실패 5회)가 list-blocks, 감사 로그, 보고서에 남습니다.

판정 로직

점수가 판정이 되는 방식

설정기본값의미
malware.verdict 가중치static_ml 0.9 · yara 1.0 · virustotal 1.0 · dynamic 0.9종합 = max(신호 × 가중치). 0.8 이상 악성, 0.5 이상 의심
policy.alert_threshold / block_threshold30 / 70경보 / 차단에 필요한 누적 위험 점수
policy.half_life_seconds600위험 점수 반감기(감쇠)
policy.ttl_seconds / ttl_escalation / ttl_max_seconds3600 / 2.0 / 86400첫 차단 TTL, 재범 시 배수, 상한
detectors.packet.scan_ports10초 내 20개서로 다른 (목적지, 포트) 쌍 ⇒ 포트 스캔
detectors.packet.syn_threshold / udp_threshold5초 내 200 / 500한 출발지의 SYN / UDP 패킷 수 ⇒ 플러드
detectors.authlog.fail_threshold60초 내 5회한 IP 의 인증 실패 ⇒ SSH 무차별 대입
policy.quarantine_suspiciousfalse“의심” 파일도 격리할지 여부(꺼짐: 오탐 위험)
안전 우선 집행

탐지와 조치 사이의 열 가지 안전장치

안전장치동작
기본 dry-run옵션이 없으면 할 일을 기록만 하며 시스템은 그대로
이중 게이트--enforce 와 enforcement.allow: true 가 모두 필요하며, 하나만 있으면 dry-run 유지
허용 목록사설 대역, 자기 주소, 게이트웨이, DNS, 접속 중인 SSH 클라이언트, 사용자 CIDR 은 절대 차단하지 않음
TTL(자동 해제)차단은 기본 1시간 후 만료, 재범은 ×2 로 최대 24시간
동시 차단 상한max_blocks(기본 200). 초과하면 기록만 함
전용 테이블 / 체인규칙은 aisec_defense 에만 추가되고, 롤백은 그것만 삭제 — 다른 규칙은 건드리지 않음
롤백defend rollback 또는 --rollback-on-exit 로 모든 조치를 원복
해시 체인 감사 로그각 기록에 이전 기록의 SHA-256 을 포함하며 verify-audit 로 변조 탐지
파괴적 조치 꺼짐프로세스 종료·계정 잠금은 설정 + --enforce 가 필요하고, 파일은 삭제하지 않고 격리만 함
격리 ≠ 삭제권한 000 으로 이동하고 원본 해시·경로를 보관하며, 복원에는 --yes 필요

권장 순서: 며칠간 dry-run 관찰 → 허용 목록 정리(관리자 IP 추가) → 그 후에 집행 활성화. 원격 시험 시에는 콘솔 접근(IPMI / 클라우드 콘솔)을 확보해 두세요.

감사 체인

변조를 탐지할 수 있을 뿐, 변조를 막지는 못합니다

실행했든 dry-run 이든 모든 조치는 prev_hash 와 hash 와 함께 audit.jsonl 에 추가됩니다. 체인은 로테이션된 파일까지 이어지며 verify-audit 가 모두 읽습니다. 수정은 탐지하지만 파일 전체를 다시 쓰는 공격자는 막을 수 없으므로 원격 또는 WORM 사본을 보관하세요.

verify-audit: 정상 체인과 일부러 수정한 사본

$ python main.py defend verify-audit
OK   audit.jsonl  records=4  OK

# audit.jsonl 2번째 줄을 일부러 수정한 사본에서 (on a deliberately edited copy, line 2 modified):
FAIL audit.jsonl  records=1  2번째 줄 해시 불일치(내용 변조 의심)      [exit code: 1]

self-test: 16개 중 16개 통과(발췌)

$ python main.py defend self-test
[PASS] 집행 이중 게이트: --enforce 만으로는 dry-run  (mode=dry-run)
[PASS] 공격자 3명 탐지·(가상)차단  (blocked=['203.0.113.50', '203.0.113.60', '203.0.113.77'])
[PASS] dry-run: 파일이 이동되지 않음
[PASS] dry-run: 방화벽 백엔드 없음  (backend=None)
[PASS] 감사 로그 해시 체인 정상  (records=4 OK)
[PASS] 정상 트래픽 오탐 없음  (events=0)
[PASS] 허용 목록(루프백)은 차단되지 않음  (blocks=0)
[PASS] 롤백: 모든 차단 해제 + teardown  (calls=13)
  … (16 checks in total / 총 16개 항목)
결과: 16/16 통과

집행 점검은 내장 가상 방화벽을 사용했고, 실제 nft/iptables 는 격리된 네트워크 네임스페이스에서 따로 검증했습니다.

모니터링 UI 보안

대시보드는 어떻게 보호되는가

위협대응
노출기본 127.0.0.1 바인드, 루프백이 아니면 토큰 필수. 원격에서는 SSH 터널 권장(UI 는 HTTPS 를 제공하지 않음)
토큰 추측 / 타이밍상수 시간 비교, HttpOnly + SameSite=Strict 쿠키
DNS 리바인딩Host 헤더 허용 목록, 아니면 HTTP 400
CSRFPOST 는 일치하는 Origin, JSON 콘텐츠 타입, X-CSRF-Token 필요
XSStextContent 만 사용, nonce 기반 CSP, 로그 값은 텍스트로 표시
경로 순회보고서·정적 파일은 이름 허용 목록 / basename 만
의도치 않은 변경해제·복구는 --allow-actions 필요, 방화벽에 집행된 항목의 해제는 --enforce + enforcement.allow 도 필요, 복원은 confirm=true 필요
책임 추적모든 요청을 ui/access.jsonl 에 기록(쿼리스트링·토큰 제외)
시험 결과

측정 결과 — 실험실 수치이며 운영 성능이 아닙니다

매뉴얼의 표 9 입니다. “합성”은 학습 데이터를 만든 것과 같은 생성기의 트래픽입니다. NSL-KDD 는 공식 KDDTest+ 이며 학습 세트에 없는 공격 유형(예: mscan, apache2, snmpguess)을 포함합니다.

NIDS 학습 평가(매뉴얼 v1.1)
데이터셋모델정확도정밀도재현율F1ROC-AUCFPR
합성(30% 홀드아웃)Isolation Forest91.4%96.6%74.0%0.8380.9851.1%
합성(30% 홀드아웃)Random Forest100.0%100.0%100.0%1.0001.0000.0%
합성(30% 홀드아웃)LightGBM100.0%100.0%100.0%1.0001.0000.0%
합성(30% 홀드아웃)Autoencoder96.4%97.8%90.1%0.9380.9980.9%
NSL-KDD (KDDTest+)Isolation Forest76.4%97.7%59.9%0.7430.9321.9%
NSL-KDD (KDDTest+)Random Forest76.5%96.5%60.9%0.7470.9592.9%
NSL-KDD (KDDTest+)LightGBM77.3%96.5%62.4%0.7580.9643.0%
NSL-KDD (KDDTest+)Autoencoder79.8%97.4%66.4%0.7890.9532.4%

솔직하게 읽는 법: NSL-KDD 의 정밀도는 96~98% 로 높지만 재현율은 60~66% 에 그칩니다. 학습에 없던 공격과 내용 기반 R2L/U2R 공격이 시험 세트에 많고 내용 특징은 제외했기 때문입니다. 합성 점수는 실제 정확도의 근거가 아닙니다.

추가 실험실 수치

엔드투엔드 데모 결과(합성 데이터)

  • P 1.000 · R 0.960NIDS 데모 pcap, 4개 모델 다수결플로우 1,722개 중 경보 960건, F1 0.980, FPR 0.000. 놓친 것: SSH 무차별 대입 플로우(40개 중 0개 탐지)
  • P 1.0 · R 0.769HIDS 데모 로그이상 줄 52개 중 40개 탐지, 오탐 0건, 초기 무차별 대입 시도는 놓침
  • F1 0.972정적 악성코드 모델(합성 PE)정확도 97.2%, ROC-AUC 0.982, FPR 2.7%
  • ≈ 2,700 pps4개 모델 pcap 재생 속도병목은 Scapy 이며 고속 링크에는 eBPF/XDP, AF_PACKET, PF_RING, DPDK, Zeek/Suricata, CICFlowMeter 를 사용

모든 값은 매뉴얼의 합성 데이터 데모 실행에서 온 것입니다(매뉴얼 6~7, 9, 10장). 파이프라인이 동작함을 확인하는 수치이며, 어떤 숫자든 신뢰하기 전에 자체 기준선으로 재학습하세요.

검증 현황

검증한 것과 검증하지 못한 것

매뉴얼 21장에서 가져왔습니다. 방어 제품은 근거를 분명히 해야 하므로 공개합니다.

항목상태
nftables / iptables 차단, 해제, TTL, 속도 제한, 정리격리된 사용자+네트워크 네임스페이스에서 실제 명령과 실제 TCP 연결로 검증됨(호스트 네트워크는 건드리지 않음)
실제 nft 를 쓴 엔진 엔드투엔드같은 네임스페이스에서 검증됨: 공격자 차단, 연결 시간 초과, 감사 기록, 롤백 후 연결 복구
pcap 재생, 로그 추적, 파일 감시, CLI, 실제 HTTP 의 UI검증됨(UI: 실제 HTTP 서버와 요청, 방화벽은 가상 백엔드)
실시간 패킷 스니핑(--iface, root)시험하지 못함(비 root 환경). 같은 탐지 코드는 pcap 재생으로 시험
Windows netsh 차단모의로만 확인 — 명령 문자열만 검증, 실제 Windows 없음
프로세스 종료 / 계정 잠금모의로만 확인 — 가짜 os.kill / 가짜 실행기, 게이트와 보호 이름은 검증
systemd 서비스 예시, webhook / syslog 전송시험하지 못함
대용량 트래픽 성능, 장기 안정성시험하지 못함 — 도입 후 dropped 카운터를 확인
대시보드의 브라우저 호환성헤드리스 Chrome 에서만 확인
한계와 유의 사항

도입 전에 한계를 알아두세요

기술적 한계

  • 합성 데이터의 수치는 기능 검증용이며 실제 성능이 아닙니다.
  • NSL-KDD 는 1998년 트래픽 기반이고, UNSW-NB15 / CIC-IDS2017 도 수집 환경의 편향이 있습니다.
  • 플로우 통계만 보므로 TLS 안의 공격(SQLi, XSS)은 WAF / EDR 이 필요합니다.
  • 2초 / 100연결 창을 넘는 느린 스캔과 널리 분산된 공격은 놓칠 수 있습니다.
  • ML 탐지기는 적대적 조작으로 회피될 수 있으므로 다층 방어를 하세요.
  • 백업, 스캐너, NAT 공유 사용자, CDN 은 오탐을 만들 수 있으니 먼저 dry-run 으로 관찰하세요.
  • joblib/pickle 모델은 로드 시 코드를 실행할 수 있으므로 신뢰할 수 있는 모델만 사용하세요.
  • 감사 해시 체인은 수정은 탐지하지만 전체 재작성은 막지 못합니다.
  • 실제 차단은 Linux 에서만 검증되었습니다.

법적·윤리적 유의

  • 본인이 소유했거나 서면으로 명시적 허가를 받은 시스템·네트워크에서만 사용하세요. 무단 패킷 캡처나 차단은 통신비밀보호법, 정보통신망법 등 관련 법령 위반이 될 수 있습니다.
  • 패킷과 로그에는 개인정보(IP, 계정명)가 있을 수 있으므로 관련 개인정보 보호 법령에 따라 목적, 보존, 접근을 정하세요. 저장되는 것은 플로우 통계뿐입니다.
  • 실제 악성코드 샘플은 격리된 환경에서만 다루세요. 이 도구는 샘플을 실행하거나 업로드하지 않습니다.
  • VirusTotal 조회는 파일 해시를 외부로 보냅니다. 조직 정책을 확인하고 필요하면 --no-vt 를 사용하세요.
  • 탐지 결과는 의사결정 보조이며, 차단·징계·신고 전에 사람이 검토해야 합니다.
  • 방어 목적으로만 사용하며 공격용 개조는 금지됩니다.
  • 소프트웨어는 보증 없이 있는 그대로 제공됩니다.

귀사 환경에 대해 이야기해 주세요

네트워크, 호스트, 제약 사항을 알려 주시면 dry-run(모의 실행) 우선의 시범 도입 계획을 제안드립니다. 부담 없이 문의하세요.