본문 바로가기
정보보호 (Security)

AWS Lambda 서버리스 운영·보안 핵심 패턴과 위협·통제·체크리스트

by 날으는물고기 2025. 11. 6.

AWS Lambda 서버리스 운영·보안 핵심 패턴과 위협·통제·체크리스트

728x90

— “서버가 안 보이는(Serverless) 만큼 권한·진입점·시크릿·이그레스·가시성을 표준화”가 핵심입니다.

기본 개념 & 구조

  1. 실행 모델: 이벤트 트리거(예: API Gateway, SQS, EventBridge, S3) → 함수 초단명 컨테이너 기동 → 핸들러 실행 → 종료/대기(컨테이너 재사용 가능).
  2. 배포 단위: ZIP(런타임 의존) 또는 컨테이너 이미지(ECR). 레이어(공유 라이브러리)·확장(Extension)로 기능 확장.
  3. 연계 자원: IAM(Role/Policy), VPC(보안그룹·엔드포인트), KMS, CloudWatch(X-Ray), Config·Security Hub·GuardDuty.
  4. 비용/성능 키: 동시성(Reserved/Provisioned), 타임아웃, 메모리/CPU, 재시도, DLQ, 콜드/워밍.

운영 원칙: IaC(SAM/CDK/Terraform) + 표준 보안 Baseline으로 “사람 손 배포” 금지.

위협 모델(Threat Model)

  • 권한 과다: Action/Resource=* 또는 공용 실행 역할 공유.
  • 공개 엔드포인트: Function URL AuthType=NONE, API 인증/레이트리밋 부재.
  • 시크릿 노출: 환경변수 평문·로그 유출·초기화 스냅샷(SnapStart) 잔존.
  • 공급망: 취약한 레이어/확장/의존(서명·SBOM 부재).
  • 이그레스: 인터넷 무제한 통신(SSRF·데이터 외부 유출).
  • 가시성 부족: 구조화 로그/추적/데이터 이벤트 미수집.
  • 재시도 폭주/스파이크: DLQ 부재·동시성 무제한(비용·백엔드 고갈).
300x250

운영 표준(필수 베이스라인)

  1. IAM 최소권한 & 경계
  • 함수별 전용 실행 역할(공유 금지), 리소스 단위로 ARN 제한.
  • Permission Boundary/SCP로 상한선, Access Analyzer 정기 점검.
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": ["s3:GetObject","s3:PutObject"],
    "Resource": ["arn:aws:s3:::my-bucket/*"]
  }]
}
  1. 진입점 보안
  • 기본: API Gateway + WAF + 인증(Cognito/JWT/SigV4/mTLS).
  • Function URL은 가급적 금지, 필요 시 AuthType=AWS_IAM + CloudFront/WAF 전단.
aws lambda create-function-url-config \
  --function-name my-fn \
  --auth-type AWS_IAM \
  --cors 'AllowOrigins=["https://app.example.com"],AllowMethods=["POST"]'
  1. 시크릿/키 관리
  • Secrets Manager/SSM + KMS, 런타임 조회 + 단기 캐시, 로그 마스킹.
  • 환경변수는 KMS 암호화하되 민감값 로깅 금지.
import os, json, boto3
sm = boto3.client('secretsmanager')
secret = json.loads(sm.get_secret_value(SecretId=os.environ['SECRET_ID'])['SecretString'])
  1. 공급망(코드/이미지/레이어/확장)
  • Code Signing(AWS Signer) 강제, ECR ScanOnPush + IMMUTABLE.
  • SBOM(syft) + 취약점 스캔(Trivy), 버전 고정·허가목록(allowlist).
aws ecr create-repository --repository-name my-lambda \
  --image-tag-mutability IMMUTABLE \
  --image-scanning-configuration scanOnPush=true
  1. 네트워크/이그레스
  • VPC 엔드포인트(S3/Dynamo/Secrets) 사용, NAT/Firewall로 도메인 화이트리스트.
  • 보안그룹 최소 규칙(필요 포트만 아웃바운드), Endpoint Policy로 서비스 축소.
  1. 로깅/추적/탐지
  • CloudWatch JSON 구조화 로그, PII 마스킹, X-Ray 트레이싱.
  • CloudTrail(관리+데이터 이벤트), Config·Security Hub·GuardDuty 활성화.
  • Powertools(logger/metrics/tracer)로 표준화.
  1. 재시도/실패 격리
  • 비동기: DLQ(SQS/SNS) 또는 On-Failure Destination 필수.
  • SQS 이벤트: Visibility Timeout ≥ 함수 Timeout.
  • 멱등성 키로 중복 처리 방지.
  1. 동시성/비용 방어
  • Reserved Concurrency(상한), 필요 시 Provisioned로 콜드스타트 완화.
  • API GW/WAF 레이트리밋, Budgets/Cost Anomaly 알림.
aws lambda put-function-concurrency \
  --function-name my-fn \
  --reserved-concurrent-executions 50
  1. 런타임/컨테이너 보강
  • AL2/최신 런타임, 정기 스캔. /tmp(10GB) 민감데이터 금지·즉시 삭제.
  • SnapStart/글로벌 스코프에는 시크릿 로드 금지(초기화 스냅샷 잔존 위험).
  1. 데이터 암호화/거버넌스
  • S3/Dynamo/RDS/전송 구간 KMS 전면 적용, 수명주기·리전 정책 정의.
  • 로그 보존·삭제 기준(PII/PCI 등) 문서화.
  1. CI/CD & IaC
  • SAM/CDK/Terraform만 배포 허용, PR 필수·정책 검사(Checkov/tfsec).
  • 파이프라인 롤 최소권한·승인 단계·아티팩트 서명 검증.
  • SAST/SCA( Semgrep, pip-audit/npm audit ) + 컨테이너 Trivy.

IaC/구성 예시

1. SAM 템플릿 요지

Resources:
  MyFn:
    Type: AWS::Serverless::Function
    Properties:
      Runtime: python3.12
      Handler: app.handler
      CodeUri: src/
      Timeout: 15
      MemorySize: 256
      Policies:
        - Statement:
          - Effect: Allow
            Action: ["secretsmanager:GetSecretValue"]
            Resource: "arn:aws:secretsmanager:ap-northeast-2:123456789012:secret:my/*"
      VpcConfig:
        SecurityGroupIds: [ sg-0123 ]
        SubnetIds: [ subnet-a, subnet-b ]
      Events:
        Api:
          Type: Api
          Properties:
            Path: /do
            Method: POST
      DeadLetterQueue:
        Type: SQS
        TargetArn: !GetAtt MyDLQ.Arn

2. API Gateway → Lambda만 호출 허용(리소스 정책)

aws lambda add-permission \
  --function-name my-fn \
  --statement-id apigw-only \
  --action lambda:InvokeFunction \
  --principal apigateway.amazonaws.com \
  --source-arn arn:aws:execute-api:ap-northeast-2:123456789012:apiId/*/*/*

3. 구조화 로깅 & 민감정보 마스킹

import json, logging
SENSITIVE = {"password","secret","token","authorization"}

def mask(d):
    return {k: ("***" if k.lower() in SENSITIVE else v) for k, v in d.items()}

def handler(event, context):
    logging.getLogger().setLevel(logging.INFO)
    safe = mask(event if isinstance(event, dict) else {"raw": str(event)})
    logging.info(json.dumps({"evt": safe, "reqId": context.aws_request_id}))
    return {"ok": True}

아키텍처 패턴별 권장안

  1. 공개 API(모바일/웹 백엔드)
  • CloudFront → WAF → API GW(인증·레이트리밋) → Lambda(VPC 내부) → RDS/Dynamo
  • 프라이빗 VPC 엔드포인트로 AWS 서비스 접근, 인터넷 이그레스 차단.
  1. 비동기 워커(SQS/Kinesis/EventBridge)
  • 큐/스트림 → Lambda(Reserved Concurrency) → DLQ/On-Failure → 모니터링 알람
  • 멱등성 키로 중복 방지, 배치 사이즈·재시도·가시성 시간 정합.
  1. 데이터 파이프라인(S3 이벤트)
  • S3 Put → Lambda(검증/정규화) → S3(정제) / Dynamo / Firehose
  • S3 버킷 정책·암호화·버전 관리·Object Lock(필요 시).

모니터링·감사·탐지 운영

  • 지표: 오류율, 처리 지연, 동시성 사용량, 스로틀, 재시도/배치 실패, 비용.
  • 로그 규칙: ① PII 금지 ② 토큰/Authorization 헤더 금지 ③ 예외 stacktrace 수집.
  • 보안 경보(예):
    • Function URL이 NONE 인증으로 생성/변경됨
    • IAM 정책에 와일드카드 포함됨
    • DLQ 미구성인 비동기 함수 존재
    • 퍼블릭 S3에서 트리거되는 함수 탐지
    • 이그레스 허용 SG/라우팅 발견

구현 팁: AWS Config + Security Hub(중앙 대시보드), GuardDuty 알림을 Slack/Teams로 연동.

점검 체크리스트

  1. IAM: 전용 역할, 리소스 제한, Boundary/SCP, Access Analyzer 무결성.
  2. 엔드포인트: API GW+WAF+인증, Function URL은 IAM만(가능한 비사용).
  3. 시크릿: Secrets Manager/SSM+KMS, 평문/로그/스냅샷 노출 금지.
  4. 공급망: 서명/스캔/SBOM, 레이어·확장 허가목록·버전 고정.
  5. 네트워크: VPC 엔드포인트·도메인 화이트리스트·최소 SG.
  6. 로그/추적: JSON 구조화, PII 마스킹, X-Ray, CloudTrail 데이터 이벤트.
  7. 신뢰성: DLQ/On-Failure, 재시도·가시성 시간 정합, 멱등성.
  8. 비용/안정성: Reserved Concurrency, 레이트리밋, 예산/이상탐지.
  9. 런타임: 최신화·스캔, /tmp 민감 금지, SnapStart 초기화에 시크릿 금지.
  10. 데이터 거버넌스: 전 구간 KMS, 보존/삭제/리전 정책.
  11. CI/CD & IaC: SAM/CDK/Terraform만 허용, PR·정책검사·서명.
  12. 감사: Config 규칙·Security Hub 표준 매핑, 정기 리포트.

자주 하는 실수 & 예방 팁

  • Function URL “간편하니 공개” → 반드시 IAM/WAF 앞단.
  • 환경변수에 DB 비밀번호 저장 후 디버그 로그로 출력 → 마스킹 필수.
  • SQS 재시도 폭주로 비용 급증 → DLQ + 멱등성 + 상한 동시성.
  • 컨테이너 이미지 최신화 잊음 → ECR Scan + 만료/교체 주기 강제.
  • SnapStart 성능만 보고 시크릿 초기화에 로드 → 초기화 스냅샷 금지.

최소 적용(Quick Start) 스크립트 모음

# 1) 동시성 상한
aws lambda put-function-concurrency \
  --function-name my-fn --reserved-concurrent-executions 50

# 2) API GW 외 호출 금지(리소스 정책)
aws lambda add-permission \
  --function-name my-fn \
  --statement-id apigw-only \
  --action lambda:InvokeFunction \
  --principal apigateway.amazonaws.com \
  --source-arn arn:aws:execute-api:ap-northeast-2:123456789012:apiId/*/*/*

# 3) ECR 보안
aws ecr put-image-scanning-configuration \
  --repository-name my-lambda --image-scanning-configuration scanOnPush=true
aws ecr put-image-tag-mutability \
  --repository-name my-lambda --image-tag-mutability IMMUTABLE
  • “전용 IAM 역할 + 인증된 진입점 + 시크릿의 런타임 관리 + 이그레스 화이트리스트 + 구조화 로그”가 서버리스 보안의 최소 안전선입니다.
  • 여기에 서명/SBOM/스캔(공급망)과 동시성/재시도 가드(신뢰성·비용)를 추가하면, 운영·규제·비용을 동시에 잡는 프로덕션급 Lambda 보안을 구현할 수 있습니다.
728x90
그리드형(광고전용)

댓글