EC2 사용자 데이터의 AWS 자격 증명 점검

EC2 사용자 데이터의 장기 AWS 자격 증명을 제거하고 인스턴스 역할을 통한 임시 자격 증명을 사용하세요.

설명

EC2의 user_data에 AWS 자격 증명을 직접 넣으면 소스 저장소, Terraform 상태, 초기화 로그나 인스턴스 메타데이터를 통해 노출될 수 있습니다. 접근 키 ID만으로는 AWS API를 호출할 수 없지만, 대응하는 비밀 접근 키까지 유출되면 해당 자격 증명의 권한이 악용될 수 있습니다.

정적 키 대신 인스턴스 프로파일을 통해 IAM 역할을 연결하고 애플리케이션이 임시 자격 증명을 사용하도록 구성하세요.

잠재적 영향

  • 유효한 자격 증명이 유출되면 허용된 AWS 작업이 다른 환경에서 실행될 수 있습니다.
  • 스크립트와 배포 자료에 복제된 비밀 값은 회수와 교체가 어렵습니다.
  • 자격 증명 교체 시 이를 사용하는 초기화 작업이나 애플리케이션이 중단될 수 있습니다.

해결 방법

  • 사용자 데이터와 호출하는 스크립트에서 접근 키 ID와 비밀 접근 키를 제거하세요.
  • EC2 역할에 필요한 작업과 리소스만 허용하고 AWS SDK가 역할의 임시 자격 증명을 사용하도록 하세요. 외부 서비스의 비밀 값은 Secrets Manager 같은 관리 서비스에서 권한을 제한해 가져오세요.
  • 실제 자격 증명이 노출되었다면 사용처를 확인하고 교체·폐기한 뒤 관련 API 활동을 조사하세요. 소스, 상태 파일과 초기화 로그의 접근 권한도 제한하세요.

예시

부분 예제입니다. ami_id와 subnet_id에는 배포 환경에 맞는 값을 제공하고 IAM 인스턴스 프로파일은 별도로 구성하세요.

변경 전

hcl
module "ec2_instance" {
  source  = "terraform-aws-modules/ec2-instance/aws"
  version = "~> 3.0"

  name      = "single-instance"
  ami       = var.ami_id
  subnet_id = var.subnet_id
  user_data = "1234567890123456789012345678901234567890$"
}

user_data에 문자열을 직접 넣습니다. 이 예시 문자열 자체가 발급된 AWS 자격 증명이라는 뜻은 아니며, 실제 비밀 접근 키를 이 위치에 저장하지 않아야 합니다.

변경 후

hcl
module "ec2_instance" {
  source  = "terraform-aws-modules/ec2-instance/aws"
  version = "~> 3.0"

  name      = "single-instance"
  ami       = var.ami_id
  subnet_id = var.subnet_id
  user_data = file("scripts/first-boot-http.sh")
}

file()은 스크립트 내용을 읽어 사용자 데이터로 전달합니다. 파일로 분리하는 것만으로 비밀 값이 보호되지는 않으므로 스크립트에도 자격 증명을 넣지 말고 역할 기반 접근을 구성하세요.

참조