W tym ćwiczeniu pokazujemy, jak wdrożyć szczegółową kontrolę dostępu do poszczególnych zestawów rekordów DNS w Cloud DNS za pomocą warunków IAM i ról niestandardowych.
Wprowadzenie
Cloud DNS tradycyjnie obsługuje ustawianie uprawnień IAM na poziomie projektu i strefy zarządzanej. Zapewnia to szeroki dostęp do wszystkich rekordów w strefie. W przypadku dużych przedsiębiorstw nie spełnia to jednak „zasady jak najmniejszych uprawnień”.
To ćwiczenie przeprowadzi Cię przez proces konfigurowania uprawnień IAM dla poszczególnych zestawów rekordów w Cloud DNS. Ta funkcja umożliwia przekazywanie zarządzania konkretnymi subdomenami lub typami rekordów różnym zespołom w ramach jednej wspólnej zarządzanej strefy.
Czego się nauczysz
- Jak używać warunków uprawnień do ograniczania zarządzania rekordami DNS.
- Dlaczego i jak tworzyć role niestandardowe.
- Jak delegować subdomeny i określone typy rekordów (np. A, MX).
- Jak obsługiwać transakcje DNS z uprawnieniami warunkowymi za pomocą flagi
--skip-soa-update.
Wymagania wstępne
- Konto Google
- projekt Google Cloud z włączonymi płatnościami;
- zainstalowana i skonfigurowana najnowsza wersja Google Cloud CLI;
- Podstawowa znajomość pojęć związanych z DNS i IAM
Przygotowania
Czas trwania: 03:00
Włączanie interfejsu Cloud DNS API
Zaloguj się w gcloud CLI i włącz interfejs API.
gcloud auth login
gcloud services enable dns.googleapis.com
Tworzenie projektu testowego
Jeśli nie masz jeszcze projektu, utwórz go i skonfiguruj gcloud, aby wszystkie polecenia były kierowane do tego projektu.
gcloud projects create my-dns-per-rrset-lab
gcloud config set project my-dns-per-rrset-lab
Informacje o podejściu do ról niestandardowych
Czas trwania: 02:00
Nie możesz przypisywać warunków uprawnień bezpośrednio do standardowej roli roles/dns.admin.
Zamiast tego musisz oddzielić zarządzanie zestawem rekordów od innych zadań administracyjnych
za pomocą 2 ról niestandardowych:
- DnsRecordSetAdmin: zawiera uprawnienia do tworzenia, usuwania, pobierania i aktualizowania zestawów rekordów zasobów. Ta rola zostanie przyznana warunkowo.
- DnsNonRecordSetAdmin: zawiera wszystkie inne uprawnienia administracyjne DNS (np. zarządzanie strefami, wyświetlanie rekordów i szczegółów projektu). Ta rola zostanie przyznana bezwarunkowo.
Dzięki rozdzieleniu tych ról masz pewność, że wstępne sprawdzenia wykonywane przez Cloud DNS (np. dns.changes.create) są spełnione bezwarunkowo, a rzeczywiste modyfikacje rekordów są ściśle kontrolowane przez Twoje warunki.
Tworzenie ról niestandardowych
Czas trwania: 05:00
Aby utworzyć w projekcie wymagane role niestandardowe, uruchom te polecenia.
Określ zestawy uprawnień
# 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"
Tworzenie ról w gcloud
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}"
Scenariusz 1. Dokładne dopasowanie rekordu
Czas trwania: 05:00
W tym scenariuszu chcesz przyznać zespołowi uprawnienia do zarządzania tylko rekordem A dla api.example.com..
Tworzenie strefy zarządzanej
gcloud dns managed-zones create example-zone \
--description="Lab zone for per-RRSet permissions" \
--dns-name=example.com. --visibility=private \
--networks=default
Tworzenie testowego konta usługi
To konto usługi będzie używane do weryfikowania ograniczonych uprawnień.
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"
Stosowanie warunkowej zasady uprawnień
Przyznawanie DnsNonRecordSetAdmin bezwarunkowo i DnsRecordSetAdmin z warunkiem.
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
Sprawdzanie ograniczenia
Spróbuj utworzyć dozwolony rekord, a potem nieautoryzowany.
# 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}
Scenariusz 2. Delegowanie subdomeny
Czas trwania: 05:00
Teraz przyznajmy uprawnienia do zarządzania dowolnym rekordem w subdomenie p.example.com..
Zaktualizuj zasady uprawnień
Zmodyfikuj warunek, aby używać znaku resource.name.extract() i dopasowywać sufiks subdomeny.
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
Weryfikowanie delegowania
# 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}
Scenariusz 3. Zmiany i transakcje zbiorcze
Czas trwania: 03:00
W przypadku korzystania z uprawnień warunkowych istnieje ważny szczegół dotyczący transakcji.
Domyślnie transakcje DNS próbują zaktualizować rekord SOA. Jeśli warunek IAM zezwala użytkownikom tylko na zarządzanie określonymi rekordami (np. api.example.com.), transakcja zakończy się niepowodzeniem, ponieważ użytkownik nie ma uprawnień do modyfikowania rekordu SOA.
Flaga --skip-soa-update
Aby zmodyfikować dozwolone rekordy w transakcji, musisz zezwolić na aktualizacje SOA, odpowiednio modyfikując warunek (resource.name.endsWith('/SOA')), lub użyć flagi --skip-soa-update.
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}
Uwaga: jeśli transakcja zawiera choćby jedną nieautoryzowaną modyfikację rekordu, cała transakcja zostanie odrzucona.
Czyszczenie danych
Czas trwania: 01:00
Aby uniknąć opłat, usuń zasoby utworzone w tym module.
# 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}
Gratulacje
Gratulacje! Wiesz już, jak wdrożyć w Cloud DNS szczegółowe uprawnienia IAM dla poszczególnych zestawów rekordów.
Podsumowanie omówionych zagadnień
- Utworzono role niestandardowe, aby oddzielić uprawnienia do zestawów rekordów od zadań administracyjnych na poziomie strefy.
- Wdrożono warunek dopasowania ścisłego w przypadku konkretnych nazw i typów rekordów.
- Wdrożono delegowanie subdomen za pomocą wyodrębniania ciągów tekstowych w warunkach uprawnień.
- Użyj flagi
--skip-soa-update, aby umożliwić użytkownikom warunkowym wprowadzanie zmian zbiorczych.