IAM json 문법
- Effect
- enum: Allow | Deny
- 허용한다는 규칙인지, 불허한다는 규칙인지 구분
- Action
- string | Array
- 하나 혹은 여러 개의 Action을 지정할 수 있습니다.
- AWS 서비스에 사용되는 작업, 리소스 및 조건 키
- 각 서비스별로 고유의 서비스 접두사(예: DynamoDB는 dynamodb)가 있습니다.
- 위 설명서에서 각 서비스를 선택해서 들어가면 XX에서 정의한 작업이라는 단락에 작업 목록이 있습니다.
- Action은 (서비스 접두사):(작업) 형식으로 작성합니다.
- 예: dynamodb:DeleteItem, s3:GetObject 등
- Resource
- Statement의 주제가 되는 리소스를 한정(qualify)합니다.
- 서비스에 따라서 이렇게 해당 서비스에 속한 하부 리소스 단위까지 한정할 수 있습니다. (DynamoDB의 테이블 수준까지 한정
- 리소스를 특정할 수 없는 일부 서비스에서는, Resource를 비워두는 대신 *를 입력합니다.
{
"Effect": "Allow",
"Action": "dynamodb:*",
"Resource": "arn:aws:dynamodb:::table/musma"
}
- Principal
- object (Principal)
- 리소스 기반 정책에서, 보안 주체를 지정합니다.
- Sid
- string
- Statement ID
- 각 요소에 Unique ID를 붙이고 싶을 때 사용
IAM Policy 종류
다양한 유형이 존재하지만 가장 중요한 두가지 유형은 아래와 같다.
- 자격 증명 기반 정책(Id-Based Policy)
- 리소스 기반 정책(Resource-Based Policy)
완전한 정책의 참 의미
→ “(어떤 Principal이) (어떤 Condition을 만족할 때,) 어떤 Resource에 대해서 어떤 Action을 할 수 있게 허용/불허(Effect)한다.”
자격 증명 기반 정책(Id-Based Policy)
- 이 정책과 연결된 보안 주체는 어떤 대상에 대해 이러한 권한이 부여된다.
- 정책에 연결된 보안 주체(AWS 계정, IAM 사용자, 그룹, 역할 혹은 연합 인증된 사용자, Cognito User Identity 등이 될 수 있음)가 암묵적인 Principal이 된다.
- IAM 메뉴의 정책 리스트에 나오는 정책들은 모두 자격 증명 기반 정책이다.
AWS 관리형 정책 (AWS Managed Policy)
AWS 관리형 정책은 AWS에서 생성 및 관리하는 독립적인 정책입니다.
여기에서 독립적인 정책이란 정책 스스로 정책 이름이 포함된 Amazon 리소스 이름(ARN)을 갖고 있다는 것을 의미합니다.
AWS 에서 대부분 제공되는 정책입니다. AWS에서 제공되는 정책이므로 글로벌하게 적용됩니다.
예를 들어 arn:aws:iam::aws:policy/IAMReadOnlyAccess는 AWS 관리형 정책입니다.
고객 관리형 정책 (AWS Customer Managed Policy)
독립적인 정책은 사용자 자신의 AWS 계정에서 관리하도록 생성할 수도 있습니다.
이러한 정책을 고객 관리형 정책이라고 합니다. 이렇게 생성된 정책은 AWS 계정에 속한 다수의 보안 주체 엔터티에 추가할 수 있습니다.
정책을 보안 주체 엔터티에 추가할 경우 정책에서 정의한 권한까지 엔터티에게 부여하게 됩니다.
고객이 관리하는 정책을 생성하는 좋은 방법은 AWS에서 관리하는 기존의 정책을 복사하여 시작하는 것입니다.
이렇게 하면 시작 시 올바른 정책으로 시작하므로 해당 환경에 맞게 사용자 지정만 하면 됩니다. 고객 관리형 정책은 만들어진 Account에서만 사용할 수 있습니다.
리소스 기반 정책(Resource-Based Policy)
- 객체(대상)을 중심으로 생각
- 이 대상에 대해 이러이러한 권한이 누구누구누구에게 부여된다.
- AWS 서비스 중 일부 서비스에서 사용된다.
- 리소스 기반 정책을 사용하는 서비스 중에서 대표적으로 S3가 있다.
{
"Principal": { # ARN에서 (AWS 리전 이름), (AWS 계정)은 암묵적으로 생략되었다.
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E36E6CTWWW86E5"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mcas.musma.net/*"
}
"arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E36E6CTWWW86E5"
- CloudFront는 글로벌 서비스이므로 리전 구분이 없다.
- 서비스 식별자가 iam이다.
- (AWS 계정)이 들어갈 자리에 cloudfront 라고 되어있다.
- 특별히 예약된 규칙으로 CloudFront를 위해 별도의 보안 주체를 관리하는 리소스 그룹(user)가 있다는 것을 말해준다.
- S3에 접근하는 E36E6CTWWW86E5라는 CloudFront 전용 보안 주체를 가리킨다.
arn:aws:s3:::mcas.musma.net/*
- 서비스 식별자가 s3
- S3의 경우 리소스 한정자는 곧 버킷을 나타냅니다.
- 리소스 한정자 사용되는 리소스 그룹은 서비스 마다 다릅니다.
- AWS 서비스에 사용되는 작업, 리소스 및 조건 키
- 여기서 각 서비스 아래 ‘XX에서 정의한 리소스’ 항목을 보면 해당 서비스에서 사용할 수 있는 리소스 그룹(유형)이 나옵니다.
- mcas.musma.net 버킷에 있는 모든 오브젝트를 가리킵니다.
정리해보자면,
S3 버킷 mcas.musma.net에 업로드된 모든 오브젝트를 읽을 권한(s3:GetObject)를 CloudFront Origin Access Identity E36E6CTWWW86E5에 부여한다.
정책 유형 요약 비교
자격증명-기반 정책(Id-Based Policy) | 리소스-기반 정책(Resource-Based Policy) | |
---|---|---|
연결 대상 | 사용자, 그룹, 역할 등 보안주체(Principal)가 될 수 있는 대상 |
리소스 |
의미 | ( 이 정책이 연결된 보안주체는 ) ( 특정 조건(Condition) 하에 ) 이 리소스(Resource)에 대한 특정 행동(Action)을 허용/불허(Effect) |
( 특정 조건(Condtion)하에 ) 이 리소스(Resource)에 대한 특정 행동(Action)을 특정 보안주체(들)(Principal)에게 허용/불허(Effect) |
특징1 | Principal 속성이 안 들어감 | Principal 속성이 들어감 |
특징2 | IAM Policy 메뉴에서 관리 (혹은 IAM Role에 인라인으로) |
일부 AWS 서비스의 리소스에서 자체 관리 (대표적으로 S3, SQS 등) |
특징3 | 모든 AWS 서비스에 연관 | 일부 공유 자원 성격을 가진 서비스에서 사용 (대표적으로 S3, SQS 등) |
data "aws_iam_policy_document" "assume_role_from_ec2_svc" {
statement {
effect = "Allow"
actions = ["sts:AssumeRole"]
principals {
type = "Service"
identifiers = ["ec2.amazonaws.com"]
}
}
}
resource "aws_iam_role" "ec2_default" {
name = "${var.name_prefix}-ec2-default"
assume_role_policy = data.aws_iam_policy_document.assume_role_from_ec2_svc.json
}
- aws_iam_policy_document : 사용할 policy를 정의한다.
- aws_iam_policy : policy을 연결한다.
- aws_iam_role_policy_attachment : role에 policy를 연결한다.
- aws_iam_role : 사용 주체에 연결할 role을 정의한다.
- aws_iam_instance_profile : iam role을 위한 컨테이너로서 인스턴스 시작시 EC2 인스턴스에 역할 정보를 전달하는데 사용된다.
- assume_role_policy : entity에 역할을 assume 할 수 있는 권한을 부여하는 정책이다.
'Public Cloud > AWS' 카테고리의 다른 글
AWS Backup 실습 (1) | 2023.09.18 |
---|---|
CloudWatch (0) | 2023.02.08 |
Console에서 ElasticCache Redis 생성해보기 (0) | 2023.01.20 |
[AWS] NACL과 Security Group의 차이 (2) | 2022.04.26 |
[AWS] EFS(Elastic File System) 사용법 (0) | 2022.04.22 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!