为托管式区域设置和管理 IAM 政策

本页面介绍了如何为同一项目下的不同代管区域设置特定的读取、写入或管理员 Identity and Access Management (IAM) 权限。

如需详细了解 IAM 政策,请参阅了解允许政策。如需了解 IAM 政策 API,请参阅 Policy。 如需了解如何创建可在托管区域使用的 IAM 自定义角色,请参阅了解 IAM 自定义角色

此过程假定您已在项目中创建代管区域。如需了解如何创建托管区域,请参阅创建、修改和删除区域

为托管式区域设置 IAM 政策

如需对特定托管区域设置 IAM 政策,请按照以下步骤操作。

控制台

  1. 在 Google Cloud 控制台中,前往 Cloud DNS 区域页面。

    前往 Cloud DNS 区域

  2. 选择要为其添加访问权限控制权限的一个或多个区域。

  3. 资源权限页面上,点击添加主账号

  4. 授予对资源的访问权限页面上的新建主账号下,添加您希望添加为新主账号的用户、群组、网域或服务账号的电子邮件地址。

  5. 分配角色列表中,选择要分配给主账号的角色。

  6. 如需分配更多角色,请点击添加其他角色

  7. 点击保存

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:项目的名称或 ID
  • MANAGED_ZONE:要为其设置 IAM 权限的代管区域的名称

如需详细了解此 API 调用,请参阅 IAM Policy API 页面上的绑定

授予对特定资源记录集的访问权限

Cloud DNS 支持使用 IAM 条件为托管区域内的特定资源记录集 (RRset) 提供精细的访问权限控制。

您可以使用以下方法之一配置精细的访问权限控制:

  • 标准角色(推荐):使用标准 roles/dns.admin 角色,并添加特定的 IAM 条件,以允许必要的非记录集操作。这是最简单的方法,因为它不需要创建自定义角色。
  • 自定义角色:创建两个自定义角色,以将记录集管理与其他管理任务分开。

如需使用标准 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 角色。

  1. 向绑定添加条件(许可型或限制型)。

方法 2:自定义角色

如果您不想使用复杂的条件,可以创建自定义角色来分离权限。

前提条件:创建自定义角色
  1. 创建包含以下权限的记录集管理角色(例如 DnsRecordSetAdmin):

    • dns.resourceRecordSets.create
    • dns.resourceRecordSets.delete
    • dns.resourceRecordSets.get
    • dns.resourceRecordSets.update
  2. 创建一个补充角色(例如 DnsNonRecordSetAdmin),其中包含标准 roles/dns.admin 角色的所有剩余权限。这些额外的权限(例如 dns.changes.createdns.managedZones.get)对于区域的整体管理是必需的,并且在修改记录时需要满足前提条件检查。

授予权限

为确保条件政策按预期运行,您必须按如下方式向正文授予这些角色:

  1. 无条件授予互补角色:将包含剩余管理权限(例如 DnsNonRecordSetAdmin)的角色无条件分配给受管区域中的正文 。
  2. 有条件地授予记录集管理角色:根据您的具体访问权限要求,有条件地向正文分配包含记录集权限(例如 DnsRecordSetAdmin)的角色。

示例条件

以下示例展示了如何使用 resource.nameresource.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:项目的名称或 ID
  • MANAGED_ZONE:要为其设置 IAM 权限的代管区域的名称

检查托管区域的 IAM 权限

使用 managedZone.testIamPermissions 方法发送 POST 请求:

POST https://dns.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones/ManagedZone:testIamPermissions

替换以下内容:

  • PROJECT_ID:项目的名称或 ID
  • MANAGED_ZONE:您要检查其 IAM 权限的托管区域的名称

后续步骤