개요 — 무엇을 하나
보안 개요(/security)는 보안 역할 영역의 센터피스입니다. InfraGuard 가 수집·판정·자동조치까지 수행하지만 한 번도 시각화되지 않았던 "숨은 텔레메트리"를 하나의 방어 퍼널 서사로 표면화합니다.
핵심 메시지는 한 문장으로 요약됩니다 — "지금 이 순간에도 AI·IDS 자동 방어가 위협 네트워크를 막고 있습니다." 이를 위해 화면은 다음을 한 눈에 보여줍니다:
- 4단 방어 퍼널 — 위협(원시 이벤트) → 탐지(플래그) → 자동 대응 룰셋(카탈로그 규칙·JA3 룰셋) → 대응(차단). 각 단계에 실측 카운트를 표시.
- 위협 강도 게이지 — 보안 점수 기반 conic 도넛(높을수록 위험).
- 자동 대응 카드 — 시간당 위협·24h 위협·활성 차단 /24·24h 차단.
- JA3 오펜더 패널 — 최근 6시간 상위 JA3 핑거프린트 오펜더(자동화·봇넷 후보).
- 상위 위협 IP + 최근 자동 조치 피드(차단 근거 서사).
- 기간별 위협 추이 스파크라인.
모든 데이터는 읽기 전용이며 이 화면에서는 아무것도 차단·수정하지 않습니다. 실제 조작은 위협·차단 & 평판·탐지 화면에서 이뤄집니다.
이 화면의 "도메인"은 없습니다 — 보안 개요는 웹 TLD 가 아니라 역할 영역(보안 관제) 관점의 요약입니다.
언제 쓰나
- 하루 시작/교대 시 전체 보안 태세를 30초 안에 파악하고 싶을 때.
- 차단이 실제로 동작하는지 경영진·감사자에게 신뢰도 있게 설명해야 할 때(퍼널 카운트·자동 방어율).
- 위협이 급증했는지 추이 스파크라인으로 확인하고, 이상 IP 를 골라 위협·탐지 로 드릴다운할 때.
- JA3 봇넷/스캐너를 빠르게 훑고 상세 룰셋으로 넘어갈 때.
화면 구성
상단 — 위협 강도 게이지 + 방어 퍼널
| 영역 | 내용 |
|---|---|
위협 강도(t.ov.score) |
보안 점수를 conic-gradient 도넛으로 표시. UI 표기값 = 100 − score(높을수록 위험). 부제: "높을수록 위험 · 미조치로 남은 잔여 기준". |
방어 퍼널(t.ov.funnel_title) |
위→아래로 폭이 좁아지는 4단 스테이지 바. 각 스테이지에 실측 카운트 + 설명. |
중단 — 자동 대응 + 위협 추이
| 카드 | 내용 |
|---|---|
자동 대응(t.ov.resp_title) |
4개 지표 타일: 시간당 평균 위협 · 24시간 위협 · 활성 차단 /24 · 24h 차단. |
기간별 위협 추이(t.ov.tseries_title) |
IDS 경보를 30 버킷으로 다운샘플한 SVG 스파크라인. Σ 총합 · ▲ 최대/버킷분 메타 + 수집 지연(⏱ Nm) 배지. |
하단 — JA3 오펜더 · 상위 위협 IP · 최근 자동 조치
- JA3 시퀀스 분석(
t.ov.ai_title) — 최근 6시간 상위 오펜더를 3×3(최대 9) 카드로. 각 카드에 JA3 다양성·TLS 연결·SNI 다양성·국가/ASN/ISP·차단 여부 배지, 그리고 로테이션 바와 브라우저가t.ov.ai_behavior에서 고르는 행동 태그(읽는 사람의 언어를 따릅니다). IP 를 클릭하면 평판 팝업이 열리고, 룰셋 자체는 탐지 에 있습니다. - 상위 위협 IP(
t.ov.top_title) — 경보 수·심각도·시그니처 수·최종 관측·차단 여부·국가. - 최근 자동 조치(
t.ov.feed_title) — 최근 차단된 /24 대역의 국가·소스 태그(Kitsune/Suricata/수동)·근거 요약·시각.
헤더 컨트롤
- 조회 창 토글:
1h / 6h / 24h(기본 24h). - LIVE / PAUSED 토글: 30초 자동 폴링 on/off.
- 전체화면 버튼: 상단 네비를 숨기고 대시보드 모드(ESC 로 해제).
- stamp: 마지막 계산 시각.
사용법
- 상단 위협 강도 게이지로 현재 위험 수준을 파악합니다(값이 클수록 위험).
- 방어 퍼널을 위에서 아래로 읽으며 "얼마나 많이 들어와서(위협) → 얼마나 걸러졌고(탐지) → 몇 개 룰셋이 발화했으며(자동 대응) → 몇 건을 차단(대응)" 했는지 서사를 확인합니다.
- 위협 추이 스파크라인에서 급증 구간을 봅니다.
⏱ Nm배지가 크면 수집이 지연된 것이니 카운트를 그 시점 기준으로 해석합니다. - JA3 오펜더·상위 위협 IP 목록에서 의심 IP 를 골라 위협·탐지 로 넘어가 심층 조사·평판 조회·차단을 수행합니다.
- 최근 자동 조치 피드로 자동 방어가 방금 무엇을 왜 막았는지 확인합니다.
퍼널 단계의 정확한 정의
각 카운트는 선택한 조회 창(1h/6h/24h) 기준입니다. SecurityOverviewService::compute() 가 계산합니다.
| 단계 | 키 | 계산식 | 원천 |
|---|---|---|---|
| 위협 | threats |
alertCount + nginxSuspiciousCount |
suricata_alert_ct + nginx_meta_ct(is_suspicious=1) |
| 탐지 | detections |
distinctAlertIps + kitsuneBlockedCount |
distinct src_ip(suricata_alert_ct) + kitsune_detail_log(is_blocked=1) |
| 자동 대응 룰셋 | rulesets |
active rulesets + firing rulesets |
infr_sec_ruleset(status=active) + Rulesets 카탈로그(44) 중 발화한 수 |
| 대응 | response |
blockedCount |
blacklist_info(created_at ≥ 창) |
"자동 대응 룰셋" 카운트는 raw 시그니처(sid) 수가 아니라 룰셋 라이브러리와 동일한 "룰셋" 단위(RulebookService 재사용)로 셉니다. 그래서 44 카탈로그를 초과하지 않고 Rulesets 화면과 수치가 일치합니다.
자동 대응 카드 지표 정의
| 지표 | 의미 | 계산 |
|---|---|---|
| 시간당 평균 위협 | threats_hr |
앵커 기준 24h 경보 ÷ 24 |
| 24시간 위협 | threats_24h |
앵커 기준 24h alertCount |
| 활성 차단 /24 | active |
blacklist_info is_use=1 총 개수 |
| 24h 차단 | blocks_24h |
최근 24h blockedCount |
자동 대응 카드에는 "격리(자동)"·"국제공조(수동)" 항목이 카피로 존재하지만(
resp.isolate/resp.coop), 이 두 지표는 대응 툴 배치 후 집계되는 후속 단계입니다(현재는 위 4개 지표만 실집계).
위협 강도(보안 점수) 공식
공식은 Services\Security\PostureService 가 소유합니다(2026-09-04 개정). Overview 의 "보안 근거" 카드와 같은 숫자입니다:
score = weighted mean of ids, ai, web, rep, tls, fw # each metric 0..100
metric = 100 − 45 × open / (total + floor) # open = 0 -> metric = 100
displayed threat intensity = 100 − score # 0..45, higher = worse
open= 막았어야 하는데 못 막은 잔여,total= 같은 종류로 관측된 전부(차단분 포함), floor = 표본이 작을 때 비율이 폭주하지 않게 하는 평활 상수.- 잔여가 0 이면 그 지표는 100 입니다 — 아무리 많이 공격받아도 전부 막았다면 감점할 이유가 없습니다.
- 차단 판정은
blacklist_info(집행)와blacklist(스테이징)를 모두 봅니다. 자기 서버 대역은 분자·분모 양쪽에서 제외됩니다. - 구 공식은
kitsune_detail_log의 차단 건수와nginx_meta_ct의 의심 요청 수를 감점했기 때문에, 자동 방어가 성공할수록 점수가 떨어졌습니다. - 점수는 최저 55(=위협강도 최대 45)로 클램프됩니다.
데이터 소스
모든 위협/탐지/차단 카운트는 레거시 legacy_glory 커넥션의 대용량 텔레메트리 테이블을 읽기 전용으로 조회합니다. 접속 자격은 config('database.connections.legacy_glory')(=.env)만 사용하며 하드코딩하지 않습니다.
| 테이블 | 커넥션 | 용도 |
|---|---|---|
suricata_alert_ct |
legacy_glory | IDS 경보(위협·탐지·상위 위협 IP·추이). alert_ts 인덱스 |
nginx_meta_ct |
legacy_glory | 의심 웹요청(is_suspicious). idx_suspicious |
kitsune_detail_log |
legacy_glory | ML 이상탐지 차단(is_blocked) |
suricata_tls_ct |
legacy_glory | JA3 핑거프린트 시퀀스(JA3 오펜더) |
blacklist_info |
legacy_glory | 자동/수동 차단(/24 CIDR). 대응·활성 차단·피드 |
ip_info_loop |
legacy_glory | geo/ASN/ISP 인리치(ipEnrichment) |
infr_sec_ruleset |
앱(MAIN) | JA3 시퀀스 룰셋(활성 룰셋 카운트·요약) |
성능·신선도 규율
- 좁은 시간창 + 인덱스 + LIMIT 로만 조회(대용량 테이블 slow query 회피).
SecurityRepository가 쿼리빌더 + 파라미터 바인딩으로 격리합니다. - 앵커 = 최근 경보 시각(
latestAlertTs()=MAX(alert_ts)). eve_ingest 수집 지연으로now()가 데이터보다 앞설 때, 시계열·24h 통계를 이 앵커 기준으로 잡아 "빈 꼬리"를 제거합니다. 지연이 5분 초과면⏱ Nm배지로 표시. - 30초 캐시: 결과는
infr:sec:ov:{range}키로 30초 캐시되어 30초 폴링과 맞물립니다. 개별 읽기 실패는safe()로 흡수되어 한 영역 오류가 전체 퍼널을 막지 않습니다.
SecurityScope — 자기망 자동 제외
상위 위협 IP·JA3 오펜더 목록은 우리 서버 IP 가 공격자로 오르는 오탐을 제거하기 위해 자기망을 자동 제외합니다(하드코딩 금지).
SecurityScope::excludePrefixes()가 등록 인스턴스(infr_instance의 공인/사설/NIC IP → /24 접두) + 운영정책 화이트리스트(internal_networks— IP·접두·CIDR)를 통합해 접두 배열을 만듭니다.- 이 접두는 쿼리에서
src_ip NOT LIKE '접두%'(파라미터 바인딩)로 적용됩니다. - 매처는 60초 캐시되며 운영 정책 저장 시 무효화됩니다.
예) infr_instance 에 203.0.113.10 등록 → 접두 "203.0.113." 자동 제외
OpsPolicy internal_networks 에 10.0.0.0/8 추가 → CIDR → "10." 접두 근사 제외
우리 서버가 위협·오펜더 목록에 계속 뜬다면, 그 IP 를 Assets ▸ Instances 에 등록하거나 운영 정책의
internal_networks화이트리스트에 추가하세요. 자동으로 목록에서 빠집니다.
권한
- 이 화면을 포함한
/security/*전 구간은infr.level:2미들웨어로 보호됩니다 —user_level ≥ 2여야 접근할 수 있습니다. - 따라서 데모(1) 계정은 보안 정보 조회가 차단되고, 스탭(5)·관리자(10) 는 접근 가능합니다.
- 보안 개요는 완전 읽기 전용입니다 — 쓰기·차단·수정 액션이 없으므로 별도의 상위 게이트나 감사 로그가 필요 없습니다. 실제 차단/해제는 차단 & 평판(쓰기 level≥2 + 감사)에서 수행합니다.
문제해결 · FAQ
Q. 퍼널 카운트가 모두 0 입니다.
선택 창(1h/6h/24h)에 데이터가 없거나 legacy_glory 연결이 끊겼을 수 있습니다. 24h 로 넓혀 보고, ⏱ 지연 배지가 매우 크면 수집기(eve_ingest·kts_tx·srct_tx)가 멈춰 데이터가 오래된 것입니다.
Q. 우리 회사 서버 IP 가 상위 위협/오펜더에 뜹니다.
자기망 제외가 안 된 것입니다. 해당 IP 를 Instances 에 등록하거나 운영 정책의 internal_networks 에 추가하세요(SecurityScope 가 /24 접두로 자동 제외).
Q. "자동 대응 룰셋" 숫자가 룰셋 라이브러리와 다릅니다.
룰셋 단은 active rulesets + firing rulesets입니다. JA3 시퀀스 룰셋(infr_sec_ruleset active)이 더해지므로 순수 카탈로그 발화 수보다 클 수 있습니다.
Q. 룰셋에 action=block 이라고 적혀 있는데 차단되지 않았습니다.
그 필드는 권고이지 명령이 아닙니다. 자동 차단은 suricata_tls_ct 에서 JA3 로테이션을 직접 계산하며 infr_sec_ruleset 을 읽지 않습니다. 실제 차단은 차단 목록 에서 하거나 자동 차단 스케줄러가 수행합니다. 탐지 참조.
Q. 위협 강도가 항상 낮게(≤45) 나옵니다.
정상입니다. 표기값은 100 − score이고 score 는 최저 55 로 클램프되므로 위협 강도는 0~45 범위입니다.
Q. 수치가 30초마다 조금씩 튑니다. 30초 폴링 + 30초 캐시 조합이라 매 폴링마다 최신 창으로 재계산됩니다. LIVE 를 끄면 자동 갱신이 멈춥니다.
관련 항목
- 위협 (Threats) — IDS 위협 엔티티 트리아지·IP 드릴다운·차단 연결.
- 탐지 + JA3 — 탐지 알고리즘 서사와 JA3 시퀀스 룰셋(온디맨드 분석).
- 룰셋 라이브러리 — 44 탐지 룰셋 카탈로그(발화 룰셋 카운트의 정본).
- 차단 & 평판 (Blocklist) — blacklist_info 자동 방어 서사 + 차단/해제 제어.
- 운영 정책 —
internal_networks화이트리스트(SecurityScope 자기망 제외). - IP 평판 조회 — AbuseIPDB 인앱 팝업.

