본문 바로가기
데브옵스 이야기

AWS 리소스를 IAM ResourceTag로 더욱 세밀하게 제어하기 (feat. 공식문서의 위대함)

by lakescript 2024. 7. 23.
728x90

들어가며

사내에서 특정 서비스가 배포된 EC2에만 SSM(AWS Systems Manage) 허용하도록 하는 요청이 있었습니다. 해당 요청의 대상 EC2에는 특정 Tag가 할당되어 있었는데, Service: store 같은 방식으로 서비스의 내용이 tag로 할당되어 있었습니다.

 

그렇기에 해결 방법은 2가지로 구상해보았습니다.

  1. ec2 목록을 노출시킬 때 특정 Tag가 있는 EC2 목록을 노출시켜 그 EC2들에게만 SSM 접근을 허용한다.
  2. 전체 EC2 목록을 노출시키고, 특정 Tag가 있는 EC2에만 SSM 접근을 허용한다.

바로 1번 방법을 시행해보자!

1번의 방법이 가장 효율적으로 보였기에 바로 아래와 같이 IAM 권한을 할당했습니다.

{ 
  "Sid": "ec2Describes",
	"Action": [
	  "ec2:DescribeInstances",
    "ec2:DescribeVolumes",
    "ec2:DescribeSecurityGroups"
   ],
   "Effect": "Allow",
   "Resource": "*",
	 "Condition": {
	   "StringLike": {
	     "aws:resourceTag/Service": [
	       "store"
         ]
       }
		},
},
...
{
	"Sid": "ssmStart",
	"Action": [
		"ssm:StartSession",
		"ssm:GetConnectionStatus"
	],
	"Condition": {
		"StringLike": {
			"ssm:resourceTag/Service": [
				"store"
			]
		}
	},
	"Effect": "Allow",
	"Resource": [
		"arn:aws:ec2:ap-northeast-2:1111111111:instance/*"
	]
},
{
	"Sid": "ssmDescribe"
	"Action": [
		"ssm:DescribeSessions",
    "ssm:DescribeInstanceInformation",
    "ssm:DescribeInstanceProperties"
  ],
	"Condition": {
		"StringLike": {
			"ssm:resourceTag/Service": [
				"store"
			]
		}
	},
	"Effect": "Allow",
	"Resource": [
		"arn:aws:ec2:ap-northeast-2:1111111111:instance/*"
	]
},
...

이렇게 작성 후 전달을 했는데, 아래와 같이 정책상 거부되어 접근이 불가능하다고 메시지가 왔습니다.

인스턴스 정보를 설명하지 못함
User: arn:aws:iam::1111111111111:user/store/user-name is not authorizaes to perform: ec2:DescribeInstance on resource: arn:aws:ssm:ap-northeast-2:11111111111:* because no identity-based policy allows the ec2:DescribeInstances action”

ResourceTag

https://docs.aws.amazon.com/ko_kr/service-authorization/latest/reference/list_amazonec2.html#amazonec2-policy-keys

 

Amazon EC2에 사용되는 작업, 리소스 및 조건 키 - 서비스 승인 참조

 

docs.aws.amazon.com

 

위의 페이지를 참고하면 IAM 정책에서 condition의 요소에 조건을 사용하여 접근 제어가 가능하다고 합니다.

이중 요청사항에 맞는 조건을 살펴보면 store라는 tag가 달려있는 EC2에 접근을 해야 하니 ResourceTag/${TagKey}를 사용하고자 했습니다.

"StringEquals": { "aws:ResourceTag/environment": "production" }

위와 같은 방식으로 condition 구문안에 ResourceTag/${TagKey}를 조건으로 할당하여 접근 제어가 가능합니다.

근데 접근이 안된다고?

위와 같이 설정하였음에도 정작 요청자가 aws console에 접근해서 확인해보면 EC2목록 출력은 물론 아무런 권한도 없어서 접근하지 못한다고 피드백이 돌아왔습니다.

분명히 ec2:DescribeInstances에 대해 aws:resourceTag/Service로 조건 값을 할당하여 접근을 허용했는데 왜 접근이 안되는 것일까요?

정책마다 사용가능한 리소스 및 조건 키가 다르다

https://docs.aws.amazon.com/ko_kr/service-authorization/latest/reference/list_amazonec2.html

 

Amazon EC2에 사용되는 작업, 리소스 및 조건 키 - 서비스 승인 참조

 

docs.aws.amazon.com

 

 

위에서 정의한 EC2의 권한인 ec2:DescribeInstances는 aws:ResourceTag/${TagKey}를 지원하지 않는다고 합니다. 그렇기에 모든 사용자에게 세부적인 권한 제어를 할 수 없어 모든 EC2 리소스를 노출시킬 수 밖에 없습니다.

그렇기에 위에서 생각했었던 구현 방식중 1번째는 불가능했고, 2번 방향으로 진행했습니다.

2번 방법으로 진행하기로 결정!

2번 방향은 전체 EC2 목록을 노출시키고, 특정 Tag가 있는 EC2에만 SSM 접근을 허용하는 방향으로 설정하고 작업을 진행했습니다.

ResourceTag를 설정할 수 있는 정책을 확인해보자.

일단 EC2, ssm에 관한 내용중 현재 작업을 해야할 정책에서 ResourceTag/${TagKey}를 사용할 수 있는 정책, 사용할 수 없는 정책을 나누어 봤습니다.

EC2 - ResourceTag 사용 불가능

  • ec2:DescribeInstances

  • ec2:DescribeVolumes

  • ec2:DescribeSecurityGroups

SSM - ResourceTag 사용 불가능

  • ssm:DescribeSessions

  • ssm:DescribeInstanceInformation

  • ssm:DescribeInstanceProperties

SSM - ResourceTag 사용 가능

  • ssm:StartSession

  • ssm:GetConnectionStatus

 

이에 따라 아래와 같이 수정하였습니다.

{ 
  "Sid": "ec2Describes",
	"Action": [
	  "ec2:DescribeInstances",
    "ec2:DescribeVolumes",
    "ec2:DescribeSecurityGroups"
   ],
   "Effect": "Allow",
   "Resource": "arn:aws:ec2:ap-northeast-2:1111111111:instance/*"
},
...
{
	"Sid": "ssmStart",
	"Action": [
		"ssm:StartSession",
		"ssm:GetConnectionStatus"
	],
	"Condition": {
		"StringLike": {
			"ssm:resourceTag/Service": [
				"store"
			]
		}
	},
	"Effect": "Allow",
	"Resource": [
		"arn:aws:ec2:ap-northeast-2:1111111111:instance/*"
	]
},
{
	"Sid": "ssmDescribe"
	"Action": [
		"ssm:DescribeSessions",
    "ssm:DescribeInstanceInformation",
    "ssm:DescribeInstanceProperties"
  ],
	"Condition": {
		"StringLike": {
			"ssm:resourceTag/Service": [
				"store"
			]
		}
	},
	"Effect": "Allow",
	"Resource": [
		"arn:aws:ec2:ap-northeast-2:1111111111:instance/*"
	]
},
...

정리하며

IAM을 통해 AWS 리소스의 정책들에 대해 세세하게 접근 제어를 해보는 좋은 기회였습니다. 특히 이번 기회를 토대로 IAM 접근 제어에 대해 더욱 깊이 알 수 있게 되었는데요. 무엇보다 공식문서를 확인하면서 작업하는 습관을 길러야 겠다고 생각했습니다.. (당연히 그냥 될 줄 알았던 생각때문에 2~3시간을 소비했네요ㅠ)

728x90

'데브옵스 이야기' 카테고리의 다른 글

K8s의 Memory? (RAM, Storage)  (0) 2024.08.02
Kubernetes common errors  (0) 2024.07.29
CKA, CKAD 취득 후기  (0) 2024.03.04
좌충우돌 AWS EKS NodeGroup EC2 Type 전환기  (0) 2023.08.14