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

Cloud নিরাপত্তার ভিত্তি — misconfiguration, audit log আর defense in depth

Cloud Security Foundations — Misconfiguration, Audit Logs and Defense in Depth

Taught in Bangla, this lesson shows why misconfiguration is the main cloud risk, turns shared responsibility into a working checklist, reads audit logs and stores them in a separate account, separates threat detection, CSPM and CIS Benchmarks, ranks findings by likelihood and impact, applies five layers of defense in depth, covers patching and scanning, isolates a suspicious VM while keeping evidence, and builds a new-account security baseline, with a simulator.

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

  • Misconfiguration কেন cloud-এর প্রধান ঝুঁকি, আর তার পাঁচটি চেনা রূপ
  • Shared responsibility-কে কাজের চেকলিস্টে বদলানো
  • Audit log পড়া, আলাদা account-এ পাঠানো আর কত দিন রাখা হবে ঠিক করা
  • Threat detection, CSPM আর CIS Benchmark কোনটি কী কাজ করে
  • Finding-কে severity দিয়ে সাজানো, আর একটি সন্দেহজনক VM নিরাপদে আলাদা করা
  • নতুন account-এর প্রথম দিনের নিরাপত্তা baseline তৈরি করা

১ · তালা শক্ত, কিন্তু চাবি দরজায় ঝুলছে

পর্ব ৩১ থেকে ৩৩-এ পরিচয়, অনুমতি আর secret দেখেছেন। এবার পুরো ছবিটি এক জায়গায় আনার সময়। প্রশ্নটি সহজ: আপনার cloud account এই মুহূর্তে কতটা নিরাপদ, আর সেটি আপনি কীভাবে জানবেন? এই সামগ্রিক অবস্থাকে বলে security posture, বাংলায় নিরাপত্তার অবস্থান।

ভাড়া করা গুদামঘর: ধরুন আপনি একটি বড় বাণিজ্যিক গুদামে ঘর ভাড়া নিলেন। দেয়াল পুরু, গেটে পাহারা, চারদিকে ক্যামেরা। মালিক এসব সামলান। কিন্তু আপনার ঘরের শাটার নামানো, তালা দেওয়া আর চাবি কাকে দেবেন, সেটি আপনার কাজ। শাটার তোলা রেখে বাড়ি গেলে মালিকের পাহারা আপনাকে বাঁচাবে না। Cloud-এর বেশিরভাগ নিরাপত্তা-ঘটনাও এমনই: দেয়াল ভাঙেনি, শাটার খোলা ছিল।

এই “শাটার খোলা” অবস্থাকেই বলে misconfiguration: কোনো সেবা ত্রুটি ছাড়াই চলছে, কিন্তু তার সেটিং ভুল। Software-এর bug নয়, তাই কোনো patch এটি সারায় না।

কে কী বলেছেন, আর কতটা বিশ্বাস করবেন: মার্কিন NSA ২০২০ সালের “Mitigating Cloud Vulnerabilities” নথিতে misconfiguration-কে সবচেয়ে বেশি দেখা cloud দুর্বলতা বলেছে। Cloud Security Alliance-এর Top Threats তালিকাতেও এটি উপরের সারিতে থাকে। Gartner ২০১৯ সালের দিকে পূর্বাভাস দিয়েছিল যে cloud নিরাপত্তার প্রায় সব ব্যর্থতা হবে গ্রাহকের দিক থেকে। এটি পূর্বাভাস, মাপা হিসাব নয়। আমরা ইচ্ছে করেই এখানে কোনো শতকরা হিসাব দিচ্ছি না। বিভিন্ন রিপোর্টের পদ্ধতি আলাদা, আর অনেকগুলোর প্রকাশক নিজেই নিরাপত্তা-পণ্য বিক্রি করেন।

ভুল এত বেশি হয় কেন? কারণগুলো cloud-এর গুণ থেকেই আসে। একটি API call-এ সেটিং বদলায়, তাই ভুলও এক সেকেন্ডে হয়। সেবার সংখ্যা বিশাল, প্রত্যেকটির সেটিং আলাদা। “আজকের জন্য খুলে দিই” বলা অস্থায়ী নিয়ম মাসের পর মাস থেকে যায়। আর দল বড় হলে কেউ নিশ্চিত থাকেন না, কোন জিনিসের মালিক কে।

ভুলদেখতে কেমনফল কী হতে পারেপ্রথম প্রতিকার
Public storageBucket সবার জন্য পড়ার যোগ্যগ্রাহকের তথ্য ফাঁসBlock public access, পর্ব ২১
খোলা portSSH বা database 0.0.0.0/0-তেদুনিয়াজুড়ে স্বয়ংক্রিয় স্ক্যানের লক্ষ্যSecurity group সরু করা, পর্ব ২৭
বাড়তি IAM অনুমতিPolicy-তে *একটি key ফাঁসে পুরো account ঝুঁকিতেLeast privilege, পর্ব ৩২
এনক্রিপশন ছাড়া ডেটাDisk, backup বা সংযোগে এনক্রিপশন নেইহারানো snapshot বা সংযোগ থেকে তথ্য পড়া যায়Default এনক্রিপশন, TLS, পর্ব ৩৩
বন্ধ loggingAudit বা access log নেইঘটনা ঘটলেও কেউ জানে না, প্রমাণও নেইAudit log চালু, অংশ ৩ দেখুন

শেষ সারিটি একটু আলাদা। অন্য চারটি ভুল দরজা খোলে, এটি ক্যামেরা বন্ধ করে। তাই একে ছোট ভাববেন না। আর বাস্তবের ঘটনায় একটি ভুল প্রায় একা থাকে না। কয়েকটি মাঝারি ভুল জোড়া লেগে বড় ক্ষতি করে। এই কারণেই একটি ভুলের blast radius, মানে ক্ষতি কতদূর ছড়াতে পারে, সেটিও সমান গুরুত্বপূর্ণ।

২ · Shared responsibility — দর্শন নয়, চেকলিস্ট

পর্ব ২-এ আপনি shared responsibility দেখেছেন। AWS-এর জনপ্রিয় ভাষায় provider সামলায় “security of the cloud”, আর গ্রাহক সামলান “security in the cloud”. কথাটি সুন্দর, কিন্তু কাজের নয়, যতক্ষণ না একে প্রশ্নে ভাঙা হয়। প্রতিটি সেবার জন্য একটিই প্রশ্ন: এই কাজটি যদি না হয়, দোষ কার?

কাজVM (IaaS)Managed database (PaaS)Function (FaaS)SaaS
ভবন, hardware, hypervisorProviderProviderProviderProvider
OS patchআপনিProvider, সময় বাছেন আপনিProviderProvider
Runtime আর libraryআপনিProviderভাগাভাগি: runtime provider, library আপনিProvider
Network-এর নিয়মআপনিআপনিঅংশত আপনিসাধারণত provider
পরিচয় আর অনুমতিআপনিআপনিআপনিআপনি
ডেটা, তার শ্রেণি আর backup-এর নীতিআপনিআপনিআপনিআপনি

শেষ দুটি সারি লক্ষ করুন। SaaS পর্যন্ত গেলেও পরিচয় আর ডেটা আপনার হাত থেকে সরে না। সেবার ধরন বদলালে দায় কমে, শূন্য হয় না। সূক্ষ্ম ভাগ provider আর সেবাভেদে আলাদা, তাই সেই সেবার অফিসিয়াল নথি দেখে নিশ্চিত হওয়াই নিয়ম। এবার একে একটি ব্যবহারযোগ্য তালিকায় আনি। নতুন যেকোনো সেবা চালুর আগে নিচের প্রশ্নগুলো ধরে এগোন।

নতুন সেবার দায়িত্ব-চেকলিস্ট

৩ · Audit log — কে, কখন, কোথা থেকে, কী করলেন

Cloud-এ প্রায় সব কাজ শেষ পর্যন্ত একটি API call. তাই provider সেই call-গুলো লিখে রাখতে পারে। এই রেকর্ডই audit log. একে ভাবুন লঞ্চঘাটের প্রবেশ-খাতা হিসেবে: কে এলেন, কখন, কোন গেট দিয়ে, কী নিয়ে গেলেন, আর প্রহরী তাঁকে ঢুকতে দিলেন কি না।

Audit log-এর একটি event-এর ভেতরে যা থাকে, নিচের সংক্ষিপ্ত নমুনায় দেখুন। এটি CloudTrail-এর গঠন মেনে লেখা, তবে সব field নেই, আর account নম্বর কাল্পনিক।

{
  "eventTime": "2026-10-12T04:15:41Z",
  "eventSource": "signin.amazonaws.com",
  "eventName": "ConsoleLogin",
  "awsRegion": "us-east-1",
  "sourceIPAddress": "203.0.113.44",
  "userIdentity": {
    "type": "IAMUser",
    "accountId": "123456789012",
    "userName": "karim"
  },
  "responseElements": { "ConsoleLogin": "Success" },
  "additionalEventData": { "MFAUsed": "No" }
}

এখানে উত্তর আছে পাঁচটি প্রশ্নের: কে (userIdentity), কখন (eventTime), কোথা থেকে (sourceIPAddress), কী (eventName), আর ফল কী (responseElements). যে পরিচয় কাজটি করছে, তাকে বলে principal: সে মানুষ, role বা কোনো সেবা, যেকেউ হতে পারে।

Log দুই ধরনের কাজ লেখে। Management event হলো নিয়ন্ত্রণের কাজ: VM বানানো, policy বদলানো, bucket মোছা। Data event হলো ডেটার কাজ: একটি object পড়া বা function চালানো। দ্বিতীয়টির সংখ্যা বিশাল, তাই সাধারণত নিজে থেকে চালু থাকে না, আর চালু করলে খরচ বাড়ে। এই একটি কথা না জানলে ঘটনার দিন অবাক হবেন: bucket-এর সেটিং কে বদলালেন জানা যাবে, কিন্তু কে কোন ফাইল পড়লেন, জানা যাবে না।

বিষয়AWS CloudTrailAzure Activity LogGoogle Cloud Audit Logs
নিয়ন্ত্রণের কাজManagement event, Event history-তে প্রায় ৯০ দিনSubscription-স্তরের event, প্রায় ৯০ দিনAdmin Activity, সবসময় চালু, প্রায় ৪০০ দিন
ডেটার কাজData event, আলাদা করে চালু করতে হয়Resource log, diagnostic setting লাগেData Access log, বেশিরভাগ সেবায় আলাদা করে চালু
দীর্ঘদিন রাখার পথTrail থেকে S3 বা log সেবাDiagnostic setting থেকে Log Analytics বা storageLog sink থেকে Cloud Storage বা BigQuery
Login-এর তথ্যConsoleLogin eventMicrosoft Entra-র আলাদা sign-in logCloud Identity বা Workspace-এর audit log

সংখ্যাগুলো লেখার সময়ের, আর provider-ভেদে বদলাতে পারে। যাচাই করে নেবেন। মূল ধারণা একই: নিজে থেকে যা থাকে, তা অল্প দিনের। দীর্ঘদিনের জন্য আপনাকে পাঠানোর ব্যবস্থা করতে হবে।

আলাদা, সুরক্ষিত account-এ পাঠানো

ধরুন একজন অনুপ্রবেশকারী কোনোভাবে admin ক্ষমতা পেলেন। Log একই account-এর bucket-এ থাকলে তিনি সেটিও মুছতে পারেন। তাই পরিণত প্রতিষ্ঠান একটি log archive account রাখে। সেখানে প্রায় কেউ ঢোকেন না, আর সব account-এর log সেখানেই জমা হয়। দোকানের সিসিটিভির রেকর্ডার যদি দোকানের ক্যাশবাক্সের পাশে থাকে, চোর সেটিও তুলে নেয়। রেকর্ডার থাকা উচিত অন্য ঘরে, অন্য চাবিতে।

  • লেখা যায়, মোছা যায় না: log জমা হওয়া bucket-এ শুধু লেখার অনুমতি, সাথে versioning আর object lock.
  • সত্যতা প্রমাণ: Log integrity validation চালু রাখুন। CloudTrail-এর এই সুবিধায় hash আর digital signature দিয়ে পরে দেখানো যায়, কোনো file বদলানো হয়নি।
  • সব region: ব্যবহার না করা region-ও ধরুন। সেখানকার কার্যকলাপ ঠিক সেই কারণেই সন্দেহজনক।
  • Alert: Log বন্ধ করার চেষ্টাটিই সবচেয়ে বড় সংকেতগুলোর একটি।

কত দিন রাখবেন — retention

Retention আন্দাজে ঠিক হয় না। তিনটি প্রশ্ন আছে: নিয়ম কত দিন চায়, একটি অনুপ্রবেশ ধরা পড়তে কত দিন লাগতে পারে, আর খরচ কত। উদাহরণ হিসেবে কার্ড-পেমেন্টের মান PCI DSS কমপক্ষে ১২ মাস রাখতে বলে, যার সাম্প্রতিক ৩ মাস সাথে সাথে বিশ্লেষণের জন্য হাতের কাছে থাকতে হবে। বাংলাদেশে আপনার খাতে কোন নিয়ম খাটে, সেটি নিয়ন্ত্রক সংস্থার নির্দেশনা আর আইনি পরামর্শ দেখে নিশ্চিত করুন (পর্ব ৩৫)। ব্যবহারিক কৌশল হলো দুই ধাপ: নতুন log খোঁজা-সহজ জায়গায়, পুরোনো log সস্তা storage-এ। এই সরানোর কাজটি পর্ব ২১-এর lifecycle rule দিয়ে নিজে থেকেই হয়।

এবার খাতা পড়ি। নিচের script-এ CloudTrail-এর JSON-কে আমরা এক লাইনের সরল রূপে এনেছি, যাতে পর্ব ৯-এর awk দিয়েই পড়া যায়। দুটি প্রশ্ন: কে MFA ছাড়া console-এ ঢুকলেন, আর কে কী মুছলেন?

set -euo pipefail
export LC_ALL=C
cd "$(mktemp -d)"
cat > audit.log <<'LOG'
2026-10-12T03:02:11Z type=IAMUser user=rahim event=ConsoleLogin result=Success mfa=Yes ip=198.51.100.7
2026-10-12T03:40:52Z type=AssumedRole user=sso-nadia event=ConsoleLogin result=Success mfa=No ip=198.51.100.9
2026-10-12T04:15:09Z type=IAMUser user=karim event=ConsoleLogin result=Failure mfa=No ip=203.0.113.44
2026-10-12T04:15:41Z type=IAMUser user=karim event=ConsoleLogin result=Success mfa=No ip=203.0.113.44
2026-10-12T04:25:18Z type=IAMUser user=karim event=DeleteBucketPolicy result=Success mfa=- ip=203.0.113.44
2026-10-12T04:31:57Z type=IAMUser user=karim event=DeleteTrail result=AccessDenied mfa=- ip=203.0.113.44
2026-10-12T05:10:26Z type=Root user=root event=ConsoleLogin result=Success mfa=No ip=203.0.113.80
2026-10-12T06:44:12Z type=AssumedRole user=ci-deployer event=TerminateInstances result=Success mfa=- ip=198.51.100.7
2026-10-12T06:45:30Z type=AssumedRole user=ci-deployer event=RunInstances result=Success mfa=- ip=198.51.100.7
LOG

# Turn key=value pairs into named fields, then apply one condition per report.
report() {
  awk -v cond="$1" '{
    split("", f); f["time"] = $1
    for (i = 2; i <= NF; i++) { split($i, kv, "="); f[kv[1]] = kv[2] }
    hit = 0
    if (cond == "nomfa")
      hit = f["event"] == "ConsoleLogin" && f["result"] == "Success" &&
            f["mfa"] != "Yes" && f["type"] != "AssumedRole"
    if (cond == "delete")
      hit = f["event"] ~ /^(Delete|Terminate|Remove)/
    if (hit) print f["time"], f["user"], f["event"], f["result"], f["ip"]
  }' audit.log
}
echo "== console login without MFA"
report nomfa
echo "== deletion events"
report delete
echo "== deletion events per user"
report delete | cut -d' ' -f2 | sort | uniq -c | sort -rn

প্রথম অংশ: ধরা পড়েছে দুটি login: karim ConsoleLogin Success 203.0.113.44 আর root ConsoleLogin Success 203.0.113.80. দ্বিতীয়টি বেশি গুরুতর, কারণ root সবচেয়ে ক্ষমতাবান পরিচয়, আর এটি দৈনন্দিন কাজে ব্যবহার হওয়ারই কথা নয়।

যা বাদ গেছে: sso-nadia-র লাইনে mfa=No লেখা থাকলেও সে আসেনি। SSO-তে MFA হয় পরিচয়-প্রদানকারীর কাছে, তাই CloudTrail-এর MFAUsed এখানে No দেখাতে পারে। CIS Benchmark-এর পরিচিত filter-ও এজন্য শুধু IAMUser ধরে। আর karim-এর ব্যর্থ login-টিও বাদ, কারণ result Success নয়।

দ্বিতীয় অংশ: DeleteBucketPolicy Success, DeleteTrail AccessDenied আর TerminateInstances Success. শেষ সারাংশে 2 karim আর 1 ci-deployer. লক্ষ করুন, karim-এর log মোছার চেষ্টা ব্যর্থ হয়েছে, তবু এটি রিপোর্টে এসেছে। ব্যর্থ চেষ্টাও তথ্য, বরং অনেক সময় সফল কাজের চেয়ে বেশি তথ্য।

একটি MFA-হীন login বা একটি মোছার কাজ একা কিছু প্রমাণ করে না। অস্বাভাবিকতা বোঝা যায় তুলনায়। প্রতিটি principal-এর স্বাভাবিক আচরণ আগে থেকে জানা থাকলে নতুন কিছু চোখে পড়ে। এই ধারণাকে বলে anomaly detection. নিচের সিমুলেটরে একটি কাল্পনিক CI পরিচয়ের ৩০ দিনের স্বাভাবিক আচরণের সাথে একদিনের কাজ মেলানো হয়েছে।

// Compare one day of audit events with each principal's normal behaviour.
const baseline = {
  'ci-deployer': { actions: ['PutObject', 'UpdateService'], ips: ['198.51.100.7'], regions: ['ap-south-1'], hours: [8, 20] },
  'nadia': { actions: ['DescribeInstances', 'GetObject'], ips: ['198.51.100.9'], regions: ['ap-south-1'], hours: [8, 20] },
};
const SENSITIVE = ['StopLogging', 'DeleteTrail', 'CreateAccessKey', 'AttachUserPolicy', 'PutBucketPolicy'];
const events = [
  ['10:05', 'ci-deployer', 'PutObject', '198.51.100.7', 'ap-south-1'],
  ['10:06', 'ci-deployer', 'UpdateService', '198.51.100.7', 'ap-south-1'],
  ['11:30', 'nadia', 'DescribeInstances', '198.51.100.9', 'ap-south-1'],
  ['15:12', 'nadia', 'ListBuckets', '198.51.100.9', 'ap-south-1'],
  ['02:41', 'ci-deployer', 'ListUsers', '203.0.113.50', 'ap-south-1'],
  ['02:44', 'ci-deployer', 'CreateAccessKey', '203.0.113.50', 'ap-south-1'],
  ['02:47', 'ci-deployer', 'RunInstances', '203.0.113.50', 'eu-north-1'],
  ['02:52', 'ci-deployer', 'StopLogging', '203.0.113.50', 'ap-south-1'],
].map(([time, who, action, ip, region]) => ({ time, who, action, ip, region }));

function flagsFor(e) {
  const b = baseline[e.who], hour = Number(e.time.slice(0, 2)), flags = [];
  if (!b.actions.includes(e.action)) flags.push('new-action');
  if (!b.ips.includes(e.ip)) flags.push('new-ip');
  if (!b.regions.includes(e.region)) flags.push('new-region');
  if (hour < b.hours[0] || hour >= b.hours[1]) flags.push('odd-hour');
  if (SENSITIVE.includes(e.action)) flags.push('sensitive');
  return flags;
}
const scored = events.map(e => {
  const flags = flagsFor(e);
  return { ...e, flags, score: flags.length + (flags.includes('sensitive') ? 2 : 0) };
});
scored.filter(e => e.score >= 1).sort((a, b) => b.score - a.score || a.time.localeCompare(b.time))
  .forEach(e => console.log(e.score, e.time, e.who, e.action, '[' + e.flags.join(', ') + ']'));
const byWho = {};
scored.forEach(e => { byWho[e.who] = (byWho[e.who] || 0) + e.score; });
Object.entries(byWho).forEach(([who, s]) => console.log(`${who}: total ${s}, ${s >= 5 ? 'OPEN INCIDENT' : 'review later'}`));

সবচেয়ে ওপরে দুটি 6 নম্বরের সারি: CreateAccessKey আর StopLogging. প্রতিটিতে চারটি flag, সাথে sensitive বলে বাড়তি ২। পুরো ঘটনাটি সময় ধরে পড়লে গল্প দাঁড়ায়: 02:41 থেকে 02:52, একই অচেনা IP, চারটি কাজ, রাত আড়াইটায়। মোট ci-deployer: total 19, OPEN INCIDENT, যা ৬ + ৬ + ৪ + ৩ থেকে এসেছে।

এই পরিচয়ের সকাল দশটার কাজগুলো কোনো flag পায়নি, তাই তালিকাতেই নেই। অন্যদিকে nadia-র ListBuckets নতুন, কিন্তু স্কোর 1, ফলে review later. প্রতিটি নতুন কাজে alarm বাজালে দল সেগুলো উপেক্ষা করা শিখে যায়। তাই একাধিক সংকেত মিললে তবেই incident খোলা হয়। নম্বরগুলো শেখানোর জন্য আমাদের বানানো, কোনো মান নয়।

৪ · পাহারার যন্ত্র — threat detection, CSPM আর CIS Benchmark

হাতে log পড়া শেখার জন্য ভালো, প্রতিদিনের কাজের জন্য নয়। এখানে দুই আলাদা ধরনের যন্ত্র আসে, আর এই দুটিকে গুলিয়ে ফেলা নতুনদের সাধারণ ভুল।

CSPM: দরজা-জানালা পরীক্ষক

CSPM (Cloud Security Posture Management) আপনার সেটিংগুলো পড়ে নিয়মের সাথে মেলায়। প্রশ্ন: “কোন দরজা খোলা?” এটি ঘটনার আগের প্রতিরোধ।

Threat detection: রাতের প্রহরী

Threat detection সেবা audit log, flow log আর DNS log-এর মতো উৎস দেখে সন্দেহজনক আচরণ খোঁজে। প্রশ্ন: “এখন কেউ কি ভেতরে কিছু করছে?”

এদের প্রতিটি রিপোর্টকে বলে finding: একটি নির্দিষ্ট resource-এ একটি নির্দিষ্ট সমস্যার রেকর্ড। Finding নিজে থেকে কিছু সারায় না। অনেক দল ধরে নেয়, সেবা চালু করলেই কাজ শেষ। আসলে কাজ শুরু হয় সেখান থেকে, কারণ finding কারও চোখে না পড়লে তার কোনো মূল্য নেই। এই দুই ধারার ওপরে অনেক প্রতিষ্ঠান সব log আর finding এক জায়গায় আনার জন্য SIEM ব্যবহার করে।

কাজAWSAzureGoogle Cloud
Threat detectionGuardDutyDefender for CloudSecurity Command Center
Posture যাচাইSecurity Hub, ConfigDefender for Cloud-এর CSPM অংশSecurity Command Center-এর Security Health Analytics
দুর্বলতা স্ক্যানInspectorDefender for ServersArtifact Analysis, VM Manager
Patch ব্যবস্থাপনাSystems Manager Patch ManagerAzure Update ManagerVM Manager
নিয়ম আগে থেকে আটকানোSCP, RCPAzure PolicyOrganization Policy

নাম আর tier নিয়মিত বদলায়, আর এগুলো সাধারণত ব্যবহার-ভিত্তিক বিলে চলে। চালুর আগে সেই সেবার pricing পাতা দেখুন। এসবের বাইরে Prowler-এর মতো open-source posture scanner-ও আছে। লক্ষ্য একই: সেটিং পড়া, নিয়মে মেলানো, রিপোর্ট দেওয়া।

কিন্তু “ভালো সেটিং” কোনটি, সেটি ঠিক করল কে? এর একটি বহুল ব্যবহৃত উত্তর CIS Benchmark. অলাভজনক সংস্থা Center for Internet Security বিভিন্ন বিশেষজ্ঞের সম্মতিতে এই নির্দেশিকা বানায়। AWS, Azure, Google Cloud, Linux, Kubernetes, সবকিছুর আলাদা Benchmark আছে। প্রতিটি সুপারিশে কারণ, যাচাইয়ের পথ আর প্রতিকার লেখা থাকে। সাধারণত দুটি স্তর থাকে: Level 1 প্রায় সবার জন্য, Level 2 বেশি সংবেদনশীল পরিবেশের জন্য। Version সময়ের সাথে বদলায়, তাই নম্বর মুখস্থ করার দরকার নেই।

এবার একটি ছোট posture scanner নিজের হাতে দেখি। JSON-এ একটি কাল্পনিক account-এর resource তালিকা, আর প্রতিটি নিয়মের একটি severity ও ওজন।

// Posture scanner over a fake inventory. Severity weights are our own teaching scheme.
const WEIGHT = { critical: 10, high: 5, medium: 2, low: 1 };
const inventory = JSON.parse(`[
  {"id":"bucket-invoices","type":"bucket","public":true,"encrypted":true,"logged":false},
  {"id":"bucket-site","type":"bucket","public":true,"encrypted":true,"logged":true,"publicReason":"static site"},
  {"id":"bucket-backup","type":"bucket","public":false,"encrypted":false,"logged":true},
  {"id":"vm-web","type":"vm","worldPorts":[443],"diskEncrypted":true,"patchAgeDays":12},
  {"id":"vm-admin","type":"vm","worldPorts":[22,443],"diskEncrypted":false,"patchAgeDays":95},
  {"id":"db-orders","type":"db","public":true,"encrypted":true},
  {"id":"user-ci","type":"iam","actions":["*"],"mfa":false},
  {"id":"role-report","type":"iam","actions":["s3:GetObject"],"mfa":true},
  {"id":"audit-trail","type":"log","enabled":false}
]`);
const rules = [
  ['bucket', 'critical', 'public without a recorded reason', r => !r.public || !!r.publicReason],
  ['bucket', 'medium', 'not encrypted at rest', r => r.encrypted],
  ['bucket', 'low', 'access logging is off', r => r.logged],
  ['vm', 'high', 'admin port open to the world', r => !r.worldPorts.some(p => [22, 3389].includes(p))],
  ['vm', 'medium', 'disk not encrypted', r => r.diskEncrypted],
  ['vm', 'high', 'no patch for over 30 days', r => r.patchAgeDays <= 30],
  ['db', 'critical', 'database reachable from the internet', r => !r.public],
  ['iam', 'critical', 'wildcard permission', r => !r.actions.includes('*')],
  ['iam', 'high', 'no MFA', r => r.mfa],
  ['log', 'high', 'audit logging disabled', r => r.enabled],
];
let total = 0, earned = 0;
const failed = [];
for (const res of inventory) for (const [type, sev, text, pass] of rules) {
  if (res.type !== type) continue;
  total += WEIGHT[sev];
  if (pass(res)) earned += WEIGHT[sev]; else failed.push({ sev, id: res.id, text });
}
failed.sort((a, b) => WEIGHT[b.sev] - WEIGHT[a.sev]);
failed.forEach(f => console.log(f.sev.toUpperCase().padEnd(9), f.id.padEnd(16), f.text));
console.log(`failed: ${failed.length}, score: ${Math.round(100 * earned / total)}/100`);

শেষ লাইন: failed: 10, score: 49/100. মোট ওজন ১০৮, ব্যর্থ নিয়মের ওজন ৫৫, তাই পাওয়া গেল ৫৩। ৫৩ ÷ ১০৮ ≈ ০.৪৯। ওপরে তিনটি CRITICAL: bucket-invoices, db-orders আর user-ci.

দুটি জিনিস খেয়াল করুন। bucket-site-ও public, কিন্তু রিপোর্টে নেই, কারণ তার publicReason লেখা আছে। ভালো scanner কারণসহ ব্যতিক্রম মানে, নইলে একটি static website সারাজীবন লাল হয়ে থাকবে। আর user-ci দুটি নিয়মে ব্যর্থ, vm-admin তিনটিতে। একই resource বারবার এলে সেটি সাধারণত অবহেলার চিহ্ন। স্কোরের পদ্ধতি এখানে আমাদের নিজের, Microsoft-এর Secure Score-এর মতো বাস্তব স্কোরের হিসাব আলাদা।

৫ · কোনটি আগে — severity আর ঝুঁকির হিসাব

প্রথমবার scanner চালালে শত শত finding দেখা অস্বাভাবিক নয়। সব সমান জরুরি মনে হলে আসলে কিছুই জরুরি থাকে না। একে বাছাই করার কাজকে বলে triage, হাসপাতালের জরুরি বিভাগের মতো: বুকে ব্যথার রোগী আগে, হাতে ছড়ে যাওয়া রোগী পরে।

সবচেয়ে পরিচিত সরল সূত্র, যা NIST SP 800-30-এর মতো ঝুঁকি-নির্দেশিকার ধারণার সহজ রূপ:

সূত্র

ঝুঁকি = সম্ভাবনা (likelihood, ১–৫) × ক্ষতি (impact, ১–৫)

Provider-এর দেওয়া severity আপনার ব্যবসা চেনে না। একটি test VM-এ “High” আর payment database-এর “Medium”-এর মধ্যে দ্বিতীয়টি আগে দেখতে হতে পারে। তাই পাঁচটি প্রশ্নে নিজের হিসাব মিলিয়ে নিন।

  • উন্মুক্ত কি না: internet থেকে পৌঁছানো যায়, নাকি শুধু ভেতর থেকে?
  • ডেটা কী: গ্রাহকের ব্যক্তিগত বা পেমেন্টের তথ্য, নাকি কাল্পনিক test ডেটা?
  • ক্ষমতা কত: এই resource-এর role কতদূর পৌঁছায়?
  • সক্রিয় ব্যবহার আছে কি: এই দুর্বলতা বাস্তবে ব্যবহার হচ্ছে বলে জানা গেছে?
  • অন্য স্তর আছে কি: অন্য কোনো পাহারা এটিকে আংশিক ঢেকে রেখেছে?
// Risk = likelihood x impact (1 to 5 each). L2 is the likelihood after the fix.
const findings = [
  { name: 'invoices bucket public', L: 5, I: 5, L2: 1, hours: 1 },
  { name: 'CI user has wildcard policy', L: 3, I: 5, L2: 1, hours: 8 },
  { name: 'SSH open to the world', L: 4, I: 4, L2: 1, hours: 2 },
  { name: 'audit logging disabled', L: 3, I: 4, L2: 1, hours: 1 },
  { name: 'old TLS on internal API', L: 2, I: 3, L2: 1, hours: 6 },
  { name: 'unused test VM unpatched', L: 3, I: 1, L2: 1, hours: 1 },
];
const band = s => s >= 15 ? 'CRITICAL' : s >= 10 ? 'HIGH' : s >= 5 ? 'MEDIUM' : 'LOW';
const due = { CRITICAL: 'today', HIGH: '7 days', MEDIUM: '30 days', LOW: 'next cycle' };
const rows = findings.map(f => {
  const score = f.L * f.I, left = f.L2 * f.I;
  return { ...f, score, left, perHour: (score - left) / f.hours };
});
console.log('-- order by risk');
[...rows].sort((a, b) => b.score - a.score || a.hours - b.hours).forEach((r, i) => {
  const b = band(r.score);
  console.log(`${i + 1}. ${String(r.score).padStart(2)} ${b.padEnd(8)} ${r.name} (fix by: ${due[b]})`);
});
console.log('-- risk removed per hour of work');
[...rows].sort((a, b) => b.perHour - a.perHour).slice(0, 3).forEach(r =>
  console.log(`${r.perHour.toFixed(1).padStart(4)}  ${r.name} (${r.score} -> ${r.left} in ${r.hours}h)`));
const before = rows.reduce((s, r) => s + r.score, 0);
const after = rows.reduce((s, r) => s + r.left, 0);
console.log(`total risk ${before} -> ${after} if all are fixed`);

ঝুঁকির ক্রমে প্রথম 25 CRITICAL invoices bucket public, তারপর 16 আর 15. বিভাগের সীমা এখানে ১৫, ১০ আর ৫, যা আমাদের নমুনা নীতি। আপনার দল নিজের সীমা ঠিক করবে।

দ্বিতীয় তালিকা আরও মজার। audit logging disabled ঝুঁকিতে চতুর্থ, কিন্তু প্রতি ঘণ্টার লাভে দ্বিতীয়: 8.0. অর্থাৎ এক ঘণ্টায় অনেকটা ঝুঁকি কমে। অন্যদিকে CI-এর wildcard সরাতে আট ঘণ্টা লাগে, প্রতি ঘণ্টায় মাত্র (১৫ − ৫) ÷ ৮ = ১.২৫, তাই সে তালিকার প্রথম তিনে নেই। তবু সে CRITICAL, তাই আজই ধরতে হবে। ব্যবহারিক নিয়ম: severity ঠিক করে সময়সীমা, আর একই সীমার ভেতরে ক্রম ঠিক করে পরিশ্রম। সব মিলিয়ে total risk 77 -> 22 if all are fixed. ঝুঁকি শূন্য হয়নি, কারণ সারানোর পরও সম্ভাবনা ১ থাকে। বাকি অংশকে বলে residual risk.

এবার একটি finding-এর পুরো জীবন দেখি, ধরা পড়া থেকে আর কখনো না ঘটার ব্যবস্থা পর্যন্ত। প্রেক্ষাপট একটি কাল্পনিক অনলাইন দোকান।

  1. ধরা পড়াCSPM
  2. বিচারTriage
  3. আটকানোContain
  4. সারানোFix
  5. ঠেকানোPrevent
Bucket: example-invoices
সময়
Public?
Severity
দায়িত্বে
  1. ভুলটি ঘটল। একজন ডেভেলপার হিসাব বিভাগকে রিপোর্ট দেখাতে bucket policy-তে সবাইকে পড়ার অনুমতি দিলেন। উদ্দেশ্য ভালো ছিল, পদ্ধতি ভুল।
  2. Finding এল। ১২ মিনিট পর posture scanner Critical finding দিল, আর সেটি on-call-এর কাছে গেল। ই-মেইলের স্তূপে নয়, সরাসরি alert হিসেবে।
  3. Triage. owner=billing tag দেখে মালিক পাওয়া গেল। ভেতরে আসল invoice আছে। Internet থেকে পড়া যায়, তাই সম্ভাবনা ৫, ক্ষতি ৫, ঝুঁকি ২৫।
  4. আগে আটকানো। সমাধান খোঁজার আগে bucket-এ block public access চালু হলো। তারপর বাইরের একটি সংযোগ থেকে পড়ার চেষ্টা করে 403 পেয়ে যাচাই হলো।
  5. পেছনে তাকানো। Access log দেখে প্রশ্ন: খোলা থাকার ২৭ মিনিটে বাইরে থেকে কেউ পড়েছে কি? ডেটা ব্যক্তিগত হলে এখানেই আইনি ও privacy দায়িত্বশীলকে জানাতে হয়। Log না থাকলে ধরে নিতে হবে, পড়া হয়ে থাকতে পারে।
  6. আসল প্রয়োজন মেটানো। হিসাব বিভাগের কাজ তো থামানো যাবে না। Public-এর বদলে সীমিত মেয়াদের presigned URL দেওয়া হলো (পর্ব ২১)। Finding বন্ধ হলো কারণসহ।
  7. আর যেন না ঘটে। Account-স্তরে block public access, সেটি বন্ধ করা আটকাতে organization-এর নিয়ম, আর Terraform-এর পরিকল্পনায় নিয়ম যাচাই (পর্ব ৫৫)। ছোট postmortem-এ কাউকে দোষ না দিয়ে পদ্ধতি বদলানো হলো।

ধাপ ৭-ই আসল লাভ। একই ভুল ঠিক করতে থাকলে আপনি পাহারাদার হয়েই থাকবেন। ভুলটি অসম্ভব করে দিলে প্রকৌশলী হবেন। এই পথের নাম guardrail: এমন স্বয়ংক্রিয় সীমা, যার বাইরে কেউ ভুল করেও যেতে পারে না।

৬ · Defense in depth — পাঁচ স্তরের পাহারা

Defense in depth-এর মূল ভাবনা সরল: যেকোনো একটি পাহারা একদিন ব্যর্থ হবে, তখন পরেরটি থাকতে হবে। ধারণাটি সামরিক কৌশল থেকে এসেছে। পুরোনো দুর্গে শুধু একটি উঁচু দেয়াল থাকত না; পরিখা, বাইরের দেয়াল, ভেতরের দেয়াল, সবই থাকত। Cloud-এ আমরা পাঁচটি স্তর ধরছি। স্তরের নাম বইভেদে একটু আলাদা হয়, ধারণা একই।

স্তরে স্তরে পাহারা

Defense in depth around customer data

গ্রাহকের তথ্য ঘিরে পাঁচটি প্রতিরক্ষা স্তর ধরা পড়া · Detection audit log, threat detection, alert পরিচয় · Identity MFA, least privilege, temporary key নেটওয়ার্ক · Network private subnet, security group, WAF কম্পিউট · Compute patch, scan, hardened image ডেটা · Data encryption, key, backup, object lock গ্রাহকের তথ্য একটি স্তর ভাঙলেও পরেরটি বাকি থাকে
ছবি ৩৪.১ — Detection সবকিছু ঘিরে আছে, কারণ সে আটকায় না, দেখে। বাকি চারটি স্তর আটকায়।
স্তরমূল নিয়ন্ত্রণএটি ব্যর্থ হলে পরের স্তর কী করে
পরিচয়MFA, সীমিত role, temporary credentialKey ফাঁস হলেও network আর অনুমতির সীমা বাধা দেয়
নেটওয়ার্কPrivate subnet, security group, WAFপথ খুলে গেলেও login আর অনুমতি লাগে
ComputePatch, golden image, IMDSv2VM হাতছাড়া হলেও role সীমিত থাকলে ক্ষতি ছোট
ডেটাএনক্রিপশন, আলাদা চাবির অনুমতি, immutable backupডেটা নষ্ট হলেও backup থেকে ফেরা যায়
ধরা পড়াAudit log, threat detection, alertআগের সব স্তর পেরোলেও ঘটনাটি দেখা যায়, দ্রুত থামানো যায়

এনক্রিপশনের default কী — আর সে কী করে না

এখন বড় cloud-গুলোতে অনেক কিছু নিজে থেকেই এনক্রিপ্ট হয়। ডেটা জমা থাকা অবস্থায় এই সুরক্ষার নাম encryption at rest, আর পথে থাকা অবস্থায় encryption in transit. Default আলাদা আলাদা, আর মনে করে নেওয়া বিপজ্জনক।

জিনিসAWSAzureGoogle Cloud
Object storage২০২৩ থেকে নতুন object নিজে থেকে এনক্রিপ্টStorage account সবসময় এনক্রিপ্টনিজে থেকে এনক্রিপ্ট
Block diskEBS-এ “encryption by default” region ধরে চালু করতে হয়Managed disk নিজে থেকে এনক্রিপ্টনিজে থেকে এনক্রিপ্ট
Managed databaseEngine আর পদ্ধতিভেদে, তৈরির সময় দেখুনAzure SQL-এ নতুন database-এ সাধারণত চালুCloud SQL-এ নিজে থেকে এনক্রিপ্ট

লেখার সময়ের এই তথ্য বদলাতে পারে, নিজের সেবায় যাচাই করে নিন। আর এবার সবচেয়ে গুরুত্বপূর্ণ কথাটি।

এনক্রিপশন অনুমতির বিকল্প নয়। Encryption at rest চোরাই disk থেকে রক্ষা করে। কিন্তু অনুমতি থাকা যেকোনো অনুরোধের জন্য সেবা নিজেই ডেটা খুলে দেয়। তাই provider-এর চাবিতে এনক্রিপ্ট করা একটি public bucket-এর ফাইল internet থেকে সরাসরি পড়া যায়। চাবির ব্যবহারে আলাদা অনুমতি রাখলে তবে বাড়তি একটি স্তর পাওয়া যায়, যা পর্ব ৩৩-এ দেখেছেন। সংযোগের ক্ষেত্রে TLS বাধ্য করাও আলাদা সিদ্ধান্ত।

৭ · Patching আর vulnerability scanning

Misconfiguration আপনার সেটিংয়ের ভুল। Vulnerability হলো software-এর নিজের ত্রুটি। প্রকাশিত ত্রুটি একটি CVE নম্বর পায়। দুটির উত্তরও আলাদা: প্রথমটিতে সেটিং বদলান, দ্বিতীয়টিতে patch দিন।

কোন resource-এ কোন দুর্বল version চলছে, সেটি বের করার কাজই vulnerability scanning. একটি VM-এ agent বসিয়ে স্ক্যান করা যায়, আবার অনেক সেবা disk-এর snapshot পড়ে agent ছাড়াও পারে। Container image স্ক্যান হয় registry-তে (পর্ব ৪১)। মনে রাখুন, শুধু নিজের resource-এই স্ক্যান চালাবেন, আর provider-এর নীতি পড়ে নেবেন।

ফল বিচার করার তিনটি মাপকাঠি আছে, আর এগুলো এক জিনিস নয়।

মাপকাঠিকে দেয়যে প্রশ্নের উত্তর দেয়
CVSSFIRST-এর মান, ০.০ থেকে ১০.০ত্রুটিটি কতটা গুরুতর হতে পারে? ৯.০ বা তার ওপরে Critical, ৭.০–৮.৯ High
KEV তালিকামার্কিন সংস্থা CISA, ২০২১ থেকেএটি বাস্তবে ব্যবহার হয়েছে বলে জানা গেছে?
EPSSFIRST-এর মডেলকাছাকাছি সময়ে এটি ব্যবহৃত হওয়ার সম্ভাবনা কত?

সিদ্ধান্তের নিয়ম সহজ: CVSS ৯.৮-এর একটি ত্রুটি যদি ভেতরের ল্যাবের VM-এ থাকে, আর CVSS ৭.৫-এর একটি ত্রুটি internet-মুখী server-এ থাকে এবং KEV-এ নাম ওঠে, দ্বিতীয়টি আগে। ডিসেম্বর ২০২১-এর Log4Shell (CVE-2021-44228, CVSS ১০.০) অনেক দলকে শিখিয়েছিল আরেকটি কথা। প্রথম প্রশ্নটি ছিল না “কীভাবে সারাব”, ছিল “আমাদের কোথায় কোথায় এই library আছে?” সম্পদের তালিকা না থাকলে patch শুরুই করা যায় না।

Patch দেওয়ার তিন পথ

জায়গায় বসে আপডেট

চলমান VM-এ patch manager বা unattended-upgrades. সহজ, কিন্তু VM-গুলো ধীরে ধীরে একে অপরের থেকে আলাদা হয়ে যায়, আর kernel-এ reboot লাগে।

নতুন image, নতুন VM

Golden image-এ patch বসিয়ে পুরো instance group ধীরে বদলানো (পর্ব ১৬)। পরীক্ষা করা সহজ, ফিরে আসাও সহজ। Immutable infrastructure-এর পথ এটিই।

Provider-কে দেওয়া

Managed সেবায় patch provider দেয়। আপনি শুধু maintenance window বেছে নেন। তবে সংস্করণ সমর্থনের শেষ তারিখ আপনাকেই নজরে রাখতে হয়।

Scanner মাঝে মাঝে ভুলও করে। Linux distribution অনেক সময় নিরাপত্তা-সংশোধন পুরোনো version-এই বসায়, version নম্বর বাড়ায় না। তখন শুধু version দেখে বানানো scanner মিথ্যা alarm দেয়, যাকে বলে false positive. Finding বন্ধ করার আগে distribution-এর security advisory দেখুন, আর কারণটি লিখে রাখুন।

৮ · Incident-এর প্রস্তুতি — আলাদা করা, প্রমাণ রাখা, credential বদলানো

সব পাহারার পরও ঘটনা ঘটবে, এই মেনে নিয়েই প্রস্তুতি। NIST SP 800-61 নিরাপত্তা-ঘটনা সামলানোর বহুল ব্যবহৃত নির্দেশিকা। এর ২০১২ সালের সংস্করণে চারটি ধাপ: প্রস্তুতি; শনাক্ত ও বিশ্লেষণ; আটকানো, নির্মূল ও পুনরুদ্ধার; আর ঘটনার পরের কাজ। ২০২৫ সালের নতুন সংস্করণ এটিকে NIST Cybersecurity Framework-এর সাথে মিলিয়েছে। পুরো ব্যবস্থাকে বলে incident response. Severity, ভূমিকা আর on-call-এর বিস্তার পর্ব ৬৭-এ পাবেন; এখানে নিরাপত্তার বিশেষ অংশটুকু।

আগুন লাগলে আপনি ঘর পুড়তে দেন না, আবার পোড়া জায়গাও সাথে সাথে ঝাড়ু দেন না, কারণ তদন্তকারী দেখতে চাইবেন আগুন কোথা থেকে শুরু। Cloud-এও তিনটি কাজ একসাথে সামলাতে হয়। আগুন ছড়ানো থামানো, যাকে বলে containment. প্রমাণ অক্ষত রাখা। আর যা চুরি হয়ে থাকতে পারে, তা অকেজো করা। নিচে ক্রমটি দেখুন।

Instance: vm-web-3
Traffic
Network
Role credential
প্রমাণ
VM চলছে?
  1. Finding. Threat detection জানাল, vm-web-3-এর role credential অচেনা জায়গা থেকে ব্যবহার হচ্ছে, আর VM-টি অস্বাভাবিক ঠিকানায় সংযোগ করছে।
  2. Incident খোলা, বন্ধ করা নয়। একটি ঘটনা-নম্বর আর সময়রেখা শুরু হলো। প্রথম প্রলোভন হলো VM মুছে দেওয়া। সেটি করা হলো না, কারণ মেমরির প্রমাণ আর ঘটনার সূত্র তাতে হারিয়ে যায়।
  3. Traffic থেকে সরানো। Target group আর instance group থেকে VM-টি সরানো হলো। নইলে autoscaling একে অসুস্থ ভেবে নিজেই মুছে দিতে পারে। গ্রাহকের সেবা বাকি VM চালাল, আর দল একটি নতুন VM বসাল।
  4. Network বিচ্ছিন্ন। কোনো ভেতর-বাইরের নিয়ম ছাড়া sg-quarantine লাগানো হলো। কিন্তু security group stateful, চলমান সংযোগ এতে সবসময় কাটে না। তাই subnet-এর NACL-এ সেই ঠিকানা আটকে সংযোগ কাটা হলো।
  5. Credential অকেজো করা। Role-এর credential বাইরে চলে গিয়ে থাকতে পারে। VM বিচ্ছিন্ন করলেও সেগুলো বাইরে থেকে চলবে। তাই ঘটনার সময়ের আগে ইস্যু করা session বাতিল করা হলো। AWS-এ একটি deny policy দিয়ে এটি করা যায়।
  6. প্রমাণ রাখা। সব disk-এর snapshot নেওয়া হলো, প্রস্তুত থাকলে মেমরিও। প্রতিটি কপির hash লেখা হলো। কে কখন কী করলেন, সেই ধারাবাহিক নথির নাম chain of custody.
  7. আলাদা জায়গায় তদন্ত। Snapshot চলে গেল আলাদা forensic account-এ। Log archive থেকে এই VM আর role-এর সময়রেখা মেলানো হলো: কখন শুরু, কী কী ছোঁয়া হয়েছে, আর কোন পথে ঢোকা হয়েছিল।
  8. সারিয়ে নতুন করে শুরু। মূল কারণ সারানো হলো, golden image থেকে নতুন VM এল, আর এই VM যে সব secret দেখতে পেত, সব বদলানো হলো। পুরোনো VM-টি তদন্ত শেষ না হওয়া পর্যন্ত রাখা হলো, তারপর সরানো হবে। শেষে লেখা হলো postmortem.

একই কাজ AWS CLI-তে দেখতে এরকম (উদাহরণ, আইডি কাল্পনিক; চালানোর আগে আপনার runbook দেখুন)। Azure আর Google Cloud-এ ধারণা একই: VM-কে group থেকে সরানো, network নিয়ম বদলানো, disk snapshot.

# 1. Leave the group, but keep capacity: the group starts a replacement
aws autoscaling detach-instances \
  --instance-ids i-0abc1234example \
  --auto-scaling-group-name shop-web \
  --no-should-decrement-desired-capacity

# 2. Swap to a group with no rules
aws ec2 modify-instance-attribute \
  --instance-id i-0abc1234example \
  --groups sg-0quarantexample

# 3. Preserve the disk
aws ec2 create-snapshot \
  --volume-id vol-0abc1234example \
  --description "IR-014 evidence vm-web-3"

চলমান VM আর তার snapshot-এর জন্য বিল চলতে থাকে, কিন্তু প্রমাণের তুলনায় সেটি ছোট দাম। আর এই সব ধাপ ঘটনার রাতে ভাবা যায় না। আগে থেকে runbook লেখা, sg-quarantine বানানো, forensic account তৈরি আর মাঝে মাঝে মহড়া, এটিই আসল প্রস্তুতি।

একটি প্রকাশ্য ঘটনা: CircleCI, ২০২৩। CI/CD সেবা CircleCI ২০২৩ সালের জানুয়ারিতে গ্রাহকদের জানায়, তাদের সিস্টেমে জমা সব secret বদলে ফেলতে হবে। প্রতিষ্ঠানটির প্রকাশিত ঘটনা-প্রতিবেদন অনুযায়ী, একজন প্রকৌশলীর ল্যাপটপে থাকা malware তাঁর SSO session চুরি করেছিল, যা MFA-র সুরক্ষাও পাশ কাটিয়ে যায়। হাজার হাজার দলকে তখন নিজের সব token খুঁজে খুঁজে বদলাতে হয়েছিল, আর অনেকে আবিষ্কার করেন, তাদের কাছে secret-এর সম্পূর্ণ তালিকাই নেই। শিক্ষাটি প্রস্তুতির: আপনার প্রতিটি secret কোথায় আছে, কে ব্যবহার করে আর কতটা সহজে বদলানো যায়, সেটি ঘটনার আগেই জানতে হবে (পর্ব ৩৩)। বিস্তারিত প্রতিষ্ঠানের নিজের প্রতিবেদনে দেখে নেবেন।

৯ · নতুন account-এর প্রথম দিন — security baseline

Security baseline হলো প্রতিটি account-এ বাধ্যতামূলক ন্যূনতম ব্যবস্থা। নতুন বাড়িতে উঠে আগে যেমন তালা বদলান, তারপর আসবাব তোলেন, তেমনই। Resource বানানোর আগে এটি করলে খরচ আর পরিশ্রম দুটিই সবচেয়ে কম। ধরুন একটি ছোট দল একটি নতুন account খুলেছে। প্রথম দিনটি দেখি।

Account-এর অবস্থা
সম্পন্ন
এইমাত্র বসল
সবচেয়ে বড় বাকি ঝুঁকি
  1. Root সিন্দুকে। পর্ব ৬-এর মতো root-এ শক্ত MFA বসল। Root-এর কোনো access key থাকল না, আর এটি দৈনন্দিন কাজে ব্যবহার বন্ধ।
  2. খবর পাওয়ার পথ। Budget alert বসল, কারণ অস্বাভাবিক বিলও একটি নিরাপত্তা-সংকেত। Provider-এর নিরাপত্তা-বার্তা একজন ব্যক্তির বদলে দলের সাধারণ ঠিকানায় যাবে।
  3. মানুষের প্রবেশ। সবাই SSO আর MFA দিয়ে ঢুকবেন, role নেবেন, পাবেন সাময়িক credential. দীর্ঘদিনের key না বানানোই নিয়ম।
  4. আগে ক্যামেরা। Workload আসার আগে সব region-এর audit log আলাদা log archive account-এ যাওয়া শুরু হলো। Integrity validation আর object lock সহ। এটি পরে করলে শুরুর ঘটনাগুলো হারিয়ে যায়।
  5. নিরাপদ default. Account-স্তরে block public access, disk-এ default এনক্রিপশন, নতুন VM-এ IMDSv2 বাধ্যতামূলক। এখন একটি ভুল করতে হলে ইচ্ছে করে সুরক্ষা সরাতে হবে।
  6. যন্ত্রের পাহারা। Threat detection আর posture scan চালু হলো, finding এক জায়গায় আসছে। CIS Benchmark-এর Level 1-কে শুরুর মান ধরা হলো।
  7. পরীক্ষা ছাড়া বিশ্বাস নয়। একটি নমুনা finding বানিয়ে দেখা হলো, alert সত্যিই on-call-এর ফোনে আসে কি না। প্রথম runbook লেখা হলো, আর সাপ্তাহিক পর্যালোচনার সময় ঠিক হলো।

নিচের কমান্ডগুলো সেই baseline-এর কয়েকটি ধাপের নমুনা, পূর্ণ সেটআপ নয়। Log bucket-এর policy, নিরাপত্তা-সেবার সংযোগ আর region-ভিত্তিক কাজ আলাদা করে লাগবে। কিছু সেবা বিল তুলতে পারে, আর পরীক্ষার account হলে কাজ শেষে এগুলো বন্ধ করে পরিষ্কার করবেন। বাস্তবে এগুলো হাতে নয়, IaC দিয়ে সব account-এ একইভাবে বসানো হয় (পর্ব ৩৫ আর ৫১)।

# AWS: audit log for all regions, with integrity validation
aws cloudtrail create-trail --name org-trail \
  --s3-bucket-name example-log-archive \
  --is-multi-region-trail --is-organization-trail \
  --enable-log-file-validation
aws cloudtrail start-logging --name org-trail

# AWS: block public access for the whole account
aws s3control put-public-access-block --account-id 123456789012 \
  --public-access-block-configuration \
  BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true

# AWS: safe defaults in this region, then threat detection
aws ec2 enable-ebs-encryption-by-default
aws ec2 modify-instance-metadata-defaults --http-tokens required
aws guardduty create-detector --enable

# Google Cloud: send audit logs to a separate bucket
gcloud logging sinks create audit-sink \
  storage.googleapis.com/example-log-archive \
  --organization=123456789012 --include-children \
  --log-filter='logName:"cloudaudit.googleapis.com"'

# Azure: turn on a Defender plan for servers
az security pricing create --name VirtualMachines --tier Standard

আরও গভীরে: CSPM নামটি Gartner জনপ্রিয় করে, আর পরে posture, workload আর IaC স্ক্যান এক ছাতার নিচে এসে CNAPP নাম পায়। ঝুঁকি-ম্যাট্রিক্স নিয়েও সতর্কতা আছে: Louis Anthony Cox-এর ২০০৮ সালের প্রবন্ধ “What's Wrong with Risk Matrices?” দেখায়, ১ থেকে ৫-এর ক্রমবাচক সংখ্যা গুণ করলে ভুল ক্রমও আসতে পারে। তাই FAIR-এর মতো পদ্ধতি টাকার পরিসর দিয়ে হিসাব করে। প্রমাণের বেলায় RFC 3227 (২০০২) “order of volatility” ধারণা দেয়: যা সবচেয়ে দ্রুত হারায়, যেমন মেমরি, সেটি আগে সংগ্রহ করা।

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

  • CSPM আর threat detection-এর পার্থক্য? প্রথমটি ভুল সেটিং খোঁজে, দ্বিতীয়টি চলমান সন্দেহজনক আচরণ খোঁজে।
  • Audit log আলাদা account-এ কেন? হাতছাড়া হওয়া account থেকে প্রমাণ মোছা আটকাতে।
  • Encrypted bucket কি public হলেও নিরাপদ? না। অনুমতি থাকলে সেবা ডেটা খুলে দেয়।
  • Compromised VM দেখে প্রথম কাজ? মুছে না ফেলে traffic থেকে সরানো, network বিচ্ছিন্ন করা, credential বাতিল আর প্রমাণ রাখা।
  • CVSS বেশি হলেই কি আগে সারাবেন? না। উন্মুক্ততা, ডেটা আর বাস্তবে ব্যবহার হচ্ছে কি না, এসব মিলিয়ে দেখবেন।

১০ · AI-এর যুগে cloud নিরাপত্তা

AI দ্রুত Terraform, policy বা সমাধান লিখে দেয়। কিন্তু তার লক্ষ্য থাকে “কাজ চলুক”, আর সবচেয়ে সহজে কাজ চলে সব খুলে দিলে। সমস্যা হলে সে অনেক সময় নিরাপত্তা কমিয়ে সমাধান দেয়। আর একটি নতুন ঝুঁকি: log বা finding AI-কে দেওয়ার আগে তার ভেতরের আসল তথ্য মুছতে হবে।

AI প্রায়ই যা করেকেন বিপজ্জনকআপনার করণীয়
Action: "*" দিয়ে অনুমতিএকটি key ফাঁসে পুরো accountকাজের ঠিক যে অনুমতি লাগে, তা বের করা
0.0.0.0/0 খুলে সংযোগ ঠিক করাTimeout-এর কারণ না বুঝে দরজা খোলাGroup reference, flow log দিয়ে কারণ খোঁজা
Bucket public করে ফাইল শেয়ারআসল ডেটা উন্মুক্তPresigned URL বা CDN-এর সীমিত প্রবেশ
“খরচ কমাতে log বন্ধ করুন”ঘটনার দিন আপনি অন্ধRetention আর storage শ্রেণি দিয়ে খরচ কমানো
“Compromised VM মুছে দিন”প্রমাণ শেষ, মূল কারণ অজানাআগে আলাদা করা, snapshot, তারপর সিদ্ধান্ত
Secret code-এ বসানো, latest tag, বানানো flagফাঁস, অনিশ্চিত version, ভুল কমান্ডSecret manager, নির্দিষ্ট version, অফিসিয়াল নথি
terraform destroy বা rm -rf সতর্কতা ছাড়াঅপূরণীয় ক্ষতিterraform plan আর --dry-run আগে, throwaway পরিবেশে পরীক্ষা

AI-কে নিরীক্ষকের ভূমিকায় বসান, নির্মাতার নয়। নিচের প্রম্পট একটি নিরাপত্তা-পর্যালোচনা চায়, সাথে সীমাও দেয়। আসল account নম্বর, IP, নাম, key বা গ্রাহকের তথ্য প্রম্পটে দেবেন না।

তুমি একজন cloud নিরাপত্তা পর্যালোচক। নিচে একটি কাল্পনিক account-এর resource তালিকা JSON-এ দিলাম (সব নাম ও আইডি নকল)। কাজ: ১. পাঁচটি বিভাগে সমস্যা খোঁজো: public storage, খোলা port, বাড়তি অনুমতি, এনক্রিপশন, logging. ২. প্রতিটি সমস্যায় সম্ভাবনা (১-৫), ক্ষতি (১-৫) আর কারণ লেখো। ৩. প্রতিকারকে দুই ভাগে দাও: এখনই আটকানো, আর স্থায়ী প্রতিরোধ। সীমা: - কোনো সমাধানে * অনুমতি, 0.0.0.0/0, public bucket বা log বন্ধ করা চলবে না। - ধ্বংসাত্মক কমান্ড থাকলে আগে সতর্ক করবে আর dry-run বা plan-এর পথ দেখাবে। - যে flag বা সেবার নাম সম্পর্কে নিশ্চিত নও, সেটি বলে দেবে, আর অফিসিয়াল নথির কোন অংশ দেখতে হবে জানাবে। - কোনো আক্রমণের ধাপ লিখবে না, শুধু প্রতিরোধ আর শনাক্তকরণ।

AI-এর নিরাপত্তা-পরামর্শ ব্যবহারের আগে — চেকলিস্ট

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

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

প্র ০১Provider-এর default বদলালেই যদি হাজারো ভুল কমে, তাহলে এত বছর লাগল কেন?

S3-এর ইতিহাস দেখলে উত্তরটি স্পষ্ট হয়। ২০০৬ সালে চালু হওয়ার সময় এটি মূলত internet-এর জন্য বানানো storage. বহু গ্রাহক এতে সরাসরি ছবি আর website-এর ফাইল রাখতেন, তাই public পড়া একটি স্বাভাবিক সুবিধা ছিল, ত্রুটি নয়। নতুন bucket নিজে থেকে private থাকত, কিন্তু ACL আর policy মিলে অনুমতির হিসাব জটিল হতে থাকল।

২০১৭ সালের দিকে একের পর এক সংবাদ আসে, নিরাপত্তা-গবেষকেরা বড় প্রতিষ্ঠানের খোলা bucket খুঁজে পেয়েছেন। AWS ২০১৮ সালে Block Public Access আনে, যা policy আর ACL-এর ওপরে বসা একটি বড় সুইচ। কিন্তু পুরোনো কিছু বদলায়নি, শুধু নতুন একটি সুরক্ষা যুক্ত হয়েছিল। অবশেষে ২০২৩ সালের এপ্রিলে নতুন bucket-এ এই সুরক্ষা নিজে থেকে চালু হয়, আর ACL বন্ধ থাকে। একই বছর নতুন object-এ এনক্রিপশনও default হয়।

দেরির কারণ বোঝা দরকার। Cloud API একটি চুক্তি। লাখো গ্রাহকের script আর pipeline পুরোনো আচরণের ওপর দাঁড়িয়ে আছে। Default হঠাৎ বদলালে কোনো একজনের website বা data pipeline রাতারাতি ভেঙে যাবে। তাই provider-রা সাধারণত আগে ঐচ্ছিক সুবিধা আনেন, তারপর নতুন resource-এর default বদলান, আর পুরোনো resource অনেক সময় অপরিবর্তিত থাকে। এর ফল হলো, আপনার পুরোনো account-এ নতুন নিরাপদ default নাও থাকতে পারে। “এখন তো default নিরাপদ” কথাটি শুধু নতুন resource-এর জন্য।

মূল উপলব্ধি: নিরাপদ default হলো সবচেয়ে সস্তা নিরাপত্তা, কিন্তু পুরোনো ব্যবস্থায় সেটি আপনাআপনি আসে না। আপনার নিজের প্ল্যাটফর্মে default নিরাপদ রাখুন, আর পুরোনো resource ধরে ধরে যাচাই করুন।

প্র ০২Capital One-এর ২০১৯ সালের ঘটনা থেকে defense in depth সম্পর্কে কী শেখা যায়?

২০১৯ সালের জুলাইয়ে মার্কিন ব্যাংক Capital One জানায়, প্রায় ১০ কোটি মার্কিন আর প্রায় ৬০ লাখ কানাডীয় মানুষের তথ্য অননুমোদিতভাবে নেওয়া হয়েছে। মার্কিন আদালতের নথি আর পরে প্রকাশিত বিশ্লেষণ অনুযায়ী, এটি কোনো একটি বড় ভুল ছিল না। ভুলভাবে সাজানো একটি web application firewall, instance metadata থেকে role credential পাওয়ার তখনকার ব্যবস্থা, আর সেই role-এর প্রয়োজনের চেয়ে বেশি অনুমতি, এগুলো মিলে একটি পথ তৈরি হয়েছিল বলে বর্ণনা করা হয়। ২০২০ সালে মার্কিন নিয়ন্ত্রক OCC ব্যাংকটিকে ৮ কোটি ডলার জরিমানা করে।

আমরা আক্রমণের ধাপে যাব না। প্রতিরক্ষার দিক থেকে দেখুন। Network স্তরের একটি ভুল থাকলেও IMDSv2-এর মতো ব্যবস্থা metadata স্তরে বাধা দিতে পারত। AWS সেটি ওই বছরের শেষে আনে। Role-এ শুধু দরকারি bucket-এর অনুমতি থাকলে ক্ষতির পরিধি অনেক ছোট হতো। আর প্রকাশিত তথ্য বলে, ঘটনাটি কয়েক মাস পরে বাইরের একজনের খবরে সামনে আসে, যা ধরা পড়ার স্তরের সীমাও দেখায়।

লক্ষ করুন, ব্যাংকটি cloud নিরাপত্তায় বড় বিনিয়োগ করা প্রতিষ্ঠান হিসেবেই পরিচিত ছিল। মানে সম্পদ থাকলেও ভুল সম্ভব। এখানে কোনো স্তর “থাকা” যথেষ্ট ছিল না, প্রতিটি স্তরের স্বাধীনভাবে কাজ করা দরকার ছিল। দুটি স্তর একই ভুলের ওপর নির্ভর করলে সেগুলো আসলে একটিই স্তর।

Swiss cheese মডেলের কথা ভাবুন। James Reason-এর এই ধারণায় প্রতিটি প্রতিরক্ষা একটি ফুটোওয়ালা পনিরের টুকরো। সব ফুটো এক সারিতে এলেই দুর্ঘটনা ঘটে। আপনার কাজ ফুটো শূন্য করা নয়, ফুটোগুলোকে এক সারিতে আসতে না দেওয়া।

মূল উপলব্ধি: বড় ঘটনা সাধারণত কয়েকটি ছোট ভুলের শৃঙ্খল। তাই প্রশ্নটি “এই ভুলটি কতটা খারাপ” নয়, বরং “এই ভুলের পরে আর কী কী আমাদের বাঁচাবে”।

প্র ০৩একটি ছোট দলের কি সত্যিই আলাদা log আর backup account দরকার? এটি কি বাড়াবাড়ি নয়?

২০১৪ সালের Code Spaces-এর গল্প এই প্রশ্নে বারবার ওঠে। প্রতিষ্ঠানটি ছিল একটি code hosting সেবা। তাদের নিজের প্রকাশিত বিবৃতি আর সে সময়ের সংবাদ অনুযায়ী, একজন অনুপ্রবেশকারী তাদের cloud নিয়ন্ত্রণ-প্যানেলে ঢুকে চাঁদা দাবি করেন। প্রতিষ্ঠানটি প্রবেশ ফিরিয়ে নেওয়ার চেষ্টা করলে বহু resource আর backup মুছে যায়। অল্প সময়ের মধ্যেই প্রতিষ্ঠানটি জানায়, তারা আর ব্যবসা চালাতে পারবে না।

এই ঘটনার মূল শিক্ষা হলো, backup আর মূল ডেটা একই পরিচয়ের নিয়ন্ত্রণে থাকলে সেটি পূর্ণ backup নয়। একই কথা log-এর বেলায়। যে ক্ষমতায় মূল সিস্টেম ধ্বংস করা যায়, সেই ক্ষমতায় যদি প্রমাণ আর backup-ও মোছা যায়, তাহলে আপনার blast radius হলো পুরো প্রতিষ্ঠান।

খরচের হিসাব দেখুন। Cloud-এ আলাদা account খোলার জন্য সাধারণত আলাদা দাম নেই। লাগে সামান্য সেটআপ আর log storage-এর বিল, যা একটি ছোট দলের জন্য সাধারণত নগণ্য। অনুশীলনের হিসাবেই দেখবেন, এক বছরের log রাখার মাসিক খরচ কয়েক ডলারের ঘরে থাকতে পারে, ধরে নেওয়া দামে। আসল খরচ হলো জটিলতা: আরেকটি account সামলানো, আরেকটি login মনে রাখা। ছোট দলের জন্য তাই সবকিছু আলাদা করার দরকার নেই।

ব্যবহারিক মধ্যপথ হলো দুটি account: একটি কাজের, একটি log আর backup-এর। দ্বিতীয়টিতে প্রবেশ অল্প, MFA বাধ্যতামূলক, object lock চালু। প্রতিষ্ঠান বড় হলে পর্ব ৩৫-এর multi-account কাঠামোয় যাওয়া যায়।

মূল উপলব্ধি: আলাদা account মানে আমলাতন্ত্র নয়, ক্ষতির সীমা টানা। প্রশ্ন করুন: একটি পরিচয় হাতছাড়া হলে কী কী হারাতে পারি? উত্তর “সবকিছু” হলে আলাদা করার সময় হয়ে গেছে।

প্র ০৪ঘটনার সময় কোনটি আগে: হামলা থামানো, নাকি প্রমাণ বাঁচানো?

দুটি লক্ষ্য একে অন্যকে টানে। ডাক্তার আর তদন্তকারী একই রোগীর পাশে দাঁড়ালে যেমন হয়। ডাক্তার চান চিকিৎসা, তদন্তকারী চান কিছু যেন না সরে। NIST SP 800-61 আগে থেকেই আটকানোর কৌশল বেছে রাখতে বলে, কারণ পরিস্থিতিভেদে সিদ্ধান্ত বদলায়: ক্ষতির মাত্রা, প্রমাণের প্রয়োজন, সেবার প্রাপ্যতা, সময়।

RFC 3227 (২০০২) “order of volatility” ধারণা দিয়েছে: প্রমাণ সংগ্রহ করতে হবে সবচেয়ে ক্ষণস্থায়ী থেকে সবচেয়ে স্থায়ীর ক্রমে। মেমরি আর চলমান সংযোগ আগে, disk পরে, দূরের log শেষে। কিন্তু cloud এখানে একটি বড় সুবিধা দেয়। Audit log, flow log আর snapshot সিস্টেমের বাইরে বা API দিয়েই পাওয়া যায়। ফলে প্রাচীন data center-এর মতো “তার খুললে সব হারায়” ভয় অনেকটা কম।

ব্যবহারিক উত্তর সাধারণত এমন: সক্রিয় ক্ষতি চলতে থাকলে, যেমন ডেটা বেরোচ্ছে বা ফাইল মুছছে, আগে থামান। Network বিচ্ছিন্ন করায় VM বন্ধ হয় না, তাই মেমরিও থেকে যায়। Credential বাতিল করাতেও disk-এর প্রমাণ নষ্ট হয় না। অর্থাৎ বেশিরভাগ containment প্রমাণ ধ্বংস করে না। ধ্বংস করে শুধু VM মোছা, বন্ধ করা বা “পরিষ্কার” করার চেষ্টা।

অন্যদিকে autoscaling একটি নতুন সমস্যা। একটি অসুস্থ VM নিজে থেকেই মুছে যেতে পারে। তাই প্রমাণ VM-এর ভেতরে রাখলে চলে না। Log সবসময় বাইরে পাঠানো, আর নকশার সময়ই এটি ধরে নেওয়াই সমাধান। আইনি প্রয়োজন থাকলে প্রমাণের ধারাবাহিকতা নিয়ে আরও সতর্ক হতে হয়, তাই প্রতিষ্ঠানের আইনি দায়িত্বশীলকে আগে থেকেই পরিকল্পনায় রাখুন।

মূল উপলব্ধি: প্রশ্নটি “থামানো বনাম প্রমাণ” নয়। এমন ক্রম বেছে নিন, যাতে থামানোর কাজ প্রমাণ না মোছে, আর সেই ক্রম ঘটনার আগেই runbook-এ লিখে রাখুন।

প্র ০৫Posture score ১০০ মানে কি account নিরাপদ? স্কোরকে লক্ষ্য বানালে কী হয়?

অর্থনীতিবিদ Charles Goodhart-এর নামে একটি বহুল প্রচলিত কথা আছে, যার সরল রূপ: কোনো মাপ লক্ষ্য হয়ে গেলে সেটি আর ভালো মাপ থাকে না। Posture score-এ এটি সহজেই ঘটে। ব্যবস্থাপক বললেন, “এই মাসে স্কোর ৯০ চাই।” দল তখন সহজ finding আগে বন্ধ করে, কঠিনগুলোকে “ব্যতিক্রম” লিখে দেয়, আর কিছু resource scanner-এর আওতার বাইরে রাখে। স্কোর বাড়ে, ঝুঁকি কমে না।

স্কোরের সীমাও আছে। এটি শুধু তাই দেখে, যা নিয়ম হিসেবে লেখা আছে। অ্যাপের ভেতরের যুক্তির ভুল, ফাঁস হওয়া একটি বৈধ key, বা ভেতরের কারও ক্ষতিকর আচরণ স্কোরে ধরা পড়ে না। যে resource scanner দেখতে পায় না, যেমন ভুলে যাওয়া আরেকটি account, সেটিও হিসাবে আসে না।

উল্টো দিকের বিপদ হলো alert-এর ক্লান্তি, যাকে বলে alert fatigue. Target-এর ২০১৩ সালের ঘটনা নিয়ে প্রকাশিত প্রতিবেদনগুলোতে বলা হয়েছে, নিরাপত্তা-যন্ত্র সতর্কবার্তা দিয়েছিল, কিন্তু তা যথাসময়ে কাজে পরিণত হয়নি। অর্থাৎ যন্ত্র কিনলেই সমস্যা মেটে না। যে সংকেতের পেছনে কেউ নেই, সেটি শুধু খরচ।

তাহলে কী মাপবেন? কয়েকটি মাপ একসাথে: সবচেয়ে গুরুতর finding কত দিন খোলা থাকে; নতুন ভুল ধরা পড়তে কত সময় লাগে; কতটি account আওতায় আছে; কত alert সত্যিকারের কাজে গড়ায়; আর মহড়ায় দল কত দ্রুত একটি VM আলাদা করতে পারল। এই মাপগুলো আচরণ বদলায়, শুধু সংখ্যা নয়। পরে পর্ব ৬৬-এ ভালো alert নিয়ে আরও দেখবেন।

মূল উপলব্ধি: স্কোর একটি ড্যাশবোর্ডের বাতি, গন্তব্য নয়। নিরাপত্তা মাপুন ফলাফলে: কত দ্রুত ধরা পড়ে, কত দ্রুত সারে, আর একই ভুল ফিরে আসে কি না।

অনুশীলন

কোনো cloud account লাগবে না। কাগজ, কলম আর পাতার সিমুলেটরই যথেষ্ট।

  1. হিসাব: (ক) একটি scanner-এর মোট ওজন ৫০। ব্যর্থ হয়েছে ১টি critical (ওজন ১০), ২টি high (প্রতিটি ৫) আর ৩টি medium (প্রতিটি ২)। স্কোর কত? Critical আর একটি high সারালে স্কোর কত হবে? (খ) দিনে ৩ GB audit log জমে। এক বছর রাখবেন: প্রথম ৯০ দিন দ্রুত storage-এ, বাকিটা সস্তা storage-এ। ধরে নিই দাম প্রতি GB-মাসে $0.02 আর $0.004 (আসল দাম pricing পাতায় দেখুন)। পূর্ণ অবস্থায় মোট কত GB, আর মাসিক খরচ কত? (গ) Finding A: সম্ভাবনা ৪, ক্ষতি ২। Finding B: সম্ভাবনা ২, ক্ষতি ৫। কোনটি আগে?

    (ক) ব্যর্থ ওজন ১০ + ১০ + ৬ = ২৬। পাওয়া গেছে ৫০ − ২৬ = ২৪, স্কোর ২৪ ÷ ৫০ = ৪৮%. সারানোর পর ব্যর্থ ওজন ২৬ − ১৫ = ১১। পাওয়া ৩৯, স্কোর ৭৮%.

    (খ) মোট ৩ × ৩৬৫ = ১,০৯৫ GB. দ্রুত storage-এ ৩ × ৯০ = ২৭০ GB, সস্তায় ৮২৫ GB. খরচ ২৭০ × ০.০২ = $৫.৪০ আর ৮২৫ × ০.০০৪ = $৩.৩০, মোট মাসে $৮.৭০.

    (গ) A = ৮, B = ১০। সূত্রে B আগে, যদিও সেটি কম সম্ভাব্য। ক্ষতি বড় হলে অল্প সম্ভাবনাকেও গুরুত্ব দিতে হয়।

  2. ফল অনুমান করুন: Audit log পড়ার একটি script দুটি রিপোর্ট বানায়। রিপোর্ট ১: event=ConsoleLogin, result=Success, mfa Yes নয়, আর type AssumedRole নয়। রিপোর্ট ২: event মেলে /^(Delete|Terminate|Remove)/-এর সাথে। ইনপুট ছয়টি লাইন (সংক্ষেপে): (১) IAMUser tania ConsoleLogin Success mfa=No (২) AssumedRole sso-ali ConsoleLogin Success mfa=No (৩) IAMUser tania ConsoleLogin Failure mfa=No (৪) IAMUser ops BatchDeleteImage Success (৫) IAMUser ops RemoveUserFromGroup AccessDenied (৬) IAMUser rafi ConsoleLogin Success mfa=Yes. কোন কোন লাইন কোন রিপোর্টে আসবে? কোন লাইনটি আসা উচিত ছিল, কিন্তু আসবে না?

    রিপোর্ট ১: শুধু লাইন ১। লাইন ২ AssumedRole, লাইন ৩ ব্যর্থ, লাইন ৬-এ MFA আছে।

    রিপোর্ট ২: শুধু লাইন ৫, যদিও সেটি AccessDenied; filter ফল দেখে না।

    ফসকে গেছে: লাইন ৪ BatchDeleteImage. এটিও মোছার কাজ, কিন্তু নাম Batch দিয়ে শুরু, তাই ^ চিহ্নের কারণে মেলেনি। Filter-এর এমন নীরব ফাঁক সবচেয়ে বিপজ্জনক, কারণ রিপোর্ট দেখতে পরিষ্কার লাগে।

  3. নকশা ও সমালোচনা: একটি কাল্পনিক startup জানাল: “আমরা নিরাপদ। সব log একই account-এর bucket-এ আছে। Root দিয়ে প্রতিদিন deploy করি, তবে তাতে MFA আছে। Threat detection চালু, alert যায় আগের CTO-র ই-মেইলে। সব VM private subnet-এ, তবে একটি জরুরি SSH নিয়ম 0.0.0.0/0-তে খোলা, কারণ bastion বানানোর সময় পাইনি। Disk এনক্রিপ্ট করা, তাই ডেটা নিয়ে চিন্তা নেই।” কমপক্ষে পাঁচটি সমস্যা ধরুন, ঝুঁকির ক্রমে সাজান, আর প্রতিটির প্রতিকার লিখুন।

    ১. Alert কেউ পান না: ধরা পড়ার স্তরটি কার্যত নেই। দলের on-call-এ পাঠিয়ে নমুনা finding দিয়ে পরীক্ষা করুন।

    ২. Root দিয়ে deploy: সর্বোচ্চ ক্ষমতা দৈনন্দিন কাজে। CI-এর জন্য সীমিত role আর সাময়িক credential (পর্ব ৬১) ব্যবহার করুন।

    ৩. খোলা SSH: Session manager (পর্ব ১২) বা নির্দিষ্ট ঠিকানা। “Bastion”-এর চেয়ে সহজ পথও আছে, এবং “জরুরি” নিয়মে মেয়াদ লাগে।

    ৪. Log একই account-এ: Root হাতছাড়া হলে প্রমাণও শেষ। আলাদা account, object lock, integrity validation.

    ৫. “এনক্রিপ্ট করা, তাই চিন্তা নেই”: ভুল ধারণা। Backup, অনুমতি আর পথের এনক্রিপশন আলাদা বিষয়, আর চলমান VM নিজের disk পড়তে পারে।

  4. কমান্ড: audit_login.sh-এ একটি তৃতীয় রিপোর্ট যোগ করুন, যা log-এর সাথে কারসাজি ধরবে: StopLogging, DeleteTrail বা UpdateTrail. প্রয়োজনীয় পরিবর্তন লিখুন, আর পাতার নমুনা log-এ আউটপুট কী হবে বলুন।

    report()-এর ভেতরে একটি শর্ত আর নিচে একটি ডাক যোগ হবে:

        if (cond == "tamper")
          hit = f["event"] ~ /^(StopLogging|DeleteTrail|UpdateTrail)$/
    
    echo "== audit log tampering"
    report tamper

    আউটপুট একটি লাইন: 2026-10-12T04:31:57Z karim DeleteTrail AccessDenied 203.0.113.44. এখানে শেষে $ দিয়েছি, কারণ এই তিনটি নাম পুরোপুরি মিলতে হবে। ব্যর্থ হলেও এটি জরুরি সংকেত, কারণ চেষ্টাটিই উদ্দেশ্য জানায়।

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

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

ক্রমএকটি সন্দেহজনক VM ধরা পড়ার পর কাজগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. Finding নিশ্চিত করে incident আর সময়রেখা শুরু করা
  2. VM-টিকে traffic আর instance group থেকে সরানো
  3. Network বিচ্ছিন্ন করা আর role-এর session বাতিল করা
  4. Disk snapshot নিয়ে hash লিখে আলাদা account-এ রাখা
  5. Secret বদলানো আর পরিষ্কার image থেকে নতুন VM আনা
  6. Postmortem লিখে স্থায়ী প্রতিরোধ বসানো

একটি cloud VM (IaaS)-এর operating system-এ নিরাপত্তা patch দেওয়ার দায়িত্ব সাধারণত কার?

  • Cloud provider-এর, কারণ VM তার hardware-এ চলে
  • গ্রাহকের, কারণ IaaS-এ OS থেকে ওপরের অংশ তাঁর
  • Region-এর ওপর নির্ভর করে
  • কারও নয়, VM নিজে থেকে আপডেট হয়

একটি bucket provider-এর চাবিতে server-side এনক্রিপ্ট করা, আর তার policy সবাইকে পড়ার অনুমতি দিয়েছে। Internet থেকে একজন ফাইলটি চাইলে কী হবে?

  • চাবি না থাকায় অনুরোধ ব্যর্থ হবে
  • তিনি শুধু দুর্বোধ্য এনক্রিপ্ট করা বাইট পাবেন
  • তিনি ফাইলটি স্বাভাবিকভাবে পড়তে পারবেন
  • Bucket স্বয়ংক্রিয়ভাবে মুছে যাবে

Audit log আলাদা log archive account-এ পাঠানোর প্রধান কারণ কী?

  • কাজের account হাতছাড়া হলেও log মোছা বা বদলানো কঠিন রাখা
  • Log লেখার গতি বাড়ানো
  • Storage-এর বিল কমানো
  • যাতে কেউ কখনো log পড়তে না পারেন

ঝুঁকি = সম্ভাবনা × ক্ষতি সূত্রে (দুটিই ১ থেকে ৫) চারটি finding-এর মান: P (৫, ১), Q (২, ৪), R (৩, ২), S (৩, ৪)। কোনটি আগে ধরবেন?

  • P
  • Q
  • R
  • S

AWS-এ একটি সন্দেহজনক VM-এ সব নিয়ম ছাড়া নতুন security group লাগানো হলো। একটি চলমান সংযোগ তবু চলছে। সবচেয়ে সম্ভাব্য কারণ কী?

  • Security group বদলাতে কয়েক ঘণ্টা লাগে
  • Stateful connection tracking চলমান সংযোগটি মনে রেখেছে
  • Instance role সংযোগটি খোলা রেখেছে
  • Disk এনক্রিপ্ট করা আছে

দুটি দুর্বলতা পাওয়া গেছে। X: CVSS ৯.৮, ভেতরের একটি বিচ্ছিন্ন ল্যাব VM-এ, বাস্তবে ব্যবহারের খবর নেই। Y: CVSS ৭.৫, internet-মুখী payment server-এ, CISA-র KEV তালিকায় আছে। কোনটি আগে সারানো যুক্তিসঙ্গত?

  • X, কারণ CVSS স্কোর সবসময় ক্রম ঠিক করে
  • যেটির patch ফাইল ছোট
  • Y, কারণ সেটি উন্মুক্ত, সংবেদনশীল আর বাস্তবে ব্যবহৃত
  • CVE নম্বর যেটির ছোট

শব্দকোষ

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

মনে রাখুন

  1. Cloud-এর প্রধান ঝুঁকি misconfiguration: public storage, খোলা port, বাড়তি IAM, এনক্রিপশন ছাড়া ডেটা, বন্ধ log.
  2. Audit log সব region থেকে আলাদা, সুরক্ষিত account-এ পাঠান। Data event নিজে থেকে থাকে না।
  3. CSPM ভুল সেটিং খোঁজে, threat detection চলমান আচরণ দেখে। Finding কারও কাছে না পৌঁছালে মূল্যহীন।
  4. পাঁচ স্তর: পরিচয়, network, compute, ডেটা, ধরা পড়া. এনক্রিপশন অনুমতির বিকল্প নয়।
  5. ঘটনায় আলাদা করুন, প্রমাণ রাখুন, credential বদলান, নতুন করে বানান। আর baseline বসান প্রথম দিনেই।

পরের পর্বে: একটি account-এর নিরাপত্তা দেখলেন। এবার অনেক account, অনেক দল: multi-account কাঠামো, landing zone, tag, quota আর compliance.

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

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