Kayıt kümeleri için Cloud DNS ayrıntılı IAM izinleri


Bu codelab'de, IAM koşullarını ve özel rolleri kullanarak Cloud DNS'teki bağımsız DNS kayıt kümeleri için ayrıntılı erişim denetiminin nasıl uygulanacağı gösterilmektedir.

Giriş

Cloud DNS, geleneksel olarak proje ve yönetilen bölge düzeylerinde IAM izinlerinin ayarlanmasını destekler. Bu, bir bölgedeki tüm kayıtlara geniş kapsamlı erişim sağlar. Ancak büyük kuruluşlar için bu durum "en az ayrıcalık ilkesi"ni karşılamaz.

Bu codelab, Cloud DNS'te kayıt kümesi başına IAM izinlerini yapılandırma konusunda size yol gösterecektir. Bu özellik, belirli alt alan adlarının veya kayıt türlerinin yönetimini tek bir paylaşılan yönetilen bölge içindeki farklı ekiplere devretmenize olanak tanır.

Neler öğreneceksiniz?

  • DNS kaydı yönetimini kısıtlamak için IAM koşullarını kullanma
  • Özel roller oluşturmanın nedenleri ve yöntemleri.
  • Alt alan adlarını ve belirli kayıt türlerini (ör. A, MX) nasıl temsilciye devredeceğinizi öğrenin.
  • --skip-soa-update işaretini kullanarak koşullu izinlerle DNS işlemlerini işleme

Ön koşullar

  • Bir Google Hesabı
  • Faturalandırmanın etkin olduğu bir Google Cloud projesi
  • Google Cloud CLI'nin en son sürümü yüklü ve yapılandırılmış olmalıdır.
  • DNS ve IAM kavramları hakkında temel bilgi

Hazırlanma

Süre: 03:00

Cloud DNS API'yi etkinleştirme

gcloud CLI'ye giriş yapın ve API'yi etkinleştirin.

gcloud auth login
gcloud services enable dns.googleapis.com

Test projesi oluşturma

Hazır bir projeniz yoksa hemen bir proje oluşturun ve gcloud yapılandırmanızı projeye ayarlayın. Böylece tüm komutlar bu projeyi hedefler.

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

Özel Rol Yaklaşımını Anlama

Süre: 02:00

IAM koşullarını doğrudan standart roles/dns.admin rolüne bağlayamazsınız. Bunun yerine, iki özel rol kullanarak kayıt kümesi yönetimini diğer yönetim görevlerinden ayırmanız gerekir:

  1. DnsRecordSetAdmin: Kaynak kayıt kümelerini oluşturma, silme, alma ve güncelleme izinlerini içerir. Bu rol koşullu olarak verilir.
  2. DnsNonRecordSetAdmin: Diğer tüm DNS yönetim izinlerini (ör. bölgeleri yönetme, kayıtları listeleme ve proje ayrıntılarını görüntüleme) içerir. Bu rol koşulsuz olarak verilir.

Bu rolleri ayırarak Cloud DNS tarafından gerçekleştirilen ön koşul kontrollerinin (ör. dns.changes.create) koşulsuz olarak karşılanmasını sağlarken gerçek kayıt değişiklikleri koşullarınız tarafından sıkı bir şekilde kontrol edilir.

Özel roller oluşturma

Süre: 05:00

Projenizde gerekli özel rolleri oluşturmak için aşağıdaki komutları çalıştırın.

İzin kümelerini tanımlama

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

Gcloud'da rolleri oluşturma

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

1. senaryo: Tam kayıt eşleşmesi

Süre: 05:00

Bu senaryoda, bir ekibe yalnızca api.example.com. için A kaydını yönetme izni vermek istiyorsunuz.

Yönetilen bölge oluşturma

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

Test hizmet hesabı oluşturma

Kısıtlanmış izinleri doğrulamak için bu hizmet hesabını kullanırsınız.

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"

Koşullu IAM politikasını uygulama

DnsNonRecordSetAdmin koşulsuz ve DnsRecordSetAdmin koşullu olarak verilir.

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

Kısıtlamayı doğrulama

İzin verilen kaydı oluşturmayı deneyin, ardından yetkisiz bir kayıt oluşturmayı deneyin.

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

2. Senaryo: Alt Alan Adı Temsili

Süre: 05:00

Şimdi p.example.com. alt alanında herhangi bir kaydı yönetme izni verelim.

IAM politikasını güncelleme

Alt alan adı sonekiyle eşleşmesi için koşulu resource.name.extract() kullanacak şekilde değiştirin.

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

Temsil yetkisini doğrulama

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

Senaryo 3: Toplu Değişiklikler ve İşlemler

Süre: 03:00

Koşullu izinleri kullanırken işlemler için önemli bir ayrıntı vardır. Varsayılan olarak, DNS işlemleri SOA kaydını güncellemeye çalışır. IAM koşulunuz yalnızca kullanıcıların belirli kayıtları (ör. api.example.com.) yönetmesine izin veriyorsa kullanıcı SOA kaydını değiştirmeye yetkili olmadığından işlem başarısız olur.

--skip-soa-update işareti

Bir işlemdeki izin verilen kayıtları değiştirmek için koşulunuzu buna göre değiştirerek (resource.name.endsWith('/SOA')) SOA güncellemelerine izin vermeli veya --skip-soa-update işaretini kullanmalısınız.

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}

Not: Bir işlemde tek bir yetkisiz kayıt değişikliği olsa bile işlemin tamamı reddedilir.

Temizleme

Süre: 01:00

Ücretlendirilmemek için bu laboratuvarda oluşturulan kaynakları silin.

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

Tebrikler

Tebrikler! Cloud DNS'te ayrıntılı, kayıt kümesi başına IAM izinlerini nasıl uygulayacağınızı öğrendiniz.

İşlediğimiz konuların özeti

  • Kayıt kümesi izinlerini bölge düzeyindeki yönetim görevlerinden ayırmak için özel roller oluşturuldu.
  • Belirli kayıt adları ve türleri için tam eşleme koşulu uygulandı.
  • IAM koşullarında dize ayıklama kullanarak alt alan adı temsilini uyguladık.
  • Koşullu kullanıcıların toplu değişiklik yapmasına izin vermek için --skip-soa-update işaretini kullandık.

Daha fazla bilgi