সরাসরি পর্বে যান
পর্ব ৩১ · ৮১-এর মধ্যে · মডিউল ৬

Cloud IAM — identity, role, policy আর temporary credential

Cloud IAM — Identity, Roles, Policies and Temporary Credentials

Taught in Bangla, this lesson separates authentication from authorization, reads requests as principal, action, resource and condition, explains users, groups, roles and service accounts across AWS, Azure and Google Cloud, walks through a policy document, compares long-lived keys with temporary credentials, covers role assumption, the confused deputy problem, workload identity, SSO, MFA and break-glass access, and safely removes old keys, with a simulator.

এই পর্বে যা শিখবেন

  • Authentication আর authorization আলাদা করা, আর principal-action-resource-condition দিয়ে অনুরোধ পড়া
  • User, group, role আর service account-এর কাজ, আর AWS, Azure ও Google Cloud-এর মডেলের পার্থক্য
  • একটি policy document লাইন ধরে পড়া, আর group থেকে আসল অনুমতি বের করা
  • Role assume করা, token-এর মেয়াদ, confused deputy আর external ID
  • VM, Kubernetes আর CI-কে key ছাড়া পরিচয় দেওয়া
  • মানুষের জন্য SSO, MFA, break-glass আর access review সাজানো, আর স্থায়ী key নিরাপদে সরানো

১ · দুটি প্রশ্ন — আপনি কে, আর আপনি কী করতে পারেন

পর্ব ২৫ থেকে ৩০ পর্যন্ত আমরা network সাজিয়েছি। সেখানে প্রশ্ন ছিল packet কোথায় যাবে। এই মডিউলে প্রশ্ন বদলাচ্ছে: কে কী করতে পারবে। Cloud-এ VM বানানো, bucket মোছা, database খোলা, সবই একটি API call. আর প্রতিটি API call-এর আগে একটি পাহারাদার সিদ্ধান্ত নেয়। সেই পাহারাদারই IAM.

গার্মেন্টস কারখানার গেট: সকালে গেটে কার্ড পাঞ্চ করে আপনি প্রমাণ করলেন, আপনি রহিমা, ৪৫১ নম্বর কর্মী। এটি পরিচয় যাচাই। ভেতরে ঢুকে আপনি কাটিং সেকশনে যেতে পারেন, কিন্তু হিসাব বিভাগের আলমারি খুলতে পারেন না। এটি অনুমতি। কার্ড ঠিক থাকলেও আলমারি বন্ধই থাকবে।

এই দুই কাজের নাম:

  • Authentication (সংক্ষেপে authn): আপনি যা দাবি করছেন, আপনি কি তা-ই? প্রমাণ হতে পারে password, MFA কোড, স্বাক্ষরিত অনুরোধ বা token.
  • Authorization (সংক্ষেপে authz): পরিচয় মেনে নেওয়ার পর, এই কাজটি কি আপনি করতে পারেন?

Web-এর ভাষায় পার্থক্যটি status code-এও দেখা যায়। 401 মানে পরিচয় প্রমাণ হয়নি। 403 মানে পরিচয় চেনা গেছে, কিন্তু অনুমতি নেই। তাই AccessDenied দেখলে password বদলে লাভ নেই। সমস্যা policy-তে।

প্রতিটি অনুরোধের চার অংশ

সব cloud-এর IAM মূলত চারটি প্রশ্নের উত্তর মেলায়। একটি বাক্যে: “নাদিয়া (কে) পড়তে (কী) চান reports ফোল্ডারের ফাইল (কোনটি), অফিসের network থেকে (কোন শর্তে)।”

অংশপ্রশ্নউদাহরণ
Principalকে অনুরোধ করছে?একজন মানুষ, একটি VM-এর role, একটি CI job
Actionকোন কাজ?s3:GetObject, storage.objects.get
Resourceকোন জিনিসে?একটি bucket, VM বা database
Conditionকোন শর্তে?MFA আছে কি না, কোন network, কোন সময়

একটি অনুমতির সিদ্ধান্ত

Principal → Policy decision → Resource

Principal থেকে policy decision হয়ে resource পর্যন্ত একটি অনুরোধের পথ Principal · কে? মানুষ · VM-এর role · CI job action + resource + context Policy decision · cloud-এর IAM ১ · Authentication স্বাক্ষর ঠিক? মেয়াদ আছে? ২ · Authorization Policy মিলিয়ে দেখা কোনো মিল না পেলে উত্তর deny Policy থাকে পরিচয়ে, resource-এ, বা scope-এ বিস্তারিত হিসাব পর্ব ৩২-এ DENY ALLOW 403 AccessDenied resource কিছুই জানে না Resource bucket · VM · database Audit log কে, কী, কোনটিতে, কখন, ফল কী
ছবি ৩১.১ — পাহারাদার resource-এর সামনে বসে। Deny হলে অনুরোধ resource পর্যন্ত পৌঁছায়ই না।

ছবির সবচেয়ে গুরুত্বপূর্ণ কথাটি হলো default deny: কিছু না লেখা থাকলে উত্তর “না”। নতুন পরিচয়ের কোনো ক্ষমতা নেই। এখানেই least privilege শুরু হয়: যতটুকু কাজ, ঠিক ততটুকু অনুমতি।

একটি সীমারেখা: এই পর্বের IAM হলো আপনার দল আর আপনার সফটওয়্যারের cloud ব্যবহারের নিয়ন্ত্রণ। আপনার অ্যাপের ক্রেতাদের login আলাদা বিষয়। সার্ভারের ভেতরের Linux permission-ও আলাদা স্তর (পর্ব ৮). গভীর তত্ত্ব পাবেন Operating Systems · Protection পর্বে।

২ · চার চরিত্র — user, group, role আর service account

পর্ব ৬-এ (Cloud ব্যবহারের পথ) দেখেছেন, root বা owner account প্রতিদিনের কাজে ব্যবহার করা ঠিক নয়। তাহলে প্রতিদিনের কাজ হবে কোন পরিচয়ে? চারটি চরিত্র আছে।

User

একজন মানুষ বা একটি স্থায়ী পরিচয়। নিজের password বা key থাকে। অফিসের নামফলকের মতো।

Group

Userদের দল। পরিচয় নয়, অনুমতি দেওয়ার সুবিধা। “হিসাব বিভাগ”-কে একবার অনুমতি দিলে সবাই পান।

Role

নিজের স্থায়ী password নেই। যাকে অনুমতি দেওয়া আছে, সে কিছু সময়ের জন্য এটি “পরে” নেয়। ডিউটির ইউনিফর্মের মতো।

Service account

মানুষ নয়, প্রোগ্রামের পরিচয়। রাতের হিসাব-মেলানোর কাজটি যে পরিচয়ে চলে।

একটি নিয়ম প্রায় সব জায়গায় খাটে: অনুমতি মানুষকে নয়, group বা role-কে দিন। কর্মী বদলালে শুধু সদস্যপদ বদলায়, policy-তে হাত দিতে হয় না। এই ধারণাটিই RBAC.

নামগুলো সব cloud-এ এক নয়। AWS-এ “service account” নামে আলাদা কিছু নেই, সাধারণত role ব্যবহার হয়। Google Cloud-এ service account একটি আসল resource. Azure-এ মেশিনের পরিচয় হলো service principal বা managed identity. আর Kubernetes-এর ServiceAccount আরেকটি জিনিস, যা cluster-এর ভেতরে থাকে।

৩ · তিন cloud, দুই ভাবনা — policy বনাম role assignment

প্রথমে মূল পার্থক্যটি দুই লাইনে দেখুন। AWS-এ আপনি সাধারণত একটি JSON নিয়মের কাগজ লিখে পরিচয়ের গায়ে লাগান। Azure আর Google Cloud-এ আপনি বলেন: “এই পরিচয়কে, এই জায়গায়, এই role দিলাম।” প্রথমটিকে বলে identity policy, দ্বিতীয়টিকে scope-এ role assignment.

দুই রকম অফিস: এক অফিসে প্রত্যেকের হাতে একটি তালিকা: “এই ঘরগুলোয় ঢুকতে পারবেন।” এটি identity policy. আরেক অফিসে প্রতিটি তলার রেজিস্টারে লেখা: “তৃতীয় তলায় রহিমা হিসাবরক্ষক।” এটি scope-এ role assignment. দুটিই কাজ করে, তবে খোঁজার জায়গা আলাদা।

বিষয়AWS IAMAzure RBAC ও Entra IDGoogle Cloud IAM
পরিচয় কোথায়Account-এর IAM, মানুষের জন্য IAM Identity CenterEntra ID (আগের নাম Azure AD)Google account, Cloud Identity বা Workspace
অনুমতি বসে কীভাবেJSON policy, পরিচয়ে বা resource-এRole assignment: principal + role + scopeResource-এর allow policy-তে binding: member + role
“Role” মানেAssume করার মতো একটি পরিচয়অনুমতির তালিকাঅনুমতির তালিকা
উত্তরাধিকারOrganization-এর guardrail আছে, তবে policy নিজে ওপর থেকে নামে নাManagement group → subscription → resource group → resourceOrganization → folder → project → resource
মেশিনের পরিচয়Instance role, অন্য service-এর roleManaged identity, service principalService account
স্পষ্ট denyPolicy-তে Deny আছেDeny assignment আছে, ব্যবহার সীমিতআলাদা deny policy আছে

এই তুলনা একটি সরল চিত্র। আসল ব্যবস্থায় ব্যতিক্রম আছে, আর নাম ও সুবিধা বদলায়। যেমন Azure আর Google Cloud-এ শর্তযুক্ত অনুমতি আছে, আর AWS-এও resource-এর নিজের policy আছে। তাই কাজে নামার আগে সেই সময়ের official docs দেখে নিন।

সবচেয়ে পরিচিত ভুল বোঝাবুঝি: AWS-এ অভ্যস্ত কেউ Azure-এ “role” শুনে ভাবেন assume করতে হবে। আসলে সেখানে role শুধু অনুমতির তালিকা। আরেকটি ফাঁদ: Entra ID-র directory role (যেমন Global Administrator) আর Azure resource-এর RBAC role দুটি আলাদা ব্যবস্থা। একটি থাকলেই অন্যটি আসে না।

এক কাজ, তিন cloud-এ। লক্ষ করুন কোথায় scope বলা হচ্ছে।

# উদাহরণ: এখানে চালানোর জন্য নয়। সব নাম ও id ভুয়া।

# AWS: আগে লেখা policy একটি role-এর গায়ে লাগানো
aws iam attach-role-policy \
  --role-name app-reader \
  --policy-arn arn:aws:iam::123456789012:policy/ReportsRead

# Azure: একটি resource group scope-এ role assignment
az role assignment create \
  --assignee 00000000-0000-0000-0000-000000000000 \
  --role "Storage Blob Data Reader" \
  --scope /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg

# Google Cloud: project-এর allow policy-তে একটি binding
gcloud projects add-iam-policy-binding example-project \
  --member="serviceAccount:app-reader@example-project.iam.gserviceaccount.com" \
  --role="roles/storage.objectViewer"

AWS-এর লাইনে resource-এর সীমা লেখা নেই, কারণ সীমা আছে policy-র ভেতরে। Azure-এ --scope সীমা ঠিক করে। Google Cloud-এ যে resource-এর ওপর binding বসে, সেটিই scope. এখানে পুরো project, যা প্রায়ই দরকারের চেয়ে বড়। Bucket-এর ওপর binding বসালে ক্ষমতা ছোট হতো। Scope যত নিচে, blast radius তত ছোট।

৪ · Policy document-এর গঠন — একটি JSON লাইন ধরে পড়া

এবার AWS ধরনের একটি policy পড়ি। কারণ এই JSON বিন্যাস সবচেয়ে বেশি দেখা যায়, আর পর্ব ৩০-এ একটি bucket policy দেখেছেন। লক্ষ্য: একজন শুধু reports/ ফোল্ডারের ফাইল দেখতে ও পড়তে পারবেন।

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ListOnlyReportsFolder",
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::example-bucket",
      "Condition": {
        "StringLike": { "s3:prefix": ["reports/*"] }
      }
    },
    {
      "Sid": "ReadReportFiles",
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::example-bucket/reports/*"
    }
  ]
}

প্রতিটি field-এর মানে নিচের টেবিলে। সবচেয়ে সাধারণ ভুলটি দেখুন: ListBucket কাজ করে bucket-এর ওপর, GetObject কাজ করে ভেতরের object-এর ওপর। তাই Resource দুটি আলাদা। উল্টে দিলে JSON ঠিক থাকলেও অনুমতি কাজ করবে না।

Fieldমানেখেয়াল রাখুন
VersionPolicy ভাষার versionআপনার লেখার তারিখ নয়। এই মানটিই ব্যবহার করুন।
Statementনিয়মের তালিকাএকটি policy-তে একাধিক থাকতে পারে
Sidনিয়মের ঐচ্ছিক নামপড়ার সুবিধার জন্য
EffectAllow বা Denyকোনটি জেতে, তা পর্ব ৩২-এর বিষয়
ActionAPI কাজs3:* মানে সব, এড়িয়ে চলুন
ResourceARN দিয়ে লেখা ঠিকানা"*" মানে সব resource
Conditionঅতিরিক্ত শর্তএখানে prefix সীমিত করা হয়েছে

লক্ষ করুন, এই JSON-এ Principal নেই। কারণ এটি identity policy: যার গায়ে লাগানো, সে-ই principal. Bucket policy-র মতো resource policy-তে কিন্তু Principal লিখতেই হয়, কারণ কাগজটি resource-এর গায়ে।

Group থেকে আসল অনুমতি

একজন মানুষের আসল ক্ষমতা কোনো একটি কাগজে লেখা থাকে না। তাঁর সব group আর সরাসরি লাগানো policy মিলিয়ে যা হয়, সেটিই। এই পর্বে শুধু Allow ধরছি, তাই হিসাবটি একটি union. Action-গুলো বোঝার সুবিধার জন্য বানানো।

// From groups to effective permissions. Allow-only model: Deny comes in lesson 32.
const policies = {
  ReadLogs:     ["logs:Read"],
  StorageRead:  ["storage:GetObject", "storage:ListBucket"],
  RestartApp:   ["compute:RestartService"],
  DbAdmin:      ["db:*"],
  StorageWrite: ["storage:PutObject"],
};
const groups = {
  developers: ["ReadLogs", "StorageRead"],
  oncall:     ["ReadLogs", "RestartApp"],
  dba:        ["DbAdmin"],
};
const users = {
  rafi:   { groups: ["developers"], direct: [] },
  nadia:  { groups: ["developers", "oncall"], direct: [] },
  tanvir: { groups: ["developers", "oncall", "dba"], direct: ["StorageWrite"] },
};
function effective(name) {
  const u = users[name], from = new Map();
  const add = (p, via) => policies[p].forEach((a) =>
    from.set(a, [...(from.get(a) || []), via]));
  u.groups.forEach((g) => groups[g].forEach((p) => add(p, g)));
  u.direct.forEach((p) => add(p, "direct"));
  return from;
}
const can = (perms, action) => [...perms.keys()].some((a) =>
  a === action || (a.endsWith("*") && action.startsWith(a.slice(0, -1))));
for (const name of Object.keys(users)) {
  const e = effective(name);
  console.log(`${name}: ${e.size} permissions, can drop db: ${can(e, "db:DropTable")}`);
  for (const [a, via] of e) console.log(`   ${a.padEnd(23)} from ${via.join(" + ")}`);
}

আউটপুট:

rafi: 3 permissions, can drop db: false
   logs:Read               from developers
   storage:GetObject       from developers
   storage:ListBucket      from developers
nadia: 4 permissions, can drop db: false
   logs:Read               from developers + oncall
   storage:GetObject       from developers
   storage:ListBucket      from developers
   compute:RestartService  from oncall
tanvir: 6 permissions, can drop db: true
   logs:Read               from developers + oncall
   storage:GetObject       from developers
   storage:ListBucket      from developers
   compute:RestartService  from oncall
   db:*                    from dba
   storage:PutObject       from direct

নাদিয়ার logs:Read দুই group থেকে আসছে। তাই শুধু oncall থেকে সরালেও তিনি log পড়তে পারবেন। তানভীরকে দেখুন। তিনটি group, একটি সরাসরি policy, আর db:* থেকে টেবিল মোছার ক্ষমতা। হয়তো তিনি একসময় DBA দলকে সাহায্য করেছিলেন, আর কেউ সরায়নি। সময়ের সাথে এভাবে অনুমতি জমে যাওয়াকে বলে permission creep.

৫ · স্থায়ী key কেন ঝুঁকি, অস্থায়ী credential কেন ভালো

বাড়ির চাবি বনাম ভিজিটর কার্ড: Access key বাড়ির আসল চাবির মতো। হারালে তালা না বদলানো পর্যন্ত বিপদ। Temporary credential অফিসের ভিজিটর কার্ডের মতো: সন্ধ্যায় নিজে থেকেই অচল। কেউ পরদিন পেলেও কিছু খুলবে না।

বিষয়স্থায়ী access keyঅস্থায়ী credential
মেয়াদকেউ না মোছা পর্যন্তমিনিট থেকে কয়েক ঘণ্টা
কোথায় থাকেEnv file, config, CI secret, ডেভেলপারের ল্যাপটপপ্রায়ই শুধু memory-তে
ফাঁস হলেমানুষকে খুঁজে বের করে মুছতে হয়মেয়াদ শেষে নিজে থেকেই অচল
নবায়নহাতে বা নিজের script-এPlatform আর SDK নিজেই করে
Audit logএকই key, অনেক জন ব্যবহার করতে পারেনSession-এর নাম ধরে আলাদা করা যায়

ঝুঁকির সময় আর rotation-এর হিসাব

ধরে নিই, একটি key ফাঁস হলো আর ধরা পড়তে ৩০ দিন লাগল। ঝুঁকির সময় ৩০ × ২৪ = ৭২০ ঘণ্টা। এবার ১ ঘণ্টার token ধরুন। কেউ জারির মুহূর্তেই কপি করলেও তা সর্বোচ্চ ১ ঘণ্টা চলে। পার্থক্য ৭২০ গুণ। এখানে ৩০ দিন একটি অনুমান, আসল সময় প্রতিষ্ঠান-ভেদে আলাদা।

Rotation-এর খাটুনিও হিসাব করুন। ১০০টি key, ৯০ দিনে একবার বদল। বছরে প্রায় ১০০ × ৩৬৫ ÷ ৯০ ≈ ৪০৬ বার। প্রতিবার ২০ মিনিট ধরলে প্রায় ১৩৫ ঘণ্টা। Key rotation ভালো, তবে key না থাকা আরও ভালো।

সৎ সীমা: ছোট মেয়াদ শুধু কপি করা token-এর আয়ু কমায়। কেউ যদি VM-এর ভেতরে ঢুকে থাকে, সে সেখান থেকে নতুন token পেতে থাকবে। তাই role-এর অনুমতিও ছোট রাখতে হয়। মেয়াদ আর অনুমতি, দুটোই লাগে।

যেসব key এখনো আছে, সেগুলোর বয়স নজরে রাখতে হয়। নিচের ছোট auditor একটি কৃত্রিম ঘড়িতে চলে, দিন গোনে। নিয়ম তিনটি: ৪৫ দিন অব্যবহৃত হলে বন্ধ, ৯০ দিন বয়স হলে বদল, নইলে ঠিক আছে।

// A credential age auditor on a simulated clock (days). now = 0 is audit day.
const MAX_AGE = 90, MAX_IDLE = 45;
const keys = [
  { id: "ci-deploy",  born: -200, usedDaily: true },
  { id: "backup-job", born: -70,  usedDaily: true },
  { id: "old-intern", born: -130, lastUsed: -80 },
  { id: "report-bot", born: -10,  usedDaily: true },
];
function verdict(k, now) {
  const age = now - k.born;
  const idle = k.usedDaily ? 0 : now - k.lastUsed;
  if (k.state === "disabled") return `disabled (age ${age})`;
  if (idle >= MAX_IDLE) return `DISABLE idle ${idle}d`;
  if (age >= MAX_AGE) return `ROTATE age ${age}`;
  return `ok age ${age}`;
}
for (let now = 0; now <= 90; now += 30) {
  console.log(`--- day ${now}`);
  for (const k of keys) {
    const v = verdict(k, now);
    console.log(`${k.id.padEnd(11)} ${v}`);
    // the auditor acts: rotate resets the age, idle keys get disabled
    if (v.startsWith("ROTATE")) k.born = now;
    if (v.startsWith("DISABLE")) k.state = "disabled";
  }
}
const live = keys.filter((k) => k.state !== "disabled").length;
console.log(`rotations per year if all ${live} live keys stay: ${(live * 365 / MAX_AGE).toFixed(1)}`);

আউটপুট:

--- day 0
ci-deploy   ROTATE age 200
backup-job  ok age 70
old-intern  DISABLE idle 80d
report-bot  ok age 10
--- day 30
ci-deploy   ok age 30
backup-job  ROTATE age 100
old-intern  disabled (age 160)
report-bot  ok age 40
--- day 60
ci-deploy   ok age 60
backup-job  ok age 30
old-intern  disabled (age 190)
report-bot  ok age 70
--- day 90
ci-deploy   ROTATE age 90
backup-job  ok age 60
old-intern  disabled (age 220)
report-bot  ROTATE age 100
rotations per year if all 3 live keys stay: 12.2

দিন ০-তে ci-deploy-এর বয়স ২০০, তাই বদল। old-intern ৮০ দিন অব্যবহৃত, তাই বন্ধ। লক্ষ করুন, auditor বন্ধ করে, মোছে না। ভুল হলে ফেরা যায়। ৩টি key থাকলেই বছরে প্রায় ১২ বার বদল। প্রতিটি বদলের ঝুঁকি আছে, আর এই বোঝাই role-এর পক্ষে সবচেয়ে বাস্তব যুক্তি।

৬ · Role assume করা — token, মেয়াদ আর confused deputy

Role পরার কাজকে বলে assume role. যে সেবা এই অস্থায়ী credential জারি করে, AWS-এ তার নাম STS (Security Token Service). অন্য cloud-এ একই কাজের অন্য নাম আছে। ধারণাটি এক: পরিচয় প্রমাণ করুন, role চান, মেয়াদসহ একটি প্রমাণ নিন।

একটি role-এর দুটি দরজা থাকে।

  1. Trust policy: কে এই role পরতে পারবে?
  2. Permission policy: role পরার পর কী কী করা যাবে?
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::123456789012:user/nadia" },
      "Action": "sts:AssumeRole",
      "Condition": {
        "Bool": { "aws:MultiFactorAuthPresent": "true" }
      }
    }
  ]
}

এটি trust policy. তাই এখানে Principal আছে: IAM user nadia db-admin পরতে পারবেন, তবে শর্ত হলো অনুরোধে MFA থাকা। SSO বা federation থেকে আসা session-এ এই শর্তের key থাকে না, তাই সেখানে MFA বাধ্যতামূলক করতে হয় IdP-তেই। ভিন্ন account থেকে হলে দুই দিকের অনুমতিই লাগে: আপনার দিকের policy-তে sts:AssumeRole, আর role-এর দিকে এই trust policy.

অনুরোধটি এরকম। নিচের উত্তর নমুনা, কোনো আসল account-এর নয়।

# উদাহরণ: এখানে চালানোর জন্য নয়। Account id আর নাম ভুয়া।
aws sts assume-role \
  --role-arn arn:aws:iam::123456789012:role/db-admin \
  --role-session-name nadia-restore \
  --serial-number arn:aws:iam::123456789012:mfa/nadia \
  --token-code 123456 \
  --duration-seconds 900
{
  "Credentials": {
    "AccessKeyId": "ASIAEXAMPLEEXAMPLE00",
    "SecretAccessKey": "example-not-a-real-secret",
    "SessionToken": "example-session-token",
    "Expiration": "2026-10-31T05:15:00+00:00"
  },
  "AssumedRoleUser": {
    "AssumedRoleId": "AROAEXAMPLEEXAMPLE00:nadia-restore",
    "Arn": "arn:aws:sts::123456789012:assumed-role/db-admin/nadia-restore"
  }
}

নমুনা আউটপুট, version-ভেদে আলাদা হতে পারে। তিনটি জিনিস একসাথে লাগে: key id, secret আর session token. Key id-র শুরুর ASIA বলে এটি অস্থায়ী, স্থায়ী key শুরু হয় AKIA দিয়ে। Audit log-এ nadia-restore নামটি থাকে, তাই বোঝা যায় কে পরেছিলেন। লেখার সময়ে ডিফল্ট মেয়াদ ১ ঘণ্টা, সর্বনিম্ন ১৫ মিনিট, আর role-এর সেটিং অনুযায়ী বেশি হতে পারে। সীমাগুলো docs-এ মিলিয়ে নিন।

একটি খেলনা STS

নিচের simulator-এ কোনো আসল cloud নেই। আছে একটি কৃত্রিম ঘড়ি, যা সেকেন্ড গোনে। পরীক্ষা করা হচ্ছে চারটি জিনিস: মেয়াদের সীমা, অনুমতি, trust আর মেয়াদ ফুরানো।

// A toy STS with a simulated clock. Nothing here talks to a real cloud.
function mulberry32(a) { return () => { a |= 0; a = a + 0x6D2B79F5 | 0;
  let t = Math.imul(a ^ a >>> 15, 1 | a); t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
  return ((t ^ t >>> 14) >>> 0) / 4294967296; }; }
const rand = mulberry32(31);
let clock = 0; // seconds
const roles = {
  "app-reader": { trust: ["vm-17"], maxTtl: 3600, perms: ["storage:GetObject"] },
  "db-admin":   { trust: ["nadia"], maxTtl: 900,  perms: ["db:Restore"] },
};
function assume(who, role, ttl) {
  const r = roles[role];
  if (!r.trust.includes(who)) return console.log(`t=${clock} ${who} -> ${role}: REFUSED, not in trust policy`);
  const life = Math.min(ttl, r.maxTtl);
  const token = "tmp-" + Math.floor(rand() * 0xffffff).toString(16).padStart(6, "0");
  console.log(`t=${clock} ${who} -> ${role}: asked ${ttl}s, got ${life}s, ${token}`);
  return { token, role, exp: clock + life };
}
function call(c, action) {
  let res = "ALLOW";
  if (clock >= c.exp) res = "DENY ExpiredToken";
  else if (!roles[c.role].perms.includes(action)) res = "DENY no permission";
  console.log(`t=${clock} ${c.token} ${action}: ${res}`);
}
let cred = assume("vm-17", "app-reader", 7200);
call(cred, "storage:GetObject");
call(cred, "storage:PutObject");
assume("vm-17", "db-admin", 900);
clock = 3300; const next = assume("vm-17", "app-reader", 3600); // renew 5 min early
clock = 3599; call(cred, "storage:GetObject"); // old token still valid
clock = 3600; call(cred, "storage:GetObject"); // old token dead
call(next, "storage:GetObject"); // new one works

আউটপুট:

t=0 vm-17 -> app-reader: asked 7200s, got 3600s, tmp-ac18f9
t=0 tmp-ac18f9 storage:GetObject: ALLOW
t=0 tmp-ac18f9 storage:PutObject: DENY no permission
t=0 vm-17 -> db-admin: REFUSED, not in trust policy
t=3300 vm-17 -> app-reader: asked 3600s, got 3600s, tmp-d6008e
t=3599 tmp-ac18f9 storage:GetObject: ALLOW
t=3600 tmp-ac18f9 storage:GetObject: DENY ExpiredToken
t=3600 tmp-d6008e storage:GetObject: ALLOW

৭২০০ সেকেন্ড চাইলেও মিলেছে ৩৬০০, কারণ role-এর সীমা সেটুকুই। ভালো token দিয়েও PutObject আটকেছে, কারণ মেয়াদ আর অনুমতি আলাদা প্রশ্ন। db-admin চাওয়া ফিরে গেছে, কারণ trust policy-তে vm-17 নেই। t=3300-এ নতুন token নেওয়া হয়েছে, তাই পুরোনোটি t=3599-এ চললেও আর t=3600-তে মরলেও কাজ থামেনি। নিয়মটি হলো t < exp, তাই ঠিক t=3600-তে token অচল।

মেয়াদ বেছে নেওয়া একটি trade-off. ছোট মেয়াদে ঝুঁকি কম, তবে token সেবার ওপর নির্ভরতা বেশি। আর সাধারণ অবস্থায় জারি করা token মেয়াদের আগে নিজে থেকে বাতিল হয় না। তাই জরুরি অবস্থায় আলাদা ব্যবস্থা লাগে, যেমন AWS-এ পুরোনো session-কে deny করার নিয়ম। বেশিরভাগ কাজে ১৫ মিনিট থেকে ১ ঘণ্টা একটি প্রচলিত শুরু।

Confused deputy — আপনার হয়ে কাজ করা তৃতীয় পক্ষ

ধরুন একটি বাইরের প্রতিষ্ঠান আপনার cloud-এর খরচ বিশ্লেষণ করে দেয়। এজন্য আপনি একটি role বানিয়ে তাদের account-কে trust করলেন। তারা একইভাবে অনেক গ্রাহকের role পরে। এখন অন্য এক গ্রাহক তাদের ফর্মে আপনার role-এর ঠিকানা দিয়ে দিলে কী হবে? বিশ্বস্ত সেবাটি নিজের ক্ষমতা দিয়ে ভুল জনের হয়ে কাজ করতে পারে। একে বলে confused deputy: ক্ষমতাবান সহকারী যে বুঝতে পারে না, সে কার হয়ে কাজ করছে।

গুদামের দারোয়ান: একই দারোয়ান দশটি দোকানের গুদামের চাবি রাখেন। কেউ এসে বললেন, “৭ নম্বর গুদাম খুলুন।” দারোয়ানের চাবি আছে, তিনি খুলে দিলেন, অথচ লোকটি ৭ নম্বরের মালিক নন। সমাধান: মালিকের সাথে আলাদা সংকেত ঠিক করা, যা দারোয়ান প্রতিবার মিলিয়ে নেবেন।

সেই সংকেতটিই external ID. সেবাদাতা প্রতিটি গ্রাহকের জন্য একটি অনন্য মান তৈরি করে দেয়। আপনি সেটি trust policy-র শর্তে বসান। সেবাদাতা role চাওয়ার সময় যে গ্রাহকের কাজ করছে, তারই মান পাঠায়। অন্য গ্রাহকের অনুরোধে অন্য মান যাবে, তাই শর্ত মিলবে না।

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:root" },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": { "sts:ExternalId": "customer-7f3a-example" }
      }
    }
  ]
}

External ID মূলত গোপন কথা নয়, এটি গ্রাহক চেনার একটি শর্ত। তাই মানটি গ্রাহক নিজে না বেছে সেবাদাতা তৈরি করে দিলে ভালো। Cloud-এর নিজের সেবার ক্ষেত্রেও একই সমস্যা আছে। সেখানে source-এর শর্ত লাগে, যেমন পর্ব ৩০-এর AWS:SourceArn. আরেকটি কথা: এই role-কে সবসময় ন্যূনতম অনুমতি দিন, আর কাজ শেষ হলে সরিয়ে ফেলুন।

৭ · Workload identity — মেশিনকে key ছাড়া পরিচয়

প্রোগ্রামকে পরিচয় দেওয়ার পুরোনো পথ ছিল একটি key কোথাও লিখে রাখা। আধুনিক পথকে বলে workload identity: প্রোগ্রাম কোথায় চলছে, সেটিই তার পরিচয়ের প্রমাণ। Platform সেই প্রমাণ দিয়ে অস্থায়ী credential এনে দেয়।

যেখানে চলেপ্রমাণ কীউদাহরণ
VMPlatform জানে কোন VM, metadata service দেয়AWS instance role, Azure managed identity, Google attached service account
Kubernetes podCluster-এর স্বাক্ষর করা ServiceAccount tokenCloud cluster-এর issuer-কে trust করে, token বদলে role দেয়। পর্ব ৪৯-এ Kubernetes-এর নিজের RBAC.
CI jobCI platform-এর স্বাক্ষর করা OIDC tokenCloud শর্ত মেলায়: কোন repository, কোন branch. পর্ব ৬১-এ বিস্তারিত।

শেষ দুটির মূল ধারণা একই: federation. Cloud একটি বাইরের প্রতিষ্ঠানের স্বাক্ষর বিশ্বাস করে। Kubernetes বা CI বলে, “এই job আমার, এর নাম এই।” Cloud স্বাক্ষর আর শর্ত মিলিয়ে অল্প সময়ের credential দেয়। CI-তে কোনো স্থায়ী secret জমা রাখতে হয় না।

VM-এ আসলে কী ঘটে, ধাপে ধাপে দেখুন। সময় আর মেয়াদগুলো উদাহরণ, provider-ভেদে আলাদা। পর্ব ১৫-এ metadata service আর IMDSv2 দেখেছেন।

  1. VMrole: app-reader
  2. SDKcredential খোঁজা
  3. Metadataঅস্থায়ী credential
  4. Storage + IAMসিদ্ধান্ত
অবস্থা
ঘড়ি
Disk-এ key
Memory-তে credential
মেয়াদ শেষ
Storage-এর উত্তর
  1. ধাপ ১ — VM চালু। VM-এর সাথে app-reader role যুক্ত। Image-এ বা disk-এ কোনো key নেই।
  2. ধাপ ২ — SDK খোঁজে। অ্যাপ ফাইল পড়তে চায়। SDK একটি নির্দিষ্ট ক্রমে credential খোঁজে: env, config file, তারপর platform. এই ক্রমকে বলে credential chain. প্রথম দুটিতে কিছু নেই।
  3. ধাপ ৩ — Metadata থেকে credential. IMDSv2-তে আগে session token, তারপর role-এর credential আসে। Memory-তে এলো temp-1, মেয়াদ ১৬:০০ পর্যন্ত।
  4. ধাপ ৪ — স্বাক্ষর করে পাঠানো। SDK secret দিয়ে অনুরোধে স্বাক্ষর করে পাঠায়। Secret নিজে পথে যায় না। Storage উত্তরের অপেক্ষায়।
  5. ধাপ ৫ — সিদ্ধান্ত। IAM দেখে: principal হলো app-reader, action হলো s3:GetObject, আর policy-তে মিল আছে। ফল ALLOW, উত্তর 200 OK.
  6. ধাপ ৬ — নীরবে নবায়ন। ১৫:৪০-এ, মেয়াদ শেষের ২০ মিনিট আগে, SDK নতুন temp-2 আনে। অ্যাপ restart হয়নি, disk-এ তখনো কোনো key নেই।

একটি ফাঁদ: ধাপ ২-এর ক্রম খেয়াল করুন। AWS SDK-তে সাধারণত env variable আগে আসে। তাই VM-এ role থাকলেও পুরোনো AWS_ACCESS_KEY_ID রয়ে গেলে SDK সেই key-ই ব্যবহার করবে। অন্য SDK আর cloud-এ ক্রম আলাদা হতে পারে। সন্দেহ হলে দেখুন আসল পরিচয় কী দেখাচ্ছে, যেমন aws sts get-caller-identity.

আরেকটি কথা। Instance role সেই VM-এর সব প্রোগ্রামের জন্য একটিই পরিচয়। SSRF ত্রুটিতে এই credential ঝুঁকিতে পড়তে পারে (পর্ব ১৫). তাই IMDSv2 চালু রাখুন, আর role-কে শুধু দরকারি অনুমতি দিন।

৮ · মানুষের access — SSO, MFA, break-glass আর review

প্রতিটি cloud account-এ আলাদা user বানালে কর্মী চলে যাওয়ার দিন দশ জায়গায় মুছতে হয়, আর একটি জায়গা ভুলে যাওয়া সহজ। সমাধান হলো পরিচয় এক জায়গায় রাখা। সেই জায়গার নাম identity provider (IdP), আর এক login-এ সব জায়গায় ঢোকা হলো SSO.

IdP আর cloud কথা বলে দুটি মানে: SAML ২.০ (২০০৫) আর OIDC ১.০ (২০১৪). AWS-এ এই কাজের সেবা IAM Identity Center, যার আগের নাম AWS SSO. Azure-এ Entra ID নিজেই IdP. Google Cloud-এ Cloud Identity বা Workforce Identity Federation. কারখানার গেটের উপমায়: গেটে একবার কার্ড, ভেতরে প্রতিটি সেকশনে আলাদা খাতা নেই।

  1. নাদিয়াcloud portal
  2. IdPlogin + MFA
  3. Cloud SSOgroup → role
  4. Console১ ঘণ্টা
অবস্থা
ঘড়ি
IdP-তে অবস্থা
Group
Role
Credential-এর মেয়াদ
  1. ধাপ ১ — Portal খোলা। নাদিয়ার কোনো session নেই, তাই cloud portal তাঁকে IdP-তে পাঠায়। Cloud-এ তাঁর কোনো password নেই।
  2. ধাপ ২ — পরিচয় প্রমাণ। IdP password আর passkey যাচাই করে। এখানে authentication শেষ।
  3. ধাপ ৩ — স্বাক্ষরিত দাবি। IdP cloud-কে একটি স্বাক্ষরিত বার্তা পাঠায়: ইনি নাদিয়া, group developers আর oncall. Cloud স্বাক্ষর মিলিয়ে নেয়।
  4. ধাপ ৪ — Group থেকে role. আগে থেকে ঠিক করা নিয়ম: oncall group পাবে prod account-এ OnCallOperator role. নাদিয়া সেটি বেছে নেন। AWS-এ এই সেটের নাম permission set.
  5. ধাপ ৫ — অস্থায়ী credential. Console ১ ঘণ্টার জন্য খোলে, মেয়াদ ১০:০১ পর্যন্ত। Audit log-এ role-এর সাথে তাঁর নামও থাকে।
  6. ধাপ ৬ — তিনি চলে গেলেন। ০৯:২০-এ IdP-তে account বন্ধ। এখন নতুন login ব্যর্থ, আর একটি জায়গায় বন্ধ করলেই সব জায়গায় বন্ধ। তবে চলমান session মেয়াদ পর্যন্ত, অর্থাৎ ১০:০১ পর্যন্ত থাকতে পারে। জরুরি হলে session বাতিলও করতে হবে।

MFA — সব MFA সমান নয়

MFA password-এর পাশে দ্বিতীয় প্রমাণ চায়। কিন্তু দ্বিতীয় প্রমাণের শক্তি আলাদা।

ধরনশক্তিদুর্বলতা
SMS কোডকিছু না থাকার চেয়ে ভালোSIM বদল, ভুয়া পাতায় কোড দিয়ে ফেলা
Authenticator অ্যাপের কোডমাঝারিভুয়া পাতায় কোড দিয়ে ফেলা
Push approveমাঝারিবারবার push-এ বিরক্ত হয়ে approve করা
Passkey বা hardware keyসবচেয়ে শক্তKey হারালে বিকল্প লাগে

Passkey আর hardware key আসল সাইটের ঠিকানার সাথে বাঁধা থাকে। ভুয়া পাতায় এগুলো কাজই করে না। তাই ক্ষমতাবান পরিচয়ের জন্য এগুলোই প্রথম পছন্দ।

Break-glass — আগুনের সময়ের চাবি

IdP নিজেই বন্ধ থাকলে কী হবে? তখন কেউ cloud-এ ঢুকতে পারবেন না। এই দিনের জন্য রাখা হয় break-glass account: কাচের বাক্সে রাখা জরুরি চাবির মতো। সাধারণ নিয়মগুলো:

  • দুটি রাখুন, যাতে একটি নষ্ট হলে অন্যটি থাকে। এগুলো IdP-র ওপর নির্ভর করবে না।
  • শক্ত MFA, যেমন hardware key, আলাদা নিরাপদ জায়গায় রাখুন।
  • প্রতিদিনের কাজে কখনো ব্যবহার করবেন না। ব্যবহার হলেই alert যাবে।
  • নিয়মিত পরীক্ষা করুন। পরীক্ষা না করা চাবি জরুরি দিনে খুলবে, এমন নিশ্চয়তা নেই।
  • ব্যবহারের পরে password আর প্রমাণ বদলান, আর কেন লেগেছিল তা লিখে রাখুন।

Access review আর সাময়িক অধিকার

অনুমতি দেওয়া সহজ, সরানো সবাই ভুলে যায়। Access review মানে নিয়মিত সময়ে মালিককে জিজ্ঞেস করা: এই মানুষ বা মেশিনের কি এখনো এই অনুমতি দরকার? ভালো review-তে শেষ ব্যবহারের তথ্য সাথে থাকে। তিন মাস ব্যবহার হয়নি এমন অনুমতি সরানোর পক্ষে সেটিই প্রমাণ।

আরেকটি ভালো অভ্যাস হলো just-in-time access: বড় ক্ষমতা সবসময় হাতে না রেখে দরকারের সময় চেয়ে নেওয়া, ১ ঘণ্টার জন্য। Azure-এ Privileged Identity Management এই ধরনের সুবিধা দেয়। তানভীরের db:* থাকলে তিনি সারা বছর ঝুঁকি বয়ে বেড়ান। সাময়িক অধিকারে সেই ঝুঁকি শুধু কাজের সময়টুকুতে থাকে।

৯ · পুরোনো key খোঁজা আর downtime ছাড়া সরানো

নতুন নকশা সহজ। আসল কাজ হলো পুরোনো account-এ যা জমে আছে, তা খুঁজে সরানো। AWS-এ credential report নামে একটি CSV পাওয়া যায়, যাতে প্রতিটি user-এর MFA আর key-র অবস্থা থাকে। নিচে সেই ধরনের একটি ছোট, কাটছাঁট করা নমুনা। ফাইলটি block-এর ভেতরেই বানানো, আর তারিখ নির্দিষ্ট।

set -euo pipefail
report=$(mktemp)
# A trimmed credential report (sample data, fictional users).
cat > "$report" <<'EOF'
user,password_enabled,mfa_active,key_active,key_last_rotated,key_last_used
<root_account>,true,false,true,2024-02-11,2024-03-02
nadia,true,true,false,N/A,N/A
rafi,true,false,true,2026-09-20,2026-10-30
tanvir,true,true,true,2025-11-03,2026-10-30
ci-deploy,false,false,true,2026-01-15,2026-10-31
old-intern,true,false,true,2026-02-01,2026-05-10
report-bot,false,false,true,2026-10-02,2026-10-31
EOF
awk -F, -v today=2026-10-31 -v max_age=90 -v max_idle=45 '
function days(s,    a, y, m) { split(s, a, "-"); y = a[1]; m = a[2]
  if (m <= 2) { y--; m += 12 }
  return 365*y + int(y/4) - int(y/100) + int(y/400) + int(306*(m+1)/10) + a[3] }
BEGIN { now = days(today) }
NR == 1 { next }
$1 == "<root_account>" && $4 == "true" { print "CRITICAL root has an access key" }
$1 == "<root_account>" && $3 == "false" { print "CRITICAL root has no MFA" }
$1 != "<root_account>" && $2 == "true" && $3 == "false" { print "NO-MFA  " $1; nomfa++ }
$1 != "<root_account>" && $4 == "true" {
  age = now - days($5); idle = now - days($6); keys++
  if (age > max_age)   { printf "OLD-KEY %-11s age %d days\n", $1, age; old++ }
  if (idle > max_idle) { printf "IDLE    %-11s idle %d days\n", $1, idle; unused++ } }
END { printf "summary: %d active keys, %d old, %d idle, %d users without MFA\n", keys, old, unused, nomfa }
' "$report"
rm -f "$report"

আউটপুট:

CRITICAL root has an access key
CRITICAL root has no MFA
NO-MFA  rafi
OLD-KEY tanvir      age 362 days
OLD-KEY ci-deploy   age 289 days
NO-MFA  old-intern
OLD-KEY old-intern  age 272 days
IDLE    old-intern  idle 174 days
summary: 5 active keys, 3 old, 1 idle, 2 users without MFA

প্রথম দুই লাইন সবচেয়ে জরুরি: root-এর key থাকা উচিত নয়, আর root-এ MFA বাধ্যতামূলক। ci-deploy-এর password নেই, তাই MFA-র প্রশ্ন ওঠে না, কিন্তু ২৮৯ দিনের key আছে। এটি OIDC-তে সরানোর প্রথম প্রার্থী। old-intern তিন তালিকাতেই আছে, তাই আগে বন্ধ করুন। report-bot-এর key ২৯ দিনের, তাই তালিকায় নেই। আসল রিপোর্টের column আরও অনেক, আর নাম provider-ভেদে আলাদা।

চলমান সেবা থেকে key সরানো

একটি key মুছে দিলেই কাজ শেষ নয়। সেটি কে ব্যবহার করছে না জেনে মুছলে রাতের বেলায় কিছু থেমে যেতে পারে। নিরাপদ পথটি দেখুন। ধরে নিই, report-bot সেবা ৩টি VM-এ চলে, প্রতিটি ঘণ্টায় ৪০টি call করে।

  1. খোঁজাকে ব্যবহার করে
  2. Roleপাশে বসানো
  3. সরানোএক এক করে
  4. বন্ধ, পরে মোছাফেরার পথ
অবস্থা
Key-তে চলা VM
Role-এ চলা VM
Key-তে call/ঘণ্টা
Key-র অবস্থা
সেবার error
  1. ধাপ ১ — খোঁজা। Audit log আর “শেষ ব্যবহার” তথ্য দেখায়, key ব্যবহার করছে শুধু ৩টি VM, মোট ৩ × ৪০ = ১২০ call/ঘণ্টা। কী কী API লাগে, সেটিও এখান থেকে জানা যায়।
  2. ধাপ ২ — Role পাশে বসানো। শুধু ওই API-গুলোর অনুমতিসহ role বানিয়ে VM-এ যুক্ত করা হলো। এখনো কিছু বদলায়নি, কারণ env variable-এর key আগে আসে। সব call আগের মতোই ১২০।
  3. ধাপ ৩ — এক VM বদল। একটি VM থেকে env variable সরিয়ে আবার deploy. সেটি এখন role-এ চলে। Key-তে call নেমে ৮০। Error ০ কি না দেখা হলো।
  4. ধাপ ৪ — বাকিগুলো। বাকি দুটি VM-ও বদলানো হলো। Key-তে call ০, “শেষ ব্যবহার” আর বাড়ছে না। তবু key এখনো Active. মাসিক কোনো job হয়তো এখনো চলেনি।
  5. ধাপ ৫ — আগে বন্ধ। Key মোছা হয়নি, Inactive করা হয়েছে। কিছু ভাঙলে এক ক্লিকে ফেরা যায়। অপেক্ষার সময় এখানে ৭ দিন ধরা হয়েছে, তবে সবচেয়ে ধীর job-এর চক্রের চেয়ে লম্বা হওয়া উচিত। Error ০।
  6. ধাপ ৬ — তারপর মোছা। অপেক্ষার পর key মুছে ফেলা হলো। CI বা env-এ এর কপিও সরানো হলো। Downtime ০, আর একটি স্থায়ী secret কম।

আরও গভীরে: IAM-এর অনেক ধারণার শিকড় ১৯৭০-এর দশকের access control গবেষণায়। Hardy-র “The Confused Deputy” (ACM SIGOPS OSR, ১৯৮৮) দেখায়, শুধু পরিচয় দেখে অনুমতি দিলে এই সমস্যা থেকেই যায়। NIST-এর RBAC মডেল (Ferraiolo ও Kuhn, ১৯৯২ থেকে) role-ভিত্তিক চিন্তাকে আনুষ্ঠানিক রূপ দেয়। NIST SP 800-207 (২০২০) zero trust-এর কথা বলে, যেখানে network-এর অবস্থান নয়, পরিচয়ই প্রধান। আর cloud-scale-এ policy-র ফল প্রমাণ করার জন্য automated reasoning ব্যবহার হয়, যেমন AWS-এর Zelkova (২০১৮).

পরীক্ষা ও ইন্টারভিউতে:

  • Authentication আর authorization-এর পার্থক্য? প্রথমটি পরিচয় যাচাই, দ্বিতীয়টি অনুমতি। 401 আর 403 এই দুইয়ের সাথে মেলে।
  • Role কেন user-এর চেয়ে ভালো? স্থায়ী secret নেই, credential নিজে থেকে মরে, আর audit log-এ session আলাদা হয়।
  • Trust policy আর permission policy? প্রথমটি বলে কে role পরতে পারবে, দ্বিতীয়টি বলে পরে কী করতে পারবে।
  • External ID কী ঠেকায়? Confused deputy: তৃতীয় পক্ষ যেন অন্য গ্রাহকের কথায় আপনার role না পরে।
  • Break-glass account কী? IdP বন্ধ থাকলেও ঢোকার জরুরি পথ। শক্ত MFA, alert আর নিয়মিত পরীক্ষাসহ।

১০ · AI-এর যুগে IAM যাচাই

AI একটি policy কয়েক সেকেন্ডে লিখে দেয়। কিন্তু এখানে তার ভুল প্রায়ই নীরব। সবচেয়ে সহজ যে policy দিয়ে কাজ চলে, সেটি হলো সব খুলে দেওয়া। Error চলে যায়, ঝুঁকি থেকে যায়।

AI যা দিতে পারেঝুঁকিকীভাবে ধরবেন
"Action": "*", "Resource": "*"পুরো account-এর ক্ষমতাকোন API লাগে তার তালিকা নিয়ে তবেই policy
Trust policy-তে "Principal": "*"যে কেউ role পরতে পারেনির্দিষ্ট principal আর শর্ত
“একটি user বানিয়ে access key নিন”অকারণে স্থায়ী secretআগে role বা OIDC-র পথ খুঁজুন
কোডে বা .env-এ key লেখাGit-এ secret চলে যায়Secret scanning, আর পর্ব ৩৩-এর secret manager
CI-এর OIDC trust-এ repository-র শর্ত নেইঅন্য repository-ও role পেতে পারেRepository আর branch-এর শর্ত মেলান
Subscription বা project-এ OwnerScope দরকারের চেয়ে অনেক বড়সবচেয়ে নিচের scope, সবচেয়ে ছোট role
অস্তিত্বহীন action বা ভুল Resource ধরনকাজ করে না, বা ভুল ধারণা দেয়Official docs, policy simulator বা validator
iam:PassRole সব resource-এনিজের চেয়ে বড় role অন্য সেবায় বসানোর পথনির্দিষ্ট role-এ সীমিত করুন

AI-কে policy লিখতে বলার সময় কাজের সরু বর্ণনা দিন, আর কী চান না তাও বলুন। Audit log-এর আসল লাইন, account id, key বা token কখনো prompt-এ দেবেন না। নাম বদলে দিন।

আমি একটি report service চালাই। এটি AWS-এর একটি VM-এ চলে। এটি শুধু example-bucket-এর reports/ ফোল্ডার থেকে ফাইল পড়ে। আর কিছু করে না। নিচের কাজগুলো করো: ১. Least privilege মেনে identity policy JSON লেখো। "*" action বা resource ব্যবহার করবে না। ২. কেন ListBucket আর GetObject-এর Resource আলাদা, তা ব্যাখ্যা করো। ৩. কোনো access key বানাতে বলবে না। Instance role কীভাবে যুক্ত হবে, সেই ধাপ লেখো। ৪. Trust policy লেখো, আর principal কেন সেটি, তা বলো। ৫. প্রতিটি action-এর নাম কোন official doc-এ আছে তা বলো। অনিশ্চিত হলে "নিশ্চিত নই" লেখো। ৬. একটি allow আর দুটি deny পরীক্ষা লেখো, যা দিয়ে আমি policy যাচাই করব। ৭. Production-এ বসানোর আগে throwaway account-এ কী দেখব, তা বলো। ৮. Delete, detach বা destroy জাতীয় কোনো কমান্ড চালাতে বলবে না।

AI-এর দেওয়া IAM বদল হাতে পেলে — যাচাইয়ের চেকলিস্ট

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।

প্র ০১Private repository-তে রাখা একটি key কি নিরাপদ? স্থায়ী secret-এর আসল সমস্যা কোথায়?

নিরাপদ নয়, আর এর প্রকাশ্য উদাহরণ আছে। মার্কিন FTC-র অভিযোগ আর প্রকাশিত বিবরণ অনুযায়ী, ২০১৬ সালে Uber-এর একটি বড় ডেটা ফাঁসে আক্রমণকারীরা একটি cloud access key পেয়েছিল, যা ডেভেলপারদের ব্যবহৃত একটি code repository-তে ছিল। সেই key দিয়ে storage থেকে কয়েক কোটি মানুষের তথ্য নেওয়া হয়। Repository public ছিল না, তবু সেই আড়াল কাজে আসেনি। কারণ repository-র নিরাপত্তা আর cloud-এর নিরাপত্তা তখন এক হয়ে গিয়েছিল।

এখানেই স্থায়ী secret-এর আসল সমস্যা। Secret যেখানে যায়, সেই জায়গার নিরাপত্তাই secret-এর নিরাপত্তা। ল্যাপটপ, backup, CI, chat, log, সবগুলো মিলে সবচেয়ে দুর্বল জায়গাটিই আপনার সীমা। আর secret কপি হলে কেউ জানতেও পারে না।

২০২৩ সালের জানুয়ারিতে CircleCI নিরাপত্তা ঘটনার পর গ্রাহকদের সব secret বদলাতে বলে। কারণ CI সিস্টেমে হাজারো গ্রাহকের key এক জায়গায় জমা থাকে। তাই একজনের ঘটনা সবার কাজ হয়ে দাঁড়ায়। যাঁরা OIDC-তে সরেছিলেন, তাঁদের সেই ধরনের দীর্ঘস্থায়ী key বদলানোর বোঝা ছিল কম।

AWS ২০১২ সালে EC2-র জন্য instance role আনে। ধারণাটি নতুন ছিল না, তবে প্রভাব বড়: secret বিতরণের সমস্যাটিই সরিয়ে দেওয়া। Key ভালো করে লুকানোর চেয়ে key না থাকাই ভালো নকশা।

তবে সমস্যা পুরো মিলিয়ে যায় না, জায়গা বদলায়। OIDC-তে বিশ্বাস আসে CI platform-এর স্বাক্ষর থেকে। সেই শর্ত ঢিলা হলে আবার ঝুঁকি। সব মিলিয়ে অগ্রগতি হলো কপি করা যায় এমন, দীর্ঘ আয়ুর জিনিস কমানো।

মূল উপলব্ধি: Secret যত ছড়ায়, তার নিরাপত্তা তত দুর্বলতম জায়গার সমান হয়। সবচেয়ে ভালো secret হলো যেটি জমা রাখতেই হয় না।

প্র ০২“Confused deputy” নামটি কোথা থেকে এলো, আর ১৯৮৮ সালের একটি compiler-এর গল্প আজকের cloud-এ কেন প্রাসঙ্গিক?

নামটি এসেছে Norm Hardy-র ১৯৮৮ সালের ছোট প্রবন্ধ “The Confused Deputy” থেকে। গল্পটি Tymshare নামের একটি time-sharing সিস্টেমের। সেখানে একটি compiler ছিল, যাকে একটি বিশেষ ফাইলে লেখার অধিকার দেওয়া হয়েছিল: billing তথ্যের ফাইল। ব্যবহারকারীরা compiler চালানোর সময় আউটপুট ফাইলের নাম দিতে পারতেন। কেউ সেই নাম হিসেবে billing ফাইলের নাম দিলে compiler নিজের ক্ষমতা দিয়ে সেটি নষ্ট করে ফেলত।

লক্ষ করুন, এখানে কেউ পাহারা ভাঙেনি। ব্যবহারকারীর ওই ফাইলে লেখার অধিকার ছিল না, compiler-এর ছিল। Compiler একই সাথে দুজনের কাজ করছিল, কিন্তু কোন অধিকার কার, সেটি আলাদা করতে পারছিল না। Hardy-র যুক্তি ছিল, শুধু “কে অনুরোধ করছে” দেখে অনুমতি ঠিক করলে এই সমস্যা থেকেই যায়। তিনি capability-র পক্ষে কথা বলেন: অনুরোধের সাথেই অধিকার পাঠানো।

আজকের SaaS ঠিক সেই compiler-এর জায়গায় আছে। একটি সেবার হাতে অনেক গ্রাহকের role পরার অধিকার। গ্রাহক শুধু একটি role-এর ঠিকানা লিখে দেন, যেমন compiler-এ ফাইলের নাম। ঠিকানাটি যদি অন্য গ্রাহকের হয়, সেবা নিজের ক্ষমতায় তা পরে ফেলতে পারে।

External ID এই বিভ্রান্তি কমায়। সেবাকে প্রতিটি অনুরোধে বলতে হয় সে কোন গ্রাহকের হয়ে এসেছে। সেবার ভেতরের কোড ভুলভাবে সেই মান গ্রাহকের ইনপুট থেকে নিলে কিন্তু সুরক্ষা থাকে না। তাই মানটি সেবা নিজে তৈরি করে, আর নিজের ডেটাবেস থেকেই পড়ে। Cloud-এর নিজের সেবার ক্ষেত্রেও aws:SourceArn ধরনের শর্ত একই কাজ করে।

Operating system-এর দিক থেকে ধারণাটি আরও গভীরে দেখতে পারেন Operating Systems কোর্সের Protection পর্বে। Setuid প্রোগ্রামের অনেক সমস্যাও একই পরিবারের।

মূল উপলব্ধি: ক্ষমতাবান সহকারী থাকলে শুধু “সে কে” দেখা যথেষ্ট নয়। দেখতে হবে “সে এখন কার হয়ে কাজ করছে”।

প্র ০৩পরিচয়ের গায়ে policy, নাকি scope-এ role assignment — কোন মডেলটি ভালো?

কোনোটিই সব দিকে ভালো নয়। দুটি মডেল দুটি আলাদা প্রশ্নকে সহজ করে।

ক্লাসিক কম্পিউটার বিজ্ঞানে access matrix-এর সারি আর কলাম আছে। সারি ধরে রাখলে “এই মানুষ কী কী পারেন” সহজে বলা যায়। কলাম ধরে রাখলে “এই resource কে কে ছুঁতে পারে” সহজে বলা যায়। AWS-এর identity policy প্রথমটির কাছাকাছি। Google Cloud-এর resource-এ বসানো allow policy দ্বিতীয়টির কাছাকাছি। Azure-এর role assignment তিনটি জিনিস জোড়া দেয়: principal, role আর scope. এটি একটি মোটা দাগের মিল, হুবহু নয়।

Scope-এর উত্তরাধিকারের বড় সুবিধা হলো প্রশাসন। Subscription-এ একবার role দিলে নিচের সব resource-এ তা খাটে, নতুন resource-এও। Google Cloud-এর organization, folder, project-এর ধাপেও একই। কিন্তু সুবিধাটিই ঝুঁকি। ওপরের স্তরে একটি ভুল assignment নিচের সবকিছুতে পৌঁছায়, আর resource দেখে সেটি বোঝা যায় না, কারণ অনুমতি ওপর থেকে এসেছে।

AWS-এর JSON policy খুব সূক্ষ্ম শর্ত প্রকাশ করতে পারে। কিন্তু প্রতিটি অনুরোধে পরিচয়ের policy, resource-এর policy, organization-এর নিয়ম, session-এর নিয়ম মিলে হিসাবটি জটিল হয়। সেই কারণেই পর্ব ৩২ পুরোটাই এই হিসাব নিয়ে। অনেক দল account-কেই scope-এর মতো ব্যবহার করে: প্রতিটি পরিবেশ আলাদা account, যা পর্ব ৩৫-এ দেখবেন।

লক্ষ করুন, তিনটি মডেলই একে অপরের দিকে এগিয়েছে। AWS-এ resource policy আছে। Google Cloud-এ শর্ত আর deny policy এসেছে। Azure-এ শর্তযুক্ত assignment আছে।

বিচার করুন বাস্তব প্রশ্ন দিয়ে: “এই bucket কে কে পড়তে পারে?”, “কর্মী চলে গেলে কী কী মুছবে?” আপনার cloud-এ কোন প্রশ্নের উত্তর দ্রুত পান?

মূল উপলব্ধি: নকশার পার্থক্যের নিচে একই access matrix. আসল দক্ষতা হলো যেকোনো মডেলে “কে কী পারে” বের করতে শেখা।

প্র ০৪MFA থাকলেও account কেন দখল হয়? “Phishing-resistant” কথাটির মানে কী?

কারণ অনেক MFA-র দ্বিতীয় প্রমাণটিও মানুষের হাত দিয়ে যায়, আর মানুষকে ভুল বোঝানো যায়।

২০২২ সালের সেপ্টেম্বরে Uber-এর প্রকাশিত বিবরণ অনুযায়ী, একজন contractor-এর password চুরির পর তাঁর ফোনে বারবার login-এর অনুমোদন চাওয়া হয়। শেষ পর্যন্ত একটি অনুমোদন গৃহীত হয়। এই ধরনটিকে বলে MFA fatigue. কারিগরিভাবে MFA ঠিকই কাজ করেছে, কিন্তু সিদ্ধান্তটি একজন ক্লান্ত মানুষের ওপর ছিল। এরপর অনেক প্ল্যাটফর্ম push-এ number matching যোগ করে, যেখানে পর্দার সংখ্যাটি ফোনে মেলাতে হয়।

কোডভিত্তিক MFA-র দুর্বলতা আলাদা। ভুয়া login পাতা কোডটি নিয়ে সাথে সাথে আসল সাইটে দিয়ে দিতে পারে। মানুষ ঠিকানা না দেখলে কোডের কোনো দোষ নেই। SMS-এর সাথে আরও যোগ হয় SIM বদলের ঝুঁকি। NIST SP 800-63B-র ২০১৭ সালের সংস্করণে SMS-কে “restricted” ধরা হয়েছিল। সংস্করণ বদলায়, তাই সর্বশেষ মূল নথি দেখুন।

Phishing-resistant পদ্ধতিতে এই মানবিক ধাপটি সরিয়ে দেওয়া হয়। FIDO2 আর WebAuthn-ভিত্তিক passkey বা hardware key-তে একটি cryptographic স্বাক্ষর হয়, যা সাইটের ঠিকানার সাথে বাঁধা। ভুয়া পাতার ঠিকানা আলাদা, তাই স্বাক্ষরই তৈরি হয় না। মানুষকে ঠকানোর জায়গা নেই।

তবু কোনো পদ্ধতি একা যথেষ্ট নয়। Login-এর পরে পাওয়া session cookie চুরি হলে MFA-র আর ভূমিকা থাকে না। Key হারালে পুনরুদ্ধারের পথই দুর্বলতম জায়গা হতে পারে: help desk-কে ফোন করে কেউ যদি MFA রিসেট করিয়ে নেন। তাই ছোট session, ডিভাইসের অবস্থা দেখা, আর শক্ত পুনরুদ্ধার প্রক্রিয়া লাগে।

মূল উপলব্ধি: MFA-র শক্তি নির্ভর করে মানুষকে ঠকানোর সুযোগ কতটা, তার ওপর। আর শৃঙ্খলের দুর্বলতম আংটা প্রায়ই পুনরুদ্ধারের পথ।

প্র ০৫সব পরিচয় এক জায়গায় আনলে ওই জায়গাটিই কি বড় বিপদ হয়ে যায় না? IdP বন্ধ হলে কী হবে?

হ্যাঁ। কেন্দ্রীয় পরিচয় ব্যবস্থা সুবিধা দেয়, আবার একটি বড় নির্ভরতাও তৈরি করে। ঝুঁকি দুই ধরনের: বন্ধ হয়ে যাওয়া, আর দখল হয়ে যাওয়া।

প্রথমটির উদাহরণ ২০২০ সালের ১৪ ডিসেম্বর। Google-এর প্রকাশিত incident রিপোর্ট অনুযায়ী, তাদের কেন্দ্রীয় পরিচয় ব্যবস্থার ক্ষমতা একটি স্বয়ংক্রিয় quota ব্যবস্থার ভুলে কমে যায়। প্রায় ৪৫ মিনিট login-নির্ভর অনেক সেবায় সমস্যা হয়। সেবাগুলো নিজে ঠিক ছিল, শুধু পরিচয় যাচাই হচ্ছিল না।

২০২১ সালের অক্টোবরে Meta-র outage-এ আরেকটি শিক্ষা আছে। তাদের প্রকাশিত বিবরণ অনুযায়ী, network বন্ধ হওয়ায় ভেতরের কাজের হাতিয়ারও বন্ধ হয়ে যায়। মেরামতের পথটিই যে ব্যবস্থায় চলে, সেটি নষ্ট হলে আপনি বাইরে আটকে যান। ডেটা সেন্টারে সশরীরে যাওয়া আর নিরাপত্তার ধাপ পেরোনোতে বাড়তি সময় লাগে।

দ্বিতীয় ঝুঁকিটি হলো দখল। Federation-এ cloud শুধু IdP-র স্বাক্ষর দেখে। স্বাক্ষরের key চুরি হলে আক্রমণকারী যে কারও নামে token বানাতে পারে। ২০২৩ সালের Storm-0558 ঘটনায় Microsoft-এর প্রকাশিত বিবরণে এমন একটি signing key-র কথা এসেছে। তাই token জারির ব্যবস্থাকে সর্বোচ্চ সতর্কতায় রাখতে হয়।

তবু এর মানে কেন্দ্রীয় ব্যবস্থা ফেলে দেওয়া নয়। দশ জায়গায় ছড়ানো পরিচয়ে কর্মী বাদ দেওয়া ভুলে যাওয়ার ঝুঁকি আরও সাধারণ। বাস্তব পথ হলো কেন্দ্র রাখা, আর তার ব্যর্থতার পরিকল্পনা করা: break-glass account, যা IdP-র ওপর নির্ভর করে না, IdP থেকে আলাদা alert, উদ্ধারের runbook-এর ছাপা বা আলাদা কপি, আর game day-তে সত্যিই পরীক্ষা।

মূল উপলব্ধি: মেরামতের পথ যে জিনিসের ওপর দাঁড়িয়ে, সেই জিনিস নষ্ট হলে কী হবে, তা আগেই ভাবুন। Break-glass এই প্রশ্নেরই উত্তর।

অনুশীলন

কোনো cloud account লাগবে না। আসল cloud ব্যবহার সবসময় ঐচ্ছিক, আর তাতে খরচ হতে পারে।

  1. হিসাব করুন: একটি প্রতিষ্ঠানে ১৪০টি active access key আছে। নিয়ম হলো ৯০ দিনে একবার বদল, আর ১টি বদলে ১৫ মিনিট লাগে। (ক) বছরে (৩৬৫ দিন) কতবার বদল আর কত ঘণ্টা কাজ? (খ) ফাঁস হওয়া key ধরা পড়তে ২১ দিন লাগলে ঝুঁকির সময় কত ঘণ্টা? (গ) তার বদলে ১ ঘণ্টার token হলে সর্বোচ্চ ঝুঁকির সময় কত গুণ কম? (ঘ) একটি key-র শেষ বদল ২০২৬-০৩-১৫, audit-এর দিন ২০২৬-১০-৩১. বয়স কত দিন?

    (ক) ১৪০ × ৩৬৫ ÷ ৯০ = ৫৬৭.৮, প্রায় ৫৬৮ বার। সময় ৫৬৮ × ১৫ = ৮,৫২০ মিনিট = ১৪২ ঘণ্টা.

    (খ) ২১ × ২৪ = ৫০৪ ঘণ্টা.

    (গ) ৫০৪ ÷ ১ = ৫০৪ গুণ. শর্ত হলো কেউ শুধু token-টি কপি করেছে, উৎসটি দখল করেনি।

    (ঘ) মার্চের বাকি ১৬ + এপ্রিল ৩০ + মে ৩১ + জুন ৩০ + জুলাই ৩১ + আগস্ট ৩১ + সেপ্টেম্বর ৩০ + অক্টোবর ৩১ = ২৩০ দিন. ৯০ দিনের সীমার অনেক ওপরে।

  2. নকশা সমালোচনা করুন: একটি দলের সেটআপ: (১) সবাই একই admin user-এ ঢোকেন, password chat-এ আছে; (২) deploy-এর জন্য CI-তে দুই বছরের পুরোনো admin key; (৩) VM-এর .env-এ storage key; (৪) প্রতিটি নতুন কর্মীকে subscription-এ Owner; (৫) বাইরের একটি সেবাকে role দেওয়া হয়েছে, শর্ত নেই; (৬) root-এ SMS MFA, আর root দিয়ে প্রতিদিনের কাজ। প্রতিটির সমস্যা আর সমাধান বলুন।

    (১) ভাগ করা পরিচয়ে audit log অর্থহীন, কে কী করেছেন বোঝা যায় না। প্রত্যেকের নিজের SSO পরিচয়, group আর MFA দিন।

    (২) ফাঁস হলে পুরো account গেল। CI-কে OIDC federation-এ সরান, আর branch-এর শর্তসহ শুধু deploy-এর অনুমতি দিন (পর্ব ৬১).

    (৩) VM-কে instance role দিন, key সরান। আগে বন্ধ, পরে মোছা, এই ক্রমে সরান।

    (৪) Owner দরকারের চেয়ে অনেক বড়, আর scope-ও। ছোট role, নিচের scope, আর বড় ক্ষমতা just-in-time.

    (৫) Confused deputy-র ঝুঁকি। External ID-র শর্ত আর ন্যূনতম অনুমতি দিন।

    (৬) Root প্রতিদিনের জন্য নয়। Hardware key দিন, প্রতিদিনের কাজ SSO দিয়ে করুন। Root ব্যবহার হলেই alert পাঠান।

  3. Policy লিখুন: একটি AWS ধরনের identity policy JSON লিখুন, যা দিয়ে একজন শুধু example-bucket-এর invoices/ ফোল্ডারের ফাইলের তালিকা দেখতে আর ফাইল পড়তে পারবেন। লেখা বা মোছার অনুমতি থাকবে না।
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "s3:ListBucket",
          "Resource": "arn:aws:s3:::example-bucket",
          "Condition": {
            "StringLike": { "s3:prefix": ["invoices/*"] }
          }
        },
        {
          "Effect": "Allow",
          "Action": "s3:GetObject",
          "Resource": "arn:aws:s3:::example-bucket/invoices/*"
        }
      ]
    }

    যাচাই করুন: দুটি Resource আলাদা তো? Action-এ s3:* নেই তো? লেখা বা মোছার কথা আলাদা করে নিষেধ করতে হয়নি, কারণ default deny আগে থেকেই আছে।

  4. ফল অনুমান করুন: একটি role-এর সর্বোচ্চ মেয়াদ ৯০০ সেকেন্ড, আর তার অনুমতি শুধু storage:Get. কৃত্রিম ঘড়িতে ঘটনা: t=0-এ ৩৬০০ সেকেন্ড চেয়ে token A নেওয়া হলো। t=600-এ ৯০০ সেকেন্ড চেয়ে token B নেওয়া হলো। Token অচল হয় যখন t ≥ মেয়াদ শেষ। এবার বলুন প্রতিটি call-এর ফল: (ক) t=100, A, storage:Put; (খ) t=899, A, storage:Get; (গ) t=900, A, storage:Get; (ঘ) t=1499, B, storage:Get; (ঙ) t=1500, B, storage:Get.

    A-র মেয়াদ চাওয়া ৩৬০০ নয়, ৯০০, তাই শেষ t=900. B-র শেষ t=600 + ৯০০ = 1500.

    (ক) DENY, অনুমতি নেই. Token বৈধ, কিন্তু Put-এর অনুমতি নেই। (খ) ALLOW. (গ) DENY, মেয়াদ শেষ. (ঘ) ALLOW. (ঙ) DENY, মেয়াদ শেষ.

    B নেওয়ার পরও A মরে যায়নি। t=600 থেকে t=900 পর্যন্ত দুটিই বৈধ ছিল। এই overlap-এর জন্যই আগেভাগে নবায়নে কাজ থামে না।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমচলমান সেবা থেকে স্থায়ী access key সরানোর ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. Audit log দেখে key কে ব্যবহার করছে তা খুঁজে বের করা
  2. ন্যূনতম অনুমতিসহ role বানিয়ে পাশে যুক্ত করা
  3. এক এক করে সেবা থেকে key সরিয়ে role-এ নেওয়া
  4. Key-র ব্যবহার শূন্য হলে key নিষ্ক্রিয় করে অপেক্ষা করা
  5. কোনো সমস্যা না হলে key পুরোপুরি মুছে ফেলা

একজন ডেভেলপার সফলভাবে cloud-এ login করলেন, কিন্তু একটি bucket পড়তে গিয়ে 403 AccessDenied পেলেন। সমস্যাটি কোন ধাপের?

  • Authentication
  • Authorization
  • Encryption
  • Network routing

Azure RBAC-এ একটি role assignment কোন তিনটি জিনিস জোড়া দেয়?

  • Username, password আর region
  • Effect, action আর resource
  • Security principal, role definition আর scope
  • Subnet, firewall আর port

একটি AWS ধরনের policy-তে কেউ Action লিখলেন s3:ListBucket, আর Resource লিখলেন arn:aws:s3:::example-bucket/*. তালিকা দেখতে গিয়ে অনুমতি মিলল না। সবচেয়ে সম্ভাব্য কারণ কী?

  • ListBucket-এর Resource হওয়া উচিত bucket নিজে, ভেতরের object নয়
  • Version-এর তারিখ আজকের হতে হবে
  • Policy-তে Principal নেই বলে
  • Action-এর নাম বড় হাতের হতে হবে

একটি VM-এ instance role যুক্ত করা হয়েছে, কিন্তু env variable-এ একটি পুরোনো access key-ও রয়ে গেছে। AWS SDK-র সাধারণ credential ক্রমে অ্যাপ কোনটি ব্যবহার করবে?

  • সবসময় instance role
  • দুটির অনুমতি মিলিয়ে একটি
  • Error দিয়ে অ্যাপ থেমে যাবে
  • Env variable-এর access key

তৃতীয় পক্ষের সেবাকে নিজের role পরার অধিকার দেওয়ার সময় trust policy-তে external ID-র শর্ত রাখার মূল উদ্দেশ্য কী?

  • Role-এর ডেটা encrypt করা
  • Token-এর মেয়াদ বাড়ানো
  • অন্য গ্রাহকের হয়ে সেবাটির এই role পরা ঠেকানো
  • মানুষের MFA-র বদলি হিসেবে কাজ করা

একজন কর্মী 09:00-এ SSO দিয়ে ঢুকে ১ ঘণ্টার অস্থায়ী credential পেলেন। 09:20-এ IdP-তে তাঁর account বন্ধ করা হলো, আর আলাদা করে session বাতিল করা হয়নি। সাধারণভাবে ওই credential সর্বোচ্চ কতক্ষণ চলতে পারে?

  • 09:20 পর্যন্ত
  • 10:00 পর্যন্ত
  • 10:20 পর্যন্ত
  • কেউ না মোছা পর্যন্ত

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. Authentication হলো আপনি কে, authorization হলো আপনি কী পারেন. প্রতিটি অনুরোধ principal, action, resource আর condition দিয়ে বিচার হয়, ডিফল্ট উত্তর deny.
  2. AWS-এ policy পরিচয়ে বা resource-এ বসে, role হলো ধার করা পরিচয়। Azure আর Google Cloud-এ role একটি অনুমতির তালিকা, যা scope-এ বসে।
  3. Role-এর দুই দরজা: trust policy আর permission policy. অস্থায়ী credential স্থায়ী key-র চেয়ে ভালো, তবে ন্যূনতম অনুমতিও লাগে।
  4. মেশিনের জন্য instance role, Kubernetes federation আর CI-এর OIDC. মানুষের জন্য SSO, group, শক্ত MFA, just-in-time, access review আর break-glass.
  5. Key সরানোর ক্রম: খোঁজা, role বসানো, এক এক করে সরানো, বন্ধ করা, তারপর মোছা. তৃতীয় পক্ষকে role দিলে external ID ভুলবেন না।

পরের পর্বে: এতক্ষণ আমরা শুধু Allow দেখেছি। কিন্তু একই অনুরোধে পাঁচটি policy থাকলে কে জেতে? পর্ব ৩২-এ IAM policy evaluation: allow, deny, least privilege আর ভুল অনুমতি ধরা।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান