設定及管理代管區域的 IAM 政策

本頁面提供操作說明,說明如何為同一專案下的不同代管區域,設定特定的讀取、寫入或管理員身分與存取權管理 (IAM) 權限。

如要進一步瞭解 IAM 政策,請參閱「瞭解允許政策」。如要瞭解 IAM 政策 API,請參閱 Policy。如要瞭解如何建立可在代管區域中使用的 IAM 自訂角色,請參閱「瞭解 IAM 自訂角色」。

本程序假設您已在專案中建立代管區域。如需如何建立代管區域的操作說明,請參閱「建立、修改及刪除區域」。

設定代管區域的 IAM 政策

如要為特定代管區域設定 IAM 政策,請按照下列步驟操作。

控制台

  1. 前往 Google Cloud 控制台的「Cloud DNS zones」(Cloud DNS 區域) 頁面。

    前往 Cloud DNS 區域

  2. 選取要新增存取控管權限的一或多個區域。

  3. 在「Permissions to resources」(資源權限) 頁面中,按一下「Add principal」(新增主體)

  4. 在「Grant access to resource」(授予資源存取權) 頁面的「New principals」(新主體) 下方,新增要新增為新主體的使用者、群組、網域或服務帳戶的電子郵件地址。

  5. 在「Assign roles」(指派角色) 清單中,選取要指派給主體的角色。

  6. 如要指派更多角色,請按一下「Add another role」(新增其他角色)

  7. 按一下「Save」(儲存)

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 權限的代管區域名稱

後續步驟