

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 管理多账户架构的权限和访问权限
<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>

Well-Architect AWS ed 框架的支柱之一是卓越运营。团队必须明白[运营模式](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>

您可以使用中的[权限集来管理 AWS 账户 访问权限](https://docs.aws.amazon.com/singlesignon/latest/userguide/permissionsetsconcept.html) AWS IAM Identity Center。一个*权限集*是一个模板，可帮助您将一个或多个 IAM policy 部署到多个 AWS 账户。当您将权限集分配给 AWS 账户时，IAM Identity Center 会创建一个 IAM 角色，并将您的 IAM policy 附加到该角色。有关更多信息，请参阅[创建并管理权限集](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**权限集共同授予以下权限：
+ 通过**ReadOnlyAccess** AWS 托管策略 AWS 服务，用户对大多数内容具有只读访问权限。
+ 用户可以通过访问 AWS 管理策略**AWSSupport访问**未解决的支持案例。
+ 通过**AWSBillingReadOnlyAccess** AWS 托管策略，用户对 AWS Billing 控制台仪表板具有只读访问权限。
+ 用户可以通过**AWSServiceCatalogEndUserFullAccess** AWS 托管策略从 Service Catalog 中配置产品。
+ 用户可以通过内联策略验证和估算任何 CloudFormation 模板的成本。
+ 通过使用 **CloudFormationRole**IAM 角色，用户可以创建、更新或删除任何以 **app/** 开头的 CloudFormation 堆栈。
+ 用户可以使用 CloudFormation 创建、更新或删除以 **app/** 开头的 IAM 角色。I **PermissionsBoundary**AM 策略可防止用户升级其权限。
+ 用户只能通过使用来配置亚马逊 AWS Lambda、亚马逊 EventBridge CloudWatch、亚马逊简单存储服务 (Amazon S3) Simple Storage S3 和 Amazon API Gateway 资源。 CloudFormation

下图显示了授权用户（例如开发人员）如何使用本指南中介绍的权限集、IAM 角色和权限边界在成员账户中创建新的 IAM 角色：

1. 用户在 IAM 身份中心进行身份验证并担任 I **DeveloperAccess**AM 角色。

1. 用户启动`cloudformation:CreateStack`操作并担任 **CloudFormationRole**IAM 角色。

1. 用户启动`iam:CreateRole`操作并使用创建新 CloudFormation 的 IAM 角色。

1. I **PermissionsBoundary**AM 策略将应用于新的 IAM 角色。



![\[创建 IAM 角色的用户受成员账户中权限边界的约束\]](http://docs.aws.amazon.com/zh_cn/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) 技术（例如 [HashiCorp Terraform](https://www.terraform.io/) 或 Pulum [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)i）来配置资源。](https://www.pulumi.com/)通过 IaC 管理基础架构，您可以跟踪资源随时间推移而发生的变化，并引入批准变更的机制，例如 GitHub 拉取请求。