UserData에 인코딩된 개인 키가 포함된 구성

Base64로 인코딩해도 UserData의 개인 키는 보호되지 않습니다.

설명

UserData에 개인 키를 Base64로 인코딩해 넣어도 값을 쉽게 복원할 수 있습니다. 인코딩은 암호화가 아니며, 템플릿이나 인스턴스의 사용자 데이터를 읽을 수 있는 사람에게 비밀 값이 노출될 수 있습니다.

잠재적 영향

노출된 키가 실제 인증에 사용되고 있으면 해당 키의 접근 권한을 악용할 수 있습니다.

해결 방법

개인 키를 UserData에서 제거하고 노출된 키를 폐기·교체하세요. 비밀 값이 꼭 필요한 경우, 최소 권한의 인스턴스 역할로 전용 저장소에서 실행 시 가져오고 로그나 배포 산출물에 남기지 마세요.

예시

지원되는 시작 템플릿을 사용한 예시입니다. ImageId와 이에 호환되는 InstanceType을 입력합니다. 변경 전 Base64 값은 개인 키 헤더를 흉내 낸 예시이며 실제 키는 아닙니다. 변경 후에는 Fn::Base64로 비밀 값이 없는 시작 스크립트를 인코딩합니다.

변경 전

json
{
  "Parameters": {
    "ImageId": {
      "Type": "AWS::EC2::Image::Id"
    },
    "InstanceType": {
      "Type": "String"
    }
  },
  "Resources": {
    "myLaunchConfig3": {
      "Type": "AWS::EC2::LaunchTemplate",
      "Properties": {
        "LaunchTemplateData": {
          "ImageId": {
            "Ref": "ImageId"
          },
          "InstanceType": {
            "Ref": "InstanceType"
          },
          "UserData": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpzb21lS2V5"
        }
      }
    }
  }
}

변경 후

json
{
  "Parameters": {
    "ImageId": {
      "Type": "AWS::EC2::Image::Id"
    },
    "InstanceType": {
      "Type": "String"
    }
  },
  "Resources": {
    "myLaunchConfig3": {
      "Type": "AWS::EC2::LaunchTemplate",
      "Properties": {
        "LaunchTemplateData": {
          "ImageId": {
            "Ref": "ImageId"
          },
          "InstanceType": {
            "Ref": "InstanceType"
          },
          "UserData": {
            "Fn::Base64": "#!/bin/sh\necho bootstrap only\n"
          }
        }
      }
    }
  }
}

참조