

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 다중 계정 아키텍처에 대한 권한 및 액세스 관리
<a name="managing-permissions"></a>

**Topics**
+ [엔지니어링 문화적 고려 사항](engineering-cultural-considerations.md)
+ [권한 세트 생성](creating-permission-sets.md)
+ [권한 경계 생성](creating-a-permissions-boundary.md)
+ [개인의 권한 관리](managing-permissions-for-individuals.md)

# 엔지니어링 문화적 고려 사항
<a name="engineering-cultural-considerations"></a>

 AWS Well-Architected 프레임워크의 원칙 중 하나는 운영 우수성입니다. 팀은 비즈니스 성과를 달성하는 데 있어 [운영 모델](https://docs.aws.amazon.com/wellarchitected/latest/operational-excellence-pillar/operating-model.html)과 역할을 이해해야 합니다. 팀은 맡은 책임을 이해하고, 주인의식을 갖고, 의사결정 방식을 파악하면 공동의 목표를 달성하는 데 집중할 수 있습니다.

빠르게 성장하고 있는 초기 단계의 회사에서는 팀원 모두가 여러 역할을 수행합니다. 이러한 사용자가 전체 AWS 계정에 대해 높은 액세스 권한을 갖는 것은 드문 일이 아닙니다. 회사가 성장함에 따라 **최소 권한의 원칙을 따르고 사용자가 업무를 수행하는 데 필요한 권한만 부여하려는 경우가 많습니다. 범위를 제한하는 데 도움이 되도록 [AWS Identity and Access Management Access Analyzer](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)를 사용하여 사용자 또는 IAM 역할이 실제로 사용하고 있는 권한을 확인하여 초과 권한을 제거할 수 있습니다.

회사에서 IAM 역할을 생성할 권한이 있는 사용자를 결정하는 것은 어려울 수 있습니다. 이는 일반적으로 권한 에스컬레이션의 원인입니다. 사용자가 자신의 권한이나 액세스 범위를 확장할 수 있는 경우 권한 에스컬레이션이 가능합니다. 예를 들어, 사용자가 제한된 권한을 가지고 있지만 새 IAM 역할을 생성할 수 있는 경우 `AdministratorAccess` 관리형 정책이 적용된 새 IAM 역할을 생성하고 수임하여 권한을 에스컬레이션할 수 있습니다.

일부 회사는 IAM 역할 프로비저닝을 신뢰할 수 있는 개인으로 구성된 중앙 팀으로 제한합니다. 이 접근 방식의 단점은 거의 모두 IAM 역할이 AWS 서비스 필요하기 때문에이 팀이 빠르게 병목 현상이 발생할 수 있다는 것입니다. 또는 [권한 경계](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)를 사용하여 클라우드 인프라를 개발, 테스트, 시작 및 관리하는 사용자에게만 IAM 액세스를 위임할 수 있습니다. 정책 예시는 [Example Permission Boundaries](https://github.com/aws-samples/example-permissions-boundary)(GitHub)를 참조하세요.

**플랫폼 팀이라고도 하는 개발 운영(DevOps) 팀은 여러 내부 개발 팀의 셀프 서비스 기능과 애플리케이션 운영 안정성을 조정해야 하는 경우가 많습니다. 업무 공간에서 자율성, 숙달, 목적을 포용하는 엔지니어링 문화를 조성하면 팀에 동기를 부여하는 데 도움이 될 수 있습니다. 엔지니어는 다른 사람에게 의존하지 않고 자기 주도적으로 작업하기를 원합니다. DevOps 팀이 셀프 서비스 솔루션을 구현할 수 있다면 다른 사람들이 작업을 완료하기 위해 DevOps 팀에 의존하는 시간도 줄어듭니다.

# 권한 세트 생성
<a name="creating-permission-sets"></a>

에서 [권한 세트를](https://docs.aws.amazon.com/singlesignon/latest/userguide/permissionsetsconcept.html) 사용하여 AWS 계정 액세스를 관리할 수 있습니다 AWS IAM Identity Center. **권한 세트는 하나 이상의 IAM 정책을 여러 AWS 계정에 배포하는 데 사용할 수 있는 템플릿입니다. AWS 계정에 권한 세트를 할당하면 IAM Identity Center는 IAM 역할을 생성하고 IAM 정책을 해당 역할에 연결합니다. 자세한 내용은 [Create and manage permission sets](https://docs.aws.amazon.com/singlesignon/latest/userguide/permissionsets.html)(IAM Identity Center 문서)를 참조하세요.

AWS 에서는 비즈니스의 다양한 페르소나에 매핑되는 권한 세트를 생성할 것을 권장합니다.

**Topics**
+ [결제 권한 세트](#billing-permission-set)
+ [개발자 권한 세트](#developer-permission-set)
+ [프로덕션 권한 세트](#production-permission-set)

다음 권한 세트는 AWS CloudFormation 템플릿의 코드 조각입니다. 이 코드를 시작점으로 사용하여 비즈니스에 맞게 사용자 지정의해야 합니다. CloudFormation 템플릿에 대한 자세한 내용은 [Learn template basics](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/gettingstarted.templatebasics.html)(CloudFormation 설명서)를 참조하세요.

## 결제 권한 세트
<a name="billing-permission-set"></a>

재무 팀은 **BillingAccessPermissionSet**를 사용하여 각 계정 AWS Cost Explorer 의 AWS Billing 콘솔 대시보드 및를 봅니다.

```
BillingAccessPermissionSet:
  Type: "AWS::SSO::PermissionSet"
  Properties:
    Description: Access to Billing and Cost Explorer
    InstanceArn: !Sub "arn:${AWS::Partition}:sso:::instance/ssoins-instanceId"
    ManagedPolicies:
      - !Sub "arn:${AWS::Partition}:iam::aws:policy/job-function/Billing"
    Name: BillingAccess
    SessionDuration: PT8H
    RelayStateType: https://console.aws.amazon.com/billing/home
```

## 개발자 권한 세트
<a name="developer-permission-set"></a>

엔지니어링 팀은 **DeveloperAccessPermissionSet**를 사용하여 비 프로덕션 계정에 액세스합니다.

```
DeveloperAccessPermissionSet:
  Type: "AWS::SSO::PermissionSet"
  Properties:
    Description: Access to provision resources through CloudFormation
    InlinePolicy: !Sub |-
      {
        "Version": "2012-10-17", 		 	 	 		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:${AWS::Partition}:iam::*:role/CloudFormationRole",
            "Condition": {
              "StringEquals": {
                "aws:ResourceAccount": "${!aws:PrincipalAccount}",
                "iam:PassedToService": "cloudformation.${AWS::URLSuffix}"
              }
            }
          },
          {
            "Effect": "Allow",
            "Action": [
              "cloudformation:ContinueUpdateRollback",
              "cloudformation:CreateChangeSet",
              "cloudformation:CreateStack",
              "cloudformation:DeleteStack",
              "cloudformation:RollbackStack",
              "cloudformation:UpdateStack"
            ],
            "Resource": "arn:${AWS::Partition}:cloudformation:*:*:stack/app-*",
            "Condition": {
              "ArnLike": {
                "cloudformation:RoleArn": "arn:${AWS::Partition}:iam::${!aws:PrincipalAccount}:role/CloudFormationRole"
              },
              "Null": {
                "cloudformation:ImportResourceTypes": true
              }
            }
          },
          {
            "Effect": "Allow",
            "Action": [
              "cloudformation:CancelUpdateStack",
              "cloudformation:DeleteChangeSet",
              "cloudformation:DetectStackDrift",
              "cloudformation:DetectStackResourceDrift",
              "cloudformation:ExecuteChangeSet",
              "cloudformation:TagResource",
              "cloudformation:UntagResource",
              "cloudformation:UpdateTerminationProtection"
            ],
            "Resource": "arn:${AWS::Partition}:cloudformation:*:*:stack/app-*"
          },
          {
           "Effect": "Allow",
            "Action": [
              "cloudformation:CreateUploadBucket",
              "cloudformation:ValidateTemplate",
              "cloudformation:EstimateTemplateCost"
            ],
            "Resource": "*"
          }
        ]
      }
    InstanceArn: !Sub "arn:${AWS::Partition}:sso:::instance/ssoins-instanceId"
    ManagedPolicies:
      - !Sub "arn:${AWS::Partition}:iam::aws:policy/AWSServiceCatalogEndUserFullAccess"
      - !Sub "arn:${AWS::Partition}:iam::aws:policy/AWSBillingReadOnlyAccess"
      - !Sub "arn:${AWS::Partition}:iam::aws:policy/AWSSupportAccess"
      - !Sub "arn:${AWS::Partition}:iam::aws:policy/ReadOnlyAccess"
    Name: DeveloperAccess
    SessionDuration: PT8H
```

## 프로덕션 권한 세트
<a name="production-permission-set"></a>

엔지니어링 팀은 **ProductionPermissionSet**를 사용하여 프로덕션 계정에 액세스합니다. 이 권한 세트에는 제한된 읽기 전용 액세스 권한이 있습니다.

```
ProductionPermissionSet:
  Type: "AWS::SSO::PermissionSet"
  Properties:
    Description: Access to production accounts
    InlinePolicy: !Sub |-
      {
        "Version": "2012-10-17", 		 	 	 		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:${AWS::Partition}:iam::*:role/CloudFormationRole",
            "Condition": {
              "StringEquals": {
                "aws:ResourceAccount": "${!aws:PrincipalAccount}",
                "iam:PassedToService": "cloudformation.${AWS::URLSuffix}"
              }
            }
          },
          {
            "Effect": "Allow",
            "Action": "cloudformation:ContinueUpdateRollback",
            "Resource": "arn:${AWS::Partition}:cloudformation:*:*:stack/app-*",
            "Condition": {
              "ArnLike": {
                "cloudformation:RoleArn": "arn:${AWS::Partition}:iam::${!aws:PrincipalAccount}:role/CloudFormationRole"
              }
            }
          },
          {
            "Effect": "Allow",
            "Action": "cloudformation:CancelUpdateStack",
            "Resource": "arn:${AWS::Partition}:cloudformation:*:*:stack/app-*"
          }
        ]
      }
    InstanceArn: !Sub "arn:${AWS::Partition}:sso:::instance/ssoins-instanceId"
    ManagedPolicies:
      - !Sub "arn:${AWS::Partition}:iam::aws:policy/AWSBillingReadOnlyAccess"
      - !Sub "arn:${AWS::Partition}:iam::aws:policy/AWSSupportAccess"
      - !Sub "arn:${AWS::Partition}:iam::aws:policy/job-function/ViewOnlyAccess"
    Name: ProductionAccess
    SessionDuration: PT2H
```

# 권한 경계 생성
<a name="creating-a-permissions-boundary"></a>

권한 세트를 배포한 후 권한 경계를 설정합니다. 이 *권한 경계*는 클라우드 인프라를 개발, 테스트, 시작 및 관리하는 사용자에게만 IAM 액세스를 위임하는 메커니즘입니다. 이러한 사용자는 정책과 권한 경계에서 허용하는 작업만 수행할 수 있습니다.

 AWS CloudFormation 템플릿에서 권한 경계를 정의한 다음 CloudFormation StackSets를 사용하여 템플릿을 여러 계정에 배포할 수 있습니다. 이렇게 하면 단일 작업으로 조직 전체에 표준화된 정책을 수립하고 유지할 수 있습니다. 자세한 내용과 지침은 [Working with AWS CloudFormation StackSets](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html)(CloudFormation 설명서)를 참조하세요.

다음 CloudFormation 템플릿은 IAM 역할을 프로비저닝하고 권한 경계 역할을 하는 IAM 정책을 생성합니다. 스택 세트를 사용하면 이 템플릿을 조직의 모든 멤버 계정에 배포할 수 있습니다.

```
CloudFormationRole:
  Type: "AWS::IAM::Role"
  Properties:
    AssumeRolePolicyDocument:
      Version: "2012-10-17"
      Statement:
        Effect: Allow
        Principal:
          Service: !Sub "cloudformation.${AWS::URLSuffix}"
        Action: "sts:AssumeRole"
        Condition:
          StringEquals:
            "aws:SourceAccount": !Ref "AWS::AccountId"
    Description: !Sub "DO NOT DELETE - Used by CloudFormation. Created by CloudFormation ${AWS::StackId}"
    ManagedPolicyArns:
      - !Sub "arn:${AWS::Partition}:iam::aws:policy/AdministratorAccess"
    PermissionsBoundary: !Ref DeveloperBoundary
    RoleName: CloudFormationRole

DeveloperBoundary:
  Type: "AWS::IAM::ManagedPolicy"
  Properties:
    Description: Permission boundary for developers
    ManagedPolicyName: PermissionsBoundary
    PolicyDocument:
      Version: "2012-10-17"
      Statement:
        - Sid: AllowModifyIamRolesWithBoundary
          Effect: Allow
          Action:
            - "iam:AttachRolePolicy"
            - "iam:CreateRole"
            - "iam:DeleteRolePolicy"
            - "iam:DetachRolePolicy"
            - "iam:PutRolePermissionsBoundary"
            - "iam:PutRolePolicy"
          Resource: !Sub "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/app/*"
          Condition:
            ArnEquals:
              "iam:PermissionsBoundary": !Sub "arn:${AWS::Partition}:iam::${AWS::AccountId}:policy/PermissionsBoundary"
        - Sid: AllowModifyIamRoles
          Effect: Allow
          Action:
            - "iam:DeleteRole"
            - "iam:TagRole"
            - "iam:UntagRole"
            - "iam:UpdateAssumeRolePolicy"
            - "iam:UpdateRole"
            - "iam:UpdateRoleDescription"
          Resource: !Sub "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/app/*"
        - Sid: OverlyPermissiveAllowedServices
          Effect: Allow
          Action:
            - "lambda:*"
            - "apigateway:*"
            - "events:*"
            - "s3:*"
            - "logs:*"
          Resource: "*"
```

**CloudFormationRole** 역할, **PermissionsBoundary** 정책 및 **DeveloperAccess** 권한 세트가 함께 작동하여 다음 권한을 부여합니다.
+ 사용자는 **ReadOnlyAccess** AWS 관리형 정책을 AWS 서비스통해 대부분의에 대한 읽기 전용 액세스 권한을 가집니다.
+ 사용자는 **AWSSupportAccess** AWS 관리형 정책을 통해 열린 지원 사례에 액세스할 수 있습니다.
+ 사용자는 **AWSBillingReadOnlyAccess** AWS 관리형 정책을 통해 AWS Billing 콘솔 대시보드에 대한 읽기 전용 액세스 권한을 가집니다.
+ 사용자는 **AWSServiceCatalogEndUserFullAccess** AWS 관리형 정책을 통해 Service Catalog에서 제품을 프로비저닝할 수 있습니다.
+ 사용자는 인라인 정책을 통해 모든 CloudFormation 템플릿의 비용을 검증하고 추정할 수 있습니다.
+ 사용자는 **CloudFormationRole** IAM 역할을 사용하여 **app/**로 시작하는 CloudFormation 스택을 생성, 업데이트 또는 삭제할 수 있습니다.
+ 사용자는 CloudFormation을 사용하여 **app/**로 시작하는 IAM 역할을 생성, 업데이트 또는 삭제할 수 있습니다. **PermissionsBoundary** IAM 정책은 사용자가 권한을 에스컬레이션하는 것을 방지합니다.
+ 사용자는 CloudFormation을 사용해야만 AWS Lambda Amazon EventBridge, Amazon CloudWatch, Amazon Simple Storage Service(Amazon S3) 및 Amazon API Gateway 리소스를 프로비저닝할 수 있습니다. CloudFormation

다음 이미지는 개발자와 같은 권한 있는 사용자가 이 가이드에 설명된 권한 세트, IAM 역할 및 권한 경계를 사용하여 멤버 계정에서 새 IAM 역할을 생성하는 방법을 보여줍니다.

1. 사용자가 IAM Identity Center에서 인증하고 **DeveloperAccess** IAM 역할을 수임합니다.

1. 사용자가 `cloudformation:CreateStack` 작업을 시작하고 **CloudFormationRole** IAM 역할을 수임합니다.

1. 사용자가 `iam:CreateRole` 작업을 시작하고 CloudFormation을 사용하여 새 IAM 역할을 생성합니다.

1. **PermissionsBoundary** IAM 정책이 새 IAM 역할에 적용됩니다.



![\[멤버 계정의 권한 경계가 적용되는 IAM 역할을 생성하는 사용자\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/transitioning-to-multiple-aws-accounts/images/2_create-iam-role.png)


**CloudFormationRole** 역할에는 [AdministratorAccess](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html#jf_administrator) 관리형 정책이 연결되어 있지만 **PermissionsBoundary** IAM 정책으로 인해 **CloudFormationRole** 역할의 유효 권한은 **PermissionsBoundary** 정책과 동일해집니다. **PermissionsBoundary** 정책은 `iam:CreateRole` 작업을 허용할 때 자체적으로 참조하므로 권한 경계가 적용된 경우에만 역할이 생성될 수 있습니다.

# 개인의 권한 관리
<a name="managing-permissions-for-individuals"></a>

권한 세트, 권한 경계 및 **CloudFormationRole** IAM 역할을 사용하여 개별 보안 주체에게 직접 할당해야 하는 권한의 양을 제한할 수 있습니다. 이를 통해 회사가 성장함에 따라 액세스를 관리하고 최소 권한을 부여하는 보안 모범 사례를 적용할 수 있습니다.

또한 사용자를 대신하여 리소스를 프로비저닝할 수 있도록 AWS 서비스에 권한을 부여하는 **서비스 연결 역할을 사용할 수도 있습니다. IAM 보안 주체(사용자, 사용자 그룹 또는 역할)에게 권한을 부여하는 대신 서비스에 권한을 부여할 수 있습니다. 예를 들어의 서비스 연결 역할을 [AWS Service Catalog](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html) 사용하면 IAM 보안 주체에 권한을 할당하지 않고도 자체 템플릿, 리소스 및 환경을 프로비저닝할 수 있습니다. 자세한 내용은 [AWS IAM으로 작업하는AWS 서비스](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)와 [서비스 연결 역할 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html)(IAM 설명서)을 참조하세요.

또 다른 모범 사례는 개인이 AWS Management Console에 액세스할 수 있는 양을 제한하는 것입니다. 콘솔에 대한 액세스를 제한함으로써 개인이 [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html), [HashiCorp Terraform](https://www.terraform.io/) 또는 [Pulumi](https://www.pulumi.com/)와 같은 코드형 인프라(IaC) 기술을 사용하여 리소스를 프로비저닝하도록 할 수 있습니다. IaC를 통해 인프라를 관리하면 시간 경과에 따른 리소스 변경 사항을 추적하고 GitHub 풀 요청과 같은 변경 사항을 승인하는 메커니즘을 도입할 수 있습니다.