

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 管理多帳戶架構的許可和存取
<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 Framework 的其中一個支柱是卓越營運。團隊必須了解[運作模式](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 角色佈建限制給由受信任的個人組成的集中式團隊。此方法的缺點是，此團隊可以快速成為瓶頸，因為幾乎全部 AWS 服務 都需要 IAM 角色才能操作。作為替代方案，您可以使用[許可界限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)，將 IAM 存取權僅委派給正在開發、測試、啟動和管理雲端基礎設施的使用者。如需政策範例，請參閱[許可界限範例](https://github.com/aws-samples/example-permissions-boundary) (GitHub)。

開發營運 (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 政策附接到該角色。如需詳細資訊，請參閱[建立和管理許可集](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 範本的詳細資訊，請參閱[了解範本基本知識](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/gettingstarted.templatebasics.html) (CloudFormation 文件)。

## 帳單許可集
<a name="billing-permission-set"></a>

財務團隊使用 **BillingAccessPermissionSet** 來檢視 AWS Billing 主控台儀表板和每個帳戶中 AWS Cost Explorer 的 。

```
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 將範本部署到多個帳戶。這可協助您透過單一操作在整個組織中建立和維護標準化政策。如需詳細資訊和指示，請參閱[使用 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** 許可集共同運作以授與下列許可：
+ 使用者 AWS 服務可透過 **ReadOnlyAccess** 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 資源。

下圖顯示了授權使用者 (例如開發人員) 如何使用本指南中所描述的許可集、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/zh_tw/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 主體。如需詳細資訊，請參閱[可搭配 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 管理主控台的存取量。透過限制主控台的存取權，您可以要求個人使用基礎設施即程式碼 (IaC) 技術來佈建資源，例如 [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)、[HashiCorp Terraform](https://www.terraform.io/) 或 [Pulumi](https://www.pulumi.com/)。透過 IaC 來管理基礎設施可以追蹤一段時間內資源的變更，並引入核准變更的機制，例如 GitHub 提取請求。