CSPM
Cloud Security Posture Management
클라우드 보안 태세 관리 솔루션. 멀티클라우드 환경의 설정 오류, 규정 위반, 보안 취약점을 지속적으로 모니터링하고 자동 교정합니다.
Cloud Security Posture Management
클라우드 보안 태세 관리 솔루션. 멀티클라우드 환경의 설정 오류, 규정 위반, 보안 취약점을 지속적으로 모니터링하고 자동 교정합니다.
CSPM(Cloud Security Posture Management)은 클라우드 인프라의 보안 상태를 지속적으로 평가하고 관리하는 솔루션입니다. 클라우드 환경에서 가장 빈번한 보안 사고 원인은 해킹이 아닌 설정 오류(Misconfiguration)입니다. S3 버킷 퍼블릭 노출, 보안 그룹 과도한 개방, IAM 권한 과다 부여 같은 실수가 데이터 유출로 이어집니다. CSPM은 이런 설정 오류를 자동 탐지하고 알림을 제공합니다.
CSPM의 핵심 기능은 규정 준수(Compliance) 검사입니다. CIS Benchmarks, SOC 2, HIPAA, PCI-DSS, GDPR 같은 보안 표준에 맞게 클라우드 리소스가 구성되었는지 자동으로 평가합니다. 위반 사항이 발견되면 상세한 교정 가이드를 제공하고, 일부 솔루션은 자동 교정(Auto-Remediation) 기능도 지원합니다. AWS Config Rules, Azure Policy, GCP Security Command Center가 네이티브 CSPM 기능을 제공합니다.
멀티클라우드 환경에서 CSPM은 통합 가시성을 제공합니다. 기업들이 AWS, Azure, GCP를 혼합 사용하면서 각 클라우드의 보안 설정을 개별 관리하기 어려워졌습니다. Prisma Cloud, Wiz, Lacework 같은 서드파티 CSPM은 멀티클라우드를 단일 대시보드에서 관리하고, 클라우드 간 일관된 보안 정책을 적용합니다. 그래프 기반 분석으로 공격 경로를 시각화하는 기능도 제공합니다.
IaC(Infrastructure as Code)와 CSPM 통합이 트렌드입니다. Terraform, CloudFormation 템플릿을 배포 전에 스캔하여 보안 문제를 사전 탐지하는 Shift-Left 접근이 확산되고 있습니다. CI/CD 파이프라인에 Checkov, tfsec 같은 도구를 통합하면 배포 단계에서 설정 오류를 차단할 수 있습니다. CSPM + CWPP + CIEM을 통합한 CNAPP(Cloud Native Application Protection Platform) 개념도 등장했습니다.
# CSPM - Terraform 보안 스캔 (Checkov)
# 배포 전 IaC 템플릿 보안 검사
# 취약한 S3 버킷 설정 (CSPM이 탐지할 문제)
resource "aws_s3_bucket" "data" {
bucket = "company-data-bucket"
}
# ❌ Checkov 경고: CKV_AWS_18 - S3 bucket access logging disabled
# ❌ Checkov 경고: CKV_AWS_19 - S3 bucket encryption disabled
# ❌ Checkov 경고: CKV_AWS_21 - S3 bucket versioning disabled
# 보안 강화된 S3 버킷 설정
resource "aws_s3_bucket" "secure_data" {
bucket = "company-secure-data"
}
resource "aws_s3_bucket_versioning" "secure_data" {
bucket = aws_s3_bucket.secure_data.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_s3_bucket_server_side_encryption_configuration" "secure_data" {
bucket = aws_s3_bucket.secure_data.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "aws:kms"
kms_master_key_id = aws_kms_key.s3_key.arn
}
}
}
resource "aws_s3_bucket_public_access_block" "secure_data" {
bucket = aws_s3_bucket.secure_data.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
resource "aws_s3_bucket_logging" "secure_data" {
bucket = aws_s3_bucket.secure_data.id
target_bucket = aws_s3_bucket.logs.id
target_prefix = "s3-access-logs/"
}
# CI/CD 파이프라인에서 Checkov 실행
# checkov -d . --framework terraform --output cli --compact
# checkov -d . --check CKV_AWS_18,CKV_AWS_19,CKV_AWS_21
# AWS Config Rules - 네이티브 CSPM 규칙
# CloudFormation 템플릿
AWSTemplateFormatVersion: '2010-09-09'
Description: CSPM - AWS Config Rules for Security Compliance
Resources:
# S3 버킷 암호화 필수 규칙
S3BucketSSLRequestsOnly:
Type: AWS::Config::ConfigRule
Properties:
ConfigRuleName: s3-bucket-ssl-requests-only
Description: S3 버킷이 SSL/TLS 요청만 허용하는지 확인
Source:
Owner: AWS
SourceIdentifier: S3_BUCKET_SSL_REQUESTS_ONLY
MaximumExecutionFrequency: TwentyFour_Hours
# S3 퍼블릭 액세스 차단 규칙
S3BucketPublicReadProhibited:
Type: AWS::Config::ConfigRule
Properties:
ConfigRuleName: s3-bucket-public-read-prohibited
Description: S3 버킷 퍼블릭 읽기 금지 확인
Source:
Owner: AWS
SourceIdentifier: S3_BUCKET_PUBLIC_READ_PROHIBITED
# EC2 인스턴스에 IMDSv2 강제
EC2IMDSv2Check:
Type: AWS::Config::ConfigRule
Properties:
ConfigRuleName: ec2-imdsv2-check
Description: EC2 인스턴스가 IMDSv2를 사용하는지 확인
Source:
Owner: AWS
SourceIdentifier: EC2_IMDSV2_CHECK
# RDS 암호화 확인
RDSStorageEncrypted:
Type: AWS::Config::ConfigRule
Properties:
ConfigRuleName: rds-storage-encrypted
Description: RDS 인스턴스 스토리지 암호화 확인
Source:
Owner: AWS
SourceIdentifier: RDS_STORAGE_ENCRYPTED
# 자동 교정 - SSM Automation
S3RemediationConfiguration:
Type: AWS::Config::RemediationConfiguration
Properties:
ConfigRuleName: !Ref S3BucketPublicReadProhibited
TargetType: SSM_DOCUMENT
TargetId: AWS-DisableS3BucketPublicReadWrite
Automatic: true
MaximumAutomaticAttempts: 3
RetryAttemptSeconds: 60
Parameters:
S3BucketName:
ResourceValue:
Value: RESOURCE_ID
AutomationAssumeRole:
StaticValue:
Values:
- !GetAtt RemediationRole.Arn
# 규정 준수 팩 - CIS AWS Foundations
CISConformancePack:
Type: AWS::Config::ConformancePack
Properties:
ConformancePackName: cis-aws-foundations-benchmark
TemplateS3Uri: s3://config-conformance-packs/cis-aws-foundations.yaml
# CSPM 자동화 - Python으로 보안 태세 평가
import boto3
from datetime import datetime
import json
class CSPMScanner:
"""클라우드 보안 태세 자동 스캐너"""
def __init__(self):
self.s3 = boto3.client('s3')
self.ec2 = boto3.client('ec2')
self.iam = boto3.client('iam')
self.findings = []
def scan_s3_buckets(self):
"""S3 버킷 보안 설정 검사"""
buckets = self.s3.list_buckets()['Buckets']
for bucket in buckets:
bucket_name = bucket['Name']
# 퍼블릭 액세스 차단 확인
try:
public_access = self.s3.get_public_access_block(Bucket=bucket_name)
config = public_access['PublicAccessBlockConfiguration']
if not all([
config.get('BlockPublicAcls'),
config.get('BlockPublicPolicy'),
config.get('IgnorePublicAcls'),
config.get('RestrictPublicBuckets')
]):
self.findings.append({
'severity': 'HIGH',
'resource': f's3://{bucket_name}',
'rule': 'S3_PUBLIC_ACCESS_BLOCK',
'message': '퍼블릭 액세스 차단이 완전히 활성화되지 않음'
})
except self.s3.exceptions.NoSuchPublicAccessBlockConfiguration:
self.findings.append({
'severity': 'CRITICAL',
'resource': f's3://{bucket_name}',
'rule': 'S3_NO_PUBLIC_ACCESS_BLOCK',
'message': '퍼블릭 액세스 차단 설정이 없음'
})
# 암호화 확인
try:
encryption = self.s3.get_bucket_encryption(Bucket=bucket_name)
except:
self.findings.append({
'severity': 'HIGH',
'resource': f's3://{bucket_name}',
'rule': 'S3_ENCRYPTION_DISABLED',
'message': '서버 사이드 암호화가 비활성화됨'
})
def scan_security_groups(self):
"""보안 그룹 과도한 개방 검사"""
sgs = self.ec2.describe_security_groups()['SecurityGroups']
for sg in sgs:
for rule in sg.get('IpPermissions', []):
for ip_range in rule.get('IpRanges', []):
if ip_range.get('CidrIp') == '0.0.0.0/0':
port = rule.get('FromPort', 'All')
if port in [22, 3389, 3306, 5432]: # 민감한 포트
self.findings.append({
'severity': 'CRITICAL',
'resource': f'sg:{sg["GroupId"]}',
'rule': 'SG_SENSITIVE_PORT_OPEN',
'message': f'민감한 포트 {port}가 인터넷에 개방됨'
})
def scan_iam_policies(self):
"""IAM 과다 권한 검사"""
users = self.iam.list_users()['Users']
for user in users:
policies = self.iam.list_attached_user_policies(UserName=user['UserName'])
for policy in policies['AttachedPolicies']:
if policy['PolicyArn'].endswith('/AdministratorAccess'):
self.findings.append({
'severity': 'HIGH',
'resource': f'iam:user/{user["UserName"]}',
'rule': 'IAM_ADMIN_ACCESS',
'message': 'IAM 사용자에게 AdministratorAccess 직접 부여됨'
})
def generate_report(self):
"""CSPM 보고서 생성"""
report = {
'scan_time': datetime.now().isoformat(),
'total_findings': len(self.findings),
'by_severity': {
'CRITICAL': len([f for f in self.findings if f['severity'] == 'CRITICAL']),
'HIGH': len([f for f in self.findings if f['severity'] == 'HIGH']),
'MEDIUM': len([f for f in self.findings if f['severity'] == 'MEDIUM'])
},
'findings': self.findings
}
return report
# 실행
scanner = CSPMScanner()
scanner.scan_s3_buckets()
scanner.scan_security_groups()
scanner.scan_iam_policies()
report = scanner.generate_report()
print(json.dumps(report, indent=2))
"SOC 2 감사 전에 CSPM 스캔 결과부터 확인합시다. 현재 Critical 발견 사항이 15개인데, S3 퍼블릭 노출 3건이 시급합니다. AWS Config Rules로 자동 교정 설정하고, 교정 불가능한 건은 예외 처리 문서화해주세요."
"AWS, Azure, GCP 각각 네이티브 CSPM 쓰면 대시보드가 세 개입니다. Wiz나 Prisma Cloud 같은 통합 CSPM 도입해서 단일 뷰로 보안 태세 관리하고, 클라우드 간 일관된 CIS 벤치마크 정책 적용합시다."
"Terraform PR 올라오면 Checkov 스캔이 자동 실행되게 GitHub Actions 설정했습니다. Critical 발견되면 머지 차단하고, High는 경고만 표시합니다. 배포 전 CSPM으로 IaC 검사하는 Shift-Left 접근입니다."
CSPM이 수백 개 알림을 생성하면 팀이 무시하기 시작합니다. 우선순위 기반 필터링으로 Critical/High만 즉시 대응하고, 나머지는 주간 리뷰로 처리하세요. 노이즈 많은 규칙은 튜닝하거나 예외 처리하세요.
CSPM 자동 교정을 프로덕션에 바로 적용하면 서비스 장애가 발생할 수 있습니다. 먼저 알림 전용 모드로 운영하고, 교정 로직 검증 후 스테이징에서 테스트한 뒤 프로덕션에 적용하세요.
런타임 CSPM만으로는 이미 배포된 후 발견합니다. Terraform, CloudFormation 템플릿을 CI/CD 단계에서 Checkov, tfsec으로 사전 스캔하여 설정 오류가 애초에 배포되지 않게 하세요.
CIS Benchmarks를 기준 정책으로 채택하고, 조직 특성에 맞게 커스텀 규칙을 추가하세요. CSPM 발견 사항을 SIEM에 연동하여 보안 사고 대응과 통합하고, 월간 보안 태세 리포트를 경영진에게 보고하세요.