本页面介绍了如何为同一项目下的不同代管区域设置特定的读取、写入或管理员 Identity and Access Management (IAM) 权限。
如需详细了解 IAM 政策,请参阅了解允许政策。如需了解 IAM 政策 API,请参阅 Policy。 如需了解如何创建可在托管区域使用的 IAM 自定义角色,请参阅了解 IAM 自定义角色。
此过程假定您已在项目中创建代管区域。如需了解如何创建托管区域,请参阅创建、修改和删除区域。
为托管式区域设置 IAM 政策
如需对特定托管区域设置 IAM 政策,请按照以下步骤操作。
控制台
在 Google Cloud 控制台中,前往 Cloud DNS 区域页面。
选择要为其添加访问权限控制权限的一个或多个区域。
在资源权限页面上,点击添加主账号。
在授予对资源的访问权限页面上的新建主账号下,添加您希望添加为新主账号的用户、群组、网域或服务账号的电子邮件地址。
从分配角色列表中,选择要分配给主账号的角色。
如需分配更多角色,请点击添加其他角色。
点击保存。
gcloud
运行 gcloud dns managed-zones set-iam-policy 命令:
gcloud dns managed-zones set-iam-policy NAME \ --policy-file=POLICY-FILE
替换以下内容:
NAME:要为其设置 IAM 权限的代管区域的名称POLICY-FILE:包含您要为代管区域指定的 IAM 政策的文件。如需查看政策文件示例,请参阅政策。
如果此命令成功运行,则会返回 IAM 政策。否则,将返回指定具体错误的错误消息。
API
使用 managedZone.setIamPolicy 方法发送 POST 请求:
POST https://dns.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones/MANAGED_ZONE:setIamPolicy
替换以下内容:
PROJECT_ID:项目的名称或 IDMANAGED_ZONE:要为其设置 IAM 权限的代管区域的名称
如需详细了解此 API 调用,请参阅 IAM Policy API 页面上的绑定。
授予对特定资源记录集的访问权限
Cloud DNS 支持使用 IAM 条件为托管区域内的特定资源记录集 (RRset) 提供精细的访问权限控制。
您可以使用以下方法之一配置精细的访问权限控制:
- 标准角色(推荐):使用标准
roles/dns.admin角色,并添加特定的 IAM 条件,以允许必要的非记录集操作。这是最简单的方法,因为它不需要创建自定义角色。 - 自定义角色:创建两个自定义角色,以将记录集管理与其他管理任务分开。
方法 1:标准角色(推荐)
如需使用标准 roles/dns.admin 角色,您必须在 IAM 条件中添加其他资源。这是因为,如需成功修改 DNS 记录,主账号必须有权执行记录修改本身以及对 Change 资源的相关操作。
您可以根据自己的安全要求选择以下条件结构之一:
- 宽松:允许所有其他 DNS 管理操作。如果互补角色包含所有其他标准管理权限,则此方法与自定义角色方法等效。
none (resource.type == 'dns.googleapis.com/ResourceRecordSet' && <RRSET_CONDITION>) || (resource.type != 'dns.googleapis.com/ResourceRecordSet') - 限制性:仅允许对更改资源进行记录集修改和操作。其他管理操作(包括列出记录集 [
dns.resourceRecordSets.list] 和描述托管区域)会被阻止。none (resource.type == 'dns.googleapis.com/ResourceRecordSet' && <RRSET_CONDITION>) || (resource.type == 'dns.googleapis.com/Change')
将 <RRSET_CONDITION> 替换为您的具体访问要求(请参阅条件示例)。
如需授予权限,请执行以下操作:
1. 向托管地区中的主账号分配 roles/dns.admin 角色。
- 向绑定添加条件(许可型或限制型)。
方法 2:自定义角色
如果您不想使用复杂的条件,可以创建自定义角色来分离权限。
前提条件:创建自定义角色
创建包含以下权限的记录集管理角色(例如
DnsRecordSetAdmin):dns.resourceRecordSets.createdns.resourceRecordSets.deletedns.resourceRecordSets.getdns.resourceRecordSets.update
创建一个补充角色(例如
DnsNonRecordSetAdmin),其中包含标准roles/dns.admin角色的所有剩余权限。这些额外的权限(例如dns.changes.create和dns.managedZones.get)对于区域的整体管理是必需的,并且在修改记录时需要满足前提条件检查。
授予权限
为确保条件政策按预期运行,您必须按如下方式向正文授予这些角色:
- 无条件授予互补角色:将包含剩余管理权限(例如
DnsNonRecordSetAdmin)的角色无条件分配给受管区域中的正文 。 - 有条件地授予记录集管理角色:根据您的具体访问权限要求,有条件地向正文分配包含记录集权限(例如
DnsRecordSetAdmin)的角色。
示例条件
以下示例展示了如何使用 resource.name 和 resource.type 属性限制访问权限。
如果您使用方法 1(标准角色),则必须在这些表达式中附加相应的非记录集子句(例如 || (resource.type != 'dns.googleapis.com/ResourceRecordSet'))。
完全记录匹配:授予仅管理
api.example.com.的 A 记录的权限。- 自定义角色 / 原始条件:
none (resource.type == 'dns.googleapis.com/ResourceRecordSet' && resource.name.endsWith('/rrsets/api.example.com./A')) - 标准角色(宽松):
none (resource.type == 'dns.googleapis.com/ResourceRecordSet' && resource.name.endsWith('/rrsets/api.example.com./A')) || (resource.type != 'dns.googleapis.com/ResourceRecordSet') - 标准角色(限制性):
none (resource.type == 'dns.googleapis.com/ResourceRecordSet' && resource.name.endsWith('/rrsets/api.example.com./A')) || (resource.type == 'dns.googleapis.com/Change')
- 自定义角色 / 原始条件:
子网域委派:授予管理
p.example.com.子网域内所有记录的权限。- 自定义角色 / 原始条件:
none (resource.type == 'dns.googleapis.com/ResourceRecordSet' && resource.name.extract('/rrsets/{name}/').endsWith('.p.example.com.')) - 标准角色(宽松):
none (resource.type == 'dns.googleapis.com/ResourceRecordSet' && resource.name.extract('/rrsets/{name}/').endsWith('.p.example.com.')) || (resource.type != 'dns.googleapis.com/ResourceRecordSet')
- 自定义角色 / 原始条件:
管理特定类型的所有记录:授予管理区域中所有
A记录的权限。- 自定义角色 / 原始条件:
none (resource.type == 'dns.googleapis.com/ResourceRecordSet' && resource.name.endsWith('/A')) - 标准角色(宽松):
none (resource.type == 'dns.googleapis.com/ResourceRecordSet' && resource.name.endsWith('/A')) || (resource.type != 'dns.googleapis.com/ResourceRecordSet')
- 自定义角色 / 原始条件:
获取托管式区域的 IAM 政策
如需获取特定托管区域的 IAM 政策,请按以下步骤操作。
gcloud
运行 gcloud dns managed-zones get-iam-policy 命令:
gcloud dns managed-zones get-iam-policy NAME
将 NAME 替换为要获取其 IAM 政策的代管区域的名称。
如果此命令成功运行,则会返回 IAM 政策。否则,将返回指定具体错误的错误消息。
API
使用 managedZone.getIamPolicy 方法发送 POST 请求:
POST https://dns.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones/ManagedZone:getIamPolicy
替换以下内容:
PROJECT_ID:项目的名称或 IDMANAGED_ZONE:要为其设置 IAM 权限的代管区域的名称
检查托管区域的 IAM 权限
使用 managedZone.testIamPermissions 方法发送 POST 请求:
POST https://dns.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones/ManagedZone:testIamPermissions
替换以下内容:
PROJECT_ID:项目的名称或 IDMANAGED_ZONE:您要检查其 IAM 权限的托管区域的名称
后续步骤
- 如需使用代管式区域,请参阅创建、修改和删除区域。
- 如需了解您在使用 Cloud DNS 时可能会遇到的常见问题的解决方案,请参阅问题排查。
- 如需大致了解 Cloud DNS,请参阅 Cloud DNS 概览。