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-updateiş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:
- DnsRecordSetAdmin: Kaynak kayıt kümelerini oluşturma, silme, alma ve güncelleme izinlerini içerir. Bu rol koşullu olarak verilir.
- 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-updateişaretini kullandık.