InfraGuard

개요(Overview) 랜딩 읽기

가용성·보안 합성 스코어, KPI 카드, 탐지 도넛, 풀폭 서버 스트립을 한 화면에서 읽고 라이브로 갱신되는 통합 관제 랜딩입니다.

개요 — 무엇을 하나

개요(Overview) 는 로그인 후 처음 만나는 통합 관제 랜딩(/)입니다. 가용성(availability)과 보안(security)을 하나의 화면에서 관통해 보여 줍니다 — 상단은 헬스 스코어·KPI·탐지, 하단은 서버 함대의 부하/메모리/네트워크/스토리지 시계열 스트립입니다.

핵심 특징:

모든 수치는 수집기가 Laravel 밖에서 직접 DB에 적재한 실데이터입니다. 레거시 DB가 미가용이거나 데이터가 없으면 컨트롤러가 구조가 동일한 mockup(데모) 으로 graceful fallback 하며, 이때 source 는 mockup, rev 는 0 이라 프론트는 재렌더를 건너뜁니다.

언제 쓰나

화면 구성

상단 히어로

제목·태그라인("즉시 대응 · 자동 준비 · 상시 복원") + 우측에 수집 시각(stamp)·호스트 수, LIVE/PAUSED 토글, 전체 화면 버튼.

헬스 스코어(좌)

가용성·보안 두 개의 도넛 게이지 + 그 아래 근거자료 2열:

열 6 심볼(호버 툴팁) 점수 원천
가용성 근거 통신·부하·메모리·디스크·RAID·백업 aggregate() 의 avail_parts(지속 인지 합성 0~100)
보안 근거 IDS·AI·웹·방화벽·평판·TLS PostureService(24h 미조치 잔여 비율을 건전성 점수로 정규화)

각 심볼은 metric_cls 로 색이 정해집니다: 90↑ 정상(good) · 70↑ 주의(warn) · 그 미만 위험(crit) · 데이터 없음은 —(na).

KPI 카드(중앙 3×2 + 조건부 2)

카드 값 부제
서버 온라인/전체 오프라인 수 또는 "전체 온라인"
부하 피크 가시 화면 최대 load 호스트 · "N분 전"
메모리 피크 가시 화면 최대 mem% 호스트 · "N분 전"
네트워크 피크 최대 pkts(In/Out 중 큰 값) 호스트 · "N분 전"
위협 미해결(=Kitsune 차단) 오늘 차단 수
백업 14일 성공률 % 24h 실행 수 · 마지막 경과 · 우세 유형
웹 서비스(조건부) 가동/전체 최대지연 호스트·ms
데이터베이스(조건부) 가동/전체 부하 최상위 DB · 24h slow · 대기

Load/Memory/Network 피크는 프론트에서 "현재 가시 화면(current_servers)의 시리즈 max" 로 계산됩니다. 즉 분할·페이지를 바꾸면 피크 카드의 대상 서버 집합도 바뀝니다. "N분 전" 라벨은 그 피크가 처음 관측된 seq 위치(times[idx])를 역산한 값입니다.

서비스 성능 패널(우)

웹 1개 + DB 1개를 골라 컴팩트 게이지로 표시합니다(폭주 1개가 평균에 묻히지 않도록 합산하지 않고 개별). 드롭다운(다른 서비스 선택)으로 대상 교체:

탐지 도넛(우)

24시간 탐지를 4분류(IDS/AI/웹/스캔)로. ECharts 도넛 + HTML 레전드(이름·압축수치·점유바).

하단 — 풀폭 서버 스트립

서버 통계 툴바(RAID 상태 칩·여유<1G 칩·높이 슬라이더·범위 라벨·시간창 토글·분할 버튼) 아래에 4개 스트립:

사용법

  1. 게이지부터 — 가용성/보안 두 점수의 색을 봅니다. 낮으면 아래 근거 6 심볼 중 붉은(crit)/노란(warn) 칸에 마우스를 올려 어떤 축이 감점됐는지 확인.
  2. KPI 카드 — 오프라인 서버·위협·백업 성공률 등 이상치를 훑습니다. 피크 카드의 "N분 전"으로 이벤트 시점을 잡습니다.
  3. 시간창 전환 — 하단 우측 6h·24h·3d 버튼으로 스트립 창을 바꿉니다. 선택은 localStorage(infr:range:overview)에 저장되고, 서버에 range 파라미터로 재조회됩니다. KPI·헬스 게이지는 24h 개념으로 고정입니다(스트립만 창이 바뀜).
  4. 화면 분할 — 전체·2·3 버튼으로 서버 함대를 나눠 페이지(◀▶)로 넘깁니다. 여러 모니터에 배치할 때 유용.
  5. 높이·스케일 — 슬라이더로 스트립 높이(80~360px)를, 각 스트립의 Lin/Log 로 y축 스케일을 조절(sol 같은 스파이크 호스트 대비).
  6. 라이브/전체 화면 — 히어로의 LIVE 토글로 폴링을 켜고 끄고, 전체 화면 으로 상단 메뉴바를 숨겨 관제 벽 모드로.

범위 → 포인트 수

하단 스트립 시간창은 server_status 수집 주기(≈5분)를 기준으로 seq 포인트 수로 환산됩니다.

range seq 포인트
6h 72
24h 288 (기본)
3d 864

라이브 갱신(폴링) 동작

30초마다  ──▶  GET /overview/rev   (값싼 최신 seq)
                   │  rev 변동?
                   ├─ 아니오 → 스킵(대역폭 0)
                   └─ 예 → GET /overview/live?range=<창>  → 데이터만 교체 + 차트 재렌더

데이터 소스

전부 읽기 전용입니다. 신규 앱은 레거시 리소스 테이블을 그대로 읽습니다(§리소스 read verbatim).

축 테이블 / 서비스 커넥션 용도
서버 함대·시계열 server_status(loadavg·free·df-*·traffic-out) legacy(MAIN) 부하·메모리·디스크·네트워크 스트립, 통신 판정
RAID storage_status(status_summary) legacy Optimal/Degraded/Failed 근거
백업 backup_history legacy 14일 성공률·마지막·유형
IDS suricata_alert_ct legacy_glory 탐지 도넛·보안 근거(sev 1·2)
AI 이상탐지 kitsune_detail_log(is_blocked) legacy_glory 탐지·위협·보안 근거
웹 공격 nginx_meta_ct(is_suspicious) legacy_glory 탐지·의심 요청 비율
평판·차단 blacklist_info legacy_glory 오늘 차단·신규 차단 압력
TLS 위생 suricata_tls_ct(version) legacy_glory 약한 TLS(<1.2) 비율
웹 서비스 성능 WebMetricService::dashboard()(infr_web_metric) 중앙 웹 KPI·성능 패널
DB 성능 DbCollectorService::latest()·infr_db_metric·infr_collector(access=database) 중앙 DB KPI·성능 패널
방화벽 노출 FirewallService::dashboard()(infr_instance_firewall) 중앙 보안 근거 fw

합성 스코어 공식

가용성 = 데이터 있는 지표만 가중평균(가중치 재정규화). 각 축은 표시 창 전체를 보고 "얼마나 오래(지속)·얼마나 심하게(피크)" 위반했는지로 감점합니다.

축 가중치 감점 기준
통신(live) 0.30 첫 보고 이후 무응답 구간 비율
부하(load) 0.15 load avg 8 이상 침범(16↑ 완전 과부하)
메모리(mem) 0.15 사용률 99% 초과(100% 완전 압박)
디스크(disk) 0.15 루트 여유 1G 미만(실측 파티션만, 0G 완전 위험)
RAID 0.15 Degraded/Failed 노드는 0점
백업 0.10 14일 성공률

보안 = 6 근거의 가중평균(존재 지표만). 각 지표는 24h glory 실측을 건전성 점수(0~100)로 정규화 — 볼륨/비율이 커질수록 감점(최대 감점 45 → 하한 55). 전 지표 미가용 시에만 detections() 휴리스틱 스칼라로 폴백.

지표 가중치 원천(24h) 만점 감점 도달
ids 0.22 고심각(sev 1·2) IDS 경보 수 200건
ai 0.22 Kitsune 차단 수 500건
web 0.20 nginx 의심 요청 비율% 8%
rep 0.14 오늘 신규 차단 IP 수 400건
tls 0.12 약한 TLS(<1.2) 비율% 5%
fw 0.10 공인 IP 치명 포트×2 + 치명 + 미등록 노출 200

캐시 TTL

대상 TTL 키
Overview 실데이터(build) 30s infr:overview:data:v1:{points}
서비스 성능 패널(web/db) 15s infr:ov:perf
보안 근거(PostureService) 300s infr:sec:posture:v1:<range>

권한

문제해결 · FAQ

Q. 게이지·카드에 데모 같은 값이 뜹니다. 레거시 DB(legacy/legacy_glory) 연결 실패 또는 데이터 부재 시 mockup fallback 입니다. payload 의 source 가 mockup 이고 rev 가 0 이면 실 DB 미가용 상태입니다. DB 접속·수집기 적재를 점검하세요(Admin ▸ Collectors).

Q. 근거 심볼이 — 로 나옵니다. 해당 축의 데이터가 없다는 뜻(가중치에서 제외됨)입니다. 예: 방화벽 CMDB(infr_instance_firewall)가 비어 있으면 fw 가 —, firewall_status 대신 새 방화벽 자산이 필요합니다. RAID 는 매칭되는 storage_status.host 가 없으면 제외됩니다.

Q. 데이터가 안 갱신됩니다. (1) 히어로 토글이 PAUSED 인지, (2) 탭이 백그라운드인지(숨김 중 폴링 정지) 확인. 수집기는 Laravel 밖에서 약 5분 주기로 적재하므로 30초 폴링이라도 실제 값은 최대 수 분 지연될 수 있습니다. rev 가 바뀌지 않으면 무거운 payload 를 가져오지 않습니다.

Q. 부하 피크 서버가 화면마다 다릅니다. 피크는 현재 가시 화면(분할·페이지)의 서버 집합 기준으로 계산됩니다. 전 서버 기준으로 보려면 분할을 전체 로 두세요.

Q. 네트워크 In 이 항상 0 입니다. server_status 에 per-alias inbound 소스가 없어 net_in 은 0 으로 채워지고 traffic-out(packets)만 실측 표시됩니다. 상세 대역폭은 Traffic(네트워크 I/O)에서 확인하세요.

Q. 시간창을 바꿔도 KPI·게이지가 그대로입니다. 정상입니다. range(6h/24h/3d)는 하단 스트립에만 적용되고, KPI·헬스 게이지는 24h 고정 개념입니다.

관련 항목

개요 — 헬스 스코어·근거 심볼·서버 통계
개요 — 헬스 스코어·근거 심볼·서버 통계