IAM ও ক্লাউড মিসকনফিগারেশন
এই পাঠে যা শিখবেন
- IAM আসলে কী নিয়ন্ত্রণ করে, এবং কেন এটি সবচেয়ে গুরুত্বপূর্ণ single ক্লাউড সিকিউরিটি কন্ট্রোল
- Least privilege নীতি ক্লাউড রোল ও পলিসিতে ঠিক কীভাবে প্রয়োগ হয় (L31-এর প্রিভিলেজ এস্কেলেশন লেসনের সাথে সংযোগ)
- তিনটি সবচেয়ে সাধারণ real-world ক্লাউড মিসকনফিগারেশন প্যাটার্ন — এবং কেন সেগুলো এত ঘন ঘন ঘটে
- একটি IAM পলিসি সেটে wildcard ব্যবহার প্রোগ্রাম্যাটিকভাবে কীভাবে অডিট/ডিটেক্ট করা যায়
১ · IAM কী — এবং কেন এটি সবচেয়ে গুরুত্বপূর্ণ ক্লাউড কন্ট্রোল
IAMIdentity and Access Managementএকটি ক্লাউড প্ল্যাটফর্মের সেই সিস্টেম যা নির্ধারণ করে কোন identity (ইউজার, সার্ভিস, অ্যাপ্লিকেশন) কোন রিসোর্সে কোন action চালাতে পারবে। হলো ক্লাউডের সেই স্তর যা ঠিক করে দেয় — কে (identity: একজন ইউজার, একটি সার্ভিস অ্যাকাউন্ট, একটি অ্যাপ্লিকেশন) কী করতে পারবে (action: read, write, delete...) কোন রিসোর্সে (একটি নির্দিষ্ট স্টোরেজ বাকেট, একটি ডেটাবেস, একটি সার্ভার)। L51-এ আমরা শিখেছি Shared Responsibility Model-এ IAM কনফিগারেশন সম্পূর্ণভাবে কাস্টমারের দায়িত্ব — ক্লাউড প্রোভাইডার এটি আপনার হয়ে ঠিক করে দেয় না।
এই কারণেই বাস্তব ক্লাউড ব্রিচের বিশ্লেষণে বারবার একই প্যাটার্ন দেখা যায়: আক্রমণকারী কোনো জটিল zero-day এক্সপ্লয়েট ব্যবহার করেনি — বরং একটি ভুলভাবে কনফিগার করা IAM পলিসি বা পাবলিকলি-এক্সপোজড রিসোর্স খুঁজে পেয়েছে। IAM সিকিউর রাখা মানে জটিল ক্রিপ্টোগ্রাফি নয় — এটি মূলত সঠিক ডিসিপ্লিন ও অডিট-এর ব্যাপার।
২ · Least Privilege — ক্লাউড রোলে প্রয়োগ
L31-এ আমরা Principle of Least PrivilegeLeast Privilegeপ্রতিটি অ্যাকাউন্ট/প্রসেসকে শুধুমাত্র তার কাজের জন্য প্রয়োজনীয় ন্যূনতম অনুমতি দেওয়া — এর বেশি কিছু নয়। নীতি দেখেছিলাম ফাইল-পারমিশনের প্রেক্ষাপটে। ক্লাউডে এই একই নীতি IAM পলিসিতে প্রয়োগ হয়: একটি ব্যাকআপ সার্ভিসের রোলকে শুধু নির্দিষ্ট বাকেটে read/write অনুমতি দিন — পুরো অ্যাকাউন্টের সব রিসোর্সে সব action করার অনুমতি নয়।
সংবেদনশীল ডেটা থাকা একটি স্টোরেজ বাকেট ভুলবশত পাবলিক অ্যাক্সেসে খোলা রাখা — বাস্তব রিপোর্ট করা ক্লাউড ব্রিচের সবচেয়ে সাধারণ প্যাটার্নগুলোর একটি।
action বা resource ফিল্ডে
"*" ব্যবহার করা — "সময় বাঁচানোর" জন্য সুবিধাজনক মনে হলেও, একটি একক কম্প্রোমাইজড ক্রেডেনশিয়ালকে পুরো অ্যাকাউন্টে অ্যাক্সেস দিয়ে দেয়।ছেড়ে যাওয়া কর্মী বা বন্ধ হওয়া প্রজেক্টের অ্যাক্সেস-কী কখনো revoke না করা — একটি ভুলে যাওয়া কিন্তু এখনো valid এন্ট্রি পয়েন্ট।
তিনটিরই মূল কারণ একই: সুবিধা বনাম সিকিউরিটির ট্রেড-অফ (L01-এর CIA Triad ট্রেড-অফ ধারণার প্রায়োগিক উদাহরণ)। একটি wildcard পলিসি লিখতে কম সময় লাগে এবং "কাজ করে" — কিন্তু প্রতিটি অতিরিক্ত অনুমতি Availability/ গতির বিনিময়ে Confidentiality-এর ঝুঁকি বাড়ায়। নিয়মিত IAM অডিট এই ট্রেড-অফকে সঠিক দিকে ফিরিয়ে আনার একমাত্র নির্ভরযোগ্য উপায়।
৩ · একটি IAM পলিসি সেট অডিট করা
নিচের toy উদাহরণে চারটি simulated IAM পলিসি আছে — এদের কোনোটিই কোনো বাস্তব ক্লাউড অ্যাকাউন্টের সাথে সংযুক্ত নয়,
এগুলো শুধু in-memory Python dictionary। audit_policy() ফাংশনটি প্রতিটি পলিসির actions
ও resources লিস্টে "*" (wildcard) আছে কি না পরীক্ষা করে একটি ফাইন্ডিংস লিস্ট রিটার্ন
করে — বাস্তব ক্লাউড সিকিউরিটি টুলিং (যেমন AWS IAM Access Analyzer) ঠিক এই একই ধরনের লজিক অনেক বড় স্কেলে চালায়।
policies = {
"read-only-reports": {
"actions": ["s3:GetObject"],
"resources": ["arn:aws:s3:::company-reports/*"],
},
"backup-service": {
"actions": ["s3:GetObject", "s3:PutObject"],
"resources": ["arn:aws:s3:::company-backups/*"],
},
"legacy-admin-role": {
"actions": ["*"],
"resources": ["*"],
},
"deploy-bot": {
"actions": ["ec2:StartInstances", "ec2:StopInstances"],
"resources": ["*"],
},
}
def audit_policy(policy):
findings = []
if "*" in policy["actions"]:
findings.append("wildcard ACTION (\"*\") — যেকোনো action চালানোর অনুমতি")
if "*" in policy["resources"]:
findings.append("wildcard RESOURCE (\"*\") — যেকোনো resource-এ প্রয়োগযোগ্য")
return findings
print("IAM পলিসি অডিট রিপোর্ট")
print("-" * 42)
for name, policy in policies.items():
findings = audit_policy(policy)
if findings:
print(f"[ঝুঁকিপূর্ণ] {name}")
for f in findings:
print(f" -> {f}")
else:
print(f"[নিরাপদ] {name} — সঠিকভাবে স্কোপড (scoped)")
print()
legacy-admin-role ও deploy-bot দুটিই wildcard ব্যবহার করে, কিন্তু আলাদা
মাত্রায়: legacy-admin-role-এর action ও resource দুটিই wildcard (সবচেয়ে ঝুঁকিপূর্ণ — সম্পূর্ণ
অ্যাকাউন্ট অ্যাক্সেস), অন্যদিকে deploy-bot-এর action নির্দিষ্ট কিন্তু resource wildcard। বাস্তব
অডিটে এই দুই স্তরের ঝুঁকিকে আলাদাভাবে prioritize করা হয় — ঠিক যেমন L14-এ আমরা CVSS দিয়ে vulnerability
prioritize করেছিলাম।
৪ · প্রতিরক্ষা চেকলিস্ট
- প্রতিটি পলিসিতে নির্দিষ্ট action ও resource ARN লিখুন — কখনো "সাময়িক সুবিধার জন্য" wildcard নয়।
- নিয়মিত অ্যাক্সেস রিভিউ চালান — কোনো রোল/ক্রেডেনশিয়াল দীর্ঘদিন অব্যবহৃত থাকলে তা revoke করুন।
- স্টোরেজ বাকেটে "block public access" ডিফল্টভাবে চালু রাখুন — শুধু স্পষ্ট প্রয়োজনে সুনির্দিষ্টভাবে খুলুন।
- স্বয়ংক্রিয় IAM-অডিট টুলিং ব্যবহার করুন — ম্যানুয়াল রিভিউ স্কেলে ভুল করে, স্বয়ংক্রিয় স্ক্যানিং প্রতিটি পলিসি ধারাবাহিকভাবে পরীক্ষা করে (L54-এ DevSecOps পাইপলাইনে এই ধরনের স্বয়ংক্রিয় গেট আমরা বিস্তারিত দেখব)।
ক্লাউড সিকিউরিটির সবচেয়ে গুরুত্বপূর্ণ single বিনিয়োগ প্রায়ই এক্সোটিক টুল নয় — এটি IAM-কে least-privilege শৃঙ্খলার সাথে নিয়মিত অডিট করা। একটি ভুলভাবে কনফিগার করা পলিসি বছরের পর বছর নিরাপদে "লুকিয়ে" থাকতে পারে, ঠিক যতক্ষণ না কেউ (আক্রমণকারী বা অডিটর) সেটি খুঁজে পায়।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ একজন ডেভেলপার বলছেন, "আমরা সবাইকে admin অ্যাক্সেস দিয়ে দিই, তাহলে কেউ আটকে থাকবে না।" এর নিরাপত্তা ঝুঁকি কী?
এটি least-privilege নীতির সরাসরি লঙ্ঘন। যদি যেকোনো একটি অ্যাকাউন্ট (এমনকি একজন জুনিয়র ডেভেলপারের) কম্প্রোমাইজ হয় — একটি ফিশিং ইমেইলে ক্লিক করে (L45) বা লিক হওয়া ক্রেডেনশিয়ালের মাধ্যমে (L30) — আক্রমণকারী তাৎক্ষণিকভাবে পুরো ক্লাউড অ্যাকাউন্টে সম্পূর্ণ admin অ্যাক্সেস পেয়ে যায়। সুবিধা বাড়ানোর জন্য ঝুঁকির পুরো ব্লাস্ট-র্যাডিয়াস কে সর্বোচ্চ পর্যায়ে নিয়ে যাওয়া হয়েছে।
প্র ০২ একটি অরফান্ড (orphaned) ক্রেডেনশিয়াল কেন wildcard পলিসির মতোই বিপজ্জনক হতে পারে, এমনকি যদি সেটির পারমিশন সীমিতও হয়?
কারণ কেউ আর এটি মনিটর করছে না। একটি সক্রিয় ব্যবহারকারীর অস্বাভাবিক অ্যাক্টিভিটি লগ/অ্যালার্টে ধরা পড়তে পারে (L48-এর SIEM ধারণা), কিন্তু একটি "ভুলে যাওয়া" ক্রেডেনশিয়াল কম্প্রোমাইজ হলে কেউ লক্ষ্যই করবে না — কারণ কেউ আশাই করছে না সেটি ব্যবহার হবে। এটিই কেন নিয়মিত ক্রেডেনশিয়াল রিভিউ ও রিভোকেশন গুরুত্বপূর্ণ, শুধু পারমিশনের পরিমাণ নয়।
প্র ০৩ একটি পাবলিক স্টোরেজ বাকেট মিসকনফিগারেশন কীভাবে CIA Triad-এর সাথে সম্পর্কিত (L01)?
এটি প্রধানত Confidentiality লঙ্ঘন — সংবেদনশীল ডেটা এমন কারো কাছে পৌঁছে যায় যার অ্যাক্সেসের কথা ছিল না, ডেটা নিজে পরিবর্তন না হয়েও। তবে যদি বাকেটটি পাবলিকলি লিখনযোগ্যও (writable) থাকে, তাহলে Integrity-ও ঝুঁকিতে পড়ে — একজন আক্রমণকারী ফাইল পরিবর্তন বা প্রতিস্থাপন করতে পারবে।
অনুশীলন
-
চিন্তা করুন: উপরের কোড সেলে
policiesডিকশনারিতে একটি নতুন পলিসি যোগ করুন যার action নির্দিষ্ট কিন্তু resource ওয়াইল্ডকার্ড।audit_policy()কী ফলাফল দেবে তা আগে অনুমান করুন, তারপর Run চেপে যাচাই করুন।যেহেতু
audit_policy()action ও resource দুটিই আলাদাভাবে পরীক্ষা করে, শুধু resource wildcard থাকা একটি single finding তৈরি করবে ("wildcard RESOURCE") — action wildcard না থাকায় সেই সংক্রান্ত finding আসবে না। এটি দেখায় কেন প্রতিটি ফিল্ড আলাদাভাবে চেক করা জরুরি, "কোনো একটা wildcard আছে কি না" এই একক বুলিয়ান চেক যথেষ্ট নয়। -
পরীক্ষা করুন:
audit_policy()-কে এমনভাবে বাড়ান যাতে এটি ফাইন্ডিংসের পাশাপাশি একটি severity ("high"/"medium") রিটার্ন করে — action ও resource দুটিই wildcard হলে "high", শুধু একটি হলে "medium"।একটি সম্ভাব্য সমাধান:
len(findings) == 2হলে severity = "high",len(findings) == 1হলে "medium", নাহলে কোনো finding-ই নেই। এটি ঠিক L14-এর CVSS severity-band ধারণার একটি ছোট প্রয়োগ — একই ধরনের যুক্তি (severity অনুযায়ী প্রায়োরিটাইজেশন) বারবার সাইবারসিকিউরিটিতে ফিরে আসে।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৬০টি পাঠ পরবর্তী পাঠ — কন্টেইনার ও Kubernetes সিকিউরিটি — এই মডিউলের ধারাবাহিকতা।
- Discrete Mathematics কোর্স সহায়ক কোর্স লজিক ও সেট থিওরির ভিত্তি — access-control পলিসি ডিজাইনের অন্তর্নিহিত গণিত।
- System Design & Software Architecture কোর্স সঙ্গী কোর্স বড় সিস্টেমে অথেন্টিকেশন ও অথোরাইজেশন কীভাবে ডিজাইন করা হয় তা শিখতে দেখুন।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design ও Cybersecurity — সব এক জায়গায়।