Izin IAM Terperinci Cloud DNS untuk Set Data


Codelab ini menunjukkan cara menerapkan kontrol akses yang mendetail untuk setiap set data DNS dalam Cloud DNS menggunakan Kondisi IAM dan peran kustom.

Pengantar

Cloud DNS secara tradisional mendukung penetapan izin IAM di level 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 set rekaman di Cloud DNS. Fitur ini memungkinkan Anda mendelegasikan pengelolaan subdomain atau jenis catatan tertentu kepada tim yang berbeda dalam satu zona terkelola bersama.

Yang akan Anda pelajari

  • Cara menggunakan Kondisi IAM untuk membatasi pengelolaan data DNS.
  • Alasan dan cara membuat peran khusus.
  • 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 telah 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 menyiapkan project, buat project sekarang dan tetapkan konfigurasi gcloud Anda 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

Durasi: 02:00

Agar berhasil mengubah data DNS, prinsipal harus memiliki izin untuk melakukan modifikasi data dan operasi terkait pada Ubah resource.

Anda dapat mengonfigurasi hal ini dengan salah satu dari dua cara berikut:

Anda dapat mengikat kondisi IAM langsung ke peran roles/dns.admin standar. Untuk mendukung modifikasi kumpulan data dan operasi pada resource Perubahan, Anda menggunakan kondisi CEL yang lebih komprehensif yang memberikan akses ke resource non-kumpulan data yang diperlukan.

  • Permisif: Mengizinkan semua tindakan administratif DNS lainnya. Opsi ini setara dengan Opsi 2 jika peran pelengkap berisi semua izin administratif standar lainnya. cel (resource.type == 'dns.googleapis.com/ResourceRecordSet' && <RRSET_CONDITION>) || (resource.type != 'dns.googleapis.com/ResourceRecordSet')
  • Restriktif: Hanya mengizinkan modifikasi set rekaman dan operasi pada resource Perubahan. Tindakan administratif lainnya, termasuk mencantumkan set data (dns.resourceRecordSets.list) dan menjelaskan zona terkelola, diblokir. cel (resource.type == 'dns.googleapis.com/ResourceRecordSet' && <RRSET_CONDITION>) || (resource.type == 'dns.googleapis.com/Change')

Pendekatan ini direkomendasikan karena tidak memerlukan pembuatan dan pengelolaan peran khusus.

Opsi 2: Pendekatan Peran Kustom

Jika lebih memilih kondisi yang lebih sederhana, Anda dapat memisahkan pengelolaan set rekaman dari tugas administratif lainnya menggunakan dua peran khusus:

  1. DnsRecordSetAdmin: Berisi izin untuk membuat, menghapus, mendapatkan, dan memperbarui set 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.

Membuat Peran Khusus

Durasi: 05:00

[!NOTE] Langkah ini hanya diperlukan jika Anda menggunakan Opsi 2: Pendekatan Peran Kustom. Jika Anda menggunakan Opsi 1: Pendekatan Peran Standar, Anda dapat melewati langkah ini.

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

Menentukan set 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 Persis Data

Durasi: 05:00

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

Buat zona terkelola

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

Buat 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

Pilih salah satu opsi berikut untuk menerapkan kebijakan.

Opsi ini menggunakan peran dns.admin standar dengan kondisi permisif.

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

Opsi 2: Pendekatan Peran Kustom

Opsi ini menggunakan peran kustom yang Anda buat pada langkah sebelumnya.

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

Memverifikasi pembatasan

Coba buat rekaman yang diizinkan, lalu coba buat rekaman yang tidak sah.

# 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 semua data dalam subdomain p.example.com..

Perbarui kebijakan IAM

Pilih salah satu opsi berikut untuk memperbarui kebijakan.

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

Opsi 2: Pendekatan Peran Kustom

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

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 tanda --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 record yang tidak sah, 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 (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}

Selamat

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

Ringkasan yang telah kita bahas

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

Bacaan lebih lanjut