설명
Lambda 실행 역할에 과도한 권한이 있으면 함수 코드의 취약점이나 오작동이 더 많은 AWS 리소스에 영향을 줄 수 있습니다. 역할 이름이나 정책 이름이 아니라 연결된 정책, 조건과 다른 접근 제어를 확인하세요. 와일드카드가 포함되어도 특정 서비스나 작업 범위로 제한될 수 있으므로 실제 허용 범위를 검토해야 합니다.
잠재적 영향
함수가 침해되면 실행 역할이 실제로 허용하는 데이터 조회·변경·삭제 등의 작업이 악용될 수 있습니다. 필요한 범위를 넘는 권한은 피해 범위를 키울 수 있습니다.
해결 방법
- 함수가 호출하는 API와 리소스를 확인하고 실행 역할을 최소 권한으로 제한하세요. 공용 역할에 다른 함수의 권한이 불필요하게 누적되지 않도록 하세요.
- 필요한 로그·서비스 접근을 유지하면서 불필요한 권한을 제거하고 정상 호출과 승인하지 않은 접근의 거부를 시험하세요.
예시
고정된 응답을 반환하는 최소 함수와 그 실행 역할을 함께 정의합니다. 실제 코드에는 호환되는 런타임과 해당 코드에 필요한 권한을 선택해야 합니다.
변경 전
yaml
Resources:
AppendItemToListFunction:
Type: AWS::Lambda::Function
Properties:
Handler: index.handler
Role: !GetAtt LambdaExecutionRole.Arn
Runtime: nodejs22.x
Code:
ZipFile: |
exports.handler = async () => ({ statusCode: 200, body: "ok" });
LambdaExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: AdminPolicy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action: "*"
Resource: "*"
실행 역할에 전체 작업·리소스 허용을 부여합니다. 단순 응답 함수의 필요보다 매우 넓습니다.
변경 후
yaml
Resources:
AppendItemToListFunction:
Type: AWS::Lambda::Function
Properties:
Handler: index.handler
Role: !GetAtt LambdaExecutionRole.Arn
Runtime: nodejs22.x
Code:
ZipFile: |
exports.handler = async () => ({ statusCode: 200, body: "ok" });
LambdaExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: LimitedPolicy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
Resource: "*"
이 정책은 로그 관련 작업만 허용합니다. 로그 리소스 범위도 실제 로그 그룹으로 제한하는 방안을 검토하고, 함수가 다른 AWS API를 사용한다면 필요한 권한만 별도로 추가하세요.