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 uprawnień i ról niestandardowych.
Wprowadzenie
Cloud DNS tradycyjnie obsługuje ustawianie uprawnień na poziomie projektu i strefy zarządzanej. Zapewnia to szeroki dostęp do wszystkich rekordów w strefie. W przypadku dużych firm nie spełnia to jednak zasady jak najmniejszych uprawnień.
W tym ćwiczeniu pokażemy, jak skonfigurować uprawnienia do poszczególnych zestawów rekordów w Cloud DNS. Ta funkcja umożliwia delegowanie zarządzania określonymi subdomenami lub typami rekordów do różnych zespołów w ramach jednej wspólnej strefy zarządzanej.
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 rozliczeniami
- Zainstalowana i skonfigurowana najnowsza wersja interfejsu Google Cloud CLI
- Podstawowa wiedza o DNS i uprawnieniach
Przygotowania
Czas trwania: 03:00
Włączanie Cloud DNS API
Zaloguj się w gcloud CLI i włącz interfejs API.
gcloud auth login
gcloud services enable dns.googleapis.com
Utwórz projekt testowy
Jeśli nie masz gotowego projektu, utwórz go teraz i ustaw konfigurację gcloud na ten projekt, 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
Omówienie podejść
Czas trwania: 02:00
Aby można było modyfikować rekordy DNS, podmiot zabezpieczeń musi mieć uprawnienia do wykonywania zarówno modyfikacji rekordu, jak i powiązanych operacji na zasobach Change.
Możesz to skonfigurować na 2 sposoby:
Opcja 1. Standardowa rola (zalecane)
Warunek uprawnień możesz przypisać bezpośrednio do standardowej roli roles/dns.admin. Aby obsługiwać zarówno modyfikacje rekordów, jak i operacje na zasobach Change, użyj bardziej kompleksowego warunku CEL, który przyznaje dostęp do wymaganych zasobów innych niż zestaw rekordów.
- Dozwalający: umożliwia wszystkie inne działania administracyjne DNS. Jest to odpowiednik opcji 2, jeśli rola uzupełniająca zawiera wszystkie inne standardowe uprawnienia administracyjne.
cel (resource.type == 'dns.googleapis.com/ResourceRecordSet' && <RRSET_CONDITION>) || (resource.type != 'dns.googleapis.com/ResourceRecordSet') - Ograniczający: umożliwia tylko modyfikacje zestawu rekordów i operacje na zasobach Change. Inne działania administracyjne, w tym wyświetlanie listy zestawów rekordów (
dns.resourceRecordSets.list) i opisywanie strefy zarządzanej, są blokowane.cel (resource.type == 'dns.googleapis.com/ResourceRecordSet' && <RRSET_CONDITION>) || (resource.type == 'dns.googleapis.com/Change')
Zalecamy to podejście, ponieważ nie wymaga ono tworzenia ról niestandardowych ani zarządzania nimi.
Opcja 2. Rola niestandardowa
Jeśli wolisz prostsze warunki, możesz 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 listy rekordów i wyświetlanie szczegółów projektu). Ta rola zostanie przyznana bezwarunkowo.
Tworzenie ról niestandardowych
Czas trwania: 05:00
[!NOTE] Ten krok jest wymagany tylko wtedy, gdy używasz opcji 2. Rola niestandardowa. Jeśli używasz opcji 1. Standardowa rola, możesz pominąć ten krok.
Aby utworzyć wymagane role niestandardowe w projekcie, 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"
Utwórz role 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..
Utwórz strefę zarządzaną
gcloud dns managed-zones create example-zone \
--description="Lab zone for per-RRSet permissions" \
--dns-name=example.com. --visibility=private \
--networks=default
Utwórz testowe konto usługi
Użyjesz tego konta usługi do sprawdzenia 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"
Zastosuj warunkową zasadę uprawnień
Aby zastosować zasadę, wybierz jedną z tych opcji.
Opcja 1. Standardowa rola (zalecane)
Ta opcja używa standardowej roli dns.admin z warunkiem dozwolonym.
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
Opcja 2. Rola niestandardowa
Ta opcja używa ról niestandardowych utworzonych w poprzednim kroku.
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
Sprawdź ograniczenie
Spróbuj utworzyć dozwolony rekord, a potem niedozwolony.
# 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 zasadę uprawnień
Aby zaktualizować zasadę, wybierz jedną z tych opcji.
Opcja 1. Standardowa rola (zalecane)
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
Opcja 2. Rola niestandardowa
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
Sprawdź delegowanie
# 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 zbiorcze i transakcje
Czas trwania: 03:00
W przypadku korzystania z uprawnień warunkowych ważny jest szczegół dotyczący transakcji.
Domyślnie transakcje DNS próbują zaktualizować rekord SOA. Jeśli warunek uprawnień umożliwia użytkownikom zarządzanie tylko określonymi rekordami (np. api.example.com.), transakcja nie powiedzie się, ponieważ użytkownik nie ma uprawnień do modyfikowania rekordu SOA.
Flaga --skip-soa-update
Aby modyfikować dozwolone rekordy w ramach 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.
Zwalnianie miejsca
Czas trwania: 01:00
Aby uniknąć opłat, usuń zasoby utworzone w tym ćwiczeniu.
# 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}
Gratulacje
Gratulacje! Udało Ci się nauczyć, jak wdrożyć szczegółowe uprawnienia do poszczególnych zestawów rekordów w Cloud DNS.
Podsumowanie omawianych zagadnień
- Utworzono role niestandardowe, aby oddzielić uprawnienia do zestawu rekordów od zadań administracyjnych na poziomie strefy.
- Wdrożono warunek dokładnego dopasowania dla określonych nazw i typów rekordów.
- Wdrożono delegowanie subdomen za pomocą wyodrębniania ciągów w warunkach uprawnień.
- Użyto flagi
--skip-soa-update, aby umożliwić użytkownikom warunkowym wykonywanie zmian zbiorczych.