🔒 보안

FedRAMP

Federal Risk and Authorization Management Program

미국 연방 정부의 클라우드 보안 인증 프로그램. 클라우드 서비스 제공자(CSP)가 연방 기관에 서비스를 제공하려면 반드시 FedRAMP 인증을 획득해야 합니다.

📖 상세 설명

FedRAMP(Federal Risk and Authorization Management Program)는 2011년 미국 연방 정부가 도입한 클라우드 보안 인증 프로그램입니다. 연방 기관들이 클라우드 서비스를 안전하게 사용할 수 있도록 표준화된 보안 평가, 승인, 지속적 모니터링 프로세스를 제공합니다. 클라우드 서비스 제공자(CSP)는 FedRAMP 인증 없이는 연방 정부에 서비스를 판매할 수 없으며, 이는 연간 수십억 달러 규모의 시장입니다.

FedRAMP는 NIST SP 800-53 보안 통제 기준을 기반으로 하며, Low, Moderate, High 세 가지 영향 수준(Impact Level)으로 분류됩니다. Low는 기본적인 데이터 보호(125개 통제), Moderate는 개인정보 포함 데이터(325개 통제), High는 국가 안보나 생명에 영향을 미치는 데이터(421개 통제)를 다룹니다. 대부분의 SaaS 제품은 Moderate 수준을 목표로 하며, 인증 획득에 6개월~2년이 소요됩니다.

인증 경로는 JAB(Joint Authorization Board) 경로와 Agency 경로 두 가지가 있습니다. JAB 경로는 국방부(DoD), 국토안보부(DHS), 일반조달청(GSA)이 공동으로 평가하며 P-ATO(Provisional Authority to Operate)를 발급합니다. Agency 경로는 개별 연방 기관이 스폰서가 되어 ATO를 발급하며, 더 빠르지만 해당 기관에만 유효합니다. 한 번 인증받으면 FedRAMP Marketplace에 등록되어 다른 기관도 재사용할 수 있습니다.

AI 서비스 기업에게 FedRAMP는 미국 공공 부문 진출의 필수 관문입니다. AWS, Azure, GCP는 모두 FedRAMP High 인증을 보유하고 있으며, 이들 플랫폼 위에서 AI 서비스를 구축하면 인증 범위를 상속받을 수 있습니다. 다만 자체 인프라를 사용하는 AI 모델 서빙이나 데이터 처리 파이프라인은 별도 인증이 필요하며, 3PAO(Third Party Assessment Organization)의 독립적인 보안 평가를 통과해야 합니다.

💻 코드 예제

# FedRAMP Moderate 준수 AWS 인프라 구성
# Terraform으로 FedRAMP 통제 요구사항 구현

provider "aws" {
  region = "us-gov-west-1"  # GovCloud 리전 사용 (FedRAMP High)
}

# AC-2: 계정 관리 - IAM 정책
resource "aws_iam_policy" "fedramp_access_policy" {
  name        = "FedRAMP-Compliant-Access"
  description = "FedRAMP AC-2 compliant access control policy"

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid    = "RequireMFA"
        Effect = "Deny"
        Action = "*"
        Resource = "*"
        Condition = {
          BoolIfExists = {
            "aws:MultiFactorAuthPresent" = "false"
          }
        }
      },
      {
        Sid    = "EnforceSessionTimeout"
        Effect = "Allow"
        Action = ["sts:AssumeRole"]
        Resource = "*"
        Condition = {
          NumericLessThanEquals = {
            "aws:SessionDuration" = "3600"  # 1시간 세션 제한
          }
        }
      }
    ]
  })
}

# AU-2: 감사 이벤트 - CloudTrail 설정
resource "aws_cloudtrail" "fedramp_audit" {
  name                          = "fedramp-audit-trail"
  s3_bucket_name                = aws_s3_bucket.audit_logs.id
  include_global_service_events = true
  is_multi_region_trail         = true
  enable_log_file_validation    = true
  kms_key_id                    = aws_kms_key.audit_key.arn

  event_selector {
    read_write_type           = "All"
    include_management_events = true

    data_resource {
      type   = "AWS::S3::Object"
      values = ["arn:aws:s3:::"]
    }
  }

  tags = {
    FedRAMP_Control = "AU-2,AU-3,AU-6"
    Compliance      = "FedRAMP-Moderate"
  }
}

# SC-8: 전송 보호 - 암호화 강제
resource "aws_s3_bucket_policy" "enforce_tls" {
  bucket = aws_s3_bucket.data_bucket.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid       = "DenyInsecureTransport"
        Effect    = "Deny"
        Principal = "*"
        Action    = "s3:*"
        Resource  = [
          aws_s3_bucket.data_bucket.arn,
          "${aws_s3_bucket.data_bucket.arn}/*"
        ]
        Condition = {
          Bool = {
            "aws:SecureTransport" = "false"
          }
        }
      }
    ]
  })
}

# SC-28: 저장 데이터 보호 - KMS 암호화
resource "aws_kms_key" "fedramp_key" {
  description             = "FedRAMP compliant encryption key"
  deletion_window_in_days = 30
  enable_key_rotation     = true  # SC-12: 키 순환

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid    = "EnableIAMPolicies"
        Effect = "Allow"
        Principal = {
          AWS = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:root"
        }
        Action   = "kms:*"
        Resource = "*"
      }
    ]
  })

  tags = {
    FedRAMP_Control = "SC-12,SC-28"
  }
}
# FedRAMP 컴플라이언스 검증 스크립트
import boto3
from datetime import datetime, timedelta
from typing import Dict, List, Any

class FedRAMPComplianceChecker:
    """FedRAMP 통제 요구사항 자동 검증"""

    def __init__(self):
        self.iam = boto3.client('iam')
        self.s3 = boto3.client('s3')
        self.cloudtrail = boto3.client('cloudtrail')
        self.results: List[Dict[str, Any]] = []

    def check_ac2_account_management(self) -> Dict[str, Any]:
        """AC-2: 계정 관리 통제 검증"""
        issues = []

        # 비활성 사용자 확인 (90일 이상)
        users = self.iam.list_users()['Users']
        for user in users:
            last_used = self.iam.get_user(UserName=user['UserName'])
            if 'PasswordLastUsed' in user:
                days_inactive = (datetime.now(user['PasswordLastUsed'].tzinfo) -
                                user['PasswordLastUsed']).days
                if days_inactive > 90:
                    issues.append(f"비활성 계정: {user['UserName']} ({days_inactive}일)")

        # MFA 미설정 사용자 확인
        for user in users:
            mfa_devices = self.iam.list_mfa_devices(UserName=user['UserName'])
            if not mfa_devices['MFADevices']:
                issues.append(f"MFA 미설정: {user['UserName']}")

        return {
            "control": "AC-2",
            "name": "Account Management",
            "status": "PASS" if not issues else "FAIL",
            "issues": issues
        }

    def check_au2_audit_events(self) -> Dict[str, Any]:
        """AU-2: 감사 이벤트 통제 검증"""
        issues = []

        trails = self.cloudtrail.describe_trails()['trailList']
        if not trails:
            issues.append("CloudTrail이 활성화되지 않음")
        else:
            for trail in trails:
                status = self.cloudtrail.get_trail_status(Name=trail['Name'])
                if not status.get('IsLogging'):
                    issues.append(f"CloudTrail 비활성: {trail['Name']}")
                if not trail.get('LogFileValidationEnabled'):
                    issues.append(f"로그 무결성 검증 미활성: {trail['Name']}")

        return {
            "control": "AU-2",
            "name": "Audit Events",
            "status": "PASS" if not issues else "FAIL",
            "issues": issues
        }

    def check_sc28_data_at_rest(self) -> Dict[str, Any]:
        """SC-28: 저장 데이터 보호 검증"""
        issues = []

        buckets = self.s3.list_buckets()['Buckets']
        for bucket in buckets:
            try:
                encryption = self.s3.get_bucket_encryption(Bucket=bucket['Name'])
            except self.s3.exceptions.ClientError:
                issues.append(f"암호화 미설정: {bucket['Name']}")

        return {
            "control": "SC-28",
            "name": "Protection of Information at Rest",
            "status": "PASS" if not issues else "FAIL",
            "issues": issues
        }

    def generate_poam(self) -> str:
        """Plan of Action and Milestones (POA&M) 생성"""
        poam_items = []

        for result in self.results:
            if result['status'] == 'FAIL':
                poam_items.append({
                    "control": result['control'],
                    "weakness": result['issues'],
                    "remediation_date": (datetime.now() +
                                        timedelta(days=30)).strftime("%Y-%m-%d"),
                    "status": "Open"
                })

        return poam_items

    def run_assessment(self) -> Dict[str, Any]:
        """전체 FedRAMP 평가 실행"""
        self.results = [
            self.check_ac2_account_management(),
            self.check_au2_audit_events(),
            self.check_sc28_data_at_rest(),
        ]

        passed = sum(1 for r in self.results if r['status'] == 'PASS')
        total = len(self.results)

        return {
            "assessment_date": datetime.now().isoformat(),
            "impact_level": "Moderate",
            "controls_assessed": total,
            "controls_passed": passed,
            "compliance_rate": f"{(passed/total)*100:.1f}%",
            "results": self.results,
            "poam": self.generate_poam()
        }

# 실행 예시
checker = FedRAMPComplianceChecker()
report = checker.run_assessment()
print(f"FedRAMP 준수율: {report['compliance_rate']}")
# OSCAL (Open Security Controls Assessment Language)
# FedRAMP System Security Plan (SSP) 예시

system-security-plan:
  uuid: "550e8400-e29b-41d4-a716-446655440000"
  metadata:
    title: "AI Analytics Platform - FedRAMP SSP"
    version: "1.0.0"
    oscal-version: "1.0.4"
    published: "2026-01-26T00:00:00Z"
    last-modified: "2026-01-26T00:00:00Z"
    roles:
      - id: system-owner
        title: "System Owner"
      - id: isso
        title: "Information System Security Officer"
      - id: ao
        title: "Authorizing Official"

  import-profile:
    href: "https://raw.githubusercontent.com/GSA/fedramp-automation/master/baselines/rev5/json/FedRAMP_rev5_MODERATE-baseline-resolved-profile_catalog.json"
    # FedRAMP Moderate 베이스라인 import

  system-characteristics:
    system-name: "AI Analytics Platform"
    description: "클라우드 기반 AI 분석 플랫폼"
    security-sensitivity-level: moderate
    system-information:
      information-types:
        - title: "Controlled Unclassified Information (CUI)"
          categorizations:
            - system: "https://doi.org/10.6028/NIST.SP.800-60v2r1"
              information-type-ids:
                - "C.2.4.1"  # Privacy Information

    security-impact-level:
      security-objective-confidentiality: moderate
      security-objective-integrity: moderate
      security-objective-availability: moderate

    authorization-boundary:
      description: |
        시스템 경계는 AWS GovCloud 내 VPC로 제한됨.
        - 웹 애플리케이션 계층 (ALB, ECS)
        - AI/ML 처리 계층 (SageMaker)
        - 데이터 저장 계층 (RDS, S3)

  system-implementation:
    users:
      - uuid: "user-001"
        role-ids:
          - admin
        authorized-privileges:
          - title: "시스템 관리자"
            functions-performed:
              - "시스템 구성 관리"
              - "사용자 계정 관리"

    components:
      - uuid: "comp-001"
        type: "software"
        title: "AWS Identity and Access Management"
        description: "AC-2 통제 구현"
        status:
          state: operational
        responsible-roles:
          - role-id: isso

      - uuid: "comp-002"
        type: "software"
        title: "AWS CloudTrail"
        description: "AU-2, AU-3, AU-6 통제 구현"
        status:
          state: operational

      - uuid: "comp-003"
        type: "software"
        title: "AWS KMS"
        description: "SC-12, SC-28 통제 구현"
        status:
          state: operational

  control-implementation:
    description: "FedRAMP Moderate 통제 구현 상세"
    implemented-requirements:
      - uuid: "ir-ac-2"
        control-id: "ac-2"
        statements:
          - statement-id: "ac-2_smt.a"
            uuid: "stmt-ac-2-a"
            description: |
              AWS IAM을 통해 계정 유형을 정의하고 관리합니다.
              - 시스템 관리자: AdministratorAccess 정책
              - 데이터 분석가: ReadOnlyAccess + S3 특정 버킷
              - AI 엔지니어: SageMaker 전용 정책

      - uuid: "ir-sc-28"
        control-id: "sc-28"
        statements:
          - statement-id: "sc-28_smt"
            uuid: "stmt-sc-28"
            description: |
              모든 저장 데이터는 AES-256으로 암호화됩니다.
              - S3: SSE-KMS 암호화 적용
              - RDS: TDE(Transparent Data Encryption) 적용
              - EBS: 볼륨 암호화 필수

🗣️ 실무에서 이렇게 말하세요

💬 미국 공공 시장 진출 전략 회의에서
"연방 정부 고객을 타겟으로 하려면 FedRAMP 인증이 필수입니다. Moderate 수준으로 가면 325개 통제를 구현해야 하고, 3PAO 평가까지 최소 12개월은 예상해야 합니다. AWS GovCloud 위에 구축하면 상당 부분을 상속받을 수 있어요."
💬 인증 범위 설정 논의에서
"FedRAMP 경계를 최소화하는 게 핵심입니다. AI 모델 학습은 경계 밖에서 하고, 추론 API와 데이터 저장소만 인증 범위에 포함하면 통제 구현 부담이 크게 줄어듭니다. ConMon(지속적 모니터링)도 범위가 좁을수록 관리하기 쉬워요."
💬 Agency ATO vs JAB P-ATO 결정 시
"NASA가 스폰서로 나서주기로 했으니 Agency 경로로 가는 게 빠릅니다. JAB P-ATO는 더 권위 있지만 대기열이 길어요. 일단 Agency ATO 받고 나면 FedRAMP Marketplace에 올라가서 다른 기관에도 재사용할 수 있습니다."

⚠️ 주의사항 & 베스트 프랙티스

인증 범위의 과도한 확장

시스템 전체를 FedRAMP 범위에 포함하면 통제 구현과 지속적 모니터링 비용이 기하급수적으로 늘어납니다. 연방 데이터를 처리하는 핵심 컴포넌트만 경계에 포함하고, 나머지는 경계 외부로 분리하세요.

ConMon 자동화 미흡

FedRAMP는 인증 획득 후에도 월간 취약점 스캔, 분기별 POA&M 업데이트, 연간 보안 평가가 필요합니다. 수동으로 관리하면 인증 유지가 불가능합니다. AWS Security Hub, Splunk 등으로 자동화하세요.

문서화 경시

FedRAMP는 기술 구현만큼 문서화가 중요합니다. SSP(System Security Plan), CIS(Control Implementation Summary), POA&M이 불완전하면 3PAO 평가에서 지적받습니다. 구현과 동시에 문서를 작성하세요.

FedRAMP 베스트 프랙티스

FedRAMP Ready 지정을 먼저 받아 시장에서 신뢰도를 확보하세요. 기존 인증 CSP의 인프라를 활용하여 통제 상속을 극대화하고, OSCAL 포맷으로 문서를 관리하면 자동화와 재사용이 용이합니다.

🔗 관련 용어

📚 더 배우기