रिकॉर्ड सेट के लिए, Cloud DNS की IAM अनुमतियां


इस कोडलैब में, IAM की शर्तों और कस्टम रोल का इस्तेमाल करके, Cloud DNS में अलग-अलग डीएनएस रिकॉर्ड सेट के लिए, सटीक ऐक्सेस कंट्रोल लागू करने का तरीका बताया गया है.

परिचय

Cloud DNS, आम तौर पर प्रोजेक्ट और मैनेज किए गए ज़ोन के लेवल पर IAM अनुमतियां सेट करने की सुविधा देता है. इससे, किसी ज़ोन में मौजूद सभी रिकॉर्ड का ऐक्सेस मिलता है. हालांकि, बड़े कारोबारों के लिए, यह "कम से कम अधिकारों के सिद्धांत" के मुताबिक नहीं है.

इस कोडलैब में, Cloud DNS में हर रिकॉर्ड सेट के लिए IAM अनुमतियां कॉन्फ़िगर करने का तरीका बताया जाएगा. इस सुविधा की मदद से, मैनेज किए गए एक ही ज़ोन में, अलग-अलग टीमों को खास सबडोमेन या रिकॉर्ड टाइप मैनेज करने का ऐक्सेस दिया जा सकता है.

आपको क्या सीखने को मिलेगा

  • डीएनएस रिकॉर्ड के मैनेजमेंट को सीमित करने के लिए, IAM की शर्तों का इस्तेमाल करने का तरीका.
  • कस्टम रोल बनाने की वजह और तरीका.
  • सबडोमेन और खास रिकॉर्ड टाइप (उदाहरण के लिए: A, MX) को डेलिगेट करने का तरीका.
  • --skip-soa-update फ़्लैग का इस्तेमाल करके, शर्तों के साथ दी गई अनुमतियों की मदद से, डीएनएस के लेन-देन को मैनेज करने का तरीका.

ज़रूरी शर्तें

  • एक Google खाता
  • बिलिंग की सुविधा वाला Google Cloud प्रोजेक्ट
  • Google Cloud CLI का नया वर्शन इंस्टॉल और कॉन्फ़िगर किया गया हो
  • डीएनएस और IAM के कॉन्सेप्ट की बुनियादी जानकारी

सेट अप करना

अवधि: 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

IAM की शर्तों को, स्टैंडर्ड 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}"

Scenario 1: Exact Record Match

अवधि: 05:00

इस स्थिति में, आपको किसी टीम को सिर्फ़ api.example.com. के लिए A रिकॉर्ड मैनेज करने की अनुमति देनी है.

मैनेज किया गया ज़ोन बनाना

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"

शर्तों के साथ IAM की नीति लागू करना

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}

Scenario 2: Subdomain Delegation

अवधि: 05:00

अब, p.example.com. सबडोमेन में मौजूद किसी भी रिकॉर्ड को मैनेज करने की अनुमति दें.

IAM की नीति अपडेट करना

सबडोमेन के सफ़िक्स से मैच करने के लिए, 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}

Scenario 3: Batch Changes and Transactions

अवधि: 03:00

शर्तों के साथ दी गई अनुमतियों का इस्तेमाल करते समय, लेन-देन के लिए एक ज़रूरी जानकारी होती है. डिफ़ॉल्ट रूप से, डीएनएस के लेन-देन में SOA रिकॉर्ड को अपडेट करने की कोशिश की जाती है. अगर IAM की शर्त के तहत, उपयोगकर्ताओं को सिर्फ़ खास रिकॉर्ड (जैसे, api.example.com.) मैनेज करने की अनुमति मिलती है, तो लेन-देन पूरा नहीं हो पाएगा. ऐसा इसलिए, क्योंकि उपयोगकर्ता के पास SOA रिकॉर्ड में बदलाव करने की अनुमति नहीं है.

--skip-soa-update फ़्लैग

किसी लेन-देन में अनुमति वाले रिकॉर्ड में बदलाव करने के लिए, आपको या तो अपनी शर्त में बदलाव करके, एसओए अपडेट की अनुमति देनी चाहिए (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 में, हर रिकॉर्ड सेट के लिए सटीक IAM अनुमतियां लागू करने का तरीका सीख लिया है.

हमने क्या-क्या कवर किया, इसकी खास जानकारी

  • रिकॉर्ड-सेट की अनुमतियों को ज़ोन-लेवल के एडमिन टास्क से अलग करने के लिए, कस्टम रोल बनाए.
  • खास रिकॉर्ड के नामों और टाइप के लिए, पूरी तरह मेल खाने वाली शर्त लागू की.
  • IAM की शर्तों में स्ट्रिंग एक्सट्रैक्शन का इस्तेमाल करके, सबडोमेन डेलिगेशन लागू किया.
  • शर्तों के साथ दी गई अनुमतियों वाले उपयोगकर्ताओं को बैच में बदलाव करने की अनुमति देने के लिए, --skip-soa-update फ़्लैग का इस्तेमाल किया.

ज़्यादा जानकारी