Granulare IAM-Berechtigungen für Datensätze in Cloud DNS


In diesem Codelab wird gezeigt, wie Sie mit IAM-Bedingungen und benutzerdefinierten Rollen eine detaillierte Zugriffssteuerung für einzelne DNS-Einträge in Cloud DNS implementieren.

Einführung

In Cloud DNS können IAM-Berechtigungen traditionell auf Projekt- und verwalteter Zonenebene festgelegt werden. Dadurch wird ein umfassender Zugriff auf alle Einträge in einer Zone ermöglicht. Für große Unternehmen entspricht dies jedoch nicht dem Prinzip der geringsten Berechtigung.

In diesem Codelab erfahren Sie, wie Sie IAM-Berechtigungen pro Datensatz in Cloud DNS konfigurieren. Mit dieser Funktion können Sie die Verwaltung bestimmter Subdomains oder Eintragstypen an verschiedene Teams innerhalb einer einzelnen gemeinsam genutzten verwalteten Zone delegieren.

Lerninhalte

  • Verwenden von IAM-Bedingungen zum Einschränken der DNS-Eintragverwaltung.
  • Gründe für das Erstellen benutzerdefinierter Rollen und entsprechende Anleitungen.
  • Delegieren von Subdomains und bestimmten Eintragstypen (z. B. A, MX).
  • Umgang mit DNS-Transaktionen mit bedingten Berechtigungen mithilfe des Flags --skip-soa-update.

Voraussetzungen

  • Ein Google-Konto
  • Ein Google Cloud-Projekt mit aktivierter Abrechnung
  • Die aktuelle Version der Google Cloud CLI ist installiert und konfiguriert
  • Grundkenntnisse zu DNS- und IAM-Konzepten

Einrichtung

Dauer: 03:00

Cloud DNS API aktivieren

Melden Sie sich in der gcloud CLI an und aktivieren Sie die API.

gcloud auth login
gcloud services enable dns.googleapis.com

Testprojekt erstellen

Wenn Sie kein Projekt haben, erstellen Sie jetzt eines und legen Sie Ihre gcloud-Konfiguration auf das Projekt fest, damit alle Befehle auf dieses Projekt ausgerichtet sind.

gcloud projects create my-dns-per-rrset-lab
gcloud config set project my-dns-per-rrset-lab

Ansätze

Dauer: 02:00

Damit ein Hauptkonto DNS-Einträge ändern kann, muss es die Berechtigung haben, sowohl die Eintragänderung als auch die zugehörigen Vorgänge für Änderungsressourcen auszuführen.

Sie können dies auf zwei Arten konfigurieren:

Sie können die IAM-Bedingung direkt an die Standardrolle roles/dns.admin binden. Um sowohl die Eintragänderungen als auch die Vorgänge für Änderungsressourcen zu unterstützen, verwenden Sie eine umfassendere CEL-Bedingung, die Zugriff auf die erforderlichen Ressourcen gewährt, die nicht zu Datensätzen gehören.

  • Zulässig:Ermöglicht alle anderen DNS-Verwaltungsaktionen. Dies entspricht Option 2, wenn die ergänzende Rolle alle anderen Standardberechtigungen für die Verwaltung enthält. cel (resource.type == 'dns.googleapis.com/ResourceRecordSet' && <RRSET_CONDITION>) || (resource.type != 'dns.googleapis.com/ResourceRecordSet')
  • Einschränkend:Ermöglicht nur Änderungen an Datensätzen und Vorgänge für Änderungsressourcen. Andere Verwaltungsaktionen, einschließlich des Auflistens von Datensätzen (dns.resourceRecordSets.list) und des Beschreibens der verwalteten Zone, werden blockiert. cel (resource.type == 'dns.googleapis.com/ResourceRecordSet' && <RRSET_CONDITION>) || (resource.type == 'dns.googleapis.com/Change')

Dieser Ansatz wird empfohlen, da keine benutzerdefinierten Rollen erstellt und verwaltet werden müssen.

Option 2: Ansatz mit benutzerdefinierten Rollen

Wenn Sie einfachere Bedingungen bevorzugen, können Sie die Datensatzverwaltung von anderen Verwaltungsaufgaben trennen, indem Sie zwei benutzerdefinierte Rollen verwenden:

  1. DnsRecordSetAdmin: Enthält Berechtigungen zum Erstellen, Löschen, Abrufen und Aktualisieren von Datensätzen. Diese Rolle wird bedingt gewährt.
  2. DnsNonRecordSetAdmin: Enthält alle anderen DNS-Verwaltungsberechtigungen (z. B. zum Verwalten von Zonen, Auflisten von Einträgen und Anzeigen von Projektdetails). Diese Rolle wird unbedingt gewährt.

Benutzerdefinierte Rollen erstellen

Dauer: 05:00

[!NOTE] Dieser Schritt ist nur erforderlich, wenn Sie Option 2: Ansatz mit benutzerdefinierten Rollen verwenden. Wenn Sie Option 1: Standardrollenansatz verwenden, können Sie diesen Schritt überspringen.

Führen Sie die folgenden Befehle aus, um die erforderlichen benutzerdefinierten Rollen in Ihrem Projekt zu erstellen.

Berechtigungssätze definieren

# Record set management permissions
rs_perms="dns.resourceRecordSets.create,dns.resourceRecordSets.delete,dns.resourceRecordSets.get,dns.resourceRecordSets.update"

# Complementary administrative permissions
comp_perms="compute.networks.get,compute.networks.list,dns.changes.create,dns.changes.get,dns.changes.list,dns.dnsKeys.get,dns.dnsKeys.list,dns.gkeClusters.bindDNSResponsePolicy,dns.gkeClusters.bindPrivateDNSZone,dns.managedZoneOperations.get,dns.managedZoneOperations.list,dns.managedZones.create,dns.managedZones.delete,dns.managedZones.get,dns.managedZones.getIamPolicy,dns.managedZones.list,dns.managedZones.update,dns.networks.bindDNSResponsePolicy,dns.networks.bindPrivateDNSPolicy,dns.networks.bindPrivateDNSZone,dns.networks.targetWithPeeringZone,dns.networks.useHealthSignals,dns.policies.create,dns.policies.createTagBinding,dns.policies.delete,dns.policies.deleteTagBinding,dns.policies.get,dns.policies.list,dns.policies.listEffectiveTags,dns.policies.listTagBindings,dns.policies.update,dns.projects.get,dns.resourceRecordSets.list,dns.responsePolicies.create,dns.responsePolicies.delete,dns.responsePolicies.get,dns.responsePolicies.list,dns.responsePolicies.update,dns.responsePolicyRules.create,dns.responsePolicyRules.delete,dns.responsePolicyRules.get,dns.responsePolicyRules.list,dns.responsePolicyRules.update,resourcemanager.projects.get"

Rollen in gcloud erstellen

gcloud iam roles create DnsRecordSetAdmin --project=$(gcloud config get-value project) \
    --title="DNS Record Set Admin (Conditional)" --permissions="${rs_perms}"

gcloud iam roles create DnsNonRecordSetAdmin --project=$(gcloud config get-value project) \
    --title="DNS Complimentary Admin" --permissions="${comp_perms}"

Szenario 1: Exakte Übereinstimmung des Eintrags

Dauer: 05:00

In diesem Szenario möchten Sie einem Team die Berechtigung erteilen, nur den A-Eintrag für api.example.com. zu verwalten.

Verwaltete Zone erstellen

gcloud dns managed-zones create example-zone \
    --description="Lab zone for per-RRSet permissions" \
    --dns-name=example.com. --visibility=private \
    --networks=default

Testdienstkonto erstellen

Mit diesem Dienstkonto prüfen Sie die eingeschränkten Berechtigungen.

gcloud iam service-accounts create dns-restricted-sa \
    --display-name="Restricted DNS SA"

SA_EMAIL="dns-restricted-sa@$(gcloud config get-value project).iam.gserviceaccount.com"

Bedingte IAM-Richtlinie anwenden

Wählen Sie eine der folgenden Optionen aus, um die Richtlinie anzuwenden.

Bei dieser Option wird die Standardrolle dns.admin mit einer zulässigen Bedingung verwendet.

cat << EOF > policy.json
{
  "bindings": [
    {
      "role": "roles/dns.admin",
      "members": ["serviceAccount:${SA_EMAIL}"],
      "condition": {
        "expression": "(resource.type == 'dns.googleapis.com/ResourceRecordSet' && resource.name.endsWith('/rrsets/api.example.com./A')) || (resource.type != 'dns.googleapis.com/ResourceRecordSet')",
        "title": "Exact Record Match (Standard Role)"
      }
    }
  ],
  "version": 3
}
EOF

gcloud dns managed-zones set-iam-policy example-zone --policy-file=policy.json

Option 2: Ansatz mit benutzerdefinierten Rollen

Bei dieser Option werden die benutzerdefinierten Rollen verwendet, die Sie im vorherigen Schritt erstellt haben.

cat << EOF > policy_custom.json
{
  "bindings": [
    {
      "role": "projects/$(gcloud config get-value project)/roles/DnsRecordSetAdmin",
      "members": ["serviceAccount:${SA_EMAIL}"],
      "condition": {
        "expression": "resource.type == 'dns.googleapis.com/ResourceRecordSet' && resource.name.endsWith('/rrsets/api.example.com./A')",
        "title": "Exact Record Match (Custom Roles)"
      }
    },
    {
      "role": "projects/$(gcloud config get-value project)/roles/DnsNonRecordSetAdmin",
      "members": ["serviceAccount:${SA_EMAIL}"]
    }
  ],
  "version": 3
}
EOF

gcloud dns managed-zones set-iam-policy example-zone --policy-file=policy_custom.json

Einschränkung prüfen

Versuchen Sie, den zulässigen Eintrag zu erstellen, und versuchen Sie dann, einen nicht autorisierten Eintrag zu erstellen.

# ALLOWED: Create the specific A record
gcloud dns record-sets create api.example.com. --zone=example-zone --type=A --rrdatas="1.2.3.4" --ttl=300 --impersonate-service-account=${SA_EMAIL}

# DENIED: Create an unauthorized name
gcloud dns record-sets create www.example.com. --zone=example-zone --type=A --rrdatas="5.6.7.8" --ttl=300 --impersonate-service-account=${SA_EMAIL}

Szenario 2: Subdomaindelegierung

Dauer: 05:00

Erteilen Sie nun die Berechtigung, jeden Eintrag in der Subdomain p.example.com. zu verwalten.

IAM-Richtlinie aktualisieren

Wählen Sie eine der folgenden Optionen aus, um die Richtlinie zu aktualisieren.

cat << EOF > policy_subdomain.json
{
  "bindings": [
    {
      "role": "roles/dns.admin",
      "members": ["serviceAccount:${SA_EMAIL}"],
      "condition": {
        "expression": "(resource.type == 'dns.googleapis.com/ResourceRecordSet' && resource.name.extract('/rrsets/{name}/').endsWith('.p.example.com.')) || (resource.type != 'dns.googleapis.com/ResourceRecordSet')",
        "title": "Subdomain Delegation (Standard Role)"
      }
    }
  ],
  "version": 3
}
EOF

gcloud dns managed-zones set-iam-policy example-zone --policy-file=policy_subdomain.json

Option 2: Ansatz mit benutzerdefinierten Rollen

cat << EOF > policy_subdomain_custom.json
{
  "bindings": [
    {
      "role": "projects/$(gcloud config get-value project)/roles/DnsRecordSetAdmin",
      "members": ["serviceAccount:${SA_EMAIL}"],
      "condition": {
        "expression": "resource.type == 'dns.googleapis.com/ResourceRecordSet' && resource.name.extract('/rrsets/{name}/').endsWith('.p.example.com.')",
        "title": "Subdomain Delegation (Custom Roles)"
      }
    },
    {
      "role": "projects/$(gcloud config get-value project)/roles/DnsNonRecordSetAdmin",
      "members": ["serviceAccount:${SA_EMAIL}"]
    }
  ],
  "version": 3
}
EOF

gcloud dns managed-zones set-iam-policy example-zone --policy-file=policy_subdomain_custom.json

Delegierung prüfen

# ALLOWED: Create any record in the subdomain
gcloud dns record-sets create test.p.example.com. --zone=example-zone --type=A --rrdatas="192.168.1.1" --ttl=300 --impersonate-service-account=${SA_EMAIL}

# DENIED: Create a record outside the subdomain
gcloud dns record-sets create news.example.com. --zone=example-zone --type=A --rrdatas="192.168.1.2" --ttl=300 --impersonate-service-account=${SA_EMAIL}

Szenario 3: Batchänderungen und Transaktionen

Dauer: 03:00

Bei der Verwendung von bedingten Berechtigungen gibt es ein wichtiges Detail für Transaktionen. Standardmäßig wird bei DNS-Transaktionen versucht, den SOA-Eintrag zu aktualisieren. Wenn Ihre IAM-Bedingung nur zulässt, dass Nutzer bestimmte Einträge verwalten (z. B. api.example.com.), schlägt die Transaktion fehl, da der Nutzer nicht berechtigt ist, den SOA-Eintrag zu ändern.

Das Flag `--skip-soa-update`

Wenn Sie zulässige Einträge innerhalb einer Transaktion ändern möchten, sollten Sie entweder SOA-Aktualisierungen zulassen, indem Sie Ihre Bedingung entsprechend ändern (resource.name.endsWith('/SOA')), oder das Flag --skip-soa-update verwenden.

gcloud dns record-sets transaction start --zone=example-zone --skip-soa-update
gcloud dns record-sets transaction add --zone=example-zone --name="api.example.com." --type=A --ttl=300 "10.0.0.1"
gcloud dns record-sets transaction execute --zone=example-zone --impersonate-service-account=${SA_EMAIL}

Hinweis: Wenn eine Transaktion auch nur eine nicht autorisierte Eintragänderung enthält, wird die gesamte Transaktion abgelehnt.

Bereinigen

Dauer: 01:00

Löschen Sie die in diesem Codelab erstellten Ressourcen, um Gebühren zu vermeiden.

# Delete record sets
gcloud dns record-sets delete api.example.com. --zone=example-zone --type=A
gcloud dns record-sets delete test.p.example.com. --zone=example-zone --type=A

# Delete managed zone
gcloud dns managed-zones delete example-zone

# Delete custom roles (only if you created them in Option 2)
gcloud iam roles delete DnsRecordSetAdmin --project=$(gcloud config get-value project) || true
gcloud iam roles delete DnsNonRecordSetAdmin --project=$(gcloud config get-value project) || true

# Delete service account
gcloud iam service-accounts delete ${SA_EMAIL}

Glückwunsch

Glückwunsch! Sie haben erfolgreich gelernt, wie Sie detaillierte IAM-Berechtigungen pro Datensatz in Cloud DNS implementieren.

Zusammenfassung

  • Benutzerdefinierte Rollen erstellt, um Berechtigungen für Datensätze von Verwaltungsaufgaben auf Zonenebene zu trennen.
  • Eine Bedingung für exakte Übereinstimmung für bestimmte Eintragsnamen und -typen implementiert.
  • Subdomaindelegierung mithilfe der Stringextraktion in IAM-Bedingungen implementiert.
  • Das Flag --skip-soa-update verwendet, um bedingten Nutzern die Ausführung von Batchänderungen zu ermöglichen.

Weitere Informationen