EC2 인스턴스 메타데이터는 EC2 인스턴스에 대한 설정이나 정보를 가지는 데이터입니다. 인스턴스 메타데이터를 이용하여 User Data Script를 실행시키거나 IAM Role 권한을 적용시킬 수 있습니다.
EKS에서 Node Group으로 EC2를 사용할 때도 Launch Template을 이용하여 메타데이터에 대한 설정을 할 수 있습니다. 오늘은 메타데이터에 대한 설정을 살펴보고 보안을 고려했을 때 어떤 설정이 더 나은 설정인지 탐구해봅시다.
1. IMDS Version
인스턴스 메타데이터 서비스(IMDS)는 버전이 1, 2가 있습니다.
IMDSv1은 요청/응답 형식으로 메타데이터를 제공합니다. http://169.254.169.254로 접근하여 메타데이터를 얻을 수 있습니다. 쉽게 접근할 수 있는 것이 장점이지만, 그만큼 취약점이 나타날 수 있습니다.
[ec2-user@ip-10-0-11-70 ~]$ curl http://169.254.169.254/latest/meta-data/
ami-id
ami-launch-index
ami-manifest-path
...
IMDSv2는 세션 지향 요청을 사용하여 IMDSv1의 취약성을 개선했습니다. PUT 요청으로 세션 토큰을 생성해야 하고, 헤더에 세션 토큰을 넣어서 메타데이터에 접근할 수 있습니다.
[ec2-user@ip-10-0-11-70 ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 56 100 56 0 0 35331 0 --:--:-- --:--:-- --:--:-- 56000
[ec2-user@ip-10-0-11-70 ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/
ami-id
ami-launch-index
ami-manifest-path
...
IMDSv2가 IMDSv1의 취약성을 개선했기 때문에 IMDSv2를 쓰는 것이 보안적으로 나은 선택입니다. 그럼 Launch Template에서 IMDSv2만 사용할 수 있도록 설정합시다.
Launch Template 생성에서 맨 아래의 Advanced details를 누릅니다.
메타데이터를 사용하기 위해서 Metadata accessible을 Enabled로 설정합니다.
IMDSv2만 사용할 수 있도록 Metadata version을 V2 only로 설정합니다.
2. Hop limit
네트워크에서의 Hop count는 데이터가 출발지에서 도착지까지 전달되면서 거치는 네트워크 장치의 수를 나타냅니다.
Hop limit은 하나의 통신에서 허용하는 최대 Hop count입니다. Hop count가 Hop limit을 넘어서게 되면 네트워크 장비가 패킷을 전달하지 않게 합니다.
EKS Node Group에서는 Hop limit을 이용하여 메타데이터 액세스가 어디까지 허용되는지 정의할 수 있습니다. 예를 들어, Hop limit이 1이라면 EC2 Instance까지 액세스가 허용되며 Hop limit이 2라면 Node 안에 있는 Pod까지 액세스가 허용되는 것입니다.
따라서 Node를 용도에 따라 Addon, App으로 나누는 것이 좋습니다. 많은 EKS Addon들이 메타데이터를 이용하여 서비스를 제공하기 때문에 Addon Node의 Hop limit은 2로 설정하고, 메타데이터를 잘 이용하지 않는 App Node의 Hop limit은 1로 설정합니다. App Pod가 IAM 권한이 필요할 경우 serviceaccount 등을 사용합니다.
# Addon Node의 Hop limit을 1로 설정했을때의 에러
[ec2-user@ip-10-0-11-70 ~]$ kubectl logs -n kube-system aws-load-balancer-controller-57fd587bf4-fz45w
{"level":"info","ts":"2023-09-22T10:36:01Z","msg":"version","GitVersion":"v2.6.1","GitCommit":"5a5885bfbd3c7237ac190859fe0f20e96c95f1f2","BuildDate":"2023-09-11T17:50:40+0000"}
{"level":"error","ts":"2023-09-22T10:36:04Z","logger":"setup","msg":"unable to initialize AWS cloud","error":"failed to introspect vpcID from EC2Metadata or Node name, specify --aws-vpc-id instead if EC2Metadata is unavailable: failed to fetch VPC ID from instance metadata: EC2MetadataError: failed to make EC2Metadata request\n\n\tstatus code: 401, request id: "}
Hop limit은 Metadata version 아래에서 설정할 수 있습니다.
Hop limit이 1인 App Node에서 aws-cli pod를 실행시켜 권한을 확인해봅시다.
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: aws-cli
spec:
nodeSelector:
node: app
tolerations:
- key: node
operator: Equal
value: app
effect: NoSchedule
containers:
- name: aws-cli
image: amazon/aws-cli
command:
- sleep
- infinity
[ec2-user@ip-10-0-11-70 ~]$ kubectl apply -f pod.yaml
pod/aws-cli created
[ec2-user@ip-10-0-11-70 ~]$ kubectl exec -it aws-cli -- /bin/bash
bash-4.2# aws sts get-caller-identity
Unable to locate credentials. You can configure credentials by running "aws configure".
Pod가 App Node의 IAM Role을 사용할 수 없어 "Unable to locate credentials." 라고 나오게 됩니다.
참고로, Hop limit이 2인 Addon Node에서 aws-cli pod를 실행시키면 다음과 같이 나오게 됩니다.
bash-4.2# aws sts get-caller-identity
{
"UserId": "AROARCL45OW2DHAWVQT2A:i-0d0580613514b2410",
"Account": "073813292468",
"Arn": "arn:aws:sts::073813292468:assumed-role/AmazonEKSNodeRole/i-0d0580613514b2410"
}
오늘의 글은 여기까지입니다. 감사합니다!
참고
https://cloudguardians.medium.com/ec2-instance-metadata-%EB%B3%B4%EC%95%88-edd23f56b64c
EC2 Instance Metadata 보안
AWS 에서 가장 기본이 되는 EC2 서비스는 AWS Cloud 환경을 이해하는데 도움이 되는 다양한 서비스나 기능들이 모여 있는 대표적인 서비스입니다. 따라서, 많은 AWS 고객들이 EC2 서비스를 사용해왔고
cloudguardians.medium.com
https://en.wikipedia.org/wiki/Hop_(networking)
Hop (networking) - Wikipedia
From Wikipedia, the free encyclopedia When a packet is passed from one network segment to the next This article is about traversal of a computer network. For traversal of a telecommunications network, see Hop (telecommunications). An illustration of hops i
en.wikipedia.org
'AWS' 카테고리의 다른 글
[AWS] EKS AutoScaling - Karpenter (2) | 2023.09.25 |
---|---|
[AWS] aws-nuke로 모든 리소스 삭제 (0) | 2023.09.24 |
[AWS] ArgoCD를 통한 애플리케이션 배포 (with CodeCommit) (0) | 2023.09.19 |
[AWS] EKS AutoScaling - HPA, Cluster Autoscaler (2) | 2023.09.18 |
[AWS] EKS Fargate로 Pod 배포와 로깅 (0) | 2023.09.16 |