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 证明上述方法有效。
假定文档,我应该使用策略,如下所示:
{
"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 类型的记录集。
您可以创建附加以下策略的 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 证明上述方法有效。