Izin IAM Terperinci Cloud DNS untuk Set Data


Codelab ini menunjukkan cara menerapkan kontrol akses terperinci untuk setiap kumpulan data DNS dalam Cloud DNS menggunakan IAM Conditions dan peran kustom.

Pengantar

Cloud DNS secara tradisional mendukung penetapan izin IAM di tingkat project dan zona terkelola. Hal ini memberikan akses luas ke semua data dalam zona. Namun, untuk perusahaan besar, hal ini tidak memenuhi "prinsip hak istimewa terendah".

Codelab ini akan memandu Anda mengonfigurasi izin IAM per kumpulan data di Cloud DNS. Fitur ini memungkinkan Anda mendelegasikan pengelolaan subdomain atau jenis data tertentu ke tim yang berbeda dalam satu zona terkelola bersama.

Yang akan Anda pelajari

  • Cara menggunakan IAM Conditions untuk membatasi pengelolaan data DNS.
  • Alasan dan cara membuat peran kustom.
  • Cara mendelegasikan subdomain dan jenis data tertentu (misalnya: A, MX).
  • Cara menangani transaksi DNS dengan izin bersyarat menggunakan flag --skip-soa-update.

Prasyarat

  • Akun Google
  • Project Google Cloud yang mengaktifkan penagihan
  • Google Cloud CLI versi terbaru yang diinstal dan dikonfigurasi
  • Pemahaman dasar tentang konsep DNS dan IAM

Mempersiapkan

Durasi: 03:00

Mengaktifkan Cloud DNS API

Login ke gcloud CLI dan aktifkan API.

gcloud auth login
gcloud services enable dns.googleapis.com

Membuat project pengujian

Jika Anda belum memiliki project, buat project sekarang dan tetapkan konfigurasi gcloud ke project tersebut sehingga semua perintah akan menargetkan project tersebut.

gcloud projects create my-dns-per-rrset-lab
gcloud config set project my-dns-per-rrset-lab

Memahami Pendekatan Peran Kustom

Durasi: 02:00

Anda tidak dapat mengikat IAM Conditions langsung ke peran roles/dns.admin standar. Sebagai gantinya, Anda harus memisahkan pengelolaan kumpulan data dari tugas administratif lainnya menggunakan dua peran kustom:

  1. DnsRecordSetAdmin: Berisi izin untuk membuat, menghapus, mendapatkan, dan memperbarui kumpulan data resource. Peran ini akan diberikan secara bersyarat.
  2. DnsNonRecordSetAdmin: Berisi semua izin administratif DNS lainnya (seperti mengelola zona, mencantumkan data, dan melihat detail project). Peran ini akan diberikan tanpa syarat.

Dengan membagi peran ini, Anda memastikan bahwa pemeriksaan prasyarat yang dilakukan oleh Cloud DNS (seperti dns.changes.create) dipenuhi tanpa syarat, sementara modifikasi data sebenarnya dikontrol secara ketat oleh kondisi Anda.

Membuat Peran Kustom

Durasi: 05:00

Jalankan perintah berikut untuk membuat peran kustom yang diperlukan di project Anda.

Menentukan kumpulan izin

# 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"

Membuat peran di 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}"

Skenario 1: Pencocokan Data Persis

Durasi: 05:00

Dalam skenario ini, Anda ingin memberikan izin kepada tim untuk mengelola data A untuk api.example.com. saja.

Membuat zona terkelola

gcloud dns managed-zones create example-zone \
    --description="Lab zone for per-RRSet permissions" \
    --dns-name=example.com. --visibility=private \
    --networks=default

Membuat akun layanan pengujian

Anda akan menggunakan akun layanan ini untuk memverifikasi izin yang dibatasi.

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"

Menerapkan kebijakan IAM bersyarat

Berikan DnsNonRecordSetAdmin tanpa syarat dan DnsRecordSetAdmin dengan kondisi.

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

Memverifikasi batasan

Coba buat data yang diizinkan, lalu coba data yang tidak diizinkan.

# 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}

Skenario 2: Delegasi Subdomain

Durasi: 05:00

Sekarang, mari kita berikan izin untuk mengelola data apa pun dalam subdomain p.example.com..

Memperbarui kebijakan IAM

Ubah kondisi untuk menggunakan resource.name.extract() agar cocok dengan akhiran subdomain.

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

Memverifikasi delegasi

# 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}

Skenario 3: Perubahan dan Transaksi Batch

Durasi: 03:00

Saat menggunakan izin bersyarat, ada detail penting untuk transaksi. Secara default, transaksi DNS mencoba memperbarui data SOA. Jika kondisi IAM Anda hanya mengizinkan pengguna mengelola data tertentu (seperti api.example.com.), transaksi akan gagal karena pengguna tidak diizinkan untuk mengubah data SOA.

Flag --skip-soa-update

Untuk mengubah data yang diizinkan dalam transaksi, Anda harus mengizinkan pembaruan SOA dengan mengubah kondisi yang sesuai (resource.name.endsWith('/SOA')) atau menggunakan 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}

Catatan: Jika transaksi berisi satu modifikasi data yang tidak diizinkan, seluruh transaksi akan ditolak.

Pembersihan

Durasi: 01:00

Hapus resource yang dibuat di lab ini untuk menghindari biaya.

# 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}

Selamat

Selamat! Anda telah berhasil mempelajari cara menerapkan izin IAM per kumpulan data yang terperinci di Cloud DNS.

Ringkasan materi yang dibahas

  • Membuat peran kustom untuk memisahkan izin kumpulan data dari tugas administratif tingkat zona.
  • Menerapkan kondisi Pencocokan Persis untuk nama dan jenis data tertentu.
  • Menerapkan Delegasi Subdomain menggunakan ekstraksi string dalam IAM Conditions.
  • Menggunakan flag --skip-soa-update untuk mengizinkan pengguna bersyarat melakukan perubahan batch.

Bacaan lebih lanjut