일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 자격증
- cloud function
- Python
- AWS
- Clean Code
- 후기
- terraform
- vm
- devops
- interconnect
- gcp
- 보안 규칙
- cicd
- direnv
- docker
- Terraform Cloud
- Google Cloud Platform
- Java
- IAM
- 우테캠
- CentOS
- pub/sub
- vpc peering
- MIG
- github
- kubernetes
- VAGRANT
- cloud
- cloud armor
- Uptime Check
- Today
- Total
EMD Blog
EKS에서 Cluster의 IAM role과 Service account IAM role 본문
EKS 사용시 적용할 수 있는 권한체계는 2가지가 있다. 하나는 Cluster에 적용하는 리소스 기반 정책과 IAM Role Service Account(IRSA)를 사용해 Cluster 내 Service Account에 IAM Role을 연동하는 OIDC 방식이 존재한다.
Cluster에 적용해서 AWS 리소스에 접근하든, Service Account로 접근하든 AWS 리소스에 액세스 하는 것은 마찬가지인데 왜 둘이 나눠져 있는 것인지 의문이 들어 확인해보고 정리한다.
EKS cluster를 생성할 때, Cluster가 AWS에 액세스 할 수 있도록 Cluster에 role을 지정할 수 있다.
아래 문서를 보면 Cluster 생성 시 AmazonEKSClusterPolicy 정책이 포함된 role을 지정하도록 되어있다.
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/getting-started-console.html
AmazonEKSClusterPolicy에 포함되어 있는 권한 목록은 다음과 같다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"autoscaling:DescribeAutoScalingGroups",
"autoscaling:UpdateAutoScalingGroup",
"ec2:AttachVolume",
"ec2:AuthorizeSecurityGroupIngress",
"ec2:CreateRoute",
"ec2:CreateSecurityGroup",
"ec2:CreateTags",
"ec2:CreateVolume",
"ec2:DeleteRoute",
"ec2:DeleteSecurityGroup",
"ec2:DeleteVolume",
"ec2:DescribeInstances",
"ec2:DescribeRouteTables",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSubnets",
"ec2:DescribeVolumes",
"ec2:DescribeVolumesModifications",
"ec2:DescribeVpcs",
"ec2:DescribeDhcpOptions",
"ec2:DescribeNetworkInterfaces",
"ec2:DetachVolume",
"ec2:ModifyInstanceAttribute",
"ec2:ModifyVolume",
"ec2:RevokeSecurityGroupIngress",
"ec2:DescribeAccountAttributes",
"ec2:DescribeAddresses",
"ec2:DescribeInternetGateways",
"elasticloadbalancing:AddTags",
"elasticloadbalancing:ApplySecurityGroupsToLoadBalancer",
"elasticloadbalancing:AttachLoadBalancerToSubnets",
"elasticloadbalancing:ConfigureHealthCheck",
"elasticloadbalancing:CreateListener",
"elasticloadbalancing:CreateLoadBalancer",
"elasticloadbalancing:CreateLoadBalancerListeners",
"elasticloadbalancing:CreateLoadBalancerPolicy",
"elasticloadbalancing:CreateTargetGroup",
"elasticloadbalancing:DeleteListener",
"elasticloadbalancing:DeleteLoadBalancer",
"elasticloadbalancing:DeleteLoadBalancerListeners",
"elasticloadbalancing:DeleteTargetGroup",
"elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
"elasticloadbalancing:DeregisterTargets",
"elasticloadbalancing:DescribeListeners",
"elasticloadbalancing:DescribeLoadBalancerAttributes",
"elasticloadbalancing:DescribeLoadBalancerPolicies",
"elasticloadbalancing:DescribeLoadBalancers",
"elasticloadbalancing:DescribeTargetGroupAttributes",
"elasticloadbalancing:DescribeTargetGroups",
"elasticloadbalancing:DescribeTargetHealth",
"elasticloadbalancing:DetachLoadBalancerFromSubnets",
"elasticloadbalancing:ModifyListener",
"elasticloadbalancing:ModifyLoadBalancerAttributes",
"elasticloadbalancing:ModifyTargetGroup",
"elasticloadbalancing:ModifyTargetGroupAttributes",
"elasticloadbalancing:RegisterInstancesWithLoadBalancer",
"elasticloadbalancing:RegisterTargets",
"elasticloadbalancing:SetLoadBalancerPoliciesForBackendServer",
"elasticloadbalancing:SetLoadBalancerPoliciesOfListener",
"kms:DescribeKey"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "iam:CreateServiceLinkedRole",
"Resource": "*",
"Condition": {
"StringEquals": {
"iam:AWSServiceName": "elasticloadbalancing.amazonaws.com"
}
}
}
]
}
요약하면 다음과 같다.
- Auto-Scaling 정보가져오기/구성 업데이트
- EC2 Volume 편집
- Security Group 편집
- 라우팅 테이블에 라우팅 편집
- EC2 태그 추가
- ELB 태그/보안그룹/서브넷/상태확인/리스너/타겟그룹/정책 편집
- ELB 편집
- KMS 정보 가져오기
- ELB에 연결된 역할 생성
아래 네트워크 및 보안드룹 사전조건을 보면 Cluster 생성 시 Cluster와 VPC간 통신을 위해 네트워크 인터페이스를 생성하고 소스를 자신으로 하는 전체허용 Ingress 규칙과 전체 아웃바운드 허용 규칙이 포함된 보안그룹을 하나 생성한다.
- https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/network_reqs.html
- https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/sec-group-reqs.html
또한 In-tree Service Controller에 의해 로드밸런서가 생성될 경우 Cluster에 의해 ELB가 생성되어야 하므로 AmazonEKSClusterPolicy 내의 ELB 권한이 필요하고, 노드 그룹(Auto-Scaling)이나 노드(EC2)도 Cluster에 의해 생성되어야 하기 때문에 EC2 및 Autoscaling 권한이 필요하다.
위 정책은 이 정도까지의 작업을 수행할 수 있는 정책인데 이 작업들은 EKS 컨트롤 플레인 내에 위치한 Cloud-Controller-Manager의 컨트롤러들이 수행할 수 있는 작업들이다.
즉, Cloud-Controller-Manager를 통해 접근하는 작업들은 EKS Cluster의 role을 사용하며, 위 정책은 Cloud-Controller-Manager내 컨트롤러가 작업을 수행할 수 있도록 하는 최소권한만 포함된 정책이다.
그리고 Cloud-Controller-Manager에 포함되어 있지 않은 Controller가 AWS에 액세스하려면 Service Account를 필요로 하게 된다.
이와 관련해 AWS에 Case를 남겨 받은 답변들이 있는데 참고하면 좋을 것 같아 첨부파일로 남깁니다. (내용이 너무 길어서 파일로 첨부)
'Public Cloud > AWS' 카테고리의 다른 글
Github Actions에서 OIDC를 통해 AWS에 액세스 (0) | 2023.01.05 |
---|---|
ALB와 CloudFront를 사용할 때 VirtualHost 사용 테스트 (0) | 2022.12.27 |
Bastion Host를 통한 RDS SQL Server 접속 (0) | 2022.10.22 |
AWS Session Manager를 통한 RDP 연결 (0) | 2022.09.07 |
PC에 AWS Account 설정 (0) | 2022.09.03 |