Questo codelab mostra come implementare il controllo dell'accesso granulare per singoli set di record DNS in Cloud DNS utilizzando le condizioni IAM e i ruoli personalizzati.
Introduzione
Cloud DNS supporta tradizionalmente l'impostazione delle autorizzazioni IAM a livello di progetto e di zona gestita. In questo modo, viene fornito un ampio accesso a tutti i record all'interno di una zona. Tuttavia, per le grandi aziende, questo non soddisfa il "principio del privilegio minimo".
Questo codelab ti guiderà nella configurazione delle autorizzazioni IAM per ogni set di record in Cloud DNS. Questa funzionalità ti consente di delegare la gestione di specifici sottodomini o tipi di record a team diversi all'interno di una singola zona gestita condivisa.
Cosa imparerai a fare
- Come utilizzare le condizioni IAM per limitare la gestione dei record DNS.
- Perché e come creare ruoli personalizzati.
- Come delegare sottodomini e tipi di record specifici (ad esempio A, MX).
- Come gestire le transazioni DNS con autorizzazioni condizionali utilizzando il flag
--skip-soa-update.
Prerequisiti
- Un Account Google
- Un progetto cloud Google Cloud con la fatturazione abilitata
- L'ultima versione di Google Cloud CLI installata e configurata
- Conoscenza di base dei concetti DNS e IAM
Preparazione
Durata: 03:00
Abilita l'API Cloud DNS
Accedi a gcloud CLI e abilita l'API.
gcloud auth login
gcloud services enable dns.googleapis.com
Creare un progetto di test
Se non hai un progetto pronto, creane uno ora e imposta la configurazione gcloud sul progetto in modo che tutti i comandi lo prendano di mira.
gcloud projects create my-dns-per-rrset-lab
gcloud config set project my-dns-per-rrset-lab
Informazioni sull'approccio dei ruoli personalizzati
Durata: 02:00
Non puoi associare le condizioni IAM direttamente al ruolo standard roles/dns.admin.
Devi invece separare la gestione dei record set dalle altre attività amministrative
utilizzando due ruoli personalizzati:
- DnsRecordSetAdmin: contiene le autorizzazioni per creare, eliminare, recuperare e aggiornare i set di record di risorse. Questo ruolo verrà concesso in modo condizionale.
- DnsNonRecordSetAdmin: contiene tutte le altre autorizzazioni amministrative DNS (come la gestione delle zone, l'elenco dei record e la visualizzazione dei dettagli del progetto). Questo ruolo verrà concesso incondizionatamente.
Dividendo questi ruoli, ti assicuri che i controlli preliminari eseguiti da
Cloud DNS (come dns.changes.create) siano soddisfatti incondizionatamente, mentre le
modifiche effettive dei record sono strettamente controllate dalle tue condizioni.
Creazione dei ruoli personalizzati
Durata: 05:00
Esegui questi comandi per creare i ruoli personalizzati richiesti nel tuo progetto.
Definisci i set di autorizzazioni
# 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"
Crea i ruoli in 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}"
Scenario 1: corrispondenza esatta del record
Durata: 05:00
In questo scenario, vuoi concedere a un team l'autorizzazione per gestire solo il record A per api.example.com..
Crea una zona gestita
gcloud dns managed-zones create example-zone \
--description="Lab zone for per-RRSet permissions" \
--dns-name=example.com. --visibility=private \
--networks=default
Crea un service account di test
Utilizzerai questo service account per verificare le autorizzazioni con limitazioni.
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"
Applicare il criterio IAM condizionale
Concedi DnsNonRecordSetAdmin senza condizioni e DnsRecordSetAdmin con una condizione.
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
Verificare la limitazione
Prova a creare il record consentito, poi prova con uno non autorizzato.
# 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}
Scenario 2: delega del sottodominio
Durata: 05:00
Ora concediamo l'autorizzazione per gestire qualsiasi record all'interno del sottodominio p.example.com..
Aggiorna il criterio IAM
Modifica la condizione in modo da utilizzare resource.name.extract() per trovare una corrispondenza con il suffisso del sottodominio.
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
Verificare la delega
# 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}
Scenario 3: modifiche e transazioni batch
Durata: 03:00
Quando utilizzi le autorizzazioni condizionali, c'è un dettaglio importante per le transazioni.
Per impostazione predefinita, le transazioni DNS tentano di aggiornare il record SOA. Se la condizione IAM
consente agli utenti di gestire solo record specifici (come api.example.com.),
la transazione non andrà a buon fine perché l'utente non è autorizzato a modificare il record SOA.
Il flag --skip-soa-update
Per modificare i record consentiti all'interno di una transazione, devi consentire gli aggiornamenti SOA modificando di conseguenza la condizione (resource.name.endsWith('/SOA')) o utilizzare il flag --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}
Nota: se una transazione contiene anche una sola modifica non autorizzata del record, l'intera transazione verrà rifiutata.
Esegui la pulizia
Durata: 01:00
Elimina le risorse create in questo lab per evitare addebiti.
# 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}
Complimenti
Complimenti! Hai imparato a implementare autorizzazioni IAM granulari per ogni insieme di record in Cloud DNS.
Riepilogo degli argomenti trattati
- Sono stati creati ruoli personalizzati per separare le autorizzazioni dei record set dalle attività amministrative a livello di zona.
- È stata implementata una condizione di corrispondenza esatta per nomi e tipi di record specifici.
- Implementata la delega di sottodominio utilizzando l'estrazione di stringhe nelle condizioni IAM.
- Utilizza il flag
--skip-soa-updateper consentire agli utenti condizionali di eseguire modifiche collettive.