설명
Lambda 실행 역할은 함수 코드가 다른 AWS 서비스에 접근할 때 사용하는 권한을 제공합니다. iam:*와 같은 광범위한 권한이나 sts:AssumeRole, iam:CreateLoginProfile처럼 다른 역할 사용 또는 자격 증명 생성에 관여하는 권한을 불필요하게 부여하면 함수가 침해되었을 때 피해가 커질 수 있습니다.
실제로 가능한 작업은 연결된 정책, 리소스 범위, 조건, 권한 경계와 기타 적용되는 제한에 따라 달라집니다. 강력한 권한이 필요한 함수라면 업무상 필요성을 확인하고 허용 대상과 조건을 충분히 제한하세요.
잠재적 영향
- 함수가 침해되면 실행 역할에 허용된 민감한 IAM 작업이 악용될 수 있습니다.
- 실제 부여된 권한과 다른 정책에 따라 추가 자격 증명 생성이나 다른 역할 사용으로 영향이 확대될 수 있습니다.
- 여러 함수가 과도한 권한의 역할을 공유하면 사고의 영향 범위와 권한 관리의 복잡성이 커질 수 있습니다.
해결 방법
- 함수가 실제로 사용하는 작업과 리소스를 확인하고 불필요한 권한을 제거하세요.
- 함수의 용도에 맞는 실행 역할을 사용하고, 지원되는 경우 리소스와 조건을 구체적으로 제한하세요.
- 인라인 정책, 관리형 정책, 권한 경계와 기타 적용되는 제한을 함께 검토한 뒤 필요한 기능이 유지되는지 테스트하세요.
예시
아래는 정책 차이를 보여 주는 Terraform 발췌 예시입니다. Lambda 함수와 실행 역할의 정의 및 연결 설정은 생략되어 있습니다.
변경 전
hcl
resource "aws_iam_role_policy" "lambda_privileged_policy" {
name = "lambda-privileged-policy"
role = aws_iam_role.lambda_execution_role.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = [
"ec2:Describe*",
"iam:*"
]
Effect = "Allow"
Resource = "*"
}
]
})
}
변경 후
hcl
resource "aws_iam_role_policy" "lambda_scoped_policy" {
name = "lambda-scoped-policy"
role = aws_iam_role.lambda_execution_role.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = [
"ec2:Describe*",
"s3:GetObject"
]
Effect = "Allow"
Resource = "*"
}
]
})
}
설명:
- 변경 전:
iam:*를 모든 리소스에 허용하므로 실행 역할에 필요한 범위인지 검토해야 합니다. - 변경 후:
iam:*는 제거했지만Resource = "*"와 넓은 조회 권한이 남아 있습니다. 이것만으로 최소 권한 구성이 완성된 것은 아닙니다. 특히s3:GetObject는 필요한 버킷의 객체 ARN으로 범위를 좁히세요.