Lambda 환경 변수의 AWS 자격 증명 점검

Lambda 환경 변수에 장기 AWS 자격 증명을 저장하지 말고 실행 역할의 임시 자격 증명을 사용하세요.

설명

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를 일반 문자열로 바꿉니다. 이 변경이 실행 역할의 권한을 구성하거나 이미 노출된 키를 폐기하지는 않으므로 두 작업을 별도로 수행하세요.

참조