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:
- DnsRecordSetAdmin: Enthält Berechtigungen zum Erstellen, Löschen, Abrufen und Aktualisieren von Datensätzen. Diese Rolle wird bedingt gewährt.
- 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-updateverwendet, um bedingten Nutzern die Ausführung von Batchänderungen zu ermöglichen