안녕하세요?
곰군 입니다.
오늘은 AWS의 IMDS에 대해 이해해보는 시간을 가져보겠습니다.
IMDS란?
IMDS는 Instance Metadata Service(IMDS) 입니다. 이 서비스는 Amazon EC2 인스턴스에서 사용할 수 있는 메타데이터를 제공하는 것으로, EC2 인스턴스가 자신에 대한 정보를 가져올 수 있도록 도와줍니다.
그렇다면 메타데이터는 무엇일까요? 인스턴스 메타데이터는 AWS의 EC2 인스턴스가 자신을 구성하고 관리하는 데 필요한 데이터를 의미합니다. 이 메타데이터는 인스턴스의 정체성과 구성을 정의하는 정보를 포함하며, 인스턴스 ID, 인스턴스 타입, 사용된 AMI ID, 네트워크 설정 및 IAM 역할과 같은 중요한 세부 사항을 포함합니다. 자세한 세부 내용은 하기 표와 링크를 참조하시면 됩니다.
| ami-id | 인스턴스를 시작하는 데 사용되는 AMI ID입니다. | 1.0 |
| ami-launch-index | 둘 이상의 인스턴스를 동시에 시작한 경우 이 값은 인스턴스가 시작된 순서를 나타냅니다. 시작된 첫 번째 인스턴스의 값은 0입니다. | 1.0 |
| ami-manifest-path | Amazon S3의 AMI 매니페스트 파일 경로입니다. Amazon EBS 지원 AMI를 사용하여 인스턴스를 시작한 경우 반환되는 결과는 입니다 unknown. | 1.0 |
| ancestor-ami-ids | 이 AMI를 생성하기 위해 다시 번들링된 모든 인스턴스의 AMI ID입니다. 이 값은 AMI 매니페스트 파일에 ancestor-amis키가 포함된 경우에만 존재합니다. | 2007-10-10 |
| autoscaling/target-lifecycle-state | Auto Scaling 인스턴스가 전환 중인 대상 Auto Scaling 수명 주기 상태를 보여주는 값입니다. 2022년 3월 10일 이후 인스턴스가 대상 수명 주기 상태 중 하나로 전환될 때 표시됩니다. 가능한 값: Detached| InService| Standby| Terminated| Warmed:Hibernated | Warmed:Running| Warmed:Stopped | Warmed:Terminated. Amazon EC2 Auto Scaling 사용 설명서 의 인스턴스 메타데이터를 통해 대상 수명 주기 상태 검색을 참조하십시오 . | 2021-07-15 |
| block-device-mapping/ami | 루트/부팅 파일 시스템을 포함하는 가상 장치입니다. | 2007-12-15 |
| block-device-mapping/ebsN | Amazon EBS 볼륨과 연결된 가상 디바이스입니다. Amazon EBS 볼륨은 시작 시 또는 인스턴스가 마지막으로 시작되었을 때 존재했던 경우에만 메타데이터에서 사용할 수 있습니다. N 은 Amazon EBS 볼륨의 인덱스를 나타냅니다(예: ebs1또는 ebs2). | 2007-12-15 |
| block-device-mapping/ephemeralN | NVMe가 아닌 인스턴스 스토어 볼륨을 위한 가상 디바이스입니다. N 은 각 볼륨의 인덱스를 나타냅니다. 블록 디바이스 매핑의 인스턴스 스토어 볼륨 수는 인스턴스에 대한 실제 인스턴스 스토어 볼륨 수와 일치하지 않을 수 있습니다. 인스턴스 유형에 따라 인스턴스에 사용할 수 있는 인스턴스 스토어 볼륨 수가 결정됩니다. 블록 디바이스 매핑의 인스턴스 스토어 볼륨 수가 인스턴스에 사용 가능한 수를 초과하는 경우 추가 인스턴스 스토어 볼륨은 무시됩니다. | 2007-12-15 |
| block-device-mapping/root | 루트 장치 또는 가상 장치의 파티션과 연결된 가상 장치 또는 파티션. 여기서 루트(/ 또는 C:) 파일 시스템은 지정된 인스턴스와 연결됩니다. | 2007-12-15 |
| block-device-mapping/swap | 와 연결된 가상 장치입니다 swap. 항상 존재하는 것은 아닙니다. | 2007-12-15 |
| elastic-gpus/associations/elastic-gpu-id | 인스턴스에 Elastic GPU가 연결된 경우 ID 및 연결 정보를 포함하여 Elastic GPU에 대한 정보가 포함된 JSON 문자열이 포함됩니다. | 2016-11-30 |
| elastic-inference/associations/eia-id | 인스턴스에 Elastic Inference 액셀러레이터가 연결된 경우 ID 및 유형을 포함하여 Elastic Inference 액셀러레이터에 대한 정보가 포함된 JSON 문자열이 포함됩니다. | 2018-11-29 |
| events/maintenance/history | 인스턴스에 대해 완료되거나 취소된 유지 관리 이벤트가 있는 경우 이벤트에 대한 정보가 포함된 JSON 문자열을 포함합니다. 자세한 내용은 완료되거나 취소된 이벤트에 대한 이벤트 기록을 보려면 을 참조 하십시오 . | 2018-08-17 |
| events/maintenance/scheduled | 인스턴스에 대한 활성 유지 관리 이벤트가 있는 경우 이벤트에 대한 정보가 포함된 JSON 문자열을 포함합니다. 자세한 내용은 예약된 이벤트 보기를 참조하세요 . | 2018-08-17 |
| events/recommendations/rebalance | 인스턴스에 대해 EC2 인스턴스 재조정 권장 알림이 내보내지는 대략적인 시간(UTC)입니다. 다음은 이 카테고리에 대한 메타데이터의 예입니다 {"noticeTime": "2020-11-05T08:22:00Z"}. 이 카테고리는 알림이 발생한 후에만 사용할 수 있습니다. 자세한 내용은 EC2 인스턴스 재조정 권장 사항을 참조하십시오 . | 2020-10-27 |
| hostname | EC2 인스턴스가 IP 기반 이름 지정(IPBN)을 사용하는 경우 이는 인스턴스의 프라이빗 IPv4 DNS 호스트 이름입니다. EC2 인스턴스가 RBN(리소스 기반 이름 지정)을 사용하는 경우 이는 RBN입니다. 여러 네트워크 인터페이스가 존재하는 경우 이는 eth0 장치(장치 번호가 0인 장치)를 나타냅니다. IPBN 및 RBN에 대한 자세한 내용은 Amazon EC2 인스턴스 호스트 이름 유형 을 참조하십시오 . | 1.0 |
| iam/info | 인스턴스와 연결된 IAM 역할이 있는 경우 인스턴스의 LastUpdated 날짜, InstanceProfileArn 및 InstanceProfileId를 포함하여 인스턴스 프로필이 마지막으로 업데이트된 시간에 대한 정보가 포함됩니다. 그렇지 않으면 존재하지 않습니다. | 2012-01-12 |
| iam/security-credentials/role-name | 인스턴스와 연결된 IAM 역할이 있는 경우 role-name역할의 이름이며 role-name역할과 연결된 임시 보안 자격 증명을 포함합니다(자세한 내용은 인스턴스 메타데이터에서 보안 자격 증명 검색 참조 ). 그렇지 않으면 존재하지 않습니다. | 2012-01-12 |
| identity-credentials/ec2/info | 의 자격 증명에 대한 정보입니다 identity-credentials/ec2/security-credentials/ec2-instance. | 2018-05-23 |
| identity-credentials/ec2/security-credentials/ec2-instance | EC2 Instance Connect 및 AWS 시스템 관리자 기본 호스트 관리 구성과 같은 기능을 지원하기 위해 인스턴스 내 소프트웨어가 AWS에 자신을 식별할 수 있도록 하는 인스턴스 자격 증명 역할에 대한 자격 증명입니다. 이러한 자격 증명에는 연결된 정책이 없으므로 AWS 기능에 대한 인스턴스를 식별하는 것 이상의 추가 AWS API 권한이 없습니다. 자세한 내용은 인스턴스 ID 역할을 참조하세요 . | 2018-05-23 |
| instance-action | 번들링 준비를 위해 재부팅해야 함을 인스턴스에 알립니다. 유효한 값: none| shutdown | bundle-pending. | 2008-09-01 |
| instance-id | 이 인스턴스의 ID입니다. | 1.0 |
| instance-life-cycle | 이 인스턴스의 구매 옵션입니다. 자세한 내용은 인스턴스 구매 옵션을 참조하세요 . | 2019-10-01 |
| instance-type | 인스턴스 유형입니다. 자세한 내용은 인스턴스 유형을 참조하세요 . | 2007-08-29 |
| ipv6 | 인스턴스의 IPv6 주소입니다. 여러 네트워크 인터페이스가 있는 경우 eth0 장치(장치 번호가 0인 장치) 네트워크 인터페이스와 할당된 첫 번째 IPv6 주소를 나타냅니다. 네트워크 인터페이스[0]에 IPv6 주소가 없으면 이 항목이 설정되지 않고 HTTP 404 응답이 발생합니다. | 2021-01-03 |
| kernel-id | 해당하는 경우 이 인스턴스로 시작된 커널의 ID입니다. | 2008-02-01 |
| local-hostname | 여러 네트워크 인터페이스가 존재하는 경우 이는 eth0 장치(장치 번호가 0인 장치)를 나타냅니다. EC2 인스턴스가 IP 기반 이름 지정(IPBN)을 사용하는 경우 이는 인스턴스의 프라이빗 IPv4 DNS 호스트 이름입니다. EC2 인스턴스가 RBN(리소스 기반 이름 지정)을 사용하는 경우 이는 RBN입니다. IPBN, RBN 및 EC2 인스턴스 이름 지정에 대한 자세한 내용은 Amazon EC2 인스턴스 호스트 이름 유형 을 참조하십시오 . | 2007-01-19 |
| local-ipv4 | 인스턴스의 프라이빗 IPv4 주소입니다. 여러 네트워크 인터페이스가 존재하는 경우 이는 eth0 장치(장치 번호가 0인 장치)를 나타냅니다. IPv6 전용 인스턴스인 경우 이 항목이 설정되지 않고 HTTP 404 응답이 발생합니다. | 1.0 |
| mac | 인스턴스의 미디어 액세스 제어(MAC) 주소입니다. 여러 네트워크 인터페이스가 존재하는 경우 이는 eth0 장치(장치 번호가 0인 장치)를 나타냅니다. | 2011-01-01 |
| metrics/vhostmd | 더 이상 사용할 수 없습니다. | 2011-05-01 |
| network/interfaces/macs/mac/device-number | 해당 인터페이스와 연결된 고유 장치 번호입니다. 장치 번호는 장치 이름에 해당합니다. 예를 들어 a device-number2는 eth2 장치에 대한 것입니다. 이 범주는 Amazon EC2 API와 AWS CLI용 EC2 명령에서 사용되는 DeviceIndex및 필드 에 해당합니다 .device-index | 2011-01-01 |
| network/interfaces/macs/mac/interface-id | 네트워크 인터페이스의 ID입니다. | 2011-01-01 |
| network/interfaces/macs/mac/ipv4-associations/public-ip | 각 공용 IP 주소와 연결되고 해당 인터페이스에 할당된 개인 IPv4 주소입니다. | 2011-01-01 |
| network/interfaces/macs/mac/ipv6s | 인터페이스와 연결된 IPv6 주소입니다. VPC에서 시작된 인스턴스에 대해서만 반환됩니다. | 2016-06-30 |
| network/interfaces/macs/mac/local-hostname | 인스턴스의 프라이빗 IPv4 DNS 호스트 이름입니다. 여러 네트워크 인터페이스가 존재하는 경우 이는 eth0 장치(장치 번호가 0인 장치)를 나타냅니다. IPv6 전용 인스턴스인 경우 리소스 기반 이름입니다. IPBN 및 RBN에 대한 자세한 내용은 Amazon EC2 인스턴스 호스트 이름 유형 을 참조하십시오 . | 2007-01-19 |
| network/interfaces/macs/mac/local-ipv4s | 인터페이스와 연결된 프라이빗 IPv4 주소입니다. IPv6 전용 네트워크 인터페이스인 경우 이 항목이 설정되지 않고 HTTP 404 응답이 발생합니다. | 2011-01-01 |
| network/interfaces/macs/mac/mac | 인스턴스의 MAC 주소입니다. | 2011-01-01 |
| network/interfaces/macs/mac/network-card-index | 네트워크 카드의 색인입니다. 일부 인스턴스 유형은 여러 네트워크 카드를 지원합니다. | 2020-11-01 |
| network/interfaces/macs/mac/owner-id | 네트워크 인터페이스 소유자의 ID입니다. 다중 인터페이스 환경에서는 Elastic Load Balancing과 같은 타사를 통해 인터페이스를 연결할 수 있습니다. 인터페이스의 트래픽은 항상 인터페이스 소유자에게 청구됩니다. | 2011-01-01 |
| network/interfaces/macs/mac/public-hostname | 인터페이스의 퍼블릭 DNS(IPv4)입니다. 이 범주는 enableDnsHostnames속성이 로 설정된 경우에만 반환됩니다 true. 자세한 내용은 Amazon VPC 사용 설명서 의 VPC에 대한 DNS 속성을 참조하십시오 . 인스턴스에 퍼블릭 IPv6 주소만 있고 퍼블릭 IPv4 주소가 없는 경우 이 항목이 설정되지 않고 HTTP 404 응답이 발생합니다. | 2011-01-01 |
| network/interfaces/macs/mac/public-ipv4s | 인터페이스와 연결된 공용 IP 주소 또는 탄력적 IP 주소입니다. 인스턴스에 IPv4 주소가 여러 개 있을 수 있습니다. | 2011-01-01 |
| network/interfaces/macs/mac/security-groups | 네트워크 인터페이스가 속한 보안 그룹입니다. | 2011-01-01 |
| network/interfaces/macs/mac/security-group-ids | 네트워크 인터페이스가 속한 보안 그룹의 ID입니다. | 2011-01-01 |
| network/interfaces/macs/mac/subnet-id | 인터페이스가 상주하는 서브넷의 ID입니다. | 2011-01-01 |
| network/interfaces/macs/mac/subnet-ipv4-cidr-block | 인터페이스가 상주하는 서브넷의 IPv4 CIDR 블록입니다. | 2011-01-01 |
| network/interfaces/macs/mac/subnet-ipv6-cidr-blocks | 인터페이스가 상주하는 서브넷의 IPv6 CIDR 블록입니다. | 2016-06-30 |
| network/interfaces/macs/mac/vpc-id | 인터페이스가 상주하는 VPC의 ID입니다. | 2011-01-01 |
| network/interfaces/macs/mac/vpc-ipv4-cidr-block | VPC의 기본 IPv4 CIDR 블록입니다. | 2011-01-01 |
| network/interfaces/macs/mac/vpc-ipv4-cidr-blocks | VPC용 IPv4 CIDR 블록입니다. | 2016-06-30 |
| network/interfaces/macs/mac/vpc-ipv6-cidr-blocks | 인터페이스가 상주하는 VPC의 IPv6 CIDR 블록입니다. | 2016-06-30 |
| placement/availability-zone | 인스턴스가 시작된 가용 영역입니다. | 2008-02-01 |
| placement/availability-zone-id | 인스턴스가 시작되는 정적 가용 영역 ID입니다. 가용 영역 ID는 계정 전체에서 일관됩니다. 그러나 계정에 따라 다를 수 있는 가용 영역과 다를 수 있습니다. | 2019-10-01 |
| placement/group-name | 인스턴스가 시작되는 배치 그룹의 이름입니다. | 2020-08-24 |
| placement/host-id | 인스턴스가 시작되는 호스트의 ID입니다. 전용 호스트에만 적용됩니다. | 2020-08-24 |
| placement/partition-number | 인스턴스가 시작되는 파티션의 번호입니다. | 2020-08-24 |
| placement/region | 인스턴스가 시작되는 AWS 리전입니다. | 2020-08-24 |
| product-codes | 인스턴스와 연결된 AWS Marketplace 제품 코드입니다(있는 경우). | 2007-03-01 |
| public-hostname | 인스턴스의 퍼블릭 DNS(IPv4)입니다. 이 범주는 enableDnsHostnames속성이 로 설정된 경우에만 반환됩니다 true. 자세한 내용은 Amazon VPC 사용 설명서 의 VPC에 대한 DNS 속성을 참조하십시오 . 인스턴스에 퍼블릭 IPv6 주소만 있고 퍼블릭 IPv4 주소가 없는 경우 이 항목이 설정되지 않고 HTTP 404 응답이 발생합니다. | 2007-01-19 |
| public-ipv4 | 공용 IPv4 주소입니다. 탄력적 IP 주소가 인스턴스와 연결된 경우 반환되는 값은 탄력적 IP 주소입니다. | 2007-01-19 |
| public-keys/0/openssh-key | 공개 키. 인스턴스 시작 시 제공된 경우에만 사용할 수 있습니다. | 1.0 |
| ramdisk-id | 해당되는 경우 시작 시 지정된 RAM 디스크의 ID입니다. | 2007-10-10 |
| reservation-id | 예약 ID입니다. | 1.0 |
| security-groups | 인스턴스에 적용된 보안 그룹의 이름입니다.시작 후 인스턴스의 보안 그룹을 변경할 수 있습니다. mac이러한 변경 사항은 여기 및 network/interfaces/macs// security-groups 에 반영됩니다 . | 1.0 |
| services/domain | 해당 지역의 AWS 리소스에 대한 도메인입니다. | 2014-02-25 |
| services/partition | 리소스가 있는 파티션입니다. 표준 AWS 지역의 경우 파티션은 입니다 aws. 다른 파티션에 리소스가 있는 경우 해당 파티션은 입니다 . 예를 들어 중국(베이징) 지역의 리소스 파티션은 입니다 .aws-partitionnameaws-cn | 2015-10-20 |
| spot/instance-action | 작업(최대 절전 모드, 중지 또는 종료) 및 작업이 발생할 대략적인 시간(UTC)입니다. 이 항목은 스팟 인스턴스가 최대 절전 모드, 중지 또는 종료로 표시된 경우에만 존재합니다. 자세한 내용은 인스턴스 작업을 참조하세요 . | 2016-11-15 |
| spot/termination-time | 스팟 인스턴스의 운영 체제가 종료 신호를 수신하는 대략적인 시간(UTC)입니다. 이 항목은 Amazon EC2에 의해 스팟 인스턴스가 종료되도록 표시된 경우에만 존재하며 시간 값(예: 2015-01-05T18:02:00Z)을 포함합니다. 스팟 인스턴스를 직접 종료한 경우 종료 시간 항목이 시간으로 설정되지 않습니다. 자세한 내용은 종료 시간을 참조하세요 . | 2014-11-05 |
| tags/instance | 인스턴스와 연결된 인스턴스 태그입니다. 인스턴스 메타데이터의 태그에 대한 액세스를 명시적으로 허용한 경우에만 사용할 수 있습니다. 자세한 내용은 인스턴스 메타데이터의 태그에 대한 액세스 허용을 참조하세요 . | 2021-03-23 |
간단한 IMDS 활용법
IMDS를 활용하면 개발자와 시스템 관리자는 IMDS를 활용하여 다양한 스크립트를 작성하거나 인스턴스가 자동으로 환경을 인식하고 적절하게 반응하도록 프로그래밍할 수 있습니다.
실행 중인 인스턴스 내에서 인스턴스 메타데이터의 모든 범주를 보려면 다음 IPv4 또는 IPv6 URI를 사용하면 됩니다..
IPv4http://169.254.169.254/latest/meta-data/
IPv6http://[fd00:ec2::254]/latest/meta-data/
상기 주소에 curl 명령어 실행하면 하기와 같은 메타데이터를 확인할 수 있습니다.

동적 구성 파일 생성: 인스턴스가 시작될 때, 메타데이터를 사용하여 애플리케이션 구성 파일을 동적으로 생성할 수 있습니다. 예를 들어, 인스턴스의 IP 주소나 호스트 이름을 구성 파일에 삽입하면, 애플리케이션은 시작 시 자동으로 현재 환경에 맞게 설정됩니다.
동적 스크립트 생성: 스크립트가 실행될 때마다 인스턴스의 현재 상태나 환경에 따라 다른 결과를 생성할 수 있습니다. 예를 들어, 인스턴스의 ID를 산출해서 lastlog를 산출하는 하기와 같은 코드는 ssm 명령 실행과 함께 실행하면 인스턴스 별 os 계정의 내용을 쉽게 산출하고 정리할 수 있습니다.
IMDS의 위험성
EC2의 Instance Metadata Service(IMDS)는 인스턴스에 관한 정보를 제공하는 강력한 기능입니다. 하지만, IMDS의 접근성이 보안상의 우려를 야기할 수 있습니다. IMDS는 기본적으로 인스턴스 내부에서 실행되는 모든 프로세스에게 GET 요청을 통해 메타데이터에 접근할 수 있는 권한을 부여합니다. 이는 필요한 정보를 쉽게 얻을 수 있도록 하는 장점이 있지만, 동시에 보안적 측면에서 리스크가 될 수 있습니다.
IMDS는 추가적인 권한 검사 없이 접근 가능하기 때문에, 인스턴스 내에서 실행 중인 악의적인 소프트웨어나 무단 사용자에게도 메타데이터가 노출될 수 있습니다. 특히 IAM 역할과 연결된 자격 증명과 같은 민감한 정보가 포함되어 있을 경우, 이는 공격자가 AWS 리소스에 접근하는 데 사용될 수 있는 중대한 보안 구멍이 됩니다. IMDS 제한이 없을 경우에 대한 위험성은 하기 EKS CLUSTER GAMES 챌린지를 통해서 실습해보실 수 있습니다.
https://eksclustergames.com/
인스턴스 메타데이터 검색 관련 문제를 방지하기 위한 고려사항
IMDS의 보안 관련한 이슈 사항은 이미 오래전에 보고되었고 AWS 측에서의 조치도 있습니다. 바로 IMDS v2입니다. 위에 글에는 제가 의도적으로 IMDSv1에 대한 내용만을 담았고, 현재는 IMDS v2로 토큰 검증 방식을 통해 보안성을 강화하고 있습니다. 하지만 기본적으로 인스턴스를 생성할때 IMDS v1,2가 모두 활성화 되기 때문에 접근제어가 잘 되어있지 않은 환경에서는 보안강화을 위해서 v1을 비활성화 하는 방안도 필요합니다. 하기 링크를 참고하시면 v2를 강제하는 방법과 IMDS를 비활성화 하는 방법에 대한 가이드가 잘 나와있습니다.
https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/configuring-IMDS-existing-instances.html
IMDSv2의 사용 요구
인스턴스 메타데이터에 대한 액세스 비활성화
마무리하자면, IMDS는 AWS 인프라에서 매우 유용한 도구이지만, 그 위력만큼 보안에도 각별한 주의가 요구됩니다. IMDS의 기능을 최대한 활용하면서도, 보안 위험을 최소화하기 위한 철저한 접근 제어와 설정 조정을 통해, AWS 리소스를 보다 안전하게 운영해야 합니다.
'Cloud' 카테고리의 다른 글
| [AWS] Terraform과 github action연동하기 (0) | 2025.02.13 |
|---|---|
| [AWS] ECS Service에 복수 TargatGroup 설정하기 (0) | 2025.02.13 |
| [AWS]AWS ECS EXEC 설정 및 사용하기 (0) | 2025.02.13 |
| [AWS LAMBDA] 동시성 설정 및 오토스케일링 적용하기 (0) | 2025.02.13 |
| [AWS] VPC Flow Logs를 Logs Insights를 활용해 쉽게 확인하기 (1) | 2025.02.13 |
댓글