রেকর্ড সেটের জন্য ক্লাউড ডিএনএস গ্র্যানুলার আইএএম অনুমতি


এই কোডল্যাবটিতে দেখানো হয়েছে কিভাবে IAM কন্ডিশন এবং কাস্টম রোল ব্যবহার করে ক্লাউড ডিএনএস-এর মধ্যে স্বতন্ত্র ডিএনএস রেকর্ড সেটের জন্য সূক্ষ্ম অ্যাক্সেস কন্ট্রোল প্রয়োগ করা যায়।

ভূমিকা

ঐতিহ্যগতভাবে ক্লাউড ডিএনএস প্রজেক্ট এবং ম্যানেজড জোন লেভেলে আইএএম পারমিশন সেট করা সমর্থন করে। এর মাধ্যমে একটি জোনের মধ্যে থাকা সমস্ত রেকর্ডে ব্যাপক অ্যাক্সেস পাওয়া যায়। তবে, বৃহৎ প্রতিষ্ঠানগুলোর ক্ষেত্রে এটি 'সর্বনিম্ন বিশেষাধিকারের নীতি' পূরণ করে না।

এই কোডল্যাবটি আপনাকে ক্লাউড ডিএনএস-এ প্রতি-রেকর্ড-সেট আইএএম পারমিশন কনফিগার করার পদ্ধতি দেখাবে। এই ফিচারটি আপনাকে একটিমাত্র শেয়ার্ড ম্যানেজড জোনের মধ্যে বিভিন্ন টিমের কাছে নির্দিষ্ট সাবডোমেইন বা রেকর্ড টাইপের ব্যবস্থাপনার দায়িত্ব অর্পণ করার সুযোগ দেয়।

আপনি যা শিখবেন

  • DNS রেকর্ড ব্যবস্থাপনা সীমাবদ্ধ করতে IAM কন্ডিশন কীভাবে ব্যবহার করবেন
  • কেন এবং কীভাবে কাস্টম রোল তৈরি করবেন।
  • কীভাবে সাবডোমেইন এবং নির্দিষ্ট রেকর্ড টাইপ (যেমন: A, MX) ডেলিগেট করতে হয়।
  • --skip-soa-update ফ্ল্যাগ ব্যবহার করে শর্তসাপেক্ষ অনুমতিসহ ডিএনএস লেনদেন কীভাবে পরিচালনা করবেন।

পূর্বশর্ত

  • একটি গুগল অ্যাকাউন্ট
  • বিলিং সক্ষম একটি গুগল ক্লাউড প্রজেক্ট
  • Google Cloud CLI- এর সর্বশেষ সংস্করণ ইনস্টল এবং কনফিগার করা হয়েছে
  • DNS এবং IAM ধারণা সম্পর্কে প্রাথমিক জ্ঞান

প্রস্তুতি নেওয়া হচ্ছে

সময়কাল: ০৩:০০

ক্লাউড ডিএনএস এপিআই সক্রিয় করুন

gcloud CLI-তে লগ ইন করুন এবং API-টি সক্রিয় করুন।

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

কাস্টম রোল অ্যাপ্রোচ বোঝা

সময়কাল: ০২:০০

আপনি সরাসরি স্ট্যান্ডার্ড roles/dns.admin রোলের সাথে IAM শর্তাবলী যুক্ত করতে পারবেন না। এর পরিবর্তে, আপনাকে দুটি কাস্টম রোল ব্যবহার করে রেকর্ড সেট ব্যবস্থাপনাকে অন্যান্য প্রশাসনিক কাজ থেকে আলাদা করতে হবে:

  1. DnsRecordSetAdmin : রিসোর্স রেকর্ড সেট তৈরি, মুছে ফেলা, গ্রহণ এবং হালনাগাদ করার অনুমতি এই রোলের রয়েছে। এই রোলটি শর্তসাপেক্ষে প্রদান করা হবে।
  2. DnsNonRecordSetAdmin : এর মধ্যে অন্যান্য সকল DNS প্রশাসনিক অনুমতি অন্তর্ভুক্ত (যেমন জোন পরিচালনা, রেকর্ড তালিকাভুক্ত করা এবং প্রকল্পের বিবরণ দেখা)। এই ভূমিকাটি শর্তহীনভাবে প্রদান করা হবে।

এই ভূমিকাগুলো বিভক্ত করার মাধ্যমে, আপনি নিশ্চিত করেন যে ক্লাউড ডিএনএস দ্বারা সম্পাদিত পূর্বশর্ত যাচাইগুলো (যেমন dns.changes.create ) নিঃশর্তভাবে পূরণ হয়, এবং একই সাথে প্রকৃত রেকর্ড পরিবর্তনগুলো আপনার শর্তাবলী দ্বারা কঠোরভাবে নিয়ন্ত্রিত হয়।

কাস্টম রোল তৈরি করা

সময়কাল: ০৫:০০

আপনার প্রোজেক্টে প্রয়োজনীয় কাস্টম রোলগুলো তৈরি করতে নিম্নলিখিত কমান্ডগুলো চালান।

অনুমতি সেটগুলি সংজ্ঞায়িত করুন

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

দৃশ্যকল্প ১: হুবহু রেকর্ড মিল

সময়কাল: ০৫:০০

এই পরিস্থিতিতে, আপনি একটি টিমকে শুধুমাত্র 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}

দৃশ্যকল্প ২: সাবডোমেইন প্রতিনিধিদল

সময়কাল: ০৫:০০

এখন, 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}

দৃশ্যকল্প ৩: ব্যাচ পরিবর্তন এবং লেনদেন

সময়কাল: ০৩:০০

শর্তসাপেক্ষ অনুমতি ব্যবহার করার সময়, ট্রানজ্যাকশনের ক্ষেত্রে একটি গুরুত্বপূর্ণ বিষয় রয়েছে। ডিফল্টরূপে, DNS ট্রানজ্যাকশনগুলো SOA রেকর্ড আপডেট করার চেষ্টা করে। যদি আপনার IAM শর্ত ব্যবহারকারীদের শুধুমাত্র নির্দিষ্ট রেকর্ড (যেমন 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}

দ্রষ্টব্য: কোনো লেনদেনে একটিও অননুমোদিত রেকর্ড পরিবর্তন থাকলে, সম্পূর্ণ লেনদেনটি বাতিল করা হবে।

পরিষ্কার করা

সময়কাল: ০১:০০

চার্জ এড়াতে এই ল্যাবে তৈরি করা রিসোর্সগুলো মুছে ফেলুন।

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

অভিনন্দন

অভিনন্দন! আপনি সফলভাবে শিখেছেন কিভাবে ক্লাউড ডিএনএস-এ প্রতিটি রেকর্ড সেটের জন্য সুনির্দিষ্ট আইএএম অনুমতি প্রয়োগ করতে হয়।

আমরা যা যা আলোচনা করেছি তার সারসংক্ষেপ

  • জোন-স্তরের প্রশাসনিক কাজ থেকে রেকর্ড-সেট অনুমতি পৃথক করার জন্য কাস্টম রোল তৈরি করা হয়েছে।
  • নির্দিষ্ট রেকর্ড নাম এবং প্রকারের জন্য একটি সঠিক মিলের শর্ত প্রয়োগ করা হয়েছে।
  • IAM শর্তাবলীতে স্ট্রিং নিষ্কাশন ব্যবহার করে সাবডোমেইন ডেলিগেশন বাস্তবায়ন করা হয়েছে।
  • শর্তসাপেক্ষ ব্যবহারকারীদের ব্যাচ পরিবর্তন করার অনুমতি দিতে --skip-soa-update ফ্ল্যাগটি ব্যবহার করা হয়েছে।

আরও পড়ুন