설명
Lambda의 environment.variables에 AWS 자격 증명을 넣으면 배포 설정이나 Terraform 상태에 비밀 값이 남습니다. 함수가 환경 변수를 로그에 출력하거나 설정에 접근할 권한이 과도하게 부여된 경우에도 노출될 수 있습니다. 접근 키 ID만으로는 API 호출을 인증할 수 없지만, 대응하는 비밀 접근 키까지 유출되면 허용된 권한이 악용될 수 있습니다.
함수가 AWS 리소스에 접근할 때는 실행 역할의 임시 자격 증명을 사용하세요. 이 역할은 함수를 배포하는 주체의 권한과 구분됩니다.
잠재적 영향
- 유효한 자격 증명이 다른 환경에서 재사용되어 허용된 AWS 작업에 악용될 수 있습니다.
- 코드와 배포 설정에 복제된 비밀 값은 교체와 사용처 추적이 어렵습니다.
- 노출된 키를 폐기하면 해당 키에 의존하던 함수가 중단될 수 있습니다.
해결 방법
- 환경 변수에 저장한 접근 키 ID와 비밀 접근 키를 제거하고 실행 역할에 필요한 최소 권한을 부여하세요.
- 외부 서비스의 비밀 값은 Secrets Manager 또는 Systems Manager Parameter Store의
SecureString으로 관리하고 함수의 조회 권한을 제한하세요. - 실제로 노출된 자격 증명은 사용처를 전환한 뒤 폐기하고 관련 활동을 조사하세요. 소스, 상태와 로그에 남은 복사본도 관리하세요.
예시
부분 예제입니다. lambda_runtime에는 배포 패키지와 핸들러에 맞는 지원 런타임을 지정하고, 참조한 실행 역할을 별도로 구성하세요.
변경 전
hcl
resource "aws_lambda_function" "lambda_function" {
filename = "lambda_function_payload.zip"
function_name = "lambda_function_name"
role = aws_iam_role.iam_for_lambda.arn
handler = "exports.test"
runtime = var.lambda_runtime
environment {
variables = {
foo = "AKIAIOSFODNN7EXAMAAA"
}
}
}
foo에 접근 키 ID를 연상시키는 예시 문자열을 넣습니다. 이 값 자체가 유효한 자격 증명이라는 뜻은 아니며, 실제 장기 자격 증명을 이 방식으로 전달하지 않아야 합니다.
변경 후
hcl
resource "aws_lambda_function" "lambda_function" {
filename = "lambda_function_payload.zip"
function_name = "lambda_function_name"
role = aws_iam_role.iam_for_lambda.arn
handler = "exports.test"
runtime = var.lambda_runtime
environment {
variables = {
foo = "test"
}
}
}
foo를 일반 문자열로 바꿉니다. 이 변경이 실행 역할의 권한을 구성하거나 이미 노출된 키를 폐기하지는 않으므로 두 작업을 별도로 수행하세요.