인스턴스를 운영하면서 특정 IAM user에게만 인스턴스를 제어하거나 multi-account 환경일 경우 특정 account에서는 인스턴스 작업을 하지 못하게 하는 방안에 대해 고려하고 있는 사용자들이 많을 것이라고 생각이 됩니다.
IAM 사용자에게 EC2 리소스를 사용할 수 있는 권한을 부여하는 IAM 정책을 생성할 때 정책의 Condition 요소에 태그 정보를 포함하여 태그를 기반으로 액세스를 제어할 수 있습니다. 이를 속성 기반 액세스 제어(ABAC)라고 합니다.
IAM Condition을 사용한 몇 가지 사례를 소개해 드리도록 하겠습니다.
Exam 1. 특정 IAM user가 "Env" Key를 보유하고 있을 경우에만 인스턴스 Start / Stop 가능하게 하기
https://ehdtn1219.tistory.com/192
Exam 2. 특정 IAM user가 지정된 Key와 Value를 보유하고 있을 경우에만 인스턴스를 생성 할 수 있도록 하기
Key | Value |
Team | backend, devops, data |
Env | dev, test, prod |
Tag | 인스턴스 생성 여부 |
Tag 없음 | X |
Team: frontend / Env: test | X |
Team: data / Env: dev | O |
Team: devops | X |
Team: backend / Env: stage | X |
Team: data / Env: dev / name: abc123 | O |
Env: prod | X |
Step 1) Policy 생성 후 IAM user에게 권한 추가
우선 인스턴스를 생성 하기 위한 Action을 확인하고 해당 Action이 지원하는 Resource, Condition을 확인하셔야 합니다.
다음 문서 [1] 에서 확인하실 수 있습니다.
[1] Amazon EC2에 사용되는 작업, 리소스 및 조건 키 - https://docs.aws.amazon.com/ko_kr/service-authorization/latest/reference/list_amazonec2.html
IAM Conditions
- 집합 연산자
ForAllValues: 요청의 모든 키 값이 정책에 있는 하나 이상의 값과 일치하면 true
ForAnyValue: 요청의 키 값 중 하나가 정책의 조건 값 중 하나와 일치하면 true
- 문자열 조건 연산자
StringEquals / StringNotEquals: 정확하게 일치, 대소문자 구분
StringLike / String NotLike: 와일드카드(* 또는 ?) 사용 가능
- 태그 조건 키
aws:RequestTag/tag-key: 어떤 Tag가 요청에 전달 될 수 있는지 제어
aws:TagKeys: 특정 Tag가 키를 리소스 또는 요청에서 사용할 수 있는 지 여부 제어
다음으로 아래 생성 된 Policy를 IAM user에게 추가 해줍니다.
{
"Version": "2012-10-17",
"Statement": [{
"Action": "ec2:*",
"Effect": "Allow",
"Resource": "*"
},
{
"Sid": "RuninstanceKeyRestriction1",
"Effect": "Deny",
"Action": [
"ec2:RunInstances",
"ec2:CreateVolume"
],
"Resource": [
"arn:aws:ec2:*:*:instance/*",
"arn:aws:ec2:*:*:volume/*"
],
"Condition": {
"ForAllValues:StringNotLike": {
"aws:TagKeys": "team"
}
}
},
{
"Sid": "RuninstanceValueRestriction1",
"Effect": "Deny",
"Action": [
"ec2:RunInstances",
"ec2:CreateVolume"
],
"Resource": [
"arn:aws:ec2:*:*:instance/*",
"arn:aws:ec2:*:*:volume/*"
],
"Condition": {
"StringNotLike": {
"aws:RequestTag/team": [
"backend",
"devops",
"data"
]
}
}
},
{
"Sid": "RuninstanceKeyRestriction2",
"Effect": "Deny",
"Action": [
"ec2:RunInstances",
"ec2:CreateVolume"
],
"Resource": [
"arn:aws:ec2:*:*:instance/*",
"arn:aws:ec2:*:*:volume/*"
],
"Condition": {
"ForAllValues:StringNotLike": {
"aws:TagKeys": "env"
}
}
},
{
"Sid": "RuninstanceValueRestriction2",
"Effect": "Deny",
"Action": [
"ec2:RunInstances",
"ec2:CreateVolume"
],
"Resource": [
"arn:aws:ec2:*:*:instance/*",
"arn:aws:ec2:*:*:volume/*"
],
"Condition": {
"StringNotLike": {
"aws:RequestTag/env": [
"dev",
"test",
"prod"
]
}
}
}
]
}
Step 2) 인스턴스 생성 테스트
1. Tag가 Key/Value (team/frontend), (env/test)로 인스턴스 생성
Instance를 생성 할 경우 아래와 같은 에러메시지를 확인하실 수 있습니다. 이를 복호화 해보겠습니다.
aws sts decode-authorization-message --encoded-message "message"
>> \"actions\":{\"items\":[{\"value\":\"ec2:RunInstances\"},{\"value\":\"ec2:CreateVolume\"}]
2. Tag가 Key/Value (team/data), (env/dev)로 인스턴스 생성
인스턴스가 정상적으로 생성되는 것을 확인하실 수 있습니다.
질문이 있으시면 댓글 남겨주시면 확인 후에 답변해드리겠습니다.
감사합니다.
'AWS' 카테고리의 다른 글
[AWS] AWS SSO SAML with Azure (AWS IAM Identity Center) (0) | 2023.05.30 |
---|---|
[AWS] Secrets Manager 강제 삭제 (0) | 2023.02.01 |
[AWS] EC2 인스턴스 Tag-based 관리 방법 - 1 (0) | 2023.01.27 |
[AWS] Cognito Userpool 생성 (0) | 2022.11.17 |
[AWS] EC2에 도메인 연결하기(가비아 도메인) (0) | 2022.08.13 |