أذونات IAM الدقيقة لمجموعات السجلات في Cloud DNS


يوضّح هذا الدرس التطبيقي حول الترميز كيفية تنفيذ التحكّم الدقيق في الوصول إلى مجموعات سجلّات نظام أسماء النطاقات الفردية ضمن Cloud DNS باستخدام "شروط إدارة الهوية وإمكانية الوصول" والأدوار المخصّصة.

مقدمة

تتيح خدمة Cloud DNS عادةً ضبط أذونات "إدارة الهوية وإمكانية الوصول" على مستوى المشروع والمنطقة المُدارة. ويوفّر ذلك وصولاً واسع النطاق إلى جميع السجلّات ضمن منطقة معيّنة. ومع ذلك، لا يفي هذا الإجراء بـ "مبدأ منح أقل الامتيازات" للمؤسسات الكبيرة.

سيرشدك هذا الدرس التطبيقي حول الترميز إلى كيفية ضبط أذونات "إدارة الهوية وإمكانية الوصول" لكل مجموعة سجلّات في Cloud DNS. تتيح لك هذه الميزة تفويض إدارة نطاقات فرعية أو أنواع سجلّات معيّنة إلى فِرق مختلفة ضمن منطقة مُدارة مشترَكة واحدة.

المواضيع التي ستتعرّف عليها

  • كيفية استخدام "شروط إدارة الهوية وإمكانية الوصول" لتقييد إدارة سجلّات نظام أسماء النطاقات
  • أسباب إنشاء الأدوار المخصّصة وكيفية إنشائها
  • كيفية تفويض النطاقات الفرعية وأنواع السجلّات المحدّدة (على سبيل المثال: A وMX)
  • كيفية التعامل مع معاملات نظام أسماء النطاقات التي تتضمّن أذونات مشروطة باستخدام العلامة ‎--skip-soa-update

المتطلبات الأساسية

  • حساب Google
  • مشروع على Google Cloud تم تفعيل الفوترة فيه
  • أحدث إصدار من Google Cloud CLI مثبَّت ومضبوط
  • فهم أساسي لمفاهيم نظام أسماء النطاقات وإدارة الهوية وإمكانية الوصول

الإعداد

المدة: 03:00

تفعيل Cloud DNS API

سجِّل الدخول إلى gcloud CLI وفعِّل واجهة برمجة التطبيقات.

gcloud auth login
gcloud services enable dns.googleapis.com

إنشاء مشروع تجريبي

إذا لم يكن لديك مشروع جاهز، أنشئ مشروعًا الآن واضبط إعدادات gcloud على المشروع لكي تستهدفه جميع الأوامر.

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

فهم طريقة استخدام الأدوار المخصّصة

المدة: 02:00

لا يمكنك ربط شروط "إدارة الهوية وإمكانية الوصول" مباشرةً بالدور العادي roles/dns.admin. بدلاً من ذلك، عليك فصل إدارة مجموعة السجلّات عن المهام الإدارية الأخرى باستخدام دورَين مخصّصَين:

  1. DnsRecordSetAdmin: يحتوي على أذونات لإنشاء مجموعات سجلّات الموارد وحذفها والحصول عليها وتعديلها. سيتم منح هذا الدور بشكلٍ مشروط.
  2. DnsNonRecordSetAdmin: يحتوي على جميع أذونات إدارة نظام أسماء النطاقات الأخرى (مثل إدارة المناطق وإدراج السجلّات وعرض تفاصيل المشروع). سيتم منح هذا الدور بشكلٍ غير مشروط.

من خلال تقسيم هذَين الدورَين، يمكنك التأكّد من استيفاء عمليات التحقّق من المتطلبات الأساسية التي تنفّذها Cloud DNS (مثل dns.changes.create) بشكلٍ غير مشروط، بينما يتم التحكّم في تعديلات السجلّات الفعلية بشكلٍ صارم من خلال الشروط التي تحدّدها.

إنشاء الأدوار المخصّصة

المدة: 05:00

نفِّذ الأوامر التالية لإنشاء الأدوار المخصّصة المطلوبة في مشروعك.

تحديد مجموعات الأذونات

# 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

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: المطابقة التامة للسجلّ

المدة: 05:00

في هذا السيناريو، تريد منح فريق إذن إدارة سجلّ A فقط للنطاق api.example.com..

إنشاء منطقة مُدارة

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

إنشاء حساب خدمة تجريبي

ستستخدم حساب الخدمة هذا للتحقّق من الأذونات المقيّدة.

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"

تطبيق سياسة "إدارة الهوية وإمكانية الوصول" المشروطة

امنح DnsNonRecordSetAdmin بشكلٍ غير مشروط و DnsRecordSetAdmin مع شرط.

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

التحقّق من التقييد

حاوِل إنشاء السجلّ المسموح به، ثم حاوِل إنشاء سجلّ غير مسموح به.

# 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: تفويض النطاق الفرعي

المدة: 05:00

لنمنح الآن إذن إدارة أي سجلّ ضمن النطاق الفرعي p.example.com..

تعديل سياسة "إدارة الهوية وإمكانية الوصول"

عدِّل الشرط لاستخدام resource.name.extract() لمطابقة لاحقة النطاق الفرعي.

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

التحقّق من التفويض

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

السيناريو 3: التغييرات والمعاملات المجمّعة

المدة: 03:00

عند استخدام الأذونات المشروطة، هناك تفصيل مهم للمعاملات. تحاول معاملات نظام أسماء النطاقات تلقائيًا تعديل سجلّ SOA. إذا كان شرط "إدارة الهوية وإمكانية الوصول" يسمح للمستخدمين بإدارة سجلّات معيّنة فقط (مثل api.example.com.)، ستفشل المعاملة لأنّه لا يحق للمستخدم تعديل سجلّ SOA.

العلامة ‎`--skip-soa-update`

لتعديل السجلّات المسموح بها ضمن معاملة، عليك إما السماح بتعديلات سجلّ `SOA` من خلال تعديل الشرط وفقًا لذلك (`resource.name.endsWith('/SOA')`) أو استخدام العلامة ‎--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}

ملاحظة: إذا كانت المعاملة تحتوي على تعديل واحد على الأقل لسجلّ غير مسموح به، سيتم رفض المعاملة بأكملها.

تَنظيم

المدة: 01:00

احذف الموارد التي تم إنشاؤها في هذا المختبر لتجنُّب تحمُّل رسوم.

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

تهانينا

تهانينا! لقد تعلّمت بنجاح كيفية تنفيذ أذونات "إدارة الهوية وإمكانية الوصول" الدقيقة لكل مجموعة سجلّات في Cloud DNS.

ملخّص المواضيع التي تناولناها

  • أنشأنا أدوارًا مخصّصة لفصل أذونات مجموعة السجلّات عن المهام الإدارية على مستوى المنطقة.
  • نفّذنا شرط المطابقة التامة لأسماء وأنواع سجلّات معيّنة.
  • نفّذنا تفويض النطاق الفرعي باستخدام استخراج السلسلة في شروط "إدارة الهوية وإمكانية الوصول".
  • استخدمنا العلامة ‎--skip-soa-update للسماح للمستخدمين الذين لديهم أذونات مشروطة بإجراء تغييرات مجمّعة.

مزيد من المعلومات