NIDS
공격 유형 힌트, 투표 수에 따른 심각도, 모델별 점수와 임계값, 핵심 특징(count, serror_rate, rerror_rate, src_unique_dst_ports …).
모든 모델은 같은 전처리를 공유합니다: 부호 보존 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 번들(탐지기 + 전처리기 + 임계값 + 특징 목록 + 지표)로 저장됩니다.
common(NSL-KDD 호환) 33개, extended 는 총 53개페이로드 내용 기반 특징(예: 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%도)는 단순한 패턴을 반영할 뿐 실제 성능이 아닙니다. 운영 전에 반드시 자체 정상 트래픽으로 기준선을 다시 학습하고 오탐률을 측정하세요.
공격 유형 힌트, 투표 수에 따른 심각도, 모델별 점수와 임계값, 핵심 특징(count, serror_rate, rerror_rate, src_unique_dst_ports …).
점수와 임계값, 표준화된 상위 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_threshold | 30 / 70 | 경보 / 차단에 필요한 누적 위험 점수 |
policy.half_life_seconds | 600 | 위험 점수 반감기(감쇠) |
policy.ttl_seconds / ttl_escalation / ttl_max_seconds | 3600 / 2.0 / 86400 | 첫 차단 TTL, 재범 시 배수, 상한 |
detectors.packet.scan_ports | 10초 내 20개 | 서로 다른 (목적지, 포트) 쌍 ⇒ 포트 스캔 |
detectors.packet.syn_threshold / udp_threshold | 5초 내 200 / 500 | 한 출발지의 SYN / UDP 패킷 수 ⇒ 플러드 |
detectors.authlog.fail_threshold | 60초 내 5회 | 한 IP 의 인증 실패 ⇒ SSH 무차별 대입 |
policy.quarantine_suspicious | false | “의심” 파일도 격리할지 여부(꺼짐: 오탐 위험) |
| 안전장치 | 동작 |
|---|---|
| 기본 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 사본을 보관하세요.
$ 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]$ 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 는 격리된 네트워크 네임스페이스에서 따로 검증했습니다.
| 위협 | 대응 |
|---|---|
| 노출 | 기본 127.0.0.1 바인드, 루프백이 아니면 토큰 필수. 원격에서는 SSH 터널 권장(UI 는 HTTPS 를 제공하지 않음) |
| 토큰 추측 / 타이밍 | 상수 시간 비교, HttpOnly + SameSite=Strict 쿠키 |
| DNS 리바인딩 | Host 헤더 허용 목록, 아니면 HTTP 400 |
| CSRF | POST 는 일치하는 Origin, JSON 콘텐츠 타입, X-CSRF-Token 필요 |
| XSS | textContent 만 사용, nonce 기반 CSP, 로그 값은 텍스트로 표시 |
| 경로 순회 | 보고서·정적 파일은 이름 허용 목록 / basename 만 |
| 의도치 않은 변경 | 해제·복구는 --allow-actions 필요, 방화벽에 집행된 항목의 해제는 --enforce + enforcement.allow 도 필요, 복원은 confirm=true 필요 |
| 책임 추적 | 모든 요청을 ui/access.jsonl 에 기록(쿼리스트링·토큰 제외) |
매뉴얼의 표 9 입니다. “합성”은 학습 데이터를 만든 것과 같은 생성기의 트래픽입니다. NSL-KDD 는 공식 KDDTest+ 이며 학습 세트에 없는 공격 유형(예: mscan, apache2, snmpguess)을 포함합니다.
| 데이터셋 | 모델 | 정확도 | 정밀도 | 재현율 | F1 | ROC-AUC | FPR |
|---|---|---|---|---|---|---|---|
| 합성(30% 홀드아웃) | Isolation Forest | 91.4% | 96.6% | 74.0% | 0.838 | 0.985 | 1.1% |
| 합성(30% 홀드아웃) | Random Forest | 100.0% | 100.0% | 100.0% | 1.000 | 1.000 | 0.0% |
| 합성(30% 홀드아웃) | LightGBM | 100.0% | 100.0% | 100.0% | 1.000 | 1.000 | 0.0% |
| 합성(30% 홀드아웃) | Autoencoder | 96.4% | 97.8% | 90.1% | 0.938 | 0.998 | 0.9% |
| NSL-KDD (KDDTest+) | Isolation Forest | 76.4% | 97.7% | 59.9% | 0.743 | 0.932 | 1.9% |
| NSL-KDD (KDDTest+) | Random Forest | 76.5% | 96.5% | 60.9% | 0.747 | 0.959 | 2.9% |
| NSL-KDD (KDDTest+) | LightGBM | 77.3% | 96.5% | 62.4% | 0.758 | 0.964 | 3.0% |
| NSL-KDD (KDDTest+) | Autoencoder | 79.8% | 97.4% | 66.4% | 0.789 | 0.953 | 2.4% |
솔직하게 읽는 법: NSL-KDD 의 정밀도는 96~98% 로 높지만 재현율은 60~66% 에 그칩니다. 학습에 없던 공격과 내용 기반 R2L/U2R 공격이 시험 세트에 많고 내용 특징은 제외했기 때문입니다. 합성 점수는 실제 정확도의 근거가 아닙니다.
모든 값은 매뉴얼의 합성 데이터 데모 실행에서 온 것입니다(매뉴얼 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 에서만 확인 |
--no-vt 를 사용하세요.