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 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:

  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 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.

Więcej informacji