서버리스 및 함수 보안
서버리스 함수의 고유한 공격 표면(과도한 권한의 IAM 역할, 이벤트 인젝션, 종속성 위험)을 식별하고 최소 권한 및 입력 검증 제어를 적용합니다.
서버리스 및 함수 보안은(는) CoddyKit의 무료 Security+ Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Security+ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Security+ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
서버리스 컴퓨팅이란 무엇인가요?
서버리스 컴퓨팅(Functions as a Service, FaaS)을 사용하면 개발자는 기반 서버를 관리하지 않고 이벤트(HTTP 요청, 대기열 메시지, 데이터베이스 트리거 또는 예약된 타이머)에 의해 호출되는 개별 함수를 배포할 수 있습니다. 주요 플랫폼으로는 AWS Lambda, Google Cloud Functions, Azure Functions가 있습니다. 클라우드 제공업체는 패치 적용, 확장, 인프라를 관리합니다. 이 방식은 운영 부담을 줄이는 대신 보안 책임 모델을 전환합니다. 제공업체는 런타임을 보호하지만, 개발자는 함수 코드, 권한, 구성을 전적으로 책임집니다.
서버리스의 고유한 공격 표면
서버리스 함수는 기존 애플리케이션과 비교할 때 뚜렷하게 다른 공격 표면을 가집니다. 함수는 일반적으로 수명이 짧아(수 초에서 수 분) 기존 EDR과 네트워크 모니터링의 효과가 떨어집니다. 또한 이벤트 기반이므로 다양한 입력 소스(S3 이벤트, API Gateway, SNS)가 실행을 트리거할 수 있습니다. 다른 클라우드 Resource에 접근할 수 있는 IAM 권한으로 실행되는 경우가 많으며, 악성 코드를 포함할 수 있는 타사 종속성(npm, pip 패키지)을 사용합니다. 공격 표면은 이벤트 입력, IAM 권한, 종속성 신뢰 사슬에 의해 정의됩니다.
과도한 권한의 IAM 역할: 가장 큰 위협
가장 흔한 서버리스 보안 취약점은 과도한 권한의 IAM 역할입니다. 개발자가 함수에서 S3 버킷 하나에 접근해야 할 때 권한 오류를 피하기 위해 s3:*(전체 S3 접근 권한)을 부여하고 싶은 유혹을 받습니다. 이 역할을 가진 함수가 침해되거나 취약한 경우 계정의 모든 버킷을 읽고, 쓰고, 삭제할 수 있습니다. 이에 대한 방어책은 엄격한 최소 권한 IAM 역할입니다. 각 함수에는 해당 함수의 특정 작업에 필요한 최소 권한만 부여하는 전용 역할이 있어야 합니다. AWS IAM Access Analyzer 및 Cloudsplaining과 같은 도구는 과도한 권한이 부여된 Lambda 역할을 자동으로 식별합니다.
# IAM policy: least privilege for specific Lambda function
{
'Version': '2012-10-17',
'Statement': [{
'Effect': 'Allow',
'Action': ['s3:GetObject'],
'Resource': 'arn:aws:s3:::my-specific-bucket/uploads/*'
}]
}이벤트 주입 공격
이벤트 주입은 공격자가 제어하는 이벤트 페이로드의 데이터가 함수 코드에서 안전하지 않게 처리될 때 발생합니다. 서버리스 함수는 HTTP 헤더, 쿼리 매개변수, 데이터베이스 변경 기록, 대기열 메시지 본문, 이메일 내용 등 다양한 이벤트 소스에 의해 트리거될 수 있으므로, 이들 모두에 악성 페이로드가 포함될 수 있습니다. 일반적인 주입 유형으로는 함수가 이벤트 데이터를 사용해 데이터베이스를 조회할 때 발생하는 SQL 주입, NoSQL 주입(JSON 페이로드의 MongoDB 연산자), 이벤트 데이터가 OS 명령에 사용될 때의 명령 주입, 이벤트 데이터의 URL을 가져올 때의 SSRF(서버 측 요청 위조)가 있습니다. 입력 검증과 매개변수화된 쿼리는 필수적인 방어 수단입니다.
# Vulnerable: event data used directly in shell command
# const filename = event.filename;
# exec('convert ' + filename + ' output.jpg');
# Safe: validate and sanitize input
# const filename = path.basename(event.filename);
# if (!/^[a-z0-9_-]+\.(jpg|png)$/i.test(filename)) throw new Error('Invalid');
# execFile('convert', [filename, 'output.jpg']);종속성 위험: 타사 패키지
서버리스 함수는 수십 개의 타사 패키지에 의존하는 경우가 많습니다. 이러한 종속성은 공급망 위험을 초래합니다. 악성 패키지나 침해된 패키지는 함수 실행 환경에서 임의의 코드를 실행하고, 흔히 Secret이 포함된 환경 변수에 접근하며, 외부 네트워크 연결을 생성하고, 함수의 IAM 역할을 사용해 클라우드 Resource에 접근할 수 있습니다. event-stream npm 패키지 침해 사건(2018)과 수많은 타이포스쿼팅 패키지와 같은 유명 공격은 이러한 위험을 보여 줍니다. 방어 방법으로는 종속성 고정, CI/CD에서의 SCA 검사, 최소한의 종속성 사용이 있습니다.
서버리스의 Secret: 환경 변수
서버리스 함수는 클라우드 콘솔에서 구성한 환경 변수를 통해 Secret을 전달받는 경우가 많습니다. 이러한 환경 변수는 Lambda 구성에 IAM 접근 권한이 있는 누구나 볼 수 있으며, 함수 내부에서 실행되는 모든 코드가 접근할 수 있습니다. 모범 사례는 다음과 같습니다. Secret을 일반 텍스트 환경 변수에 직접 저장하지 말고, ARN 또는 Secret 이름을 저장한 다음 런타임에 AWS Secrets Manager 또는 Parameter Store에서 Secret을 Retrieve합니다. 저장된 Lambda 환경 변수에는 KMS 암호화를 활성화하고, 환경 변수를 절대 로그에 기록하지 않습니다(많은 디버그 로거가 Error 발생 시 모든 환경 변수를 덤프합니다).
# Retrieve secret at runtime instead of hardcoding
# Using AWS SDK in Lambda
# const secretsClient = new SecretsManagerClient({});
# const response = await secretsClient.send(
# new GetSecretValueCommand({ SecretId: 'prod/myapp/db-password' })
# );
# const dbPassword = response.SecretString;함수 시간 제한 및 동시성 제한
서버리스 함수에 대한 서비스 거부는 호출 폭주 형태로 발생할 수 있습니다. 함수를 반복해서 트리거할 수 있는 공격자는 계정의 동시 실행 제한을 소진할 수 있으며(Lambda의 기본값은 리전당 동시 실행 1,000회), 이로 인해 계정의 다른 함수가 실행되지 못할 수 있습니다. 사용자가 제어하는 입력을 처리하는 함수는 API Gateway 수준에서 속도 제한을 적용하고, 페이로드 크기 제한을 검증하며, 무한 실행을 방지하도록 적절한 시간 제한 값을 설정해야 합니다. 입력 크기를 제한하지 않으면 XML/YAML 구문 분석에서 Billion Laughs 방식의 확장 공격을 받을 수도 있습니다.
# AWS Lambda: set reserved concurrency to prevent account-wide DoS
aws lambda put-function-concurrency \
--function-name my-api-handler \
--reserved-concurrent-executions 100VPC 통합 및 네트워크 격리
기본적으로 AWS Lambda 함수는 인터넷에 접근할 수 있지만 사용자의 프라이빗 VPC에 있는 Resource(RDS 데이터베이스, ElastiCache, 프라이빗 API)에는 접근할 수 없는 AWS 관리형 VPC에서 실행됩니다. 프라이빗 Resource에 접근하려면 Lambda가 특정 서브넷과 보안 그룹을 사용하여 사용자의 VPC 내부에서 실행되도록 구성해야 합니다. 그러나 VPC에 연결된 Lambda 함수는 기본적으로 인터넷에 접근할 수 없으므로 외부 인터넷 연결을 위해 NAT Gateway가 필요합니다. Lambda 함수에 연결된 보안 그룹은 최소 권한 규칙을 따라야 하며, 필요한 특정 포트와 대상만 Allow해야 합니다. 프로덕션 함수 보안 그룹에서는 0.0.0.0/0 외부 연결 규칙을 사용하지 마세요.
서버리스 함수 모니터링
서버리스 보안을 모니터링하려면 기존 호스트 모니터링과 다른 접근 방식이 필요합니다. 함수는 일시적으로 존재하므로 호스트 기반 에이전트를 사용하기 어렵습니다. 효과적인 모니터링에는 모든 Lambda API 호출(호출, 구성 변경, 역할 수임)을 기록하는 AWS CloudTrail, 비정상적인 패턴이 있는지 함수 실행 로그를 조회하는 CloudWatch Logs Insights, 비정상적인 Lambda 네트워크 활동을 포함한 위협을 탐지하는 Amazon GuardDuty, 레이어를 통해 함수에 계측을 적용하여 런타임 가시성을 제공하는 Protego(현재 Check Point의 일부) 또는 Datadog의 서버리스 모니터링과 같은 상용 서버리스 전용 보안 도구가 사용됩니다.
# Query CloudWatch Logs for Lambda errors and anomalies
aws logs start-query \
--log-group-name '/aws/lambda/my-function' \
--start-time $(date -d '-1 hour' +%s) \
--end-time $(date +%s) \
--query-string 'fields @timestamp, @message | filter @message like /ERROR|WARN|credential/'서버리스 보안 테스트
서버리스 보안을 테스트하려면 특정 도구가 필요합니다. PureSec CLI(현재 Check Point)와 Prowler는 서버리스의 잘못된 구성을 찾기 위해 클라우드 구성을 검사합니다. DAST 도구는 HTTP로 트리거되는 함수의 주입 취약점을 테스트할 수 있습니다. Bandit(Python)이나 ESLint 보안 플러그인과 같은 도구를 사용한 함수 코드의 정적 분석은 안전하지 않은 코딩 패턴을 찾아냅니다. 또한 수동 테스트에서는 각 함수를 트리거할 수 있는 모든 이벤트 소스를 열거하고, 각각에 잘못 구성된 페이로드와 악성 페이로드를 사용해 테스트해야 합니다. OWASP Serverless Top 10은 서버리스 아키텍처에 특화된 포괄적인 취약점 점검 목록을 제공합니다.
# Prowler: check Lambda security posture
prowler aws --service lambda
# Checks: public URL, over-privileged roles, unencrypted env vars,
# outdated runtime, missing VPC config, excessive timeout서버리스의 공동 책임
서버리스 컴퓨팅은 공동 책임 모델에서 제공업체가 담당하는 범위를 더 넓힙니다. 클라우드 제공업체는 함수 런타임 환경, OS 패치, 기반 인프라 보안, 물리적 시설을 책임집니다. 고객은 함수 코드 보안, IAM 권한 설계, Secret 관리, 입력 검증, 종속성 관리, 로깅 구성, 네트워크 정책을 계속 책임집니다. 인프라에 대한 책임이 줄어든다고 해서 보안 책임까지 줄어드는 것은 아닙니다. 이는 보안 투자를 집중해야 할 위치가 주로 애플리케이션 수준 및 IAM 보안으로 이동한다는 뜻입니다.
빠른 확인
이 lesson에서 다룬 CompTIA Security+ (SY0-701) 개념에 대한 이해도를 확인해 보세요.
lesson 요약
이 lesson에서는 다음을 배웠습니다. 과도한 권한의 IAM 역할은 서버리스의 주요 위험이므로 각 함수에 전용 최소 권한 역할이 필요합니다. 이벤트 주입 공격은 입력 검증이 없는 함수에 공격자가 제어하는 데이터를 전달하는 모든 이벤트 소스를 악용합니다. 또한 타사 패키지로 인한 종속성 공급망 위험은 IAM 자격 증명과 Secret에 접근할 수 있는 함수 실행 환경을 침해할 수 있습니다. 다음으로는 배포 전에 잘못된 구성을 찾아내는 Infrastructure as Code 보안 검사를 살펴봅니다.
자주 묻는 질문
“서버리스 및 함수 보안” 강의는 무료인가요?
네 — “서버리스 및 함수 보안” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Security+ Academy 강의 전체를 잠금 해제할 수 있습니다. Security+ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“서버리스 및 함수 보안”에서 뭘 배우나요?
서버리스 함수의 고유한 공격 표면(과도한 권한의 IAM 역할, 이벤트 인젝션, 종속성 위험)을 식별하고 최소 권한 및 입력 검증 제어를 적용합니다. 브라우저에서 직접 실행하는 실습 코드로 Security+ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Security+ Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Security+ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“서버리스 및 함수 보안” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Security+ Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Security+ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.