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

  • Verwendung von IAM-Bedingungen zum Einschränken der DNS-Eintragverwaltung
  • Gründe für und Vorgehensweise beim Erstellen benutzerdefinierter Rollen
  • 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.
  • Grundlegende Kenntnisse von 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 noch 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

Ansatz mit benutzerdefinierten Rollen

Dauer: 02:00

Sie können IAM-Bedingungen nicht direkt an die Standardrolle roles/dns.admin binden. Stattdessen müssen 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 administrativen DNS-Berechtigungen (z. B. zum Verwalten von Zonen, Auflisten von Einträgen und Anzeigen von Projektdetails). Diese Rolle wird unbedingt gewährt.

Durch die Aufteilung dieser Rollen wird sichergestellt, dass die von Cloud DNS ausgeführten Voraussetzungsprüfungen (z. B. dns.changes.create) unbedingt erfüllt werden, während die tatsächlichen Datensatzänderungen streng durch Ihre Bedingungen gesteuert werden.

Benutzerdefinierte Rollen erstellen

Dauer: 05:00

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: Genaue Datensatzübereinstimmung

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

Gewähren Sie DnsNonRecordSetAdmin unbedingt und DnsRecordSetAdmin mit einer Bedingung.

cat << EOF > policy.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"
      }
    },
    {
      "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.json

Einschränkung prüfen

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

# 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: Subdomain-Delegierung

Dauer: 05:00

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

IAM-Richtlinie aktualisieren

Ändern Sie die Bedingung so, dass resource.name.extract() verwendet wird, um das Subdomain-Suffix abzugleichen.

cat << EOF > policy_subdomain.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"
      }
    },
    {
      "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.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 bedingter Berechtigungen gibt es ein wichtiges Detail für Transaktionen. Standardmäßig versuchen DNS-Transaktionen, 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 autorisiert 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-Updates 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 Datensatzänderung enthält, wird die gesamte Transaktion abgelehnt.

Bereinigen

Dauer: 01:00

Löschen Sie die in diesem Codelab erstellten Ressourcen, um Kosten 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
gcloud iam roles delete DnsRecordSetAdmin --project=$(gcloud config get-value project)
gcloud iam roles delete DnsNonRecordSetAdmin --project=$(gcloud config get-value project)

# 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 der behandelten Themen

  • Benutzerdefinierte Rollen erstellt, um Berechtigungen für Datensätze von Verwaltungsaufgaben auf Zonenebene zu trennen
  • Eine Bedingung für die genaue Übereinstimmung für bestimmte Datensatznamen und -typen implementiert
  • Subdomain-Delegierung 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