CASB
Cloud Access Security Broker (클라우드 접근 보안 중개)
조직과 클라우드 서비스 제공자 사이에 위치하여 보안 정책을 적용하는 보안 솔루션입니다. 클라우드 앱 사용 현황을 가시화하고, 데이터 유출을 방지하며, Shadow IT를 탐지하고 위협으로부터 조직을 보호합니다.
Cloud Access Security Broker (클라우드 접근 보안 중개)
조직과 클라우드 서비스 제공자 사이에 위치하여 보안 정책을 적용하는 보안 솔루션입니다. 클라우드 앱 사용 현황을 가시화하고, 데이터 유출을 방지하며, Shadow IT를 탐지하고 위협으로부터 조직을 보호합니다.
CASB(Cloud Access Security Broker)는 조직의 온프레미스 인프라와 클라우드 서비스 제공자 사이에 위치하는 보안 정책 실행 지점입니다. 직원들이 Salesforce, Office 365, Google Workspace, Dropbox 같은 다양한 SaaS 애플리케이션에 접근할 때 CASB는 중간에서 트래픽을 모니터링하고 보안 정책을 적용합니다. 이는 마치 클라우드로 가는 관문에 보안 검문소를 설치하는 것과 같습니다.
CASB의 등장 배경은 클라우드 서비스의 급격한 확산입니다. 2010년대 초반 SaaS 애플리케이션이 폭발적으로 증가하면서 IT 부서가 파악하지 못하는 클라우드 서비스 사용, 즉 Shadow IT가 심각한 보안 위협으로 대두되었습니다. Gartner는 2012년 CASB라는 개념을 정의했고, 기업들이 클라우드 환경에서도 온프레미스와 동일한 수준의 보안 통제를 적용할 수 있는 방법을 제시했습니다.
CASB는 네 가지 핵심 기둥(Four Pillars)을 제공합니다. 첫째, 가시성(Visibility)은 조직이 사용하는 모든 클라우드 앱과 사용자 활동을 파악합니다. 둘째, 컴플라이언스(Compliance)는 GDPR, HIPAA, PCI-DSS 등 규정 준수를 지원합니다. 셋째, 데이터 보안(Data Security)은 DLP(Data Loss Prevention)를 통해 민감한 데이터의 유출을 방지합니다. 넷째, 위협 방지(Threat Protection)는 맬웨어, 계정 탈취, 내부자 위협을 탐지하고 차단합니다.
현대 보안 아키텍처에서 CASB는 SASE(Secure Access Service Edge)와 Zero Trust의 핵심 구성 요소로 진화하고 있습니다. 단독 솔루션에서 SSE(Security Service Edge)로 통합되어 SWG(Secure Web Gateway), ZTNA(Zero Trust Network Access)와 함께 클라우드 네이티브 보안을 제공합니다. 특히 재택근무 확산으로 직원들이 어디서든 클라우드에 접근하는 환경에서 CASB의 중요성은 더욱 커지고 있습니다.
# CASB API를 활용한 Shadow IT 탐지 및 앱 분류 예제 - Python
import requests
from datetime import datetime, timedelta
from typing import Dict, List
import json
class CASBClient:
"""CASB API 클라이언트 - 클라우드 앱 가시성 및 정책 관리"""
def __init__(self, base_url: str, api_key: str):
self.base_url = base_url
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
def discover_cloud_apps(self, days: int = 30) -> List[Dict]:
"""Shadow IT 탐지 - 조직에서 사용 중인 모든 클라우드 앱 발견"""
params = {
"timeRange": f"last_{days}_days",
"includeUnsanctioned": True # 미승인 앱 포함
}
response = requests.get(
f"{self.base_url}/api/v1/discovery/apps",
headers=self.headers,
params=params
)
response.raise_for_status()
apps = response.json()["apps"]
return self._categorize_apps(apps)
def _categorize_apps(self, apps: List[Dict]) -> List[Dict]:
"""앱을 위험도와 승인 상태에 따라 분류"""
categorized = []
for app in apps:
risk_level = self._calculate_risk_score(app)
categorized.append({
"name": app["name"],
"category": app["category"],
"users": app["unique_users"],
"data_volume_mb": app["data_transferred_mb"],
"risk_level": risk_level,
"sanction_status": app.get("sanction_status", "unknown"),
"compliance_certifications": app.get("certifications", []),
"recommendation": self._get_recommendation(risk_level, app)
})
return sorted(categorized, key=lambda x: x["risk_level"], reverse=True)
def _calculate_risk_score(self, app: Dict) -> str:
"""클라우드 앱 위험도 점수 계산"""
score = 0
# 보안 인증 여부 확인
certs = app.get("certifications", [])
if "SOC2" not in certs:
score += 20
if "ISO27001" not in certs:
score += 15
# 데이터 암호화 지원
if not app.get("encryption_at_rest"):
score += 25
if not app.get("encryption_in_transit"):
score += 20
# 인증 방식
if "SSO" not in app.get("auth_methods", []):
score += 15
if "MFA" not in app.get("auth_methods", []):
score += 20
if score >= 60:
return "high"
elif score >= 30:
return "medium"
return "low"
def _get_recommendation(self, risk_level: str, app: Dict) -> str:
"""위험도에 따른 권장 조치"""
if risk_level == "high":
return "즉시 차단 권장 - 대체 승인 앱 사용 유도"
elif risk_level == "medium":
return "모니터링 강화 - DLP 정책 적용 필요"
return "승인 앱으로 등록 검토"
def apply_dlp_policy(self, app_id: str, policy_config: Dict) -> Dict:
"""DLP(Data Loss Prevention) 정책 적용"""
policy = {
"app_id": app_id,
"rules": [
{
"name": "PII_Detection",
"patterns": ["주민등록번호", "신용카드번호", "여권번호"],
"action": "block_and_alert",
"severity": "critical"
},
{
"name": "Sensitive_Files",
"file_types": [".xlsx", ".docx", ".pdf"],
"keywords": ["기밀", "대외비", "confidential"],
"action": "encrypt_or_block",
"severity": "high"
}
],
**policy_config
}
response = requests.post(
f"{self.base_url}/api/v1/dlp/policies",
headers=self.headers,
json=policy
)
response.raise_for_status()
return response.json()
def get_user_activity_anomalies(self, user_email: str = None) -> List[Dict]:
"""사용자 행위 이상 탐지 - 계정 탈취/내부자 위협"""
params = {"detection_type": "anomaly"}
if user_email:
params["user"] = user_email
response = requests.get(
f"{self.base_url}/api/v1/ueba/alerts",
headers=self.headers,
params=params
)
response.raise_for_status()
return response.json()["alerts"]
# 사용 예시
if __name__ == "__main__":
casb = CASBClient(
base_url="https://casb.example.com",
api_key="your-api-key"
)
# Shadow IT 탐지
discovered_apps = casb.discover_cloud_apps(days=30)
print("=== Shadow IT 탐지 결과 ===")
for app in discovered_apps[:10]:
print(f"앱: {app['name']}")
print(f" - 사용자: {app['users']}명")
print(f" - 데이터 전송량: {app['data_volume_mb']}MB")
print(f" - 위험도: {app['risk_level']}")
print(f" - 권장 조치: {app['recommendation']}")
print()
# CASB 정책 설정 파일 예제 - YAML
# 클라우드 앱 접근 제어, DLP, 위협 방지 정책 정의
casb_policy:
name: "Enterprise Cloud Security Policy"
version: "2.0"
effective_date: "2024-01-01"
# 1. 클라우드 앱 분류 및 접근 제어
app_governance:
sanctioned_apps:
- name: "Microsoft 365"
category: "productivity"
risk_level: "low"
allowed_actions: ["all"]
- name: "Salesforce"
category: "crm"
risk_level: "low"
allowed_actions: ["all"]
dlp_enabled: true
- name: "Slack"
category: "collaboration"
risk_level: "medium"
allowed_actions: ["read", "write"]
restrictions:
- "no_file_upload_to_external"
- "no_external_channel_join"
unsanctioned_apps:
default_action: "monitor_and_alert"
high_risk_action: "block"
categories_to_block:
- "personal_storage" # Dropbox 개인용, Google Drive 개인용
- "social_media"
- "gaming"
shadow_it_response:
discovery_interval: "daily"
auto_categorization: true
alert_threshold:
users: 10 # 10명 이상 사용 시 알림
data_volume_gb: 1 # 1GB 이상 전송 시 알림
# 2. DLP (Data Loss Prevention) 정책
dlp_policies:
- name: "PII Protection"
description: "개인식별정보 유출 방지"
enabled: true
detection_rules:
- pattern: "주민등록번호"
regex: "\\d{6}-[1-4]\\d{6}"
action: "block"
- pattern: "신용카드번호"
regex: "\\d{4}[- ]?\\d{4}[- ]?\\d{4}[- ]?\\d{4}"
action: "block"
- pattern: "여권번호"
regex: "[A-Z]{1,2}\\d{7,8}"
action: "alert_and_encrypt"
exceptions:
- app: "HR System"
users: ["hr-team@company.com"]
- name: "Confidential Document Control"
description: "기밀 문서 외부 공유 방지"
enabled: true
file_rules:
- file_types: [".docx", ".xlsx", ".pptx", ".pdf"]
keywords: ["기밀", "대외비", "Confidential", "Internal Only"]
labels: ["CONFIDENTIAL", "RESTRICTED"]
actions:
external_share: "block"
download: "watermark"
print: "log_and_alert"
# 3. 위협 방지 (Threat Protection)
threat_protection:
malware_detection:
enabled: true
scan_uploads: true
scan_downloads: true
quarantine_action: "isolate_and_alert"
account_takeover_prevention:
impossible_travel:
enabled: true
threshold_hours: 2 # 2시간 내 불가능한 이동 탐지
action: "require_mfa"
suspicious_login:
enabled: true
signals:
- "new_device"
- "new_location"
- "tor_exit_node"
- "anonymous_vpn"
action: "block_and_verify"
insider_threat:
bulk_download_detection:
threshold_files: 100
threshold_size_gb: 5
time_window_hours: 24
action: "alert_and_investigate"
off_hours_access:
enabled: true
business_hours: "09:00-18:00"
timezone: "Asia/Seoul"
action: "log_enhanced"
# 4. 컴플라이언스 모니터링
compliance:
frameworks:
- name: "GDPR"
enabled: true
requirements:
- data_residency: "EU"
- right_to_erasure: true
- consent_management: true
- name: "개인정보보호법"
enabled: true
requirements:
- encryption_required: true
- access_logging: true
- retention_policy: "3_years"
audit_logging:
retention_days: 365
export_to_siem: true
include_events:
- "login_success"
- "login_failure"
- "file_download"
- "file_share"
- "policy_violation"
- "admin_action"
// CASB와 SIEM 연동 - Node.js
// CASB 알림을 SIEM으로 전달하여 통합 보안 모니터링 구현
const axios = require('axios');
const { Kafka } = require('kafkajs');
class CASBSIEMIntegration {
constructor(config) {
this.casbApiUrl = config.casbApiUrl;
this.casbApiKey = config.casbApiKey;
this.siemWebhook = config.siemWebhook;
// Kafka for high-volume event streaming
this.kafka = new Kafka({
clientId: 'casb-siem-connector',
brokers: config.kafkaBrokers
});
this.producer = this.kafka.producer();
}
async initialize() {
await this.producer.connect();
console.log('CASB-SIEM Integration initialized');
}
// CASB 이벤트를 SIEM 형식으로 변환
transformToSIEMFormat(casbEvent) {
return {
timestamp: new Date(casbEvent.timestamp).toISOString(),
source: 'CASB',
event_type: this.mapEventType(casbEvent.type),
severity: this.mapSeverity(casbEvent.risk_level),
// Common Event Format (CEF) 필드
cef: {
version: 0,
device_vendor: 'CASB_Vendor',
device_product: 'Cloud Security',
device_version: '3.0',
signature_id: casbEvent.alert_id,
name: casbEvent.alert_name,
severity: casbEvent.risk_score
},
// 상세 정보
details: {
user: casbEvent.user_email,
user_department: casbEvent.user_department,
source_ip: casbEvent.source_ip,
geo_location: casbEvent.geo_location,
cloud_app: casbEvent.app_name,
app_category: casbEvent.app_category,
action_taken: casbEvent.action,
policy_violated: casbEvent.policy_name,
// 데이터 관련
file_name: casbEvent.file_name,
file_type: casbEvent.file_type,
file_size_bytes: casbEvent.file_size,
data_classification: casbEvent.data_classification,
// DLP 관련
dlp_patterns_matched: casbEvent.dlp_matches,
sensitive_data_types: casbEvent.sensitive_data_types
},
// 위협 인텔리전스
threat_intel: {
indicators: casbEvent.threat_indicators,
mitre_attack_techniques: casbEvent.mitre_techniques,
confidence_score: casbEvent.confidence
},
// 대응 권장사항
recommendations: this.getRecommendations(casbEvent)
};
}
mapEventType(casbType) {
const mapping = {
'dlp_violation': 'Data Exfiltration Attempt',
'malware_detected': 'Malware Detection',
'account_compromise': 'Account Takeover',
'impossible_travel': 'Suspicious Login',
'shadow_it': 'Unauthorized App Usage',
'policy_violation': 'Policy Violation',
'bulk_download': 'Insider Threat',
'external_share': 'Unauthorized Sharing'
};
return mapping[casbType] || 'Unknown Event';
}
mapSeverity(riskLevel) {
const mapping = {
'critical': 10,
'high': 8,
'medium': 5,
'low': 2,
'info': 1
};
return mapping[riskLevel] || 1;
}
getRecommendations(event) {
const recommendations = [];
if (event.type === 'account_compromise') {
recommendations.push('사용자 세션 즉시 종료');
recommendations.push('비밀번호 강제 재설정');
recommendations.push('최근 활동 감사 로그 검토');
}
if (event.type === 'dlp_violation') {
recommendations.push('해당 파일 격리 조치');
recommendations.push('사용자 접근 권한 검토');
recommendations.push('정보보호팀 에스컬레이션');
}
if (event.type === 'shadow_it' && event.risk_level === 'high') {
recommendations.push('해당 앱 즉시 차단');
recommendations.push('대체 승인 앱 안내');
recommendations.push('사용자 보안 교육 필요');
}
return recommendations;
}
// 실시간 이벤트 스트리밍
async streamToSIEM(casbEvent) {
const siemEvent = this.transformToSIEMFormat(casbEvent);
// Kafka로 이벤트 발행
await this.producer.send({
topic: 'security-events',
messages: [{
key: casbEvent.alert_id,
value: JSON.stringify(siemEvent),
headers: {
'source': 'casb',
'severity': String(siemEvent.severity)
}
}]
});
// 고위험 이벤트는 웹훅으로도 즉시 전달
if (siemEvent.severity >= 8) {
await this.sendHighPriorityAlert(siemEvent);
}
return siemEvent;
}
async sendHighPriorityAlert(event) {
try {
await axios.post(this.siemWebhook, {
alert: event,
priority: 'HIGH',
require_acknowledgment: true
});
console.log(`High priority alert sent: ${event.details.cloud_app}`);
} catch (error) {
console.error('Failed to send high priority alert:', error.message);
}
}
// CASB 이벤트 폴링 및 처리
async pollAndProcess(intervalMs = 60000) {
console.log('Starting CASB event polling...');
setInterval(async () => {
try {
const response = await axios.get(
`${this.casbApiUrl}/api/v1/alerts`,
{
headers: { 'Authorization': `Bearer ${this.casbApiKey}` },
params: {
since: new Date(Date.now() - intervalMs).toISOString(),
status: 'new'
}
}
);
for (const event of response.data.alerts) {
await this.streamToSIEM(event);
}
console.log(`Processed ${response.data.alerts.length} events`);
} catch (error) {
console.error('Polling error:', error.message);
}
}, intervalMs);
}
}
// 사용 예시
const integration = new CASBSIEMIntegration({
casbApiUrl: 'https://casb.example.com',
casbApiKey: process.env.CASB_API_KEY,
siemWebhook: 'https://siem.example.com/webhook/casb',
kafkaBrokers: ['kafka-1:9092', 'kafka-2:9092']
});
integration.initialize().then(() => {
integration.pollAndProcess(60000); // 1분 간격 폴링
});
"현재 Shadow IT 현황 분석 결과, 승인되지 않은 클라우드 앱이 150개 이상 발견됐습니다. CASB를 도입해서 모든 클라우드 트래픽에 대한 가시성을 확보하고, 고위험 앱은 차단하면서 업무에 필요한 앱은 승인 절차를 통해 관리하는 체계를 구축해야 합니다."
"CASB의 DLP 기능으로 클라우드 앱에서 주민등록번호, 신용카드번호 같은 민감정보가 외부로 공유되는 것을 실시간으로 차단하고 있습니다. 지난 달에만 47건의 데이터 유출 시도를 막았고, 이 중 12건은 악의적 의도가 아닌 실수였기 때문에 사용자 교육으로 연결했습니다."
"SASE 전환을 위해 CASB를 SWG, ZTNA와 통합하는 방향으로 가겠습니다. 현재 독립적으로 운영 중인 CASB를 SSE(Security Service Edge) 플랫폼으로 마이그레이션하면 단일 에이전트로 엔드포인트부터 클라우드까지 일관된 정책 적용이 가능합니다."
Shadow IT를 발견했다고 무조건 차단하면 직원들이 우회 방법을 찾거나 업무 효율이 떨어집니다. 위험도를 평가하여 고위험 앱만 차단하고, 중간 위험은 모니터링, 저위험은 승인 프로세스를 통해 공식화하세요.
API 모드(Out-of-band)만 사용하면 실시간 차단이 불가능하고 사후 탐지만 가능합니다. 민감한 데이터 보호가 필요한 앱에는 Proxy 모드(Inline)를 적용하여 실시간 DLP와 위협 차단을 구현하세요.
너무 많은 패턴 매칭 규칙은 오탐(False Positive)을 유발하여 업무를 방해합니다. 핵심 민감정보부터 시작하고, 머신러닝 기반 분류를 활용하며, 예외 정책을 적절히 설정하세요.
단계적 배포(가시성 → 모니터링 → 제어), SIEM/SOAR 연동으로 통합 보안 운영, 정기적인 앱 위험도 재평가, 사용자 행위 분석(UEBA) 활성화, Zero Trust 아키텍처와 통합을 구현하세요. CASB는 도입보다 지속적인 정책 튜닝이 중요합니다.