태그를 이용한 AWS 리소스 접근 제어
태그를 이용한 AWS 리소스 접근 제어 (Controlling access to AWS resources using tags)
태그를 사용해 태그를 지원하는 AWS 리소스(IAM 리소스 포함)에 대한 접근을 제어할 수 있어요. IAM 사용자·역할에 태그를 붙여 그들이 무엇에 접근할 수 있는지 제어할 수 있어요. IAM 사용자·역할 태그 지정 방법은 AWS Identity and Access Management 리소스의 태그를 참고하세요. 또한 다음 IAM 리소스에 대한 접근을 제어할 수 있어요: 고객 관리형 정책, IAM 아이덴티티 프로바이더, 인스턴스 프로필, 서버 인증서, 가상 MFA 기기. 프린시펄 태그가 있는 IAM 역할이 일치하는 태그가 있는 리소스에 접근하도록 허용하는 정책을 만들고 테스트하는 튜토리얼은 IAM 튜토리얼: 태그 기반으로 AWS 리소스 접근 권한 정의를 참고하세요. 다음 섹션의 정보를 사용해 IAM 사용자·역할에 태그를 붙이지 않고도 다른 AWS 리소스(IAM 리소스 포함)에 대한 접근을 제어할 수 있어요.
출처: 문서
본문
태그로 AWS 리소스 접근을 제어하기 전에, AWS가 어떻게 접근을 부여하는지 이해해야 해요. AWS는 리소스 모음으로 구성돼요. Amazon EC2 인스턴스는 리소스이고, Amazon S3 버킷은 리소스예요. AWS API, AWS CLI, 또는 AWS Management Console을 사용해 Amazon S3에 버킷 만들기 같은 작업을 수행할 수 있어요. 그렇게 하면 그 작업에 대한 요청을 보내요. 요청은 작업(action), 리소스, 프린시펄 엔터티(사용자·역할), 프린시펄 계정, 필요한 요청 정보를 지정해요. 이 모든 정보가 컨텍스트를 제공해요.
AWS는 프린시펄 엔터티가 인증(로그인)됐고, 지정된 리소스에 대해 지정된 작업을 수행할 권한(인가)이 있는지 확인해요. 인가 중에 AWS는 요청 컨텍스트에 적용되는 모든 정책을 확인해요. 대부분의 정책은 AWS에서 JSON 문서로 저장되며 프린시펄 엔터티의 권한을 지정해요. 정책 유형과 용도에 대한 자세한 내용은 AWS Identity and Access Management의 정책과 권한을 참고하세요.
AWS는 요청의 각 부분이 정책에 의해 허용되는 경우에만 요청을 인가해요. 이 과정의 다이어그램과 IAM 인프라에 대해 더 알아보려면 IAM 동작 방식을, IAM이 요청 허용 여부를 결정하는 방법에 대한 자세한 내용은 정책 평가 로직을 참고하세요.
태그는 리소스에 붙거나 태그를 지원하는 서비스에 대한 요청에서 전달될 수 있으므로 이 과정에서 또 다른 고려 사항이에요. 태그 기반 접근 제어를 하려면 정책의 condition 요소에 태그 정보를 제공해요. AWS 서비스가 태그로 접근 제어를 지원하는지 알아보려면 IAM과 함께 동작하는 AWS 서비스를 보고 ABAC 열에 예가 있는 서비스를 찾아보세요. 서비스 이름을 선택해 그 서비스의 인가·접근 제어 문서를 볼 수 있어요.
그런 다음 리소스의 태그에 기반해 그 리소스에 대한 접근을 허용하거나 거부하는 IAM 정책을 만들 수 있어요. 그 정책에서 다음 중 어떤 것이든 접근을 제어할 수 있어요.
- 리소스(Resource) — 그 리소스들의 태그를 기반으로 AWS 서비스 리소스에 대한 접근을 제어해요. 이렇게 하려면
aws:ResourceTag/key-name조건 키로 리소스에 붙은 태그를 기반으로 리소스 접근을 허용할지 결정해요. - 요청(Request) — 요청에서 전달할 수 있는 태그를 제어해요. 이렇게 하려면
aws:RequestTag/key-name조건 키로 AWS 리소스에 태그를 다는 요청에서 전달할 수 있는 태그 키-값 쌍을 지정해요. - 인가 과정의 어느 부분이든 —
aws:TagKeys조건 키로 특정 태그 키가 요청에 있을 수 있는지를 제어해요.
비주얼 에디터, JSON, 또는 기존 관리형 정책 가져오기를 통해 IAM 정책을 만들 수 있어요. 자세한 내용은 고객 관리형 정책으로 커스텀 IAM 권한 정의를 참고하세요.
참고
일부 서비스는 사용자가 리소스를 만드는 작업(action)을 사용할 권한이 있으면 리소스를 만들 때 태그를 지정하도록 허용해요.
AWS 리소스에 대한 접근 제어
IAM 정책의 조건을 사용해, 리소스의 태그를 기반으로 AWS 리소스에 대한 접근을 제어할 수 있어요. 전역 aws:ResourceTag/tag-key 조건 키나 서비스별 키로 이렇게 할 수 있어요. 일부 서비스는 전역 버전이 아닌 서비스별 버전만 지원해요.
경고
역할에 태그를 붙인 뒤 iam:PassRole 작업과 함께 정책에서 ResourceTag 조건 키를 사용해 역할을 전달할 수 있는 사람을 제어하려 하지 마세요. 이 방식은 신뢰할 수 있는 결과를 내지 못해요. 역할을 서비스에 전달하는 데 필요한 권한에 대한 자세한 내용은 사용자에게 역할을 AWS 서비스에 전달할 권한 부여를 참고하세요.
이 예시는 Amazon EC2 인스턴스를 시작·중지하도록 허용하는 아이덴티티 기반 정책을 만드는 방법을 보여줘요. 인스턴스 태그 Owner의 값이 사용자 이름인 경우에만 이 작업들이 허용돼요. 이 정책은 프로그래밍 방식과 콘솔 접근 모두에 권한을 정의해요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:StartInstances",
"ec2:StopInstances"
],
"Resource": "arn:aws:ec2:*:*:instance/*",
"Condition": {
"StringEquals": {
"aws:ResourceTag/Owner": "${aws:username}"
}
}
},
{
"Effect": "Allow",
"Action": "ec2:DescribeInstances",
"Resource": "*"
}
]
}
이 정책을 계정의 IAM 사용자에게 연결할 수 있어요. richard라는 사용자가 Amazon EC2 인스턴스를 시작하려 하면, 인스턴스가 Owner=richard 또는 owner=richard 태그가 있어야 해요. 그렇지 않으면 접근이 거부돼요. 조건 키 이름은 대소문자를 구분하지 않으므로 Owner 태그 키가 Owner와 owner 둘 다와 일치해요. 자세한 내용은 IAM JSON 정책 요소: Condition을 참고하세요.
이 예시는 리소스 ARN에서 team 프린시펄 태그를 사용하는 아이덴티티 기반 정책을 만드는 방법을 보여줘요. 이 정책은 Amazon Simple Queue Service 큐를 삭제할 권한을 부여하지만, 큐 이름이 팀 이름 뒤에 -queue를 붙인 것으로 시작할 때만 허용해요. 예를 들어 team 프린시펄 태그의 팀 이름이 qa라면 qa-queue예요.
{
"Version": "2012-10-17",
"Statement": {
"Sid": "AllQueueActions",
"Effect": "Allow",
"Action": "sqs:DeleteQueue",
"Resource": "arn:aws:sqs:us-east-2:111122223333:${aws:PrincipalTag/team}-queue"
}
}
AWS 요청 중 접근 제어
IAM 정책의 조건을 사용해, AWS 리소스에 태그를 적용하는 요청에서 전달할 수 있는 태그 키-값 쌍을 제어할 수 있어요.
이 예시는 Amazon EC2 CreateTags 작업을 사용해 인스턴스에 태그를 붙이는 것을 허용하는 아이덴티티 기반 정책을 만드는 방법을 보여줘요. 태그에 environment 키와 preprod 또는 production 값이 포함된 경우에만 태그를 붙일 수 있어요. 원하면 aws:TagKeys 조건 키와 함께 ForAllValues 수정자를 사용해 요청에 environment 키만 허용되도록 할 수 있어요. 이렇게 하면 사용자가 실수로 environment 대신 Environment를 사용하는 것처럼 다른 키를 포함하는 것을 막아요.
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "ec2:CreateTags",
"Resource": "arn:aws:ec2:*:*:instance/*",
"Condition": {
"StringEquals": {
"aws:RequestTag/environment": [
"preprod",
"production"
]
},
"ForAllValues:StringEquals": {
"aws:TagKeys": "environment"
}
}
}
}
태그 키 기반 접근 제어
IAM 정책의 조건을 사용해 특정 태그 키가 요청에서 사용될 수 있는지 제어할 수 있어요.
태그로 접근을 제어하는 데 정책을 사용할 때는 aws:TagKeys 조건 키를 사용하길 권장해요. 태그를 지원하는 AWS 서비스는 대소문자만 다른 여러 태그 키 이름을 만들 수 있게 허용할 수 있어요. 예를 들어 Amazon EC2 인스턴스에 stack=production과 Stack=test 태그를 다는 경우요. 키 이름은 정책 조건에서 대소문자를 구분하지 않아요. 즉 정책의 condition 요소에 "aws:ResourceTag/TagKey1": "Value1"을 지정하면 TagKey1 또는 tagkey1이라는 리소스 태그 키와 일치하지만 둘 다와는 일치하지 않아요. 대소문자만 다른 키를 가진 중복 태그를 막으려면 aws:TagKeys 조건으로 사용자가 적용할 수 있는 태그 키를 정의하거나, AWS Organizations에서 제공하는 태그 정책을 사용하세요. 자세한 내용은 AWS Organizations 사용자 가이드의 태그 정책을 참고하세요.
이 예시는 Secrets Manager 시크릿을 만들고 태그를 달지만, environment 또는 cost-center 태그 키로만 허용하는 아이덴티티 기반 정책을 만드는 방법을 보여줘요. Null 조건은 요청에 태그가 없으면 조건이 false로 평가되도록 보장해요.
{
"Effect": "Allow",
"Action": [
"secretsmanager:CreateSecret",
"secretsmanager:TagResource"
],
"Resource": "*",
"Condition": {
"Null": {
"aws:TagKeys": "false"
},
"ForAllValues:StringEquals": {
"aws:TagKeys": [
"environment",
"cost-center"
]
}
}
}
더 알아보기 (Learn more)
- 태그를 이용한 IAM 사용자·역할 접근 제어 — IAM 사용자·역할 태그로 접근을 제어하는 방법을 확인해 보세요.
- IAM 리소스 태그 지정 — IAM 리소스 태그의 전반적인 규칙을 살펴보세요.
- IAM 정책 요소: Condition — 조건 키 사용법을 참고하세요.