본문 바로가기
AWS/Study

[AWS] Service Control Policies

by okms1017 2023. 4. 12.
728x90

1. 개념

 
조직 내 멤버 계정에서 사용자 또는 역할이 사용할 수 있는 서비스와 작업을 지정하는 정책  
 
 

2. 특징 

 
1) 허용 또는 차단 리스트를 정의할 수 있다
2) OU 또는 계정(관리용 계정 제외)에 적용할 수 있다. 
3) 루트 사용자를 포함하여 계정 내 모든 사용자와 역할에 직접 적용할 수 있다. 
4) Service-linked Role 에는 적용할 수 없다. 
5) 기본적으로 모든 것을 차단하므로 명시적으로 허용해야 한다. 
6) 특정 서비스에만 접근하는 것을 제한할 수 있다. 
 
※ Service-linked Role 이란 서비스에 직접 연결된 역할로 다른 서비스를 호출하기 위한 권한을 포함한다.
 
 

3. 계층 구조 

 

SCP Hierarchy

ㅇ Management Account
      - SCP 정책이 적용되지 않으므로 조직 내 모든 권한을 가진다. 
      - DenyAccessAthena SCP 는 효력이 없다. 
 
ㅇ Account A
      - 최상위 수준의 FullAWSAccess SCP 정책을 상속받으므로 조직 내 모든 권한을 가진다. 
      - OU A 수준의 DenyRedshift SCP 정책을 상속받아 Redshift 서비스 접근이 제한된다. 
      - 계정 A에 AuthorizedRedshift SCP 정책을 직접 적용하여도 상속받은 정책에 따라 Redshift 서비스에 접근할 수 없다. 
 
ㅇ Account B
      - 최상위 수준의 FullAWSAccess SCP 정책을 상속받으므로 조직 내 모든 권한을 가진다. 
      - OU A 수준의 DenyRedshift SCP 정책을 상속받아 Redshift 서비스 접근이 제한된다. 
      - OU B 수준의 DenyAWSLambda SCP 정책을 상속받아 Lambda 서비스 접근이 제한된다. 
 
ㅇ Account C
      - 최상위 수준의 FullAWSAccess SCP 정책을 상속받으므로 조직 내 모든 권한을 가진다. 
      - OU A 수준의 DenyRedshift SCP 정책을 상속받아 Redshift 서비스 접근이 제한된다. 
 
 

4. 구문 

 
1) SCP_1 : DynamoDB 서비스를 제외한 모든 작업(Action)을 허용한다. 
 

# SCP_1
{
	"Version": "2023-04-13",
        "Statement": [
        	{
            	"Sid": "AllowsAllActions",
                "Effect": "Allow",
                "Action": "*",
                "Resource": "*"
            },
            {
            	"Sid": "DenyDynamoDB",
                "Effect": "Deny",
                "Action": "dynamodb:*",
                "Resource": "*"
            }
        ]
}

 
2) SCP_2 : EC2 와 Cloudwatch 서비스에 대한 작업(Action)만 허용한다. 
 

# SCP_2
{
	"Version": "2023-04-13",
        "Statement": [
        	{
                "Effect": "Allow",
                "Action": [
                	"ec2:*",
                	"cloudwatch:*"
            	],
            	"Resource": "*"
            }
        ]
}

 
 
 

5. IAM Policy Evaluation Logic
 

1) Deny evaluation
- 명시적 거부가 존재한다면 자동으로 거부한다.  
 
2) Organizations SCPs
- 조직의 SCP 에 명시적 허용이 존재하지 않으면 묵시적으로 거부한다. 
- 허용이 존재하면 다음 단계(Resource-based policies)로 넘어간다. 
 
3) Resource-based policies
- S3 버킷, SQS 등 리소스에 적용하는 리소스 기반 정책이다. 
- 허용이 존재하면 허용하고, 허용이 존재하지 않으면 다음 단계(Identity-based policies)로 넘어간다.  
 
4) Identity-based policies
- 허용이 존재하지 않으면 묵시적으로 거부한다. 
- 허용이 존재하면 다음 단계(IAM permissions boundaries)로 넘어간다. 
 
5) IAM permissions boundaries
- 허용이 존재하지 않으면 묵시적으로 거부한다. 
- 허용이 존재하면 다음 단계(Final decision 또는 Session policies)로 넘어간다. 
 
6) Session policies 
- STS 서비스와 연관이 있다. 
- Session principal 에 해당하지 않으면 허용한다. 
- Session principal 에 해당하면 Session policy 인지 여부를 확인한다. 
- Session policy 에 허용이 존재하면 허용하고, 허용이 존재하지 않으면 묵시적으로 거부한다. 
- Session policy 에 해당하지 않으면 Role Session 인지 여부를 확인한다.
- Role Session 에 해당하면 허용하고, 해당하지 않으면 묵시적으로 거부한다. 
 
 

6. Resource Tag 

 
1) AWS 리소스에 특정 태그(aws:TagKeys)를 달아 제한할 수 있다. 
2) IAM 정책에 있는 태그 키와 리소스에 달려있는 태그를 비교하여 유효성을 검사할 수 있다. 
 
ex1) TagKeys 예시 - EBS 생성하기 
 
ForAllValues : 태그명에 "Env" 와 "CostCenter" 가 모두 포함되어 있는 경우 EBS 볼륨을 생성할 수 있다. 
 

# Tags_1
{
	"Version": "2023-04-13",
    	"Statement": [
    		{
        		"Effect": "Allow",
           	 	"Action": "ec2:CreateVolume",
           	 	"Resource": "arn:aws:ec2:*:*:volume/*",
           	 	"Condition": {
            		"ForAllValues:StringEquals": {
             	   		"aws:TagKeys": ["Env", "CostCenter"]
           	     	}
        	    }
     	   	}
   	]
}

 
ex2) TagKeys 예시 - EBS 생성하기 
 
ForAnyValues : 태그명에 "Env" 또는 "CostCenter" 둘 중에 하나라도 포함된 경우 EBS 볼륨을 생성할 수 있다. 
 

# Tags_2
{
	"Version": "2023-04-13",
    	"Statement": [
    		{
        		"Effect": "Allow",
           	 	"Action": "ec2:CreateVolume",
           	 	"Resource": "arn:aws:ec2:*:*:volume/*",
           	 	"Condition": {
            		"ForAnyValues:StringEquals": {
             	   		"aws:TagKeys": ["Env", "CostCenter"]
           	     	}
        	    }
     	   	}
   	]
}

 
 ex3) TagKeys 예시 - 리소스 생성 제한하기 
 
태그명에 "Project" 와 "CostCenter" 가 포함되어 있지 않으면 EC2 인스턴스를 생성할 수 없다. 
 

# Tags_3
{
	"Version": "2023-04-13",
    	"Statement": [
    		{
        		"Sid": "DenyRunInstanceWithNoProjectTag"
                	"Effect": "Deny",
           	 	"Action": "ec2:RunInstances",
           	 	"Resource": ["arn:aws:ec2:*:*:instance/*", "arn:aws:ec2:*:*:volume/*"],
           	 	"Condition": {
            			"Null": {
                    			"aws:RequestTag/Project": "true"
           	     	}
        	    }
     	   	},
            	{
        		"Sid": "DenyRunInstanceWithNoCostCenterTag"
                	"Effect": "Deny",
           	 	"Action": "ec2:RunInstances",
           	 	"Resource": ["arn:aws:ec2:*:*:instance/*", "arn:aws:ec2:*:*:volume/*"],
           	 	"Condition": {
            			"Null": {
                    			"aws:RequestTag/CostCenter": "true"
           	     	}
        	    }
     	   	}
   	]
}

 
ex4) TagKeys 예시 - 특정 리전에서 작업 거부하기  
 
요청하는 리전이 "eu-central-1" 또는 "eu-west-1" 에 해당하는 경우
그리고 ARN이 "arn:aws:iam::*:role/Role1" 또는 "arn:aws:iam::*:role/Role2" 에 해당하지 않는 경우,
EC2 인스턴스, RDS, DynamoDB 에서의 작업을 모두 거부한다. 
 

# Tags_4
{
	"Version": "2023-04-13",
    	"Statement": [
    		{
        		"Effect": "Deny",
           	 	"Action": ["ec2:*, "rds:*", "dynamodb:*"],
           	 	"Resource": "*",
           	 	"Condition": {
            			"StringEquals": {
             	   			"aws:RequestedRegion": ["eu-central-1", "eu-west-1"]
           	     		},
				"ArnNotLike": {
             	   			"aws:PrincipalARN": [
                        			"arn:aws:iam::*:role/Role1",
                            			"arn:aws:iam::*:role/Role2"
                       	 		]
           	     		}
        	    	}
     	   	}
   	]
}

※ SCP를 사용하여 특정 리전에서 또는 특정 리전으로부터 멤버 계정을 제한할 수 있다. 
 
 

7. Tag Policy
 

1) 태그 정책(Tag Policy)은 조직(Organization) 수준에서 정의되며, 조직의 모든 리소스에서 사용하는 태그를 표준화한다. 
2) 리소스 태그를 확인하고 적절하게 분류하는데 유용하다. 
3) 태그 키와 허용 값을 정의하면 비용할당 태그나 속성, 접근제어를 적용할때 유용하다. 
4) 규정을 준수하지 않는 태그들은 서비스와 리소스 작업 요청을 방지한다.  
5) 규정을 준수하지 않은 태그와 리소스들의 목록을 보고서 형식으로 출력할 수 있다. 
6) EventBridge 서비스를 이용하여 규정을 준수하지 않은 태그들을 확인할 수 있다. 
 
ex) 사용 예시 
 
Secrets Manager 서비스에서의 태깅 표준은 태그명으로 "CostCenter", 태그값으로 "100" 또는 "200"이 와야 한다. 
 

# Tag Policy
{
	"tags": {
    		"costcenter": {
        		"tag_key": {
            			"@@assign": "CostCenter"
            		},
            		"tag_value": {
            			"@@assign": ["100", "200"]
            		},
           		"enforced_for": {
				"@@assign": ["secretsmanager:*"]            
           		}
       		 }
    	}
}

 
 
 

8. AI Services Opt-out Policy

 
1) AWS에서는 AI/ML 서비스를 향상시키기 위한 목적으로 Amazon LEX, Amazon Comprehend, Amazon Poly 등의 서비스에서 사용자가 발생시키는 컨텐츠(데이터)를 지속적으로 추적하여 사용하고 있다. 
 
사용자는 모든 리전과 모든 멤버 계정에 Opt-out 정책을 생성하여 적용함으로써 개인의 컨텐츠가 저장되고 사용되는 것을 방지할 수 있다. 
 
2) Opt-out 정책은 Organization Root, OU, 멤버 계정 수준에 적용할 수 있다. 
 
ex1) 모든 AI 서비스에 Opt-out 정책 적용하기 
 

# Opt-out_1
{
	"services": {
    		"default": {
        		     "opt_out_policy": {
                     		"@@assign": "optOut"
           		   }
       		 }
    	}
}

 
ex2)  Rekognition 과 Lex 서비스에만 Opt-out 정책 적용하기 
 

# Opt-out_2
{
	"services": {
    		"rekognition": {
        		     "opt_out_policy": {
                     		"@@assign": "optOut"
           		     }
       		 },
             	"lex": {
        		     "opt_out_policy": {
                     		"@@assign": "optOut"
           		     }
       		}
    	}
}

 
 

9. Backup Policy 
 

1) AWS 리소스를 백업하기 위한 계획을 세우기 위해 사용한다. 
2) JSON 형식으로 작성되며, 조직(Organization) 수준에서 정의된다. 
3) 빈도수(frequency), 백업시간, 리전 등 세부적인 항목들을 설정할 수 있다.  
4) 백업 정책은 Organization Root, OU, 멤버 계정 수준에 적용할 수 있다. 
 
ex) 사용 예시 
 
아래 정책은 멤버 계정에서 읽기 전용으로 보기만 가능한 수정 불가한 백업 계획이다. 
관리용 계정에서 수정할 수 있다. 
 

# backup_policy
{
	"plans": {
    		"PII_Backup_Plan": {
        		"region": {
               			"@@assign": ["us-east-1"]
           		 },
             		"rules": {
        		     "My_Hourly_Rule": {
                     		"schedule_expression": {"@@assign": "cron(0 5 7 * * *"},
                            	"start_backup_window_minutes": {"@@assign: "60"},
                            	"complete_backup_window_minutes": {"@@assign": "604800"},
                            	"enable_continuous_backup": {"@@assign": false},
                            	"target_backup_vault_name": {"@@assign": "My_Backup_Vault"},
                            	"lifecycle": {
                            		"move_to_cold_storage_after_days": {"@@assign": "180"},
                                	"delete_after_days": {"@@assign": "270"}
                            	}
           		     }
            		}
       		}
    	}
}

 
 
 


 [출처]
1) Udemy 강의, "Ultimate AWS Certified Solutions Architect Professional 2023", https://www.udemy.com/course/aws-solutions-architect-professional

2) https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html

 

Policy evaluation logic - AWS Identity and Access Management

Policy evaluation logic When a principal tries to use the AWS Management Console, the AWS API, or the AWS CLI, that principal sends a request to AWS. When an AWS service receives the request, AWS completes several steps to determine whether to allow or den

docs.aws.amazon.com

728x90

'AWS > Study' 카테고리의 다른 글

[AWS] Control Tower  (0) 2023.04.25
[AWS] IAM Identity Center  (0) 2023.04.14
[AWS] Organizations  (0) 2023.04.10
[AWS] Directory Service  (0) 2023.04.07
[AWS] Identity Federation  (0) 2023.04.05