

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

# 将基于身份的策略（IAM 策略）用于 Amazon Route 53
<a name="access-control-managing-permissions"></a>

本主题提供了基于身份的策略的示例，这些示例展示了账户管理员如何将权限策略附加到 IAM 身份，从而授予对 Amazon Route 53 资源执行操作的权限。

**重要**  
我们建议您首先阅读一下介绍性主题，这些主题说明了管理对 Route 53 资源的访问的基本概念和选项。有关更多信息，请参阅 [管理 Amazon Route 53 资源的访问权限的概览](access-control-overview.md)。

**注意**  
授予访问权限时，托管区域和 Amazon VPC 必须属于相同分区。分区是一组 AWS 区域。每个分区的作用域 AWS 账户 仅限于一个分区。  
以下是支持的分区：  
`aws` - AWS 区域
`aws-cn` – 中国区域
`aws-us-gov` - AWS GovCloud (US) Region
有关更多信息，请参阅《*AWS 一般参考*》中的[访问管理](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)和 [Amazon Route 53 端点和限额](https://docs.aws.amazon.com/general/latest/gr/r53.html)。

**Topics**
+ [使用 Amazon Route 53 控制台所需的权限](#console-required-permissions)
+ [域记录所有者的权限示例](#example-permissions-record-owner)
+ [DNSSEC 签名所需的 Route 53 客户托管密钥权限](#KMS-key-policy-for-DNSSEC)
+ [客户管理型策略示例](#access-policy-examples-for-sdk-cli)

下面显示了一个示例权限策略。`Sid` 或语句 ID 是可选的：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid" : "AllowPublicHostedZonePermissions",
            "Effect": "Allow",
            "Action": [
                "route53:CreateHostedZone",
                "route53:UpdateHostedZoneComment",
                "route53:GetHostedZone",
                "route53:ListHostedZones",
                "route53:DeleteHostedZone",
                "route53:ChangeResourceRecordSets",
                "route53:ListResourceRecordSets",
                "route53:GetHostedZoneCount",
                "route53:ListHostedZonesByName"
            ],
            "Resource": "*"
        },
        {
         "Sid" : "AllowHealthCheckPermissions",
            "Effect": "Allow",
            "Action": [
                "route53:CreateHealthCheck",
                "route53:UpdateHealthCheck",
                "route53:GetHealthCheck",
                "route53:ListHealthChecks",
                "route53:DeleteHealthCheck",
                "route53:GetCheckerIpRanges",
                "route53:GetHealthCheckCount",
                "route53:GetHealthCheckStatus",
                "route53:GetHealthCheckLastFailureReason"
            ],
            "Resource": "*"
        }
    ]
}
```

------

该策略包含两条语句：
+ 第一条语句授予创建和管理公有托管区域及其记录所需的操作的权限。Amazon 资源名称 (ARN) 中的通配符 (\$1) 允许访问当前账户拥有的所有托管区域。 AWS 
+ 第二条语句授予创建和管理运行状况检查所需的全部操作的权限。

有关您为授予或拒绝使用每项操作的权限而指定的操作和 ARN 的列表，请参阅[Amazon Route 53 API 权限：操作、资源和条件参考](r53-api-permissions-ref.md)。

### 使用 Amazon Route 53 控制台所需的权限
<a name="console-required-permissions"></a>

要授予对 Amazon Route 53 控制台的完全访问权，您可以在以下权限策略中授予权限：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {
            "Effect":"Allow",
            "Action":[
                "route53:*", 
                "route53domains:*",
                "tag:*",
                "ssm:GetParametersByPath",
                "cloudfront:ListDistributions",
                "elasticloadbalancing:DescribeLoadBalancers",
                "elasticbeanstalk:DescribeEnvironments",
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation",
                "s3:GetBucketWebsite",
                "ec2:DescribeRegions",
                "ec2:DescribeVpcs",
                "ec2:CreateNetworkInterface",
                "ec2:CreateNetworkInterfacePermission",
                "ec2:DeleteNetworkInterface",
                "ec2:DescribeAvailabilityZones",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:ModifyNetworkInterfaceAttribute",
                "sns:ListTopics",
                "sns:ListSubscriptionsByTopic",
                "sns:CreateTopic",
                "kms:ListAliases",
                "kms:DescribeKey",
                "kms:CreateKey",
                "kms:CreateAlias",
                "kms:Sign",
                "cloudwatch:DescribeAlarms",
                "cloudwatch:PutMetricAlarm",
                "cloudwatch:DeleteAlarms",
                "cloudwatch:GetMetricStatistics"
            ],
            "Resource":"*"
        },
        {
            "Effect": "Allow",
            "Action": "apigateway:GET",
            "Resource": "arn:aws:apigateway:*::/domainnames"
        }
    ]
}
```

------

下面是需要权限的原因：

**`route53:*`**  
您可以执行*除以下操作之外*的所有 Route 53 操作：  
+ 创建和更新 Alias Targe **t 的值为 CloudFront 分配、Elastic Load Balancing 负载均衡器、Elastic Beanstalk 环境或 Amazon S3 存储桶的别名**记录。(通过这些权限，您可以创建其**别名目标**值为同一托管区域中的另一个记录的别名记录。)
+ 使用私有托管区域。
+ 使用域。
+ 创建、删除和查看 CloudWatch 警报。
+ 在 Route 53 控制台中呈现 CloudWatch 指标。

**`route53domains:*`**  
允许您使用域。  
如果您单独列出 `route53` 操作，则必须包含 `route53:CreateHostedZone` 才能使用域。注册域时，会同时创建一个托管区域，因此包括注册域权限的策略还需要创建托管区域的权限。
对于域注册，Route 53 不支持向单个资源授予或拒绝权限。

**`route53resolver:*`**  
允许您使用 Route 53 VPC 解析器。

**`ssm:GetParametersByPath`**  
允许您在创建新的别名记录、私有托管区和运行状况检查时获取公开可用的区域。

**`cloudfront:ListDistributions`**  
允许您创建和更新以 Alias Targe **t 的值为 CloudFront 分布的别名**记录。  
如果您未使用 Route 53 控制台，则不需要这些权限。Route 53 仅用它来获取要在控制台中显示的分配的列表。

**`elasticloadbalancing:DescribeLoadBalancers`**  
您可以创建和更新**别名目标**值为 ELB 负载均衡器的别名记录。  
如果您未使用 Route 53 控制台，则不需要这些权限。Route 53 仅用它来获取要在控制台中显示的负载均衡器的列表。

**`elasticbeanstalk:DescribeEnvironments`**  
可让您创建和更新 **Alias Target（别名目标）**值为 Elastic Beanstalk 环境的别名记录。  
如果您未使用 Route 53 控制台，则不需要这些权限。Route 53 仅用它来获取要在控制台中显示的环境的列表。

**`s3:ListAllMyBuckets`、`s3:GetBucketLocation` 和 `s3:GetBucketWebsite`**  
可让您创建和更新 **Alias Target（别名目标）**值为 Amazon S3 存储桶的别名记录。（只有将存储桶配置为网站终端节点时，才可以创建 Amazon S3 存储桶的别名；`s3:GetBucketWebsite` 用于获取所需的配置信息。）  
如果您未使用 Route 53 控制台，则不需要这些权限。Route 53 仅用它来获取要在控制台中显示的存储桶的列表。

**`ec2:DescribeVpcs` 和 `ec2:DescribeRegions`**  
允许您使用私有托管区域。

**所有列出的 `ec2` 权限**  
让你使用 Route 53 VPC 解析器。

**`sns:ListTopics`, `sns:ListSubscriptionsByTopic`, `sns:CreateTopic`, `cloudwatch:DescribeAlarms`, `cloudwatch:PutMetricAlarm`, `cloudwatch:DeleteAlarms`**  
允许您创建、删除和查看 CloudWatch 警报。

**`cloudwatch:GetMetricStatistics`**  
允许您创建 CloudWatch 指标运行状况检查。  
如果您未使用 Route 53 控制台，则不需要这些权限。Route 53 仅用它来获取要在控制台中显示的统计数据。

**`apigateway:GET`**  
可让您创建和更新 **Alias Target（别名目标）**值为 Amazon API Gateway API 的别名记录。  
如果您未使用 Route 53 控制台，则不需要此权限。Route 53 仅使用它来获取 APIs 要在控制台中显示的列表。

**`kms:*`**  
允许您使用 AWS KMS 来启用 DNSSEC 签名。

### 域记录所有者的权限示例
<a name="example-permissions-record-owner"></a>

使用资源记录集权限，您可以设置精细的权限，以限制 AWS 用户可以更新或修改的内容。有关更多信息，请参阅 [使用 IAM 策略条件进行精细访问控制](specifying-conditions-route53.md)。

在某些情况下，托管区域所有者可能负责托管区域的整体管理，而组织中的另一个人负责这些任务的子集。例如，启用 DNSSEC 签名的托管区域所有者可能想要创建一个 IAM 策略，其中包括允许其他人在托管区域中添加和删除资源集记录 (RRs) 以及其他任务。托管区域所有者选择为记录所有者或其他人员启用的特定权限将取决于其组织的策略。

以下是允许记录所有者修改流量策略和运行状况检查的 IAM 策略示例。 RRs不允许使用此策略的记录所有者执行区域级操作，例如创建或删除区域、启用或禁用查询日志记录、创建或删除可重用的委派集或更改 DNSSEC 设置。

```
{
      "Sid": "Do not allow zone-level modification ",
      "Effect": "Allow",
      "Action": [
        "route53:ChangeResourceRecordSets",
        "route53:CreateTrafficPolicy",
        "route53:DeleteTrafficPolicy",
        "route53:CreateTrafficPolicyInstance",
        "route53:CreateTrafficPolicyVersion",
        "route53:UpdateTrafficPolicyInstance",
        "route53:UpdateTrafficPolicyComment",
        "route53:DeleteTrafficPolicyInstance",
        "route53:CreateHealthCheck",
        "route53:UpdateHealthCheck",
        "route53:DeleteHealthCheck",
        "route53:List*",
        "route53:Get*"
      ],
      "Resource": [
        "*"
      ]
}
```

### DNSSEC 签名所需的 Route 53 客户托管密钥权限
<a name="KMS-key-policy-for-DNSSEC"></a>

当您为 Route 53 启用 DNSSEC 签名时，Route 53 会根据 () 中的客户托管密钥创建密钥签名密钥 (KSK)。 AWS Key Management Service AWS KMS您可以使用支持 DNSSEC 签名的现有客户托管密钥或创建一个新密钥。Route 53 必须具有访问您的客户托管密钥的权限，以便它能够为您创建 KSK。

要使 Route 53 能够访问您的客户托管密钥，请确保您的客户托管密钥策略包含以下语句：

```
{
            "Sid": "Allow Route 53 DNSSEC Service",
            "Effect": "Allow",
            "Principal": {
                "Service": "dnssec-route53.amazonaws.com"
            },
            "Action": ["kms:DescribeKey",
                       "kms:GetPublicKey",
                       "kms:Sign"],
            "Resource": "*"
        },
        {
            "Sid": "Allow Route 53 DNSSEC to CreateGrant",
            "Effect": "Allow",
            "Principal": {
                "Service": "dnssec-route53.amazonaws.com"
            },
            "Action": ["kms:CreateGrant"],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": true
                }
            }
        }
```

混淆代理问题是一个安全性问题，即不具有操作执行权限的实体可能会迫使具有更高权限的实体执行该操作。为了保护您 AWS KMS 免受其侵害，您可以选择通过提供`aws:SourceAccount`和`aws:SourceArn`条件的组合（两个或一个）来限制服务对基于资源的策略中的资源的权限。 `aws:SourceAccount`是托管区域所有者的 AWS 账户 ID。 `aws:SourceArn`是托管区域的 ARN。

以下是可添加的两个权限示例：

```
{
    "Sid": "Allow Route 53 DNSSEC Service",
    …
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "aws:SourceAccount": "111122223333"
        },
        "ArnEquals": {
            "aws:SourceArn": "arn:aws:route53:::hostedzone/HOSTED_ZONE_ID"
        }
    }
},
```

 - 或者 - 

```
{
    "Sid": "Allow Route 53 DNSSEC Service",
    …
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "aws:SourceAccount": ["1111-2222-3333","4444-5555-6666"]
        },
        "ArnLike": {
            "aws:SourceArn": "arn:aws:route53:::hostedzone/*"
        }
    }
},
```

有关更多信息，请参阅《IAM 用户指南》**中的[混淆代理人问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)。

### 客户管理型策略示例
<a name="access-policy-examples-for-sdk-cli"></a>

您可以创建自己的自定义 IAM 策略，以授予执行 Route 53 操作的相关权限。您可以将这些自定义策略附加到需要指定权限的 IAM 组。这些策略在您使用 Route 53 API AWS SDKs、或 AWS CLI 时起作用。以下示例显示了几个常见使用情形的权限。有关为用户授予 Route 53 的完全访问权限的策略，请参阅 [使用 Amazon Route 53 控制台所需的权限](#console-required-permissions)。

**Topics**
+ [示例 1：允许对所有托管区域进行读取访问](#access-policy-example-allow-read-hosted-zones)
+ [示例 2：允许创建和删除托管区域](#access-policy-example-allow-create-delete-hosted-zones)
+ [示例 3：允许完全访问所有域（仅限于公有托管区域）](#access-policy-example-allow-full-domain-access)
+ [示例 4：允许创建入站和出站 Route 53 VPC 解析器终端节点](#access-policy-example-create-resolver-endpoints)

#### 示例 1：允许对所有托管区域进行读取访问
<a name="access-policy-example-allow-read-hosted-zones"></a>

以下权限策略向用户授予列出所有托管区域并查看某一托管区域中的所有记录的权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {
            "Effect":"Allow",
            "Action":[
                "route53:GetHostedZone", 
                "route53:ListResourceRecordSets"
            ],
            "Resource":"*"
        },
        {
            "Effect":"Allow",
            "Action":["route53:ListHostedZones"],
            "Resource":"*"
        }
    ]
}
```

------

#### 示例 2：允许创建和删除托管区域
<a name="access-policy-example-allow-create-delete-hosted-zones"></a>

以下权限策略允许用户创建和删除托管区域并跟踪更改进度。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {
            "Effect":"Allow",
            "Action":["route53:CreateHostedZone"],
            "Resource":"*"
        },
        {
            "Effect":"Allow",
            "Action":["route53:DeleteHostedZone"],
            "Resource":"*"
        },
        {
            "Effect":"Allow",
            "Action":["route53:GetChange"],
            "Resource":"*"
        }
    ]
}
```

------

#### 示例 3：允许完全访问所有域（仅限于公有托管区域）
<a name="access-policy-example-allow-full-domain-access"></a>

以下权限策略允许用户执行与域注册有关的所有操作，包括注册域和创建托管区域的权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {
            "Effect":"Allow",
            "Action":[
                "route53domains:*",
                "route53:CreateHostedZone"
            ],
            "Resource":"*"
        }
    ]
}
```

------

注册域时，会同时创建一个托管区域，因此包括注册域权限的策略还需要创建托管区域的权限。（对于域注册，Route 53 不支持向单个资源授予权限。）

有关使用私有托管区域所需权限的信息，请参阅[使用 Amazon Route 53 控制台所需的权限](#console-required-permissions)。

#### 示例 4：允许创建入站和出站 Route 53 VPC 解析器终端节点
<a name="access-policy-example-create-resolver-endpoints"></a>

以下权限策略允许用户使用 Route 53 控制台创建 Resolver 入站和出站终端节点。

其中一些权限仅当在控制台中创建终端节点时才需要。如果您希望仅授予以编程方式创建入站和出站终端节点的权限，则可以省略上面这些权限：
+ `route53resolver:ListResolverEndpoints` 允许用户查看入站或出站终端节点列表，以便他们验证终端节点是否已创建。
+ 显示可用区列表时需要 `DescribeAvailabilityZones`。
+ `DescribeVpcs`是显示列表所必需的VPCs。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "route53resolver:CreateResolverEndpoint",
                "route53resolver:ListResolverEndpoints",
                "ec2:CreateNetworkInterface",
                "ec2:DescribeAvailabilityZones",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcs"
            ],
            "Resource": "*"
        }
    ]
}
```

------