AWS 策略:允许更新 route53 托管区域中的特定记录

AWS Policy: Allow update specific record in route53 hosted zone

假定文档,我应该使用策略,如下所示:

{
   "Version": "2017-11-27",
   "Statement":[
      {   
         "Effect":"Allow",
         "Action": [
           "route53:ChangeResourceRecordSets"
         ],  
         "Resource": [
          "arn:aws:route53:::hostedzone/<ZONE_ID>"
         ]
   ]   
}

我需要一个非常安全的政策。

我无法在 arn 中添加特定的资源记录集(区域中的一条记录)。 我可以使用 Condition 来检查应使用 ChangeResourceRecordSets API 调用更改哪些记录。如果我没记错的话。

这是自动更新 public 域区域中的一条记录所必需的。更新 _acme-challenge.ldap.example.com. 记录以自动更新 let's encrypt 证书。我知道 acme.sh 可以实现我的目标。但我想编写自己的自定义简单脚本来执行此操作。

I can use Condition to check what record should be changed with ChangeResourceRecordSets API call. If I'm not mistaken.

我相信你可能误会了。

Amazon Route 53 has no service-specific [condition] context keys that can be used in an IAM policy.

http://docs.aws.amazon.com/IAM/latest/UserGuide/list_route53.html

此外,global condition keys 的 none 似乎适用。

不过,我相信有一个解决方法。

为域 _acme-challenge.ldap.example.com 创建第二个 public 托管区域。我知道您可能在想 "but that's not a domain!" 但在相关意义上,它实际上仍然是一个域。

Route 53 将为这个新的托管区域分配 4 个新的名称服务器。记下这些服务器。

返回您的原始托管区域,为 _acme-challenge.ldap.example.com 创建类型 NS 的记录。您将用于创建此记录的值将是 Route 53 分配给新托管区域的 4 个名称服务器,每行一个。不要更改任一区域中的任何现有 NS 记录。

这称为委派 -- 您将此特定子域的权限委派给不同的托管区域,您会注意到自动分配了一组与处理您父域的服务器完全不同的 4 台 Route 53 服务器.

您现在可以在新托管区域的根目录中创建新记录,当您对 _acme-challenge.ldap.example.com 进行 DNS 查询时,返回的答案将是来自新托管区域的答案。

现在,您可以只授予您的脚本修改新区域中记录的权限,而它将无法修改父区域中的任何内容,因为您没有给它任何权限。

在允许使用脚本启动 EC2 实例以编程方式 add/remove 域的记录集的情况下,但安全地限制对特定记录的访问而不会损害 example.com。

创建另一个 public 托管区域(无需从任何人那里购买另一个域),只需使用 像 delegate.example.com 这样的子域。复制 AWS 分配给 delegate.example.com 的名称服务器,例如:

ns-1143.awsdns-14.org. 
ns-1686.awsdns-18.co.uk. 
ns-133.awsdns-16.com. 
ns-965.awsdns-56.net.

又比如创建的zone是ZONEABCD

创建域的目标是 instance-xxx.delegate.example.com 不伤害 example.com

在您的根 example.com 下的托管区域中创建一个 NS 类型的记录集。 并粘贴从 delegate.example.com.

复制的 4 个名称服务器

您可以创建附加以下策略的 IAM 用户(复制 accesskey/secretkey 脚本)。将资源限制为创建的 arn:aws:route53:::hostedzone/{ZONEABCD}.

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "route53:ChangeResourceRecordSets"
        ],
        "Resource": [
            "arn:aws:route53:::hostedzone/{ZONEABCD}"
        ]
    },
    {
        "Effect": "Allow",
        "Action": [
            "route53:ListHostedZonesByName"
        ],
        "Resource": [
            "*"
        ]
    }
]}

使用 aws-cli

启动名称为 instance-xxx 和 运行 脚本的虚拟机
$aws route53 change-resource-record-sets --cli-input-json '{
"HostedZoneId": "ZONEABCD",
"ChangeBatch": {
    "Comment": "This is a test and may be deleted.",
    "Changes": [
        {
            "Action": "CREATE",
            "ResourceRecordSet": {
                "Name": "instance-xxx.delegate.example.com",
                "Type": "A",
                "TTL": 600,
              "ResourceRecords": [
                {
                  "Value": "some.ip.v4.address"
                }
              ]
            }
        }
    ]
}}'

$nslookup instance-xxx.delegate.example.com 

为 instance-xxx.delegate 返回 {some.ip.v4.address}。example.com 证明上述方法有效。