IAM 역할을 EC2에 할당했다면, 애플리케이션이 AWS SDK를 사용하여 자동으로 자격 증명을 가져올 수 있습니다. 하지만 개발사가 사용하는 라이브러리가 access key를 직접 요구한다면 다음과 같은 방법을 고려해 볼 수 있습니다.
1. IAM 역할을 사용하여 Access Key 제공하기
EC2 인스턴스에 할당된 IAM 역할을 활용하여 access key를 제공할 수 있습니다.
(1) EC2 메타데이터에서 자격 증명 가져오기
아래 명령어를 실행하면 현재 할당된 IAM 역할의 자격 증명을 얻을 수 있습니다.
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/{IAM_ROLE_NAME}
이 요청을 실행하면 다음과 같은 JSON 응답을 받습니다.
{
"AccessKeyId": "AKIAXXXXXXXXXXXXXXXX",
"SecretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Token": "FQoGZXIvYXdzEJr//////////wEaDDTn...",
"Expiration": "2025-02-28T12:34:56Z"
}
이 값을 애플리케이션의 환경 변수에 넣어주면 됩니다.
(2) 환경 변수 설정
만약 라이브러리가 환경 변수를 통해 자격 증명을 읽을 수 있다면, EC2 인스턴스에서 다음을 실행하세요.
export AWS_ACCESS_KEY_ID="AKIAXXXXXXXXXXXXXXXX"
export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
export AWS_SESSION_TOKEN="FQoGZXIvYXdzEJr//////////wEaDDTn..."
이 방법을 사용하면 EC2에 할당된 IAM 역할의 자격 증명을 이용할 수 있습니다.
2. Instance Metadata Service v2(IMDSv2) 사용하기
AWS 보안 권장사항에 따라 IMDSv2를 사용하는 것이 좋습니다.
아래 명령어를 사용하여 먼저 토큰을 생성한 후, 해당 토큰을 활용하여 자격 증명을 가져올 수 있습니다.
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
curl -H "X-aws-ec2-metadata-token: $TOKEN" "http://169.254.169.254/latest/meta-data/iam/security-credentials/{IAM_ROLE_NAME}"
이렇게 하면 보안이 강화된 상태에서 IAM 역할의 자격 증명을 애플리케이션에 제공할 수 있습니다.
3. AWS SDK 사용을 권장
만약 개발사에서 수정이 가능하다면, AWS SDK를 사용하여 access key 없이 IAM 역할을 직접 활용하는 방식을 추천합니다. 예를 들어, Python의 boto3를 사용할 경우:
import boto3
s3 = boto3.client('s3')
response = s3.list_buckets()
print(response)
이렇게 하면 access key를 하드코딩하지 않고도 S3에 접근할 수 있습니다.
4. AWS Credentials 파일 사용하기 (비추천)
EC2 인스턴스 내의 특정 사용자 홈 디렉터리에 ~/.aws/credentials 파일을 만들어 수동으로 access key를 제공할 수도 있습니다. 하지만, 이 방법은 보안상 비추천됩니다.
[default]
aws_access_key_id=AKIAXXXXXXXXXXXXXXXX
aws_secret_access_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
이 파일을 사용하는 경우, AWS_PROFILE 환경 변수를 설정해야 할 수도 있습니다.
export AWS_PROFILE=default
결론
- 가능하면 AWS SDK를 활용하는 방식을 개발사에 요청하는 것이 가장 좋습니다.
- 라이브러리가 access key를 요구한다면 IAM 역할을 활용하여 EC2의 메타데이터에서 Access Key를 가져오는 방법을 사용하세요.
- 보안 강화를 위해 IMDSv2를 사용하는 것을 권장합니다.
- Access Key를 하드코딩하는 것은 피해야 합니다.
이 방법을 적용하면 access key를 직접 발급하지 않고도 애플리케이션이 S3에 접근할 수 있습니다.
여기서 잠깐 !!!
169.254.169.254는 **AWS EC2 인스턴스 메타데이터 서비스(Instance Metadata Service, IMDS)**에 접근하기 위한 특수한 내부 IP 주소입니다.
1. EC2 인스턴스 메타데이터 서비스(IMDS)란?
- EC2 인스턴스 내부에서 자신의 환경 정보를 조회할 수 있도록 AWS에서 제공하는 서비스입니다.
- 169.254.169.254는 EC2 인스턴스에서만 접근할 수 있는 링크-로컬(Link-local) IP 주소입니다.
- IAM 역할의 자격 증명, 인스턴스 정보, 네트워크 정보, 사용자 데이터(User Data) 등을 가져올 수 있음
2. IMDS에서 제공하는 주요 정보
IMDS를 활용하면 다음과 같은 정보를 얻을 수 있습니다.
메타데이터 정보설명조회 방법
IAM 역할 자격 증명 | EC2에 할당된 IAM 역할의 Access Key, Secret Key, Session Token 조회 | curl http://169.254.169.254/latest/meta-data/iam/security-credentials/{IAM_ROLE_NAME} |
인스턴스 ID | 현재 EC2의 인스턴스 ID | curl http://169.254.169.254/latest/meta-data/instance-id |
인스턴스 타입 | 현재 EC2의 타입 (t3.micro, m5.large 등) | curl http://169.254.169.254/latest/meta-data/instance-type |
프라이빗 IP | 현재 EC2의 내부 IP 주소 | curl http://169.254.169.254/latest/meta-data/local-ipv4 |
퍼블릭 IP | 현재 EC2의 공인 IP (있다면) | curl http://169.254.169.254/latest/meta-data/public-ipv4 |
리전 정보 | 현재 EC2가 실행 중인 AWS 리전 | curl http://169.254.169.254/latest/meta-data/placement/region |
사용자 데이터 | EC2 생성 시 입력한 User Data 스크립트 | curl http://169.254.169.254/latest/user-data |
3. IMDSv1 vs IMDSv2 (보안 강화)
AWS는 보안 강화를 위해 IMDSv2를 도입했습니다.
IMDSv1 (기존 방식)
- 단순한 curl 요청만으로 메타데이터 정보를 가져올 수 있음
- 예제:
sh복사편집curl http://169.254.169.254/latest/meta-data/
IMDSv2 (보안 강화)
- 세션 기반 **토큰(Token)**을 사용해야만 정보를 가져올 수 있음
- 보안이 강화되어 IMDSv2 사용이 권장됨
IMDSv2에서 Access Key 가져오는 방법
1. 토큰 생성
2. 토큰을 사용하여 IAM 역할 자격 증명 가져오기
4. IMDS를 이용하는 이유
보안 강화
- AWS IAM 역할을 사용하면 Access Key를 직접 발급할 필요 없음
- EC2에서만 접근 가능하므로 외부에서 자격 증명을 탈취할 위험 감소
자동화 가능
- 애플리케이션이 자동으로 EC2 환경을 감지하고 AWS 자격 증명을 가져올 수 있음
운영 편의성
- EC2에서 실행 중인 애플리케이션이 access key 없이도 AWS 서비스에 접근 가능
결론
- 169.254.169.254는 AWS EC2 내부에서만 접근할 수 있는 메타데이터 서비스 IP
- IAM 역할의 Access Key, EC2 정보, 네트워크 정보 등을 조회하는 용도로 사용됨
- 보안 강화를 위해 IMDSv2 (토큰 방식) 사용이 권장됨
- EC2에 IAM 역할을 할당하면 access key 없이 AWS 서비스 사용 가능
AWS SDK를 활용하면 자동으로 IMDS를 통해 자격 증명을 가져오므로, 가능하면 access key를 직접 사용하지 않는 방식으로 개발하는 것이 가장 안전함!
'AWS' 카테고리의 다른 글
AWS VPC 생성 및 서브넷 설정 (0) | 2025.03.01 |
---|---|
Windows Server에서 NTP 설정 확인하는 방법 (0) | 2025.02.28 |
AWS EC2의 IMDS(Instance Metadata Service)란? (0) | 2025.02.27 |