AI 기반 보안 탐지는 정확도는 높지만 "왜 이걸 공격/악성으로 판단했는가?"를 설명하지 못하는
블랙박스(black box) 문제가 있습니다. 보안 관제사(SOC analyst)는 근거 없는 경보를 신뢰하기 어렵고,
규제·감사도 설명을 요구합니다. XAI(eXplainable AI, 설명가능 인공지능)는 이 "왜?"에 답하는 기술입니다.
이 문서는 XAI 기법을 깊이 파고들고(SHAP·LIME·Integrated Gradients·Grad-CAM…), 침입탐지·악성코드 분류에서의 실제 활용,
그리고 보안 장비(VPN·Firewall·NAC)에 붙일 만큼 완성도 높은 오픈소스를 정리합니다.
함께 보면 좋은 문서
이 글은 "DDoS 탐지 방법"·"AI 기반 DDoS 탐지" 문서에서 다룬 머신러닝·딥러닝 탐지의 "설명" 계층을 깊게 확장합니다.
탐지 모델(RandomForest·CNN·LSTM 등)을 안다는 전제로 진행합니다.
목차
왜 XAI인가 — 보안에서 블랙박스의 문제
XAI 큰 그림 — 4개의 축
기법 딥다이브 ① SHAP
기법 딥다이브 ② LIME
기법 딥다이브 ③ Integrated Gradients · DeepLIFT
기법 딥다이브 ④ Grad-CAM (악성코드 이미지)
기법 딥다이브 ⑤ Attention · Anchors · Counterfactual
침입탐지(IDS)에서의 XAI 활용
악성코드 분류에서의 XAI 활용
XAI가 주는 실제 가치
한계와 함정 (반드시 알아야 할 것)
오픈소스 XAI 프로젝트 딥다이브
보안 장비(VPN·Firewall·NAC) 통합 아키텍처
용어 설명
참고 자료
1. 왜 XAI인가 — 보안에서 블랙박스의 문제
딥러닝 기반 탐지 모델은 "이 트래픽/파일은 악성"이라고 답은 주지만 이유는 주지 않습니다.
보안에서는 이 "이유"가 없으면 다음이 무너집니다.
신뢰(Trust) — 관제사가 근거 없는 경보를 믿고 조치하기 어렵다.
대응(Action) — 왜 위험한지 알아야 정확히 차단·격리·조사할 수 있다.
오탐 분석 — 정상을 왜 공격으로 봤는지 알아야 모델을 고친다.
규제·감사 — EU AI Act, GDPR의 "설명 요구권" 등 법·감사 대응.
그림 1. 블랙박스 문제 — 답은 주지만 이유가 없다. XAI는 이 "왜?"를 채워 신뢰·대응·감사를 가능하게 한다. [확대]✕
2. XAI 큰 그림 — 4개의 축
XAI 기법은 네 가지 축으로 구분하면 지형이 한눈에 들어옵니다.
그림 2. XAI 4개 축 — 내재적/사후, 국소/전역, 모델무관/특화, 설명 형태. 기법 선택의 좌표계. [확대]✕
3. 기법 딥다이브 ① SHAP 보안에서 가장 많이 쓰임
SHAP(SHapley Additive exPlanations)는 협력 게임 이론의 Shapley value에서 왔습니다.
아이디어: "각 피처(feature)가 예측이라는 이익에 평균적으로 얼마나 기여했는가"를,
피처들의 모든 조합(coalition)에 대해 넣었을 때와 뺐을 때의 차이(marginal contribution)를 평균해 계산합니다.
핵심 성질: 가산성(Additive) — 모든 피처의 SHAP 값 합 + 기준값(base) = 최종 예측. 그래서 "각 피처가 +/-로 얼마나 밀었는지"가 정확히 분해됩니다. 또 국소·전역 설명을 모두 제공합니다.
그림 3. SHAP force plot 개념 — 예측을 피처별 +/- 기여로 분해. IDS에서 "왜 이 flow가 공격인지" 한눈에 설명된다. [확대]✕
SHAP의 변종 (보안 실무에서 중요)
변종
대상 모델
특징
TreeSHAP
결정트리 앙상블(RandomForest·XGBoost·LightGBM)
정확·초고속. IDS의 flow-feature 모델에 최적 → 준실시간 설명 가능
KernelSHAP
모든 모델(model-agnostic)
범용이지만 느림(샘플링 근사)
DeepSHAP / GradientSHAP
신경망(CNN·LSTM)
딥러닝 탐지 모델 설명
왜 보안에서 SHAP이 표준인가
IDS/NIDS의 대표 모델이 결정트리 앙상블(RandomForest·XGBoost)인데, TreeSHAP은 이들에 대해
수학적으로 정확하면서도 매우 빠릅니다. 그래서 경보마다 "기여 피처 Top-N"을 실시간에 가깝게 붙일 수 있습니다.
4. 기법 딥다이브 ② LIME
LIME(Local Interpretable Model-agnostic Explanations)은 "복잡한 결정 경계라도 한 점 주변만 보면 단순하다"는
아이디어입니다. 설명하려는 샘플 주변을 조금씩 흔들어(perturb) 모델에 물어보고, 그 응답으로
국소적으로 단순한 대리 모델(선형 등)을 학습해 근사합니다.
그림 4. LIME — 대상 샘플 주변을 흔들어 국소 선형 대리모델로 근사. 직관적이나 SHAP보다 불안정한 편. [확대]✕
5. 기법 딥다이브 ③ Integrated Gradients · DeepLIFT
신경망처럼 미분 가능한 모델에는 기울기(gradient) 기반 설명이 효율적입니다.
Integrated Gradients(IG, 적분 기울기)는 기준점(baseline, 예: 모두 0인 입력)에서 실제 입력까지
직선 경로를 따라가며 기울기를 적분해, 각 피처가 예측 변화에 기여한 양을 구합니다.
"민감도(Sensitivity)"와 "완결성(Completeness: 기여 합 = 예측 차이)" 같은 수학적 공리를 만족합니다.
그림 5. Integrated Gradients — baseline에서 입력까지 기울기를 적분해 기여도 산출. DeepLIFT는 이를 더 빠르게 근사한다. [확대]✕
6. 기법 딥다이브 ④ Grad-CAM (악성코드 이미지)
악성코드 분석의 인기 기법 중 하나가 "악성코드를 이미지로 변환(malware-as-image)"해 CNN으로 분류하는 것입니다.
바이너리 바이트를 흑백 픽셀 이미지로 만들면, 같은 계열(family) 악성코드는 비슷한 시각 패턴을 보입니다.
여기에 Grad-CAM(Gradient-weighted Class Activation Mapping)을 쓰면, CNN이 이미지의 어느 영역(=바이너리의 어느 부분)을
보고 그 계열로 판단했는지 히트맵으로 보여 줍니다.
그림 6. Grad-CAM — 악성코드 이미지에서 CNN이 주목한 영역을 히트맵으로. 분석가가 실제 바이너리 구간을 특정해 조사할 수 있다. [확대]✕
7. 기법 딥다이브 ⑤ Attention · Anchors · Counterfactual
Attention(어텐션) — API 호출/opcode 같은 시퀀스 모델에서 어떤 토큰(호출)이 판단에 영향을 줬는지 가중치로 표시. (단, "attention = 설명"인지에 대한 학술 논쟁 있음 → 보조 근거로 활용)
Anchors(앵커) — LIME 저자들이 만든 "IF 조건이면 거의 항상 이 판단" 형태의 규칙 설명. 예: IF SYN비율>0.8 AND flow_duration<1s THEN 공격(정밀도 97%). 관제사가 이해하기 쉬움.
Counterfactual(반사실) — "무엇을 최소한으로 바꾸면 판단이 뒤집히나". 예: "이 패킷 수가 X 이하였다면 정상으로 분류". "왜 정상이 아닌가"를 보여줘 대응·오탐 분석에 유용.
8. 침입탐지(IDS)에서의 XAI 활용
IDS/NIDS는 흐름(flow) 피처(예: CIC-IDS2017/CIC-DDoS2019의 80여 개 피처)로 공격을 분류합니다.
XAI는 이 위에서 경보마다 근거를 붙이고, 관제 효율을 높이고, 오탐을 줄입니다.
그림 7. IDS + XAI 워크플로우 — 경보에 기여 피처·규칙을 붙여 관제사가 근거 기반으로 판단하고, 오탐 피드백으로 모델을 개선한다. [확대]✕
실제 연구에서 XI2S-IDS(SHAP로 이진 분류 설명, CICIDS2017 99.81%), E-XAI(SHAP·LIME 설명 품질 평가 프레임워크), LSTM 경보 우선순위에 LIME·SHAP·IG·DeepLIFT 비교 등이 보고되었습니다.
9. 악성코드 분류에서의 XAI 활용
입력 표현
모델
주로 쓰는 XAI
설명 형태
정적 피처(PE 헤더·import·문자열)
RandomForest/XGBoost
SHAP(TreeSHAP)
"어떤 import·섹션이 악성 판단에 기여"
악성코드 이미지(byte→image)
CNN
Grad-CAM, IG
주목 바이트 영역 히트맵
API 호출/opcode 시퀀스
LSTM/Transformer
Attention, IG, SHAP
영향 큰 호출 강조
동적 행위(sandbox)
다양
SHAP, Counterfactual
"어떤 행위가 결정적이었나"
보안 특유의 가치
악성코드 XAI는 단순 신뢰를 넘어 "계열(family) 판별 근거 → 분석가가 실제 코드 구간을 특정",
"적대적 회피(adversarial evasion) 취약 피처 발견" 등 분석·방어 개선에 직접 쓰입니다.
10. XAI가 주는 실제 가치
신뢰·채택 — 관제사가 근거를 보고 AI 경보를 실제로 사용.
관제 효율 — 경보 우선순위·분류(triage) 자동화로 알림 피로 감소.
오탐 진단·모델 디버깅 — "왜 정상을 공격으로 봤나"를 추적해 피처·데이터 개선.
적대적 견고성 — 모델이 엉뚱한 피처(지름길, shortcut)에 의존하는지 발견 → 회피 공격 방어.
규제·감사 — EU AI Act(고위험 AI 설명 의무), GDPR 등 대응.
피처 선택 — 전역 중요도로 불필요 피처 제거 → 경량·고속화(장비 탑재 유리).
11. 한계와 함정 (반드시 알아야 할 것)
설명을 맹신하지 말 것
설명 ≠ 정답(ground truth) — XAI는 "모델이 왜 그렇게 봤나"의 근사일 뿐, 세상의 진짜 인과가 아니다.
기법 간 불일치(disagreement) — SHAP·LIME·IG가 서로 다른 상위 피처를 줄 수 있다.
불안정성 — LIME 등은 샘플링에 따라 결과가 흔들린다.
적대적 조작 — 설명 자체를 속이는 공격이 존재(정상처럼 보이게 설명을 왜곡).
계산 비용 — KernelSHAP·IG는 무거워 실시간(라인레이트) 경보엔 부담 → TreeSHAP/사전계산/샘플링 필요.
Attention 논쟁 — 어텐션 가중치가 곧 설명은 아니라는 반론.
→ 실무는 여러 기법 교차확인 + 사람 검증을 함께 씁니다.
12. 오픈소스 XAI 프로젝트 딥다이브
요청하신 "보안 장비에 바로 붙일 만큼 완성도 높은 오픈소스"에 대해 먼저 솔직한 현실부터 말씀드립니다.
현실 고지"방화벽/NAC에 꽂으면 바로 XAI가 되는" 턴키 오픈소스 보안 어플라이언스는 없습니다.
대신, 생산 수준(production-grade)으로 완성된 범용 XAI "엔진 라이브러리"가 있고,
이를 탐지 모델 옆에 설명 서비스로 통합하는 방식이 실무 표준입니다. 아래가 그 완성도 높은 빌딩 블록입니다.
프로젝트
제공/기법
대상 모델
완성도·라이선스
보안 적합성
SHAP (shap/shap)
SHAP 전반(Tree/Kernel/Deep)
트리·NN·범용
사실상 표준, MIT
★★★ IDS 트리모델 준실시간
Captum (pytorch/captum, Meta)
IG·DeepLIFT·Saliency·Grad-CAM 등
PyTorch 신경망
프로덕션, BSD
★★★ 딥러닝 탐지/악성코드
Alibi + Alibi Detect (SeldonIO)
Anchors·Counterfactual·IG / 이상·드리프트·적대적 탐지
범용
서빙 지향 프로덕션, Apache/BSD
★★★ 서빙 통합·드리프트 감시
OmniXAI (salesforce/OmniXAI)
다기법 통합 + 대시보드
표·이미지·텍스트·시계열
통합·문서 우수, BSD
★★ 통합 리포팅
InterpretML (interpretml/interpret, MS)
EBM(글래스박스)·SHAP·LIME·PDP
주로 표(tabular)
프로덕션, MIT
★★ 애초에 해석가능한 모델
LIME (marcotcr/lime)
LIME
범용
널리 쓰임, BSD
★★ 국소 설명(불안정 주의)
pytorch-grad-cam (jacobgil)
Grad-CAM 계열
CNN
성숙, MIT
★★ 악성코드 이미지
AIX360 (Trusted-AI, IBM)
다양한 XAI
범용
연구 지향, Apache
★ 실험·연구
ELI5
순열 중요도 등
범용
경량, MIT
★ 빠른 전역 중요도
완성도·용도별 추천
탐지 모델이 트리 앙상블(IDS/악성코드 정적피처) → SHAP(TreeSHAP). 빠르고 정확, 준실시간.
탐지 모델이 딥러닝(CNN/LSTM) → Captum(IG·DeepLIFT·Grad-CAM), PyTorch 프로덕션.
운영 서빙 + 드리프트/적대적 감시 → Alibi + Alibi Detect(Seldon). 장비 옆 서비스로 이상·모델노후 감시까지.
통합 대시보드·리포트 → OmniXAI.
애초에 설명가능한 모델을 쓰고 싶다 → InterpretML의 EBM(글래스박스, 성능도 준수).
# (개념 예시) IDS 트리모델 경보에 SHAP 설명을 붙이는 마이크로서비스
import shap, xgboost as xgb
model = xgb.Booster(); model.load_model("nids.model")
explainer = shap.TreeExplainer(model) # TreeSHAP: 빠르고 정확
def explain_alert(flow_features):
pred = model.predict(flow_features) # 예: 0.92 (공격)
sv = explainer.shap_values(flow_features) # 피처별 기여도
top = sorted(zip(FEATURE_NAMES, sv[0]), key=lambda x: -abs(x[1]))[:5]
return {"score": float(pred), "top_reasons": top} # 경보에 근거 첨부
# → 방화벽/IDS 분석 엔진이 이 서비스를 호출해 "왜 차단했는지"를 대시보드에 표시
13. 보안 장비(VPN·Firewall·NAC) 통합 아키텍처
XAI는 보안 장비의 탐지 엔진(또는 SIEM/XDR) 옆에 "설명 서비스"로 붙는 것이 자연스럽습니다.
장비는 탐지·차단을 하고, XAI 서비스가 그 판단에 근거(기여 피처·규칙·히트맵)를 첨부해 대시보드·SIEM으로 보냅니다.
그림 8. 통합 아키텍처 — 장비의 ML 탐지 엔진 옆에 XAI 서비스를 두고, 경보에 근거를 첨부해 대시보드/SIEM으로 전달한다. [확대]✕
장비
XAI가 설명하는 것
Firewall/IDS
"이 flow를 왜 공격으로 차단했나" — 기여 피처(SYN 비율·엔트로피·flow 길이 등)
VPN 게이트웨이
이상 접속·비정상 터널 행위의 근거(시간·위치·트래픽 패턴)
NAC
"이 단말을 왜 격리(quarantine)했나" — 이상 행위 피처, 정책 위반 근거
현실적 통합 팁
① 라인레이트 경보엔 가벼운 설명(TreeSHAP·사전계산 규칙), 심층 조사엔 무거운 설명(IG·Grad-CAM)을 분리 적용.
② XAI는 별도 컨테이너/마이크로서비스로 두어 장비 데이터 경로 성능에 영향 최소화.
③ Alibi Detect로 모델 드리프트·적대적 입력을 함께 감시하면 운영 신뢰도↑.
14. 용어 설명
XAI (eXplainable AI, 설명가능 인공지능)
AI 모델의 판단 근거를 사람이 이해할 수 있게 설명하는 기술·방법론의 총칭.
블랙박스 / 글래스박스
내부를 알 수 없는 모델(딥러닝 등)과, 그 자체로 해석 가능한 모델(결정트리·선형·EBM).
국소(Local) / 전역(Global) 설명
개별 예측 한 건에 대한 설명과, 모델 전반의 경향(중요 피처)에 대한 설명.
SHAP (SHapley Additive exPlanations)
게임이론 Shapley value로 각 피처의 기여도를 가산적으로 분해하는 기법. TreeSHAP은 트리모델에 빠르고 정확.
LIME
대상 샘플 주변을 흔들어 국소 선형 대리모델로 근사하는 모델무관 설명 기법.
Integrated Gradients (IG, 적분 기울기)
baseline에서 입력까지 기울기를 적분해 피처 기여를 구하는, 공리를 만족하는 신경망 설명 기법.
DeepLIFT
기준 활성값과의 차이로 기여를 배분하는 빠른 신경망 설명 기법.
Grad-CAM
CNN에서 목표 클래스에 대한 기울기로 주목 영역 히트맵을 만드는 기법. 악성코드 이미지 분석에 유용.
Alibi Detect(SeldonIO)는 이상치(Outlier)·드리프트(Drift)·적대적 입력(Adversarial)을
탐지하는 프로덕션급 오픈소스 Python 라이브러리입니다. 보안 관점에서 이 셋은 각각
zero-day 이상 트래픽 탐지, 탐지 모델의 노후(개념 표류) 감시,
회피 공격(evasion) 탐지에 직결됩니다. 이 문서는 앞선 "XAI" 문서에서 소개만 했던 Alibi Detect를
실전 코드 중심으로 깊게 다룹니다.
함께 보면 좋은 문서
이 글은 "XAI(설명가능 AI)" 문서의 마지막에 나온 "Alibi Detect로 드리프트·적대적 감시" 부분을 코드로 확장한 심화편입니다.
탐지 모델(RandomForest·CNN 등)과 flow 피처(CIC-IDS 등) 개념을 안다는 전제로 진행합니다.
핵심 개념 3가지
① 참조 데이터(reference) — "정상/기준"을 정의(드리프트는 배포 시점 분포, 이상치는 정상 학습 데이터).
② 임계값(threshold) — infer_threshold()로 "정상의 몇 %를 정상으로 볼지" 자동 보정.
③ p-value / 유의수준 — 드리프트는 통계 검정의 p-value가 p_val보다 작으면 "드리프트"로 판정.
정상 트래픽만 학습한 뒤, 거기서 벗어나는 샘플을 이상치로 봅니다. 라벨이 없어도 되므로
미지의(zero-day) 공격 탐지에 유리합니다(앞 "DDoS 탐지" 문서의 오토인코더/비지도 탐지와 같은 철학).
그림 2. 이상치 탐지 — 정상 분포를 학습하고 임계값(threshold)을 넘는 샘플을 이상으로. zero-day 탐지에 적합. [확대]✕
Isolation Forest — 표(tabular) flow 피처에 가볍고 빠름
import numpy as np
from alibi_detect.od import IForest
from alibi_detect.saving import save_detector, load_detector
# X_normal: 평상시 정상 트래픽 flow 피처 (n_samples, n_features) - 예: CIC-IDS 정상만
od = IForest(n_estimators=200)
od.fit(X_normal) # 정상만 학습(비지도)
od.infer_threshold(X_normal, threshold_perc=95) # 정상의 95%는 정상으로 → 임계값 자동 보정
preds = od.predict(X_test, return_instance_score=True)
is_outlier = preds['data']['is_outlier'] # 0/1 배열 (1 = 이상 트래픽)
scores = preds['data']['instance_score'] # 샘플별 이상 점수
print(f"이상 트래픽 {is_outlier.sum()}건 / {len(is_outlier)}건")
save_detector(od, 'detectors/nids_iforest') # 저장 → 장비에 배포
# od = load_detector('detectors/nids_iforest') # 로드
Mahalanobis — 온라인(스트리밍) 이상치, 경량
from alibi_detect.od import Mahalanobis
# n_components: 내부 차원축소, std_clip: 이상치 영향 억제, start_clip: 통계 갱신 시작 시점
od = Mahalanobis(n_components=3, std_clip=3, start_clip=100)
od.infer_threshold(X_normal, threshold_perc=99)
preds = od.predict(X_test) # 분포 중심에서의 거리로 이상 판정
print(preds['data']['is_outlier'])
OutlierVAE — 복잡/고차원 데이터(딥러닝)
import tensorflow as tf
from tensorflow.keras.layers import Dense, InputLayer
from alibi_detect.od import OutlierVAE
n_features = X_normal.shape[1]; latent_dim = 2
encoder_net = tf.keras.Sequential([
InputLayer((n_features,)), Dense(25, activation='relu'), Dense(10, activation='relu')])
decoder_net = tf.keras.Sequential([
InputLayer((latent_dim,)), Dense(10, activation='relu'),
Dense(25, activation='relu'), Dense(n_features, activation=None)])
od = OutlierVAE(encoder_net=encoder_net, decoder_net=decoder_net, latent_dim=latent_dim)
od.fit(X_normal, epochs=20) # 정상만 재구성하도록 학습
od.infer_threshold(X_normal, threshold_perc=95)
preds = od.predict(X_test, outlier_type='instance', return_instance_score=True)
# 복원 오차(reconstruction error)가 크면 이상 → "XAI 문서"의 오토인코더 원리와 동일
4. 실전 ② 드리프트 탐지 (모델 노후) — TabularDrift · MMDDrift
공격·정상 트래픽은 시간이 지나며 변합니다(개념 표류, concept drift). 그러면 배포된 탐지 모델이 낡아
성능이 떨어집니다. 드리프트 탐지는 "지금 들어오는 데이터가 배포 시점(참조)과 통계적으로 달라졌는가"를
검정해, 재학습 시점을 알려 줍니다.
그림 3. 드리프트 탐지 — 참조 분포와 현재 분포를 통계 검정으로 비교. 유의하게 다르면 모델이 낡았다는 신호. [확대]✕
from functools import partial
from alibi_detect.cd import MMDDrift
from alibi_detect.cd.tensorflow import preprocess_drift
from alibi_detect.models.tensorflow import UAE # Untrained AutoEncoder(무학습 임베딩)
# 고차원(수십~수백 피처)일수록 원시 공간의 검정력이 떨어짐 → 임베딩으로 축소 후 검정
enc = UAE(shape=(X_ref.shape[1],), enc_dim=32) # 개념 예시(버전별 시그니처 상이)
preprocess_fn = partial(preprocess_drift, model=enc, batch_size=256)
cd = MMDDrift(X_ref, backend='tensorflow', p_val=0.05,
preprocess_fn=preprocess_fn, n_permutations=100)
preds = cd.predict(X_new)
print(preds['data']['is_drift'], preds['data']['p_val'], preds['data']['distance'])
# 팁: 탐지 모델의 은닉층 출력을 preprocess로 쓰면 "모델이 보는 표현" 기준 드리프트를 본다
5. 실전 ③ 온라인 드리프트 (스트리밍)
배치가 아니라 패킷/이벤트가 실시간으로 흘러드는 환경에서는 온라인 detector를 씁니다.
핵심 파라미터는 ERT(Expected Run-Time) — "드리프트가 없을 때 평균 몇 스텝마다 한 번 오탐하는가"로,
값이 클수록 오탐이 드뭅니다.
그림 4. 온라인 드리프트 — 스트림을 한 건씩 처리하며 누적 통계가 임계를 넘으면 감지. ERT로 오탐 빈도를 조절. [확대]✕
from alibi_detect.cd import MMDDriftOnline
ert = 150 # 평균 150 스텝마다 1회 오탐 허용(클수록 보수적)
window_size = 20 # 최근 관측 윈도우
cd = MMDDriftOnline(X_ref, ert=ert, window_size=window_size,
backend='pytorch', n_bootstraps=2500)
for x_t in traffic_stream: # 실시간 이벤트 한 건씩
pred = cd.predict(x_t)
if pred['data']['is_drift']:
alert("트래픽 분포 드리프트 감지 → 모델 재학습/재검증 필요")
cd.reset_state() # 감지 후 상태 초기화(재모니터링)
6. 실전 ④ 적대적 탐지 (회피 공격)
공격자는 탐지 모델을 속이도록 입력을 미세 조작(adversarial example)해 회피를 시도합니다.
AdversarialAE는 오토인코더로 "분류기가 같은 판단을 유지하도록" 학습해 두고,
입력이 적대적으로 조작되면 그 적대적 점수(adversarial score)가 커지는 것을 이용해 탐지합니다.
그림 5. 적대적 탐지 — 분류기 판단을 유지시키는 오토인코더로, 적대적 조작 입력을 높은 점수로 걸러낸다. [확대]✕
import tensorflow as tf
from tensorflow.keras.layers import Dense, InputLayer
from alibi_detect.ad import AdversarialAE
# clf: 이미 학습된 분류기(예: 악성코드/트래픽 분류 모델). 그대로 재사용.
n_features = X_train.shape[1]
encoder_net = tf.keras.Sequential([InputLayer((n_features,)), Dense(40, activation='relu'), Dense(20, activation='relu')])
decoder_net = tf.keras.Sequential([InputLayer((20,)), Dense(40, activation='relu'), Dense(n_features, activation=None)])
ad = AdversarialAE(encoder_net=encoder_net, decoder_net=decoder_net, model=clf)
ad.fit(X_train, epochs=40, batch_size=64) # 정상 데이터로 학습
ad.infer_threshold(X_train, threshold_perc=99) # 정상의 99%는 정상으로
preds = ad.predict(X_test, return_instance_score=True)
print("적대적 입력:", preds['data']['is_adversarial']) # 0/1
print("적대적 점수:", preds['data']['instance_score'])
7. 저장·로드·운영 · 백엔드
from alibi_detect.saving import save_detector, load_detector
save_detector(cd, 'detectors/nids_drift') # 학습·보정된 detector 저장
cd = load_detector('detectors/nids_drift') # 장비/서비스에서 로드해 바로 사용
# 백엔드 선택: 일부 detector(MMDDrift 등)는 TensorFlow / PyTorch 모두 지원
# MMDDrift(X_ref, backend='pytorch') 또는 backend='tensorflow'
운영 요령
① detector를 학습·임계보정까지 끝낸 뒤 저장해 배포한다(장비에서 재학습 불필요).
② 참조 데이터는 주기적으로 갱신(예: 분기별 재보정)해 계절성·정상 변화 반영.
③ GPU가 없다면 IForest·Mahalanobis·TabularDrift 같은 경량 detector가 적합.
8. 보안 파이프라인 통합
Alibi Detect는 탐지 모델(방화벽/IDS/NAC의 ML 엔진) 옆에서 3중 감시를 담당합니다 —
이상치(zero-day) · 드리프트(모델 노후) · 적대적(회피). "XAI" 문서의 통합 아키텍처를 이렇게 확장합니다.
그림 6. 통합 — 탐지 엔진 옆에서 Alibi Detect가 이상치·드리프트·적대적을 3중 감시하고, 결과를 SIEM·재학습 파이프라인으로 보낸다. [확대]✕
9. 실무 튜닝과 함정
반드시 고려할 것
참조 데이터 선정 — 드리프트의 기준. 대표성 없는 참조는 오탐/미탐을 부른다(계절성·요일 패턴 반영).
고차원 드리프트 — 피처가 많으면 원시 공간 검정력이 떨어진다 → UAE/PCA/모델 임베딩으로 축소 후 검정.
p_val·threshold_perc 튜닝 — 너무 민감하면 오탐 폭주, 너무 둔하면 미탐. 운영 트래픽으로 보정.
배치 vs 온라인 — 주기 점검은 배치(TabularDrift), 실시간 스트림은 온라인(MMDDriftOnline)·ERT 조절.
성능 — MMD·VAE는 무겁다. 라인레이트엔 IForest/Mahalanobis/샘플링·주기 검사.
이상치≠공격 — 이상치는 "평소와 다름"일 뿐. 정상 이벤트(신규 서비스)도 이상치가 될 수 있어 사람 검증 필요.
10. Detector 선택 가이드
목적(보안)
상황
추천 detector
zero-day 이상 트래픽
표 flow 피처, 경량·빠름
IForest, Mahalanobis
zero-day (복잡/고차원)
딥러닝 표현
OutlierVAE, OutlierAE
모델 노후(주기 점검)
혼합형 표, 피처별 근거 필요
TabularDrift(KS+ChiSq)
모델 노후(고차원·비선형)
임베딩 기반
MMDDrift(+전처리)
모델 노후(실시간 스트림)
패킷/이벤트 스트림
MMDDriftOnline, LSDDDriftOnline
회피 공격
분류기 우회 시도
AdversarialAE, ModelDistillation
시계열 이상
트래픽량 시계열
SpectralResidual, OutlierProphet
11. 용어 설명
Alibi Detect
SeldonIO의 오픈소스 라이브러리. 이상치·드리프트·적대적 입력 탐지를 제공하며 TensorFlow·PyTorch 백엔드를 지원.
이상치 탐지 (Outlier Detection)
정상 분포에서 벗어난 샘플을 찾는 것. 라벨 없이 가능해 zero-day 탐지에 유리.
드리프트 (Drift) / 개념 표류 (Concept Drift)
시간이 지나며 데이터(또는 입력-출력 관계) 분포가 변하는 현상. 배포된 모델을 낡게 만든다.
적대적 입력 (Adversarial Example)
모델의 판단을 속이도록 미세하게 조작한 입력. 보안에선 탐지 회피(evasion)에 악용된다.
infer_threshold
정상 데이터로 "정상의 몇 %를 정상으로 볼지(threshold_perc)"를 정해 이상 판정 경계를 자동 보정하는 함수.
p_val (유의수준)
드리프트 통계 검정에서, 계산된 p-value가 이 값보다 작으면 "분포가 유의하게 달라졌다=드리프트"로 판정.
KS / Chi-Square / MMD
Kolmogorov-Smirnov(연속형 분포 검정), Chi-Square(범주형), Maximum Mean Discrepancy(커널 기반 고차원 분포 차이).
ERT (Expected Run-Time)
온라인 드리프트에서 "드리프트가 없을 때 평균 몇 스텝마다 오탐하는가". 클수록 보수적(오탐↓).
UAE (Untrained AutoEncoder)
학습하지 않은 오토인코더로 만든 임베딩. 고차원 드리프트 검정 전 차원축소 전처리에 쓰인다.
Ubuntu 24.04 지키며 재파티션 → Ubuntu 26.04 듀얼부팅 설치 완전 가이드
이미 Ubuntu 24.04가 설치된 노트북의 SSD를 재파티션해 여유 공간을 만들고,
그 공간에 Ubuntu 26.04를 24.04를 손상시키지 않고 설치하는 전체 과정을 그림과 함께 정리합니다.
핵심은 "실행 중인 파티션은 줄이지 않는다", "EFI 파티션은 재사용하되 포맷하지 않는다", "나중에 설치하는 26.04의 부트로더가
전체 부팅을 통제한다" 세 가지입니다.
⚠ 시작 전 필독 — 백업
파티션 축소는 대부분 안전하지만 정전·오류 시 데이터 손상 가능합니다.
24.04의 중요한 데이터를 외장 디스크/클라우드에 반드시 먼저 백업하세요. 이 문서는 학습용 안내이며 작업 책임은 사용자에게 있습니다.
목차
3가지 핵심 안전 원칙
전체 작업 흐름 한눈에
1단계 — 현재 상태 파악
2단계 — 목표 파티션 레이아웃 (Before/After)
3단계 — 24.04에서 공간 정리
4단계 — 26.04 Live USB 제작
5단계 — Live USB에서 파티션 축소 (GParted)
6단계 — Ubuntu 26.04 설치 (ESP 재사용)
7단계 — 부팅 메뉴(GRUB) 정리
8단계 — 검증과 기본 부팅 OS 설정
특수 상황 — LVM · LUKS · /home 공유
체크리스트 · 용어 설명
1. 3가지 핵심 안전 원칙
그림 1. 반드시 지킬 3가지 — 마운트 해제 후 축소 · ESP 재사용(포맷 금지) · 신버전 GRUB이 부팅 통제. [확대]✕
2. 전체 작업 흐름 한눈에
그림 2. 전체 9단계 흐름 — 준비(①~⑤) 후 실제 디스크 작업(⑥~⑨). 축소(⑥) 전 백업·전원 연결 필수. [확대]✕
LVM 또는 LUKS 사용 여부 — 쓰고 있으면 축소 절차가 다릅니다(아래 "특수 상황"). 기본 설치면 보통 단순 ext4입니다.
장치 이름 규칙
NVMe SSD는 /dev/nvme0n1(디스크), 파티션은 /dev/nvme0n1p1, p2…
SATA SSD는 /dev/sda, 파티션은 /dev/sda1… 로 나타납니다. 본인 장치명을 정확히 확인하세요.
4. 2단계 — 목표 파티션 레이아웃 (Before/After)
그림 3. Before/After — ESP는 공유, 24.04 root는 뒤쪽으로 축소해 유지, 생긴 빈 공간에 26.04 root를 새로 만든다. [확대]✕
26.04용 여유 공간: 최소 40GB, 넉넉히 60~100GB 권장.
ESP는 두 OS가 공유합니다(새로 만들지 않음).
swap: 요즘 Ubuntu는 root 안의 swapfile을 쓰므로 별도 swap 파티션이 필요 없습니다.
5. 3단계 — 24.04에서 공간 정리
sudo apt clean
# 축소할 목표 크기보다 실제 사용량이 충분히 작은지 확인
df -h /
루트의 실제 사용량이 "축소 후 크기"보다 작아야 합니다. (예: 사용량 60GB면 그보다 작게는 못 줄임)
6. 4단계 — Ubuntu 26.04 Live USB 제작
26.04 LTS ISO를 다른 정상 PC에서 USB로 굽습니다.
Windows: Rufus / balenaEtcher
Linux: Startup Disk Creator(디스크 만들기) 또는 아래 명령
# ⚠ of= 대상(USB 장치명)을 반드시 정확히 확인! 잘못하면 다른 디스크가 지워짐
sudo dd if=ubuntu-26.04-desktop-amd64.iso of=/dev/sdX bs=4M status=progress oflag=sync
노트북 부팅 메뉴(F12/F2/ESC 등)에서 USB로 부팅 → "Try Ubuntu(체험하기)" 선택.
7. 5단계 — Live USB에서 파티션 축소 (GParted)
그림 4. Live USB에서 축소하는 이유(마운트 해제)와 GParted 방향 — 뒤쪽(오른쪽)만 당겨 빈 공간을 만든다. [확대]✕
# Live 세션 터미널에서
sudo apt install gparted # 없으면 설치 (라이브에 기본 포함되기도 함)
# 먼저 24.04 root 파일시스템 무결성 검사 (대상 장치명 정확히! 예: nvme0n1p2)
sudo fsck -f /dev/nvme0n1pX
sudo gparted
GParted에서:
24.04 root(ext4) 파티션 선택 → Resize/Move.
오른쪽 끝을 당겨 크기를 줄이고 뒤쪽에 Unallocated(빈 공간)을 만든다. (앞쪽은 건드리지 말 것)
ESP·다른 파티션은 그대로 둔다.
✔ Apply → 완료까지 전원 유지.
대안
GParted 없이 설치 마법사의 자동 축소만 써도 됩니다. 다만 GParted로 미리 빈 공간을 만들면 통제가 쉽고 안전합니다.
8. 6단계 — Ubuntu 26.04 설치 (ESP 재사용)
Live 데스크톱의 Install Ubuntu 26.04 실행. 설치 유형 화면에서 두 갈래가 있습니다.
방법 A — 자동 ("Ubuntu 24.04와 함께 설치 / Install alongside")
설치기가 빈 공간에 자동으로 26.04를 설치하고 ESP를 공유합니다. 가장 간단합니다.
방법 B — 수동 ("Manual / 이전의 Something else") — 권장
그림 5. 수동 설치 파티션 지정 — 빈 공간에 새 ext4를 /로, 기존 ESP는 "EFI로 지정 + 포맷 금지", 부트로더는 디스크에 설치. [확대]✕
앞서 만든 빈 공간(free space) 선택 → + → 새 파티션: ext4, 마운트 지점 /.
기존 ESP(예 /dev/nvme0n1p1, FAT32) 선택 → "EFI System Partition"으로 지정. ⚠ "포맷" 체크는 절대 금지 (마운트 /boot/efi).
부트로더 설치 위치: ESP가 있는 디스크 전체(예 /dev/nvme0n1)로 지정.
계정 만들고 설치 진행.
두 Ubuntu의 ESP 공유
두 Ubuntu는 ESP 안에서 같은 EFI/ubuntu 경로를 씁니다. 26.04 설치 때 이 GRUB이 신버전으로 갱신되며,
이 GRUB이 부팅을 통제하고 24.04를 메뉴에 넣어 주므로 정상 동작입니다.
9. 7단계 — 부팅 메뉴(GRUB) 정리
그림 6. 부팅 구조 — UEFI → 26.04의 GRUB → 메뉴에서 26.04/24.04 선택. os-prober가 24.04를 자동 감지해 메뉴에 추가한다. [확대]✕
재부팅 시 GRUB 메뉴에 26.04와 24.04가 모두 보여야 합니다. 만약 24.04가 안 보이면, 26.04로 부팅한 뒤:
# os-prober가 다른 OS를 찾도록 활성화
sudo os-prober # 24.04가 감지되는지 확인
echo 'GRUB_DISABLE_OS_PROBER=false' | sudo tee -a /etc/default/grub
sudo update-grub # GRUB 메뉴 재생성 → 24.04 항목 추가
# UEFI 부팅 항목 확인
efibootmgr -v
10. 8단계 — 검증과 기본 부팅 OS 설정
재부팅 → GRUB에서 26.04와 24.04를 번갈아 부팅해 둘 다 정상인지 확인.
기본 부팅 OS·대기시간 변경(26.04에서):
sudo nano /etc/default/grub
# GRUB_DEFAULT=0 # 0=첫 항목, 또는 "saved"로 마지막 선택 기억
# GRUB_TIMEOUT=10
sudo update-grub
11. 특수 상황 — LVM · LUKS · /home 공유
상황
주의점
LVM 사용 중
GParted로 바로 못 줄임. resize2fs(파일시스템 축소) → lvreduce(논리볼륨) → pvresize(물리볼륨) → 파티션 축소 순서. 순서 틀리면 손상 → 신중히.
LUKS 암호화
잠금 해제 후 내부 컨테이너·파일시스템을 축소해야 하며 절차가 복잡. 백업 필수.
/home 공유?
서로 다른 버전이 같은 /home을 쓰면 설정 파일(dotfiles) 충돌 위험. 각자 별도 home 권장, 공유가 필요하면 별도 "데이터" 파티션을 만들어 양쪽에서 마운트.
Secure Boot
두 Ubuntu 모두 서명돼 있어 켜둔 채로 문제없음.
12. 체크리스트 · 용어 설명
한눈에 보는 체크리스트
① ☑ 백업 · ② ☑ 상태/UEFI/LVM 확인 · ③ ☑ 24.04 공간 정리 · ④ ☑ 26.04 USB 제작 ·
⑤ ☑ Live USB 부팅 · ⑥ ☑ fsck → GParted로 뒤쪽 축소(빈 공간) ·
⑦ ☑ 26.04: 빈 공간에 새 ext4 /, 기존 ESP 재사용(포맷 금지) ·
⑧ ☑ 필요 시 os-prober 활성화 + update-grub · ⑨ ☑ 양쪽 부팅 검증
파티션 (Partition)
디스크를 논리적으로 나눈 구획. 각 OS·파일시스템이 자기 파티션을 갖는다.
ESP (EFI System Partition)
UEFI 부팅에 필요한 부트로더가 담긴 FAT32 파티션(보통 /boot/efi). 여러 OS가 공유하며, 재파티션 시 포맷하면 안 된다.
UEFI / Legacy BIOS
펌웨어 부팅 방식. 요즘 노트북은 대부분 UEFI. /sys/firmware/efi 존재 여부로 확인.
GRUB
리눅스 부트로더. 부팅 시 어떤 OS·커널로 부팅할지 메뉴를 제공한다. 나중에 설치한 OS의 GRUB이 통제한다.
os-prober
다른 파티션의 운영체제를 탐지해 GRUB 메뉴에 추가하는 도구. 최신 GRUB은 기본 비활성이라 필요 시 켠다.
GParted
그래픽 파티션 편집기. Live USB에서 마운트 해제된 파티션을 안전하게 축소·이동한다.
fsck
파일시스템 무결성 검사·복구 도구. 축소 전 실행해 안정성을 높인다.
ext4
Ubuntu 기본 파일시스템. 축소·확장이 지원된다.
swapfile / swap
메모리 부족 시 사용하는 디스크 영역. 요즘 Ubuntu는 root 안의 파일(swapfile)을 써서 별도 파티션이 불필요.
LVM / LUKS
논리 볼륨 관리(LVM)와 디스크 암호화(LUKS). 사용 중이면 파티션 축소 절차가 더 복잡하다.
본 문서는 학습용 안내입니다. 파티션 작업은 데이터 손실 위험이 있으므로 반드시 백업 후, 본인 디스크의 실제 장치명·레이아웃을 확인하고 진행하세요.
장치명(/dev/...)을 잘못 지정하면 다른 디스크가 지워질 수 있습니다.
Ubuntu 24.04 지키며 재파티션 → Windows 10 듀얼부팅 설치 (GRUB 복구까지)
이미 Ubuntu 24.04가 설치된 노트북에 SSD를 재파티션해 Windows 10을 함께 설치하는 방법입니다.
이 경우 앞의 "Ubuntu + Ubuntu"와 결정적으로 다른 점이 하나 있습니다 —
Windows는 설치되면서 부팅 순서를 자기 것으로 덮어써 GRUB(리눅스 부팅 메뉴)을 밀어냅니다.
그래서 "Windows 설치 → GRUB 복구"가 반드시 한 세트로 진행되어야 합니다.
⚠ 두 가지 먼저 알아두기
백업 필수 — 재파티션은 데이터 손상 위험이 있습니다. 반드시 먼저 백업하세요.
Windows 10은 지원 종료(2025년 10월 14일) 상태입니다. 보안 업데이트가 없으므로 가급적 Windows 11을 검토하되, 요청하신 대로 본 문서는 Windows 10 기준으로 설명합니다.
목차
핵심 차이 — "Windows가 GRUB을 덮어쓴다"
전체 작업 흐름
1단계 — 현재 상태 파악
2단계 — 목표 레이아웃 (Before/After)
3단계 — Live USB에서 Ubuntu 축소(빈 공간)
4단계 — Windows 10 설치 USB 제작
5단계 — Windows 10 설치 (파티션 선택 주의)
6단계 — GRUB 복구 (가장 중요!)
7단계 — 검증 · Fast Startup · 시간 문제
실패 시 대처 · 체크리스트
용어 설명
1. 핵심 차이 — "Windows가 GRUB을 덮어쓴다"
리눅스의 정석은 "Windows 먼저, 리눅스 나중"입니다. 그러면 리눅스 GRUB이 Windows를 메뉴에 넣어 주기 때문입니다.
그런데 지금은 반대 순서(Ubuntu 먼저, Windows 나중)입니다. Windows 설치기는 자기 부트로더를 UEFI 부팅 1순위로 등록하고
GRUB을 밀어내므로, 설치 직후엔 Ubuntu가 안 보이고 Windows로만 부팅됩니다. 이건 고장이 아니라 예상된 현상이며,
6단계 GRUB 복구로 되살립니다.
그림 1. Windows 설치는 부팅 순서를 자기 것으로 바꿔 GRUB을 밀어낸다. 설치 후 GRUB을 복구하면 다시 둘 다 선택 가능. [확대]✕
2. 전체 작업 흐름
그림 2. 전체 흐름 — Ubuntu 축소 → Windows 설치 → GRUB 복구 → 검증. ⑥번이 이 시나리오의 핵심. [확대]✕
UEFI + GPT로 통일
Ubuntu가 UEFI로 설치돼 있다면 Windows도 반드시 UEFI(GPT)로 설치해야 부팅이 호환됩니다.
(한쪽이 Legacy BIOS면 부팅 메뉴 공존이 어렵습니다.)
4. 2단계 — 목표 레이아웃 (Before/After)
그림 3. Before/After — ESP는 공유, Ubuntu는 축소·유지, 빈 공간에 Windows(NTFS)+MSR이 생성된다. Windows가 필요한 보조 파티션은 설치기가 자동 생성. [확대]✕
Windows용 공간: 최소 64GB, 넉넉히 100GB+ 권장(업데이트·앱 여유).
ESP는 공유 — Windows는 기존 ESP 안에 자기 부트 파일(Microsoft 폴더)을 넣습니다. ESP를 지우거나 포맷하지 마세요.
Windows는 설치 중 MSR·복구 파티션을 자동 생성하므로, 빈 공간은 unallocated(미할당)로 남겨두면 됩니다.
5. 3단계 — Live USB에서 Ubuntu 축소 (빈 공간 만들기)
Ubuntu(ext4)는 Windows에서 줄일 수 없으므로, 먼저 Ubuntu 24.04 Live USB(또는 아무 Ubuntu Live)로 부팅해
GParted로 Ubuntu root를 줄여 빈 공간을 만듭니다. (실행 중인 root는 못 줄이므로 Live USB 필수 — 앞 문서와 동일 원리)
# Live 세션에서
sudo apt install gparted
sudo fsck -f /dev/nvme0n1pX # Ubuntu root 무결성 검사(장치명 정확히!)
sudo gparted
# → Ubuntu root(ext4) 선택 → Resize/Move → 오른쪽(뒤)만 당겨 축소 → 빈 공간 생성 → Apply
빈 공간은 미할당으로
Windows 설치기가 알아서 NTFS·MSR·복구 파티션을 만드므로, GParted에서는 포맷하지 말고 unallocated(미할당)로만 남겨두면 됩니다.
6. 4단계 — Windows 10 설치 USB 제작
다른 Windows PC에서 Rufus로 Windows 10 ISO를 USB에 굽습니다.
파티션 구성: GPT, 대상 시스템: UEFI(비 CSM) — Ubuntu가 UEFI이므로 반드시 일치.
ISO는 Microsoft "미디어 생성 도구" 또는 공식 ISO 사용.
7. 5단계 — Windows 10 설치 (파티션 선택이 가장 중요)
그림 4. Windows 설치 파티션 선택 — 미할당 공간에만 설치. ESP·Ubuntu 파티션은 절대 삭제·포맷하지 않는다. [확대]✕
Windows USB로 부팅 → 언어 선택 → "지금 설치" → 제품 키(없으면 "제품 키가 없음").
설치 유형에서 "사용자 지정(Custom): Windows만 설치" 선택. (업그레이드 아님)
파티션 화면에서 앞서 만든 미할당 공간(Unallocated)을 선택 → "다음" (또는 "새로 만들기"로 크기 지정).
⚠ 절대 금지: 기존 ESP(작은 FAT 파티션)·Ubuntu 파티션을 삭제·포맷하지 말 것.
설치 진행 → 재부팅. 이 시점엔 Windows로만 부팅됩니다(정상). → 6단계로.
Secure Boot / BitLocker
① Windows 설치 중 Secure Boot는 켜둬도 됩니다(Ubuntu도 서명됨).
② Windows 11이었다면 BitLocker 자동 암호화 주의가 있으나 Windows 10은 대개 무관.
8. 6단계 — GRUB 복구 (이 시나리오의 핵심!)
Windows 설치로 밀려난 GRUB을 되살립니다. Ubuntu Live USB로 부팅("Try Ubuntu")한 뒤 두 방법 중 하나를 씁니다.
방법 A — Boot-Repair (가장 쉬움, 권장)
그림 5. Boot-Repair 흐름 — Live USB → 설치·실행 → "Recommended repair" → GRUB 복구(Windows도 메뉴에 자동 추가). [확대]✕
# Ubuntu Live USB(Try Ubuntu)에서, 인터넷 연결 후
sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt update
sudo apt install -y boot-repair
boot-repair
# → 창에서 "Recommended repair" 클릭 → 안내 따라 진행 → 재부팅
방법 B — 수동 chroot로 GRUB 재설치 (Boot-Repair가 안 될 때)
# 장치명은 본인 것으로! (예: root=nvme0n1p2, ESP=nvme0n1p1)
sudo mount /dev/nvme0n1p2 /mnt
sudo mount /dev/nvme0n1p1 /mnt/boot/efi
for d in dev proc sys run; do sudo mount --bind /$d /mnt/$d; done
sudo chroot /mnt
# (chroot 안에서)
grub-install /dev/nvme0n1 # 디스크 전체 지정
update-grub # Windows 감지해 메뉴에 추가
exit
# 정리
for d in run sys proc dev; do sudo umount /mnt/$d; done
sudo umount /mnt/boot/efi && sudo umount /mnt
Windows가 메뉴에 없으면update-grub 후에도 Windows가 없으면, /etc/default/grub에 GRUB_DISABLE_OS_PROBER=false를 추가하고
update-grub을 다시 실행하세요. UEFI 부팅 1순위가 여전히 Windows면 sudo efibootmgr -o로 ubuntu를 앞으로 옮깁니다.
9. 7단계 — 검증 · Fast Startup · 시간 문제
부팅 검증: 재부팅 → GRUB 메뉴에서 Ubuntu와 Windows 둘 다 부팅되는지 확인.
Windows 빠른 시작(Fast Startup) 끄기: Windows의 빠른 시작은 디스크를 "잠근(hibernate)" 상태로 종료해, 듀얼부팅에서 NTFS 접근·부팅 문제를 일으킬 수 있습니다. 제어판 → 전원 옵션 → 전원 단추 동작 → "빠른 시작 켜기" 체크 해제.
시간(시계) 어긋남 해결: Windows는 기본적으로 하드웨어 시계를 지역 시간(localtime)으로, Ubuntu는 UTC로 봅니다. 그대로 두면 OS 전환 시 시간이 틀어집니다. Ubuntu에서 아래로 맞추면 편합니다.
# Ubuntu에서: 하드웨어 시계를 localtime으로(=Windows와 동일 기준)
timedatectl set-local-rtc 1 --adjust-system-clock
# (대안: Windows 레지스트리에서 RealTimeIsUniversal=1로 UTC 사용하게 하는 방법도 있음)
10. 실패 시 대처 · 체크리스트
증상
원인·대처
설치 후 Windows로만 부팅
정상 현상. 6단계 GRUB 복구 진행.
GRUB에 Windows가 없음
GRUB_DISABLE_OS_PROBER=false + update-grub.
여전히 Windows 우선 부팅
efibootmgr -v로 확인 → efibootmgr -o로 ubuntu를 1순위로.
Ubuntu가 아예 안 보임
Windows 설치 시 Ubuntu/ESP를 지웠을 가능성 → 백업에서 복구. (그래서 백업 필수)
시간이 계속 틀어짐
timedatectl set-local-rtc 1 적용.
NTFS 마운트 오류
Windows 빠른 시작·최대 절전 끄기.
체크리스트
① ☑ 백업 · ② ☑ UEFI/ESP 확인 · ③ ☑ Live USB로 Ubuntu 축소(미할당) · ④ ☑ Windows USB(GPT/UEFI) 제작 ·
⑤ ☑ 미할당 공간에만 Windows 설치(ESP·Ubuntu 손대지 않음) · ⑥ ☑ GRUB 복구(Boot-Repair) ·
⑦ ☑ 양쪽 부팅 검증 + 빠른 시작 끄기 + 시간 맞추기
11. 용어 설명
부트로더 (Bootloader)
전원이 켜진 뒤 어떤 OS를 부팅할지 담당하는 프로그램. 리눅스는 GRUB, Windows는 Windows Boot Manager.
GRUB
리눅스 부트로더 겸 부팅 메뉴. Windows를 나중에 설치하면 밀려나므로 복구가 필요하다.
ESP (EFI System Partition)
UEFI 부팅 파일이 담긴 FAT32 파티션. Ubuntu와 Windows가 공유하며, 삭제·포맷하면 안 된다.
UEFI / GPT
현대 펌웨어 부팅 방식(UEFI)과 파티션 테이블(GPT). 두 OS를 같은 방식(UEFI+GPT)으로 맞춰야 공존한다.
MSR (Microsoft Reserved Partition)
Windows가 관리용으로 만드는 작은 예약 파티션. 설치기가 자동 생성한다.
NTFS
Windows 기본 파일시스템. Windows는 자기 파티션을 NTFS로 만든다.
Boot-Repair
GRUB·부팅 문제를 자동 진단·복구해 주는 도구. Live USB에서 실행한다.
chroot
Live 환경에서 설치된 시스템으로 "들어가" 명령을 실행하는 방법. 수동 GRUB 재설치에 쓴다.
os-prober
다른 OS(여기선 Windows)를 탐지해 GRUB 메뉴에 추가하는 도구.
efibootmgr
UEFI 부팅 항목·순서를 조회·변경하는 도구. ubuntu를 1순위로 만들 때 사용.
Fast Startup (빠른 시작)
Windows의 하이브리드 종료 기능. 디스크를 잠근 채 꺼서 듀얼부팅에서 문제를 유발 → 끄는 것을 권장.
RTC / localtime / UTC
하드웨어 시계(RTC) 기준. Windows는 localtime, 리눅스는 UTC를 기본 사용해 시간이 어긋날 수 있다.
본 문서는 학습용 안내입니다. 파티션·부트로더 작업은 데이터 손실 위험이 있으니 반드시 백업 후 본인 디스크의 실제 장치명을 확인하고 진행하세요.
Windows 10은 지원 종료 상태이므로 보안상 Windows 11 또는 최신 OS 사용을 함께 검토하시길 권합니다.
Ubuntu 24.04(i5-7200U)에 VirtualBox 설치 → Windows 11 가상머신 만들기
Intel Core i5-7200U가 장착된 Ubuntu 24.04 노트북에 VirtualBox를 설치하고
그 위에 Windows 11을 가상머신(VM)으로 올리는 전체 과정입니다. 이 CPU는 7세대(Kaby Lake, 2016)라
Windows 11의 공식 CPU 요구사항(8세대 이상)을 만족하지 못합니다. 다행히 TPM 2.0·Secure Boot는 VirtualBox 7이
가상으로 제공하고, CPU 검사만 설치 중 우회하면 됩니다. 이 문서는 그 방법까지 포함합니다.
⚠ CPU 호환성 → Windows 11은 8세대 이상만 공식 지원. 7세대는 설치 중 우회(bypass) 필요.
⚠ 성능 → 2코어/4스레드 저전력 CPU라 Windows 11 VM은 가볍게 쓰는 용도로만 권장.
목차
전체 작업 흐름
하드웨어 궁합 점검 (VT-x·TPM·CPU)
1단계 — VT-x(가상화) 활성화 확인
2단계 — VirtualBox 설치 (두 가지 방법)
3단계 — Windows 11 ISO 준비
4단계 — VM 생성 (EFI·TPM 2.0·Secure Boot)
5단계 — Windows 11 설치 + CPU 검사 우회
6단계 — Guest Additions 설치
성능 최적화 · 문제 해결
용어 설명
1. 전체 작업 흐름
그림 1. 전체 6단계 흐름. i5-7200U에서는 ⑤ CPU 검사 우회가 관건, TPM/Secure Boot는 ④에서 VirtualBox가 해결. [확대]✕
2. 하드웨어 궁합 점검 (VT-x·TPM·CPU)
그림 2. 궁합 점검 — VT-x·TPM·Secure Boot는 해결되고, 7세대 CPU 요구사항만 설치 중 우회하면 된다. [확대]✕
3. 1단계 — VT-x(가상화) 활성화 확인
먼저 BIOS/UEFI에서 Intel Virtualization Technology(VT-x)가 켜져 있어야 합니다. Ubuntu에서 확인:
# 값이 0보다 크면 CPU가 가상화를 지원 (vmx=Intel)
egrep -c '(vmx|svm)' /proc/cpuinfo
# 더 친절한 확인 도구
sudo apt install -y cpu-checker
kvm-ok # "KVM acceleration can be used" 나오면 OK
lscpu | grep -i virtual # Virtualization: VT-x 표시 확인
0이 나오면
재부팅 → BIOS/UEFI 진입(보통 F2/DEL) → Advanced → CPU Configuration → Intel Virtualization Technology → Enabled로 변경 후 저장.
4. 2단계 — VirtualBox 설치 (두 가지 방법)
그림 3. 설치 두 경로 — 간단한 Ubuntu 저장소(A) vs 최신 7.x가 보장되는 Oracle 공식 저장소(B, 권장). [확대]✕
방법 A — Ubuntu 저장소 (가장 간단)
sudo apt update
sudo apt install -y virtualbox virtualbox-ext-pack
# 설치 후 버전 확인 (Windows 11엔 7.x 권장)
vboxmanage --version
방법 B — Oracle 공식 저장소 (최신 7.x, 권장)
sudo apt update && sudo apt install -y wget gpg
# Oracle 서명키 등록
wget -O- https://www.virtualbox.org/download/oracle_vbox_2016.asc \
| sudo gpg --dearmor --yes -o /usr/share/keyrings/oracle-virtualbox-2016.gpg
# 저장소 추가 (Ubuntu 24.04 코드명 = noble)
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/oracle-virtualbox-2016.gpg] \
https://download.virtualbox.org/virtualbox/debian noble contrib" \
| sudo tee /etc/apt/sources.list.d/virtualbox.list
sudo apt update
sudo apt install -y virtualbox-7.1 # (또는 virtualbox-7.0)
# USB 등 사용 위해 그룹 추가 후 재로그인
sudo usermod -aG vboxusers $USER
호스트 Secure Boot가 켜져 있으면
VirtualBox 커널 모듈(vboxdrv)은 서명이 필요합니다. 설치 중 MOK 등록(비밀번호 설정 → 재부팅 시 "Enroll MOK") 안내가 뜨면 따라 하세요.
안 되면 호스트 BIOS에서 Secure Boot를 잠시 끄는 방법도 있습니다. 모듈 상태 확인: sudo systemctl status vboxdrv 또는 lsmod | grep vboxdrv.
5. 3단계 — Windows 11 ISO 준비
Microsoft 공식 사이트에서 Windows 11 디스크 이미지(ISO)를 내려받습니다(64-bit).
다운로드한 .iso 파일 경로를 기억해 둡니다(4단계에서 지정).
라이선스
Windows 11은 상용 OS입니다. 정품 라이선스(제품 키) 준비를 권장합니다(설치 자체는 키 없이 진행 후 나중에 활성화 가능).
6. 4단계 — VM 생성 (EFI · TPM 2.0 · Secure Boot)
VirtualBox를 실행하고 "새로 만들기(New)"로 VM을 만듭니다. Windows 11이 요구하는 TPM·Secure Boot를 여기서 켭니다.
그림 4. VM 설정 — Windows 11(64bit), EFI·TPM 2.0·Secure Boot 활성화, RAM 4GB·2 vCPU·64GB 디스크. [확대]✕
새로 만들기 → 이름 입력, ISO 이미지에 내려받은 Win11 ISO 지정.
"Skip Unattended Installation(무인 설치 건너뛰기)"을 체크하면 설치 화면을 직접 제어할 수 있어 우회가 쉽습니다.
종류 Windows 11 (64-bit), RAM 4096MB, CPU 2, 디스크 64GB↑.
생성 후 설정 → 시스템 → 마더보드: EFI 사용 체크, TPM 2.0 선택.
설정 → 시스템 → (Secure Boot): Secure Boot 사용 체크.
디스플레이 비디오 메모리 128MB, 필요 시 3D 가속(성능 여유 없으면 생략).
7. 5단계 — Windows 11 설치 + CPU 검사 우회 (핵심)
VM을 시작해 ISO로 부팅합니다. TPM·Secure Boot는 켰지만 7세대 CPU라 "이 PC는 Windows 11을 실행할 수 없습니다"가
뜰 수 있습니다. 이때 레지스트리로 CPU(및 잔여) 검사를 우회합니다.
그림 5. CPU 검사 우회 — 미지원 화면에서 Shift+F10 → regedit → LabConfig 키에 Bypass 값들을 만들고 설치를 계속한다. [확대]✕
설치 도중 "이 PC는 Windows 11을 실행할 수 없습니다"가 뜨면 그 화면에서 Shift + F10 → 명령 프롬프트.
regedit 입력 → 레지스트리 편집기.
HKEY_LOCAL_MACHINE\SYSTEM\Setup에서 Setup 우클릭 → 새로 만들기 → 키 → 이름 LabConfig.
LabConfig 안에 DWORD(32비트) 값들을 만들고 값을 1로:
BypassCPUCheck = 1 ← 7세대 CPU 핵심
BypassTPMCheck = 1
BypassSecureBootCheck = 1
BypassRAMCheck = 1
regedit·명령창 닫기 → 설치 화면에서 뒤로 갔다가 다시 진행 → 이제 통과됩니다.
이후는 일반 Windows 11 설치와 동일(에디션·디스크 선택 → 설치 → 계정 설정).
참고
VM에서 TPM 2.0·Secure Boot를 이미 켰다면 사실상 BypassCPUCheck만 있어도 통과되는 경우가 많지만, 안전하게 위 4개를 모두 넣는 것을 권장합니다.
(대안: Rufus로 요구사항 우회 ISO를 만들어 쓰는 방법도 있음)
8. 6단계 — Guest Additions 설치 (화면·성능·클립보드)
설치 후 화면 크기 자동 조절, 마우스 통합, 클립보드 공유, 성능 향상을 위해 Guest Additions를 설치합니다.
Windows 11 VM이 켜진 상태에서 상단 메뉴 장치(Devices) → "Guest Additions CD 이미지 삽입".
Windows 탐색기에서 CD 드라이브 → VBoxWindowsAdditions.exe 실행 → 설치 → 재부팅.
이후 보기 → 자동 크기 조정, 양방향 클립보드(장치 → 클립보드 공유 → 양방향) 사용 가능.
9. 성능 최적화 · 문제 해결
증상/목표
대처
매우 느림
i5-7200U는 저전력 2코어라 한계. RAM 4GB·2 vCPU 고정, 불필요 시각효과 끄기, 백그라운드 앱 최소화. 호스트 RAM이 8GB면 VM에 4GB 이상 주기 어려움 → 무거운 작업엔 부적합.
"VT-x is disabled" 오류
BIOS에서 Intel VT-x 활성화. 또 호스트에서 KVM과 충돌 시(다른 하이퍼바이저 동시 사용) 한쪽만 사용.
LabConfig 4개 값 재확인, VM의 TPM 2.0·Secure Boot·EFI 설정 재확인.
화면이 작게 고정
Guest Additions 설치 후 "자동 크기 조정".
USB 인식 안 됨
sudo usermod -aG vboxusers $USER 후 재로그인, Extension Pack 설치.
현실적 기대치
i5-7200U(2C/4T)에서 Windows 11 VM은 가벼운 문서·웹·테스트 용도로는 쓸 만하지만, 영상편집·게임·무거운 개발엔 버겁습니다.
호스트 RAM이 8GB 이하라면 VM과 호스트가 함께 느려질 수 있으니 RAM 증설(16GB)을 권합니다.
10. 용어 설명
VirtualBox
Oracle의 무료 오픈소스 가상화 소프트웨어. 호스트 OS 위에서 다른 OS를 가상머신(VM)으로 실행한다.
VM (Virtual Machine, 가상머신)
소프트웨어로 만든 가상의 컴퓨터. 여기서는 Ubuntu(호스트) 위에 Windows 11(게스트)을 올린다.
호스트 / 게스트 (Host / Guest)
가상화를 실행하는 실제 OS(호스트=Ubuntu)와, 그 안에서 도는 OS(게스트=Windows 11).
VT-x
인텔의 하드웨어 가상화 기술. BIOS에서 켜야 VM이 원활히·64비트로 동작한다. i5-7200U는 지원.
TPM 2.0 (Trusted Platform Module)
보안 키·측정값을 저장하는 하드웨어 모듈. Windows 11 요구사항으로, VirtualBox 7이 가상으로 제공한다.
Secure Boot
서명된 부트로더만 실행하는 UEFI 보안 기능. Windows 11 요구사항이며 VM 설정에서 켠다.
EFI / UEFI
현대 펌웨어 부팅 방식. Windows 11 VM은 EFI로 부팅해야 한다(VM 설정에서 "EFI 사용").
LabConfig / Bypass 키
Windows 설치 중 레지스트리에서 CPU·TPM·Secure Boot·RAM 요구사항 검사를 건너뛰게 하는 값들.
Guest Additions
게스트에 설치하는 드라이버·도구 묶음. 화면 자동조절·클립보드 공유·성능 향상을 제공한다.
Extension Pack
USB 2.0/3.0, RDP 등 추가 기능 팩. (개인·평가용 라이선스 조건 확인)
MOK (Machine Owner Key)
호스트 Secure Boot가 켜졌을 때 커널 모듈(vboxdrv) 서명을 등록하는 절차.
본 문서는 학습용 안내입니다. i5-7200U는 Windows 11 공식 미지원 CPU이므로 우회 설치는 테스트·학습 목적으로 권장되며,
공식 지원·보안 업데이트 보장이 제한될 수 있습니다. Windows는 정품 라이선스 사용을 권장합니다. 명령·메뉴 명칭은 VirtualBox 버전에 따라 다를 수 있습니다.
회사가 수백~수천 대의 PC와 스마트폰에 일관된 보안 설정·소프트웨어·인증서를 배포하려면 어떻게 할까요?
전통적으로는 Windows의 GPO(Group Policy Object, 그룹 정책 개체)가, 모바일과 클라우드 시대에는
MDM(Mobile Device Management, 모바일 단말 관리)가 그 역할을 합니다. 이 문서는 두 기술의 개념·아키텍처·동작·차이,
그리고 현대적 통합 흐름(UEM·Intune)까지 그림과 함께 자세히 정리합니다.
이 문서를 쓰게 된 맥락
앞서 "SSL 가시화" 문서에서 내부 CA 인증서를 모든 단말에 배포하는 수단으로 GPO와 MDM이 등장했습니다.
이 글은 그 GPO·MDM 자체를 깊게 다루며, 마지막에 "인증서 배포" 실무 시나리오로 다시 연결합니다.
목차
엔드포인트 관리 — 큰 그림
GPO란 무엇인가
GPO 아키텍처 — AD · GPC · GPT(SYSVOL)
GPO 적용 순서 — LSDOU와 상속
GPO 구성과 관리 도구
MDM이란 무엇인가 — 태동 배경
MDM 아키텍처 — 서버 · Push · 프로파일
MDM 등록(Enrollment)과 정책 배포 절차
MDM을 둘러싼 개념 — EMM · UEM · MAM · MCM
GPO vs MDM 비교
현대적 흐름 — 클라우드 · Intune · Co-management
실무 시나리오 — 인증서 · Wi-Fi · 앱 배포
시장과 선도 기업
용어 설명
1. 엔드포인트 관리 — 큰 그림
조직이 늘어나는 단말(PC·노트북·스마트폰·태블릿)을 중앙에서 일관되게 통제·보호하는 활동을
엔드포인트 관리(Endpoint Management)라 합니다. 목표는 보안 설정 강제, 소프트웨어·업데이트 배포,
인증서·Wi-Fi·VPN 프로파일 배포, 분실 시 원격 잠금·삭제 등입니다.
그림 1. GPO(사내망 Windows 중심, pull)와 MDM(클라우드·크로스플랫폼, push)의 큰 그림. [확대]✕
2. GPO란 무엇인가
GPO(Group Policy Object)는 Microsoft Active Directory(AD) 환경에서 사용자와 컴퓨터의
설정을 중앙에서 정의·강제하는 "정책 묶음"입니다. Windows 2000부터 도입된 그룹 정책(Group Policy)의
핵심 단위로, 하나의 GPO 안에는 수백~수천 개의 설정(암호 정책, 화면 잠금, 방화벽, 소프트웨어 설치, 로그온 스크립트,
인증서 배포 등)을 담을 수 있습니다.
GPO는 AD의 사이트(Site)·도메인(Domain)·조직 단위(OU, Organizational Unit)에 연결(link)되어,
그 범위 안의 컴퓨터·사용자에게 적용됩니다.
3. GPO 아키텍처 — AD · GPC · GPT(SYSVOL)
하나의 GPO는 물리적으로 두 부분으로 나뉘어 저장됩니다.
GPC(Group Policy Container) — AD 데이터베이스에 저장되는 부분. GPO의 속성·버전·상태 등 메타데이터.
GPT(Group Policy Template) — 도메인 컨트롤러의 공유 폴더 SYSVOL에 저장되는 실제 설정 파일들(스크립트, 관리 템플릿 값 등). 경로는 \\도메인\SYSVOL\...\Policies\{GUID}.
그림 2. GPO 아키텍처 — 메타데이터는 AD(GPC), 실제 설정은 SYSVOL(GPT). 클라이언트가 주기적으로 가져가 적용한다. [확대]✕
적용 시점과 주기컴퓨터 설정은 부팅 시, 사용자 설정은 로그온 시 적용됩니다.
이후 백그라운드로 약 90분(+0~30분 랜덤)마다 갱신되고, 도메인 컨트롤러는 5분마다 갱신합니다.
즉시 적용하려면 gpupdate /force를 씁니다.
4. GPO 적용 순서 — LSDOU와 상속
한 컴퓨터·사용자에 여러 GPO가 겹칠 수 있습니다. 이때 적용 순서는 LSDOU입니다 —
Local(로컬) → Site(사이트) → Domain(도메인) → OU(조직 단위, 상위→하위).
나중에 적용되는 것이 앞의 것을 덮어씁니다. 따라서 대상에 가장 가까운 하위 OU의 GPO가 최종 우선권을 갖습니다.
그림 3. GPO 적용 순서(LSDOU)와 예외 — Block Inheritance(상속 차단)와 Enforced(강제)로 우선순위를 조정한다. [확대]✕
5. GPO 구성과 관리 도구
모든 GPO는 크게 두 갈래로 나뉩니다.
Computer Configuration(컴퓨터 구성) — 컴퓨터에 적용(부팅 시). 예: 방화벽, 서비스, 보안 옵션, 신뢰할 수 있는 루트 인증서.
User Configuration(사용자 구성) — 사용자에 적용(로그온 시). 예: 바탕화면, 드라이브 매핑, 앱 제한.
그 아래 Administrative Templates(관리 템플릿)가 대표적인데, ADMX/ADML 파일로 정의되며 실제로는 레지스트리 값을 제어합니다. 조직 공통 템플릿은 SYSVOL의 Central Store에 둡니다.
도구
용도
GPMC (Group Policy Management Console)
GPO 생성·편집·링크·위임 관리의 중심 콘솔
gpupdate
정책 즉시 갱신 (gpupdate /force)
gpresult
실제 적용된 정책 결과 확인 (gpresult /r, /h report.html)
RSoP (Resultant Set of Policy)
여러 GPO가 겹쳤을 때 최종 결과 시뮬레이션·분석
PowerShell (GroupPolicy 모듈)
스크립트로 GPO 자동화
# 정책 즉시 적용 및 결과 확인
gpupdate /force
gpresult /r # 적용된 GPO 요약
gpresult /h C:\gpreport.html # HTML 상세 리포트
# PowerShell로 GPO 만들고 OU에 연결하기 (개념 예시)
New-GPO -Name "보안-화면잠금" -Comment "10분 후 화면 잠금"
New-GPLink -Name "보안-화면잠금" -Target "OU=사무직,DC=corp,DC=example,DC=com"
6. MDM이란 무엇인가 — 태동 배경
MDM(Mobile Device Management)은 스마트폰·태블릿, 그리고 이제는 PC까지 포함한 단말을
인터넷을 통해 원격으로 등록·설정·통제·보호하는 기술입니다. GPO가 "사내망의 Windows"에 최적화됐다면,
MDM은 다음 변화에 대응하기 위해 등장했습니다.
스마트폰·태블릿의 폭증 — iOS·안드로이드는 AD 도메인에 가입하지 않는다.
BYOD(Bring Your Own Device) — 개인 기기로 업무를 보는 흐름.
원격·재택근무 — 사내망 밖의 단말을 통제해야 함(GPO의 사내망 전제가 깨짐).
크로스 플랫폼 — Windows·mac·iOS·안드로이드를 한 콘솔에서.
7. MDM 아키텍처 — 서버 · Push · 프로파일
MDM은 OS 제조사가 만든 관리 프레임워크 위에서 동작합니다. 핵심은 MDM 서버가 단말에게
"프로파일(정책)"을 밀어(push) 넣는 것인데, 직접 연결하는 대신 OS별 푸시 알림 서비스로
"서버에 접속하라"는 신호를 보내는 구조입니다.
Apple(iOS·macOS) — APNs(Apple Push Notification service)로 깨우고, 단말이 MDM 서버에 접속해 명령을 받음. Apple MDM 프로토콜 사용.
Windows — OMA-DM 표준 프로토콜 + WNS(Windows Notification Service) 푸시.
그림 4. MDM 아키텍처 — 서버가 OS별 푸시(APNs·FCM·WNS)로 단말을 깨우면, 단말이 접속해 프로파일·명령을 받아 적용한다. [확대]✕
8. MDM 등록(Enrollment)과 정책 배포 절차
MDM은 단말이 등록(Enrollment)되어야 통제가 시작됩니다. 절차는 대략 다음과 같습니다.
그림 5. MDM 절차 — 등록 → 신원 확인 → 프로파일 배포 → 컴플라이언스 점검 → 원격 조치(분실 시 잠금·삭제). [확대]✕
<!-- Apple 구성 프로파일(.mobileconfig)의 개념적 구조 (XML) -->
<plist version="1.0">
<dict>
<key>PayloadType</key> <string>com.apple.wifi.managed</string>
<key>PayloadDisplayName</key> <string>회사 Wi-Fi</string>
<key>SSID_STR</key> <string>CORP-WIFI</string>
<key>EncryptionType</key> <string>WPA2</string>
</dict>
</plist>
<!-- MDM 서버가 이런 프로파일을 단말에 push → 사용자가 손대지 않아도 Wi-Fi가 설정됨 -->
9. MDM을 둘러싼 개념 — EMM · UEM · MAM · MCM
MDM은 더 큰 관리 개념의 일부로 발전했습니다. 용어가 헷갈리기 쉬워 관계를 정리합니다.
그림 6. 개념의 포함 관계 — MDM(단말) ⊂ EMM(모빌리티 전반) ⊂ UEM(PC·모바일·IoT 통합). MAM은 앱, MCM은 콘텐츠 관리. [확대]✕
용어
관리 대상
특징
MDM
단말(Device) 전체
기기 등록·설정·잠금·삭제. 강력하지만 BYOD엔 부담
MAM (Mobile Application Management)
앱 단위
기기 등록 없이 회사 앱·데이터만 통제(BYOD에 적합). 예: 앱 보호 정책
MCM (Mobile Content Management)
문서·콘텐츠
사내 문서의 접근·배포·보안
EMM
모빌리티 전반
MDM+MAM+MCM+신원(ID)을 묶은 개념
UEM
모든 엔드포인트
PC·모바일·IoT를 하나의 콘솔로 통합 관리(현재 지향점)
10. GPO vs MDM 비교
항목
GPO
MDM
기반
Active Directory(온프레미스)
클라우드 MDM 서비스
대상 OS
주로 Windows
iOS·안드로이드·Windows·macOS 등
연결 조건
사내망(도메인 컨트롤러 도달 필요)
인터넷만 있으면 어디서나
정책 전달
클라이언트가 가져감(pull)
서버가 밀어줌(push, OS 프레임워크)
적용 단위
Site/Domain/OU
그룹·태그·동적 그룹
제어 깊이
Windows에 대해 매우 세밀
OS가 허용하는 API 범위
BYOD·원격
불리
강점(선택적 삭제·앱 단위 관리)
대표
Windows Server AD, GPMC
Intune, Workspace ONE, Jamf
그림 7. 핵심 차이 — GPO는 사내망에서 클라이언트가 "가져가는(pull)" 방식, MDM은 인터넷 너머로 서버가 "밀어주는(push)" 방식. [확대]✕
11. 현대적 흐름 — 클라우드 · Intune · Co-management
많은 조직이 온프레미스 AD/GPO에서 클라우드 기반 MDM으로 이동하고 있습니다. 마이크로소프트 진영에서는
Entra ID(구 Azure AD) + Intune 조합이 대표적입니다. 단말을 클라우드에 조인·등록하면, 사내망 없이도
정책·앱·인증서를 배포할 수 있습니다.
Co-management(공동 관리) — 기존 ConfigMgr(SCCM)와 Intune을 함께 써 점진적으로 전환.
GPO → MDM 전환 지원 — Intune의 Group Policy Analytics가 기존 GPO를 분석해 대응하는 MDM 설정으로 매핑해 주고, Settings Catalog·Administrative Templates로 유사한 설정을 클라우드에서 제공.
조건부 접근(Conditional Access) — "규정을 준수한(compliant) 단말만 사내 리소스 접근 허용" 같은 정책과 결합.
그림 8. 흐름 — 온프레미스 AD/GPO에서 클라우드(Entra ID + Intune) 기반 UEM으로. Co-management로 점진 전환한다. [확대]✕
12. 실무 시나리오 — 인증서 · Wi-Fi · 앱 배포
① 내부 CA 인증서 배포 (SSL 가시화 연계)
"SSL 가시화" 문서에서 본 것처럼, 복호화 장비의 내부 Root CA 인증서를 모든 단말이 신뢰하게 하려면
GPO 또는 MDM으로 배포합니다.
GPO: Computer Configuration → Windows Settings → Security Settings → Public Key Policies → Trusted Root Certification Authorities에 CA 인증서를 추가하면 도메인 PC 전체가 자동 신뢰.
MDM: "인증서 프로파일(Trusted Certificate)"로 iOS·안드로이드·Windows·mac에 동시에 배포.
② Wi-Fi / VPN 프로파일
사용자가 손대지 않아도 회사 Wi-Fi·VPN이 자동 설정되도록 프로파일을 배포합니다(그림 5의 .mobileconfig 예시).
③ 앱 배포·제한
필수 업무 앱을 자동 설치하고, 금지 앱을 차단합니다. MDM은 앱 스토어(사내 카탈로그)와 연동해 원격 설치·제거가 가능합니다.
④ 보안 기준 강제·컴플라이언스
암호 복잡도, 화면 잠금, 디스크 암호화(BitLocker·FileVault), 최신 OS 버전 등을 강제하고, 미준수 단말은 사내 리소스 접근을 차단(조건부 접근)합니다.
실무 팁
같은 목표(예: CA 배포)라도 도메인 가입 Windows는 GPO, 모바일·원격·BYOD는 MDM으로 나눠 접근하는 것이 현실적입니다.
많은 조직이 당분간 GPO와 MDM을 병행합니다.
13. 시장과 선도 기업
기업 / 제품
특징
Microsoft Intune (Entra ID 연계)
클라우드 UEM의 대표. Windows·모바일 통합, GPO 전환 지원, 조건부 접근. 사실상 시장 기준
BGP 완전 정복 — 개념부터 장비 설정, 그리고 클라우드(OpenStack · Kubernetes)까지
BGP(Border Gateway Protocol, 경계 경로 프로토콜)는 "인터넷을 하나로 묶는 접착제"입니다.
전 세계 수만 개의 독립 네트워크(AS)가 서로 어떤 IP 대역이 어디에 있는지를 이 프로토콜로 주고받습니다.
그런데 BGP는 이제 통신사 백본을 넘어 데이터센터 내부, 그리고 OpenStack·Kubernetes 같은 클라우드 안까지
깊숙이 들어와 있습니다. 이 문서는 BGP의 개념·동작·경로 선택부터 실무 장비 설정, 그리고 클라우드 활용 사례까지
그림과 함께 아주 자세히 정리합니다.
함께 보면 좋은 문서
BGP는 앞서 다룬 "Anycast" 문서의 핵심 엔진이자, "DNS"·"OVS(Open vSwitch)" 문서와도 이어집니다.
Anycast·데이터센터 패브릭·Kubernetes 네트워킹을 이해하려면 결국 BGP로 돌아오게 됩니다.
목차
BGP란 무엇인가 — 인터넷의 지도 프로토콜
IGP vs EGP — BGP의 자리
핵심 개념 — AS · eBGP/iBGP · 세션 · 메시지
BGP 상태 머신과 세션 수립 절차
경로 속성(Path Attributes)과 Best Path 선정
운영 시나리오 ① 멀티홈(Multihoming)과 이중화
운영 시나리오 ② 인바운드/아웃바운드 트래픽 제어
운영 시나리오 ③ iBGP 확장 — Route Reflector
운영 시나리오 ④ 데이터센터 Spine-Leaf eBGP 패브릭
실무 장비 설정 (Cisco · Juniper · FRRouting)
BGP 보안과 안정성 — 필터링 · RPKI · 하이재킹
클라우드 ① OpenStack Neutron 동적 라우팅
클라우드 ② Kubernetes — Calico · MetalLB · Cilium
클라우드 ③ BGP EVPN / VXLAN 오버레이
운영·트러블슈팅 팁
시장과 생태계
용어 설명
1. BGP란 무엇인가 — 인터넷의 지도 프로토콜
인터넷은 하나의 거대한 네트워크가 아니라, 독립적으로 운영되는 수만 개의 네트워크(AS, Autonomous System, 자율 시스템)가
서로 연결된 "네트워크들의 네트워크"입니다. 각 AS(통신사, 대기업, 클라우드 사업자 등)는 자신이 보유한 IP 대역을 가지고 있습니다.
BGP는 이 AS들 사이에서 "어떤 IP 대역이 어느 경로를 통해 도달 가능한지"를 광고하고 학습하는 프로토콜입니다.
BGP는 경로 벡터(Path Vector) 프로토콜입니다. 단순히 "거리(hop 수)"만 보는 것이 아니라,
목적지까지 거쳐 가는 AS들의 목록(AS_PATH)과 다양한 정책 속성을 함께 전달합니다. 덕분에 루프를 방지하고,
사업자마다 원하는 정책(policy)에 따라 경로를 선택할 수 있습니다.
그림 1. 인터넷은 AS들이 BGP 피어링으로 연결된 구조. BGP가 "어느 대역이 어디 있는지"의 지도를 만든다. [확대]✕
2. IGP vs EGP — BGP의 자리
라우팅 프로토콜은 크게 두 종류로 나뉩니다. BGP가 어디에 위치하는지 이해하는 것이 중요합니다.
구분
IGP (내부 게이트웨이 프로토콜)
EGP (외부 게이트웨이 프로토콜)
대표
OSPF, IS-IS, EIGRP, RIP
BGP (사실상 유일)
범위
하나의 AS 내부
AS 사이(그리고 대규모 내부)
목표
가장 빠른 경로(최단 거리) 찾기
정책(policy) 기반 경로 선택
기준
링크 비용·hop 등 메트릭
AS_PATH·LOCAL_PREF 등 다수 속성
규모
수백~수천 경로
전체 인터넷 100만+ 경로 감당
한 줄 정리
IGP는 "우리 집 안에서 방을 오가는 최단 길"을, BGP는 "전 세계 도시들 사이의 정책적 통행로"를 정합니다.
둘은 경쟁이 아니라 함께 씁니다. 실제로 BGP는 다음 홉까지 도달하기 위해 내부적으로 IGP에 의존합니다.
3. 핵심 개념 — AS · eBGP/iBGP · 세션 · 메시지
eBGP와 iBGP
BGP 세션은 두 종류입니다. 어느 AS끼리 맺느냐에 따라 동작이 크게 다릅니다.
eBGP(external BGP) — 서로 다른 AS 사이의 세션. 보통 물리적으로 직접 연결된 이웃과 맺음(기본 TTL 1).
iBGP(internal BGP) — 같은 AS 내부의 라우터끼리 맺는 세션. 외부에서 배운 경로를 AS 내부에 전파하는 데 사용.
그림 2. eBGP(AS 사이)와 iBGP(AS 내부). 외부 경로를 내부로 나르는 것이 iBGP의 역할. [확대]✕
iBGP의 중요한 규칙 — Split Horizon
루프 방지를 위해 iBGP로 배운 경로는 다른 iBGP 이웃에게 다시 전달하지 않습니다.
그래서 전통적으로 모든 iBGP 라우터는 서로 직접 세션을 맺는 Full Mesh가 필요했고,
이 확장성 문제를 푸는 것이 뒤에 나올 Route Reflector입니다.
BGP 세션과 메시지
BGP는 TCP 179번 포트 위에서 동작합니다(신뢰성 있는 전송에 의존). 세션이 맺어지면 4가지 메시지를 주고받습니다.
메시지
역할
OPEN
세션 시작. AS 번호·BGP 버전·Hold Time·Router ID 등 협상
UPDATE
경로 광고/철회. NLRI(도달 가능한 대역)와 Path Attributes를 실어 나름
KEEPALIVE
세션이 살아있음을 알리는 주기적 신호(기본 60초, Hold 180초)
NOTIFICATION
오류 발생 시 전송하고 세션 종료
4. BGP 상태 머신과 세션 수립 절차
BGP 세션은 정해진 상태 머신(Finite State Machine)을 거쳐 Established(수립 완료)에 도달합니다.
그림 3. BGP 상태 머신 — Idle → Connect → Active → OpenSent → OpenConfirm → Established. 마지막 단계에서만 경로가 오간다. [확대]✕
운영 팁
세션이 Active에서 멈춰 있으면 대개 TCP 179 연결 실패(방화벽·주소·AS 번호 불일치)입니다.
Idle에 머물면 설정 오류나 이웃 미도달이 흔한 원인입니다. Established 여부가 첫 점검 지점입니다.
5. 경로 속성(Path Attributes)과 Best Path 선정
같은 목적지로 가는 경로가 여러 개일 때, BGP는 경로 속성(Path Attributes)을 순서대로 비교해 단 하나의
최적 경로(Best Path)를 고릅니다. 주요 속성은 다음과 같습니다.
속성
의미
방향/범위
Weight (Cisco 고유)
클수록 선호. 해당 라우터에서만 유효(로컬)
아웃바운드(로컬)
LOCAL_PREF
클수록 선호. AS 내부 전체가 공유 → 아웃바운드 경로 결정
AS 내부
AS_PATH
짧을수록 선호. 거쳐 온 AS 목록(루프 방지에도 사용)
전역
ORIGIN
경로의 출처(IGP < EGP < Incomplete)
전역
MED (Multi-Exit Discriminator)
작을수록 선호. 이웃 AS에게 "우리 쪽 어느 입구로 들어와라" 힌트 → 인바운드 힌트
인접 AS
NEXT_HOP
다음 홉 IP. iBGP에서 특히 주의(next-hop-self)
-
COMMUNITY
경로에 붙이는 태그. 정책을 유연하게 적용
정책용
그림 4. BGP Best Path 결정 순서(요약). 실무에서 가장 많이 만지는 손잡이는 ② LOCAL_PREF, ④ AS_PATH, ⑥ MED이다. [확대]✕
6. 운영 시나리오 ① 멀티홈(Multihoming)과 이중화
기업이 인터넷 회선을 두 개 이상의 ISP에 연결하는 것을 멀티홈(Multihoming)이라 합니다.
목적은 이중화(한 ISP 장애 시 다른 ISP로 자동 전환)와 트래픽 분산입니다.
자체 AS 번호와 독립 IP 대역(PI)을 가지고 두 ISP와 각각 eBGP를 맺습니다.
그림 5. 멀티홈 — 두 ISP와 eBGP를 맺어 이중화·부하분산. 자체 AS와 IP 대역이 필요하다. [확대]✕
7. 운영 시나리오 ② 인바운드/아웃바운드 트래픽 제어
멀티홈에서 가장 중요한 실무 기술은 "트래픽이 어느 회선으로 나가고 들어오게 할지" 제어하는 것입니다.
핵심 원리는 다음과 같습니다.
아웃바운드(나가는 트래픽) 제어 = LOCAL_PREF — 내부에서 선호 회선을 정한다. 값이 클수록 선호. 내가 통제하기 쉬움.
인바운드(들어오는 트래픽) 제어 = AS_PATH Prepend / MED / Community — 상대가 내 경로를 어떻게 볼지 조정. 상대 정책에 좌우되어 통제가 어려움.
그림 6. 트래픽 방향 제어 — 아웃바운드는 LOCAL_PREF, 인바운드는 AS_PATH prepend(경로를 길게 보이게)로 유도한다. [확대]✕
8. 운영 시나리오 ③ iBGP 확장 — Route Reflector
iBGP는 "배운 경로를 다른 iBGP 이웃에 재전달하지 않는다"는 규칙 때문에, 라우터가 N대면
N×(N-1)/2 개의 Full Mesh 세션이 필요합니다. 라우터가 많아지면 관리가 폭발합니다.
이를 해결하는 것이 Route Reflector(RR, 경로 반사기)입니다. RR은 iBGP 경로를 다른 iBGP 이웃(client)에게
대신 반사(reflect)해 주어, Full Mesh 없이도 경로를 전파합니다.
그림 7. Route Reflector — Full Mesh의 세션 폭발 문제를 "중앙 반사기"로 해결. 대규모 AS의 필수 설계. [확대]✕
대규모 환경에서는 RR을 이중화하고, 또 다른 방법인 Confederation(연합)으로 AS를 잘게 나누기도 합니다.
9. 운영 시나리오 ④ 데이터센터 Spine-Leaf eBGP 패브릭
현대 데이터센터는 Spine-Leaf(CLOS) 토폴로지를 씁니다. 흥미롭게도 이 내부 패브릭의 라우팅 프로토콜로
전통적 IGP(OSPF) 대신 eBGP를 쓰는 것이 사실상 표준이 되었습니다(RFC 7938).
각 스위치를 별도 AS로 두고 eBGP로 연결하면, 단순·확장성·트래픽 엔지니어링·멀티벤더 측면에서 유리하기 때문입니다.
FRRouting이 중요한 이유FRR(FRRouting, Quagga의 후예)은 리눅스에서 동작하는 오픈소스 라우팅 스택입니다.
뒤에 나올 Kubernetes(Calico, MetalLB, Cilium)와 OpenStack, 그리고 화이트박스 스위치(SONiC)가
내부적으로 FRR을 BGP 엔진으로 사용합니다. "클라우드의 BGP = 사실상 FRR"이라 해도 과언이 아닙니다.
11. BGP 보안과 안정성 — 필터링 · RPKI · 하이재킹
BGP는 태생적으로 "이웃을 신뢰"하도록 설계되어, 잘못된(혹은 악의적인) 경로 광고에 취약합니다.
누군가 남의 IP 대역을 자기 것이라 광고하면 트래픽이 엉뚱한 곳으로 흘러가는데, 이를 BGP 하이재킹(hijacking)이라 합니다.
대책
설명
Prefix-list / Route-map 필터링
이웃에게 받을/보낼 대역을 명시적으로 제한(가장 기본)
Maximum-prefix
이웃이 보내는 경로 수 상한 → 폭주(누출) 시 세션 차단
RPKI / ROA
어떤 AS가 어떤 대역을 광고해도 되는지 암호학적으로 검증(Route Origin Validation)
TCP-AO / MD5, GTSM
세션 인증(MD5), TTL 검사(GTSM)로 위조 세션 방지
BGPsec
AS_PATH 전체를 서명으로 검증(도입 초기 단계)
그림 9. RPKI/ROA 기반 경로 원본 검증(Route Origin Validation) — BGP 하이재킹 방어의 핵심. [확대]✕
12. 클라우드 ① OpenStack Neutron 동적 라우팅
클라우드에서도 BGP가 깊이 쓰입니다. OpenStack의 네트워킹 서비스 Neutron은
neutron-dynamic-routing 확장으로 BGP를 지원합니다. 대표 용도는
"테넌트의 사설 IP(프로젝트 서브넷)와 Floating IP를 물리 네트워크로 자동 광고"하는 것입니다.
그러면 외부 라우터가 별도 정적 경로(static route) 없이도 클라우드 내부의 IP로 가는 길을 BGP로 학습합니다.
그림 10. OpenStack Neutron 동적 라우팅 — BGP Speaker가 테넌트 서브넷·Floating IP를 물리망에 자동 광고. [확대]✕
최근에는 OVN(Open Virtual Network) 기반 환경에서 OVN-BGP-Agent가 FRR과 연동해 같은 역할을 더 유연하게 수행합니다.
13. 클라우드 ② Kubernetes — Calico · MetalLB · Cilium
Kubernetes에서 BGP는 "Pod IP와 Service(LoadBalancer) IP를 클러스터 밖 네트워크로 광고"하는 데 핵심적으로 쓰입니다.
오버레이(터널) 없이 Pod IP를 물리망에서 직접 라우팅하거나, 온프레미스에서 LoadBalancer 타입 서비스를 구현할 때 BGP가 등장합니다.
(1) Calico — Pod 네트워크를 BGP로 광고
Calico는 대표적인 CNI(Container Network Interface)로, 각 노드에서 BGP(내부적으로 BIRD 또는 FRR)를 돌려
그 노드에 있는 Pod 대역(예: /26)을 다른 노드와 물리 라우터에 광고합니다. 덕분에 오버레이 없이도
Pod끼리 순수 IP 라우팅(no-overlay)으로 통신할 수 있어 성능·가시성이 좋습니다.
대규모에서는 노드마다 Full Mesh 대신 Route Reflector를 씁니다.
그림 11. Calico BGP — 노드마다 자기 Pod 대역을 광고해 오버레이 없이 Pod IP를 물리망에서 직접 라우팅. [확대]✕
# Calico 전역 BGP 설정 (AS 번호, RR 등)
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
name: default
spec:
asNumber: 64512
serviceClusterIPs:
- cidr: 10.96.0.0/12 # Service IP도 광고 가능
---
# 물리 라우터(ToR)와 BGP 피어링
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
name: tor-switch
spec:
peerIP: 10.0.0.1
asNumber: 64513
(2) MetalLB (BGP 모드) — 온프레미스 LoadBalancer 서비스
퍼블릭 클라우드가 아닌 온프레미스 Kubernetes에는 LoadBalancer 타입 서비스에 외부 IP를 붙여 주는 장치가 없습니다.
MetalLB가 이를 해결하는데, BGP 모드에서는 서비스의 외부 IP를 BGP로 물리 라우터에 광고해
클러스터 밖에서 그 IP로 접속할 수 있게 합니다. 여러 노드가 같은 서비스 IP를 광고하면 ECMP로 부하가 분산됩니다.
그림 12. MetalLB BGP 모드 — LoadBalancer 서비스 IP를 BGP로 광고해 온프레미스에서도 외부 접속·부하분산 실현. [확대]✕
Cilium은 eBPF 기반의 현대적 CNI로, 자체 BGP Control Plane(내부적으로 GoBGP)을 내장합니다.
Pod CIDR와 LoadBalancer IP를 BGP로 광고하는 점은 Calico·MetalLB와 비슷하지만, eBPF의 고성능 데이터 경로와 결합된다는 점이 특징입니다.
(참고: Cilium은 앞서 다룬 "eBPF/XDP" 기술과 직접 연결됩니다.)
대규모 데이터센터·클라우드에서는 VXLAN으로 L2 네트워크를 물리망 위에 겹쳐(overlay) 만들고,
그 제어 평면(control plane)으로 BGP EVPN(Ethernet VPN)을 사용합니다.
쉽게 말해 "어떤 가상머신·컨테이너의 MAC/IP가 어느 물리 서버(VTEP)에 있는지"를 BGP로 광고해,
넓은 데이터센터에서도 효율적으로 L2/L3 오버레이를 운영합니다.
그림 13. BGP EVPN/VXLAN — 물리 IP 패브릭 위에 가상 L2/L3 오버레이를 만들고, MAC/IP 정보를 BGP EVPN으로 광고한다. [확대]✕
15. 운영·트러블슈팅 팁
세션 상태 먼저 — show ip bgp summary로 이웃이 Established인지 확인. 숫자(경로 수)가 보이면 정상.