Szczegółowe uprawnienia Cloud IAM do zbiorów rekordów DNS


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:

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:

  1. DnsRecordSetAdmin: zawiera uprawnienia do tworzenia, usuwania, pobierania i aktualizowania zestawów rekordów zasobów. Ta rola zostanie przyznana warunkowo.
  2. 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.

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.

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.

Dodatkowe materiały