728x90

— “서버가 안 보이는(Serverless) 만큼 권한·진입점·시크릿·이그레스·가시성을 표준화”가 핵심입니다.
기본 개념 & 구조
- 실행 모델: 이벤트 트리거(예: API Gateway, SQS, EventBridge, S3) → 함수 초단명 컨테이너 기동 → 핸들러 실행 → 종료/대기(컨테이너 재사용 가능).
- 배포 단위: ZIP(런타임 의존) 또는 컨테이너 이미지(ECR). 레이어(공유 라이브러리)·확장(Extension)로 기능 확장.
- 연계 자원: IAM(Role/Policy), VPC(보안그룹·엔드포인트), KMS, CloudWatch(X-Ray), Config·Security Hub·GuardDuty.
- 비용/성능 키: 동시성(Reserved/Provisioned), 타임아웃, 메모리/CPU, 재시도, DLQ, 콜드/워밍.
운영 원칙: IaC(SAM/CDK/Terraform) + 표준 보안 Baseline으로 “사람 손 배포” 금지.
위협 모델(Threat Model)
- 권한 과다:
Action/Resource=*또는 공용 실행 역할 공유. - 공개 엔드포인트: Function URL
AuthType=NONE, API 인증/레이트리밋 부재. - 시크릿 노출: 환경변수 평문·로그 유출·초기화 스냅샷(SnapStart) 잔존.
- 공급망: 취약한 레이어/확장/의존(서명·SBOM 부재).
- 이그레스: 인터넷 무제한 통신(SSRF·데이터 외부 유출).
- 가시성 부족: 구조화 로그/추적/데이터 이벤트 미수집.
- 재시도 폭주/스파이크: DLQ 부재·동시성 무제한(비용·백엔드 고갈).
300x250
운영 표준(필수 베이스라인)
- 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/*"]
}]
}
- 진입점 보안
- 기본: 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"]'
- 시크릿/키 관리
- 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'])
- 공급망(코드/이미지/레이어/확장)
- 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
- 네트워크/이그레스
- VPC 엔드포인트(S3/Dynamo/Secrets) 사용, NAT/Firewall로 도메인 화이트리스트.
- 보안그룹 최소 규칙(필요 포트만 아웃바운드), Endpoint Policy로 서비스 축소.
- 로깅/추적/탐지
- CloudWatch JSON 구조화 로그, PII 마스킹, X-Ray 트레이싱.
- CloudTrail(관리+데이터 이벤트), Config·Security Hub·GuardDuty 활성화.
- Powertools(logger/metrics/tracer)로 표준화.
- 재시도/실패 격리
- 비동기: DLQ(SQS/SNS) 또는 On-Failure Destination 필수.
- SQS 이벤트: Visibility Timeout ≥ 함수 Timeout.
- 멱등성 키로 중복 처리 방지.
- 동시성/비용 방어
- Reserved Concurrency(상한), 필요 시 Provisioned로 콜드스타트 완화.
- API GW/WAF 레이트리밋, Budgets/Cost Anomaly 알림.
aws lambda put-function-concurrency \
--function-name my-fn \
--reserved-concurrent-executions 50
- 런타임/컨테이너 보강
- AL2/최신 런타임, 정기 스캔.
/tmp(10GB) 민감데이터 금지·즉시 삭제. - SnapStart/글로벌 스코프에는 시크릿 로드 금지(초기화 스냅샷 잔존 위험).
- 데이터 암호화/거버넌스
- S3/Dynamo/RDS/전송 구간 KMS 전면 적용, 수명주기·리전 정책 정의.
- 로그 보존·삭제 기준(PII/PCI 등) 문서화.
- 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}
아키텍처 패턴별 권장안
- 공개 API(모바일/웹 백엔드)
- CloudFront → WAF → API GW(인증·레이트리밋) → Lambda(VPC 내부) → RDS/Dynamo
- 프라이빗 VPC 엔드포인트로 AWS 서비스 접근, 인터넷 이그레스 차단.
- 비동기 워커(SQS/Kinesis/EventBridge)
- 큐/스트림 → Lambda(Reserved Concurrency) → DLQ/On-Failure → 모니터링 알람
- 멱등성 키로 중복 방지, 배치 사이즈·재시도·가시성 시간 정합.
- 데이터 파이프라인(S3 이벤트)
- S3 Put → Lambda(검증/정규화) → S3(정제) / Dynamo / Firehose
- S3 버킷 정책·암호화·버전 관리·Object Lock(필요 시).
모니터링·감사·탐지 운영
- 지표: 오류율, 처리 지연, 동시성 사용량, 스로틀, 재시도/배치 실패, 비용.
- 로그 규칙: ① PII 금지 ② 토큰/Authorization 헤더 금지 ③ 예외 stacktrace 수집.
- 보안 경보(예):
- Function URL이
NONE인증으로 생성/변경됨 - IAM 정책에 와일드카드 포함됨
- DLQ 미구성인 비동기 함수 존재
- 퍼블릭 S3에서 트리거되는 함수 탐지
- 이그레스 허용 SG/라우팅 발견
- Function URL이
구현 팁: AWS Config + Security Hub(중앙 대시보드), GuardDuty 알림을 Slack/Teams로 연동.
점검 체크리스트
- IAM: 전용 역할, 리소스 제한, Boundary/SCP, Access Analyzer 무결성.
- 엔드포인트: API GW+WAF+인증, Function URL은 IAM만(가능한 비사용).
- 시크릿: Secrets Manager/SSM+KMS, 평문/로그/스냅샷 노출 금지.
- 공급망: 서명/스캔/SBOM, 레이어·확장 허가목록·버전 고정.
- 네트워크: VPC 엔드포인트·도메인 화이트리스트·최소 SG.
- 로그/추적: JSON 구조화, PII 마스킹, X-Ray, CloudTrail 데이터 이벤트.
- 신뢰성: DLQ/On-Failure, 재시도·가시성 시간 정합, 멱등성.
- 비용/안정성: Reserved Concurrency, 레이트리밋, 예산/이상탐지.
- 런타임: 최신화·스캔,
/tmp민감 금지, SnapStart 초기화에 시크릿 금지. - 데이터 거버넌스: 전 구간 KMS, 보존/삭제/리전 정책.
- CI/CD & IaC: SAM/CDK/Terraform만 허용, PR·정책검사·서명.
- 감사: 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
그리드형(광고전용)
댓글