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

Numerical সমস্যার অনুশীলন — entropy, key space, risk, CVSS আর detection, পূর্ণ সমাধানসহ

Security Numericals — Entropy, Key Space, Risk, CVSS and Detection with Full Solutions

Taught in Bangla, this page collects 35 fully worked security numericals by module: ALE and ROSI, entropy, key space, birthday bound and nonce limits, small-number RSA and Diffie-Hellman, lockout and TOTP, firewall and base rate, DDoS capacity, CVSS and EPSS, precision and recall, SOC staffing, MTTx, FAIR, differential privacy and k-anonymity, with 11 runnable checkers and a last-minute formula list.

এই পর্বে যা পাবেন

  • Entropy, key space, birthday bound আর nonce সীমার হিসাব ধাপে ধাপে লেখার অভ্যাস
  • ছোট সংখ্যায় RSA আর Diffie-Hellman, আর security level মেলানো
  • ALE, ROSI, CVSS, EPSS আর percentile পড়ে অগ্রাধিকার ঠিক করা
  • Precision, recall, F1, base rate, SOC staffing আর MTTx-এর পূর্ণ উদাহরণ
  • DDoS capacity, restore time, log volume, differential privacy আর k-anonymity-র হিসাব

১ · পাতার নিয়ম, ভাগের মানচিত্র আর খাতার কৌশল

মডিউল ১৩-এ স্বাগতম। ব্যাংকের লকারের চাবি হাতে পেলেই লকার নিরাপদ হয় না, কতগুলো চাবি সম্ভব, কতবার চেষ্টা করা যায়, চুরি হলে কত ক্ষতি, এসব গুনে দেখতে হয়। নিরাপত্তার অনেক সিদ্ধান্তই এমন গোনার ওপর দাঁড়িয়ে। এ ধরনের হিসাব বিশ্ববিদ্যালয়, চাকরির লিখিত পরীক্ষা আর ইন্টারভিউতে প্রায়ই আসে। সব হিসাব রক্ষকের চোখে: কতটা সুরক্ষা আছে, কোথায় ফাঁক, কোন খরচ যুক্তিসংগত।

কোন ভাগে কী, কোন পর্ব ঝালাবেন

ভাগমডিউলকী আছেমূল পর্ব
২১SLE, ALE, ARO, ROSI২
৩২Key space, entropy, nonce, birthday, DH, RSA, security level, password hash-এর খরচ৭–১০, ১৩, ১৪
৪৩Password entropy, lockout, TOTP, token entropy১৫, ১৬
৫৪Firewall গোনা, subnet exposure, base rate, DDoS, SYN backlog২২, ২৩, ২৮
৬৫, ৬CVSS, EPSS, RPO, RTO, retention, API rate limit৩২, ৩৪, ৪৩
৭৯, ১০Precision, recall, F1, log volume, SOC staffing, MTTx৫৫, ৫৬, ৬০, ৬১
৮১১FAIR, Monte Carlo, percentile, differential privacy, k-anonymity৬৮, ৭০

মডিউল ৭, ৮ আর ১২-তে আলাদা numerical কম। সেখানকার হিসাবও এই সূত্রগুলোতেই পড়ে, যেমন phishing মহড়ার report rate সাধারণ ভাগ, আর ক্যাপস্টোনের detection মাপ precision ও recall. শেষের MCQ-তে একটি নমুনা আছে।

এই পাতার নিয়ম — প্রশ্নে অন্য কিছু না বললে

বিষয়নিয়ম
বছরKey-র হিসাবে ৩১,৫৫৭,৬০০ সেকেন্ড (৩৬৫.২৫ দিন), পর্ব ৭-এর মতো। অন্য সব জায়গায় ৩৬৫ দিন
আকারদশমিক: 1 GB = 10⁹ B, 1 TB = 1,000 GB. MiB লেখা থাকলে 2²⁰ B
গতিLink-এর গতি bit-এ, ফাইল byte-এ। 1 GB = 8,000 megabit
টাকালাখ আর কোটি; ১ কোটি = ১০০ লাখ। সব পরিমাণ কাল্পনিক
ROSI(কমানো ঝুঁকি − খরচ) ÷ খরচ, পর্ব ২-এর মতো। অন্য বইয়ে ভিন্ন রূপ দেখলে সংজ্ঞাটি লিখে নিন
FP rateপরিসংখ্যানের অর্থে FP ÷ (FP + TN). SOC-এর দৈনন্দিন “FP rate” আলাদা, ৭.১ দেখুন
স্বাধীনতাএকাধিক ঘটনা স্বাধীন ধরা হয়। বাস্তবে তা পুরো মেলে না, প্রশ্নে বলা থাকলে তবেই এই শর্ত নিরাপদ
মানুষ বা যন্ত্র১৩.৩ জন হয় না। ক্ষমতার উত্তর সবসময় ওপরের পূর্ণসংখ্যায় (⌈ ⌉)
পরীক্ষার কৌশল — খাতায় উত্তর সাজানোর পাঁচ নিয়ম

১. দেওয়া তথ্য আর একক এক লাইনে। “৬ TB, ৮০০ Mbps” লিখলেই bit আর byte-এর ভুল সেখানে ধরা পড়ে।

২. ধরে নেওয়া শর্ত লিখুন। “গতি অনুমিত, ঘটনা স্বাধীন, CVSS v3.1.” প্রশ্নে স্পষ্ট না থাকলে এটিই আপনার রক্ষাকবচ।

৩. সূত্র আগে, মান পরে। গণনায় ভুল হলেও সূত্র দেখে পরীক্ষক যুক্তি বুঝতে পারেন।

৪. বড় সংখ্যা log-এ ভাবুন। ২১২৮ সরাসরি লেখার দরকার নেই। প্রতি ১০ bit-এ প্রায় ১,০০০ গুণ, এটুকুই মাথায় রাখুন।

৫. উত্তরের অর্থ এক লাইনে বলুন। “Precision ০.৯৮%” লিখেই থামবেন না। বলুন, প্রতি ১০২টি alert-এ প্রায় ১টি আসল।

২ · মডিউল ১ — ঝুঁকির ভাষা: SLE, ALE, ARO আর ROSI

ঝালিয়ে নিন: পর্ব ২ · CIA triad, threat, vulnerability আর risk. পরিসরভিত্তিক হিসাব আছে পর্ব ৬৮-এ, যা এই পাতার ভাগ ৮-এ আসবে।

সূত্রের কার্ড

SLE = AV × EF. ALE = SLE × ARO. নিট লাভ = ALE আগে − ALE পরে − control-এর বছরের খরচ। ROSI = নিট লাভ ÷ খরচ।

২.১(সহজ) একটি asset-এর মূল্য ৫০ লাখ টাকা। একটি ঘটনায় ৪০% ক্ষতি হয়, দুই বছরে গড়ে একবার। বছরে ৩ লাখ টাকার control ঘটনাকে দশ বছরে একবারে নামায়। SLE, আগের ও পরের ALE, নিট লাভ আর ROSI কত? (ঝালিয়ে নিন: পর্ব ২)
SLE = 50,00,000 x 0.4 = 20,00,000
ALE before = 20,00,000 x 0.5 = 10,00,000
ALE after  = 20,00,000 x 0.1 =  2,00,000
reduced = 10,00,000 - 2,00,000 = 8,00,000
net  = 8,00,000 - 3,00,000 = 5,00,000
ROSI = 5,00,000 / 3,00,000 = 166.7%

লক্ষ করুন, control SLE বদলায়নি, শুধু ARO কমিয়েছে। প্রতি বছর ঠিক ১০ লাখ ক্ষতি হবে তা নয়, এটি বহু বছরের গড়। SLE ২০ লাখ; ALE ১০ লাখ থেকে ২ লাখ; নিট লাভ ৫ লাখ; ROSI ১৬৬.৭%.

২.২(মাঝারি) একটি কাল্পনিক ওয়েবসাইট বন্ধ থাকলে ঘণ্টায় ২০,০০০ টাকা ক্ষতি। প্রতিটি ঘটনা ১০ ঘণ্টা চলে, বছরে ৪ বার। বছরে ৩,৫০,০০০ টাকার redundancy ঘটনা বছরে ১ বারে নামায়, স্থায়িত্ব একই। ROSI কত? সর্বোচ্চ কত খরচ পর্যন্ত এটি লাভজনক? (ঝালিয়ে নিন: পর্ব ২)
SLE = 20,000 x 10 = 2,00,000
ALE before = 2,00,000 x 4 = 8,00,000
ALE after  = 2,00,000 x 1 = 2,00,000
reduced = 6,00,000
net  = 6,00,000 - 3,50,000 = 2,50,000
ROSI = 2,50,000 / 3,50,000 = 71.4%
break-even cost = reduced = 6,00,000

এখানে EF নেই, কারণ ক্ষতি সময় দিয়ে মাপা। খরচ কমানো ঝুঁকির সমান হলে ROSI শূন্য। ROSI ৭১.৪%; বছরে ৬ লাখ টাকার নিচে থাকলে টাকার হিসাবে লাভজনক।

২.৩(কঠিন) ২.১-এর শুরুর অবস্থা (ALE ১০ লাখ)। বিকল্প A: বছরে ১.৫ লাখ, ARO অর্ধেক। বিকল্প B: বছরে ২ লাখ, EF অর্ধেক। দুটো একসাথে নিলে? ROSI সবচেয়ে বেশি কোনটিতে, নিট লাভ সবচেয়ে বেশি কোনটিতে? (ঝালিয়ে নিন: পর্ব ২, ৬৮)
A  : ALE 5.0 lakh, reduced 5.0, net 3.5, ROSI 3.5/1.5 = 233.3%
B  : ALE 5.0 lakh, reduced 5.0, net 3.0, ROSI 3.0/2.0 = 150.0%
A+B: ALE 10 x 0.5 x 0.5 = 2.5 lakh
     reduced 7.5, net 7.5 - 3.5 = 4.0, ROSI 4.0/3.5 = 114.3%

ফাঁদ: “A ৫ + B ৫ = ১০ লাখ কমবে” ভাবা। দুটো একই ঝুঁকির ওপর কাজ করে, তাই গুণ হয়, যোগ নয়। ROSI-তে A এগিয়ে (২৩৩.৩%), নিট লাভে A+B (৪ লাখ). বাজেট সীমিত হলে A, আর মোট ক্ষতি কমাতে চাইলে দুটো। শুধু শতাংশ দেখে সিদ্ধান্ত নিলে বড় সুরক্ষা বাদ পড়ে যেতে পারে।

// ALE and ROSI checker. All amounts are assumed, in taka.
const lakh = v => (v / 1e5).toFixed(2) + ' lakh';
function rosi(aleBefore, aleAfter, cost) {
  const reduced = aleBefore - aleAfter, net = reduced - cost;
  return `reduced ${lakh(reduced)}, net ${lakh(net)}, ROSI ${(net / cost * 100).toFixed(1)}%`;
}
const AV = 5000000, EF = 0.4, SLE = AV * EF;
console.log('2.1 SLE', lakh(SLE), 'ALE before', lakh(SLE * 0.5), 'after', lakh(SLE * 0.1));
console.log('2.1', rosi(SLE * 0.5, SLE * 0.1, 300000));
const down = 20000 * 10;      // taka per outage
console.log('2.2', rosi(down * 4, down * 1, 350000));
// Problem 2.3: A halves ARO, B halves EF, A+B does both.
const base = SLE * 0.5;
console.log('A  ', rosi(base, base / 2, 150000));
console.log('B  ', rosi(base, base / 2, 200000));
console.log('A+B', rosi(base, base / 4, 350000));

প্রথম দুই লাইন ২.১-এর সাথে মেলে: reduced 8.00 lakh, net 5.00 lakh, ROSI 166.7%. ২.২-এর লাইনে ROSI 71.4%. শেষ তিন লাইন ২.৩: A reduced 5.00 lakh, net 3.50 lakh, ROSI 233.3% আর A+B reduced 7.50 lakh, net 4.00 lakh, ROSI 114.3%. rosi()-এর ভেতরে শুধু তিনটি সংখ্যা বদলালেই নিজের প্রশ্ন যাচাই হয়।

৩ · মডিউল ২ — Cryptography-র হিসাব

সূত্রের কার্ড

Key space: n bit-এ 2n; সব চেষ্টা = 2n ÷ হার; গড়ে অর্ধেক। প্রতি ১ bit-এ সময় দ্বিগুণ। Entropy: H = −Σ p log₂ p; সমান সম্ভাব্য N-এ log₂ N.

Birthday: b-bit মানে n টি নমুনায় p ≈ 1 − e−n²/2b+1; ৫০% হয় n ≈ 1.1774 × 2b/2-এ। p ছোট হলে p ≈ n²/2b+1.

DH: A = ga, B = gb, s = Ba = Ab (সবই mod p). RSA: n = pq, φ = (p−1)(q−1), ed ≡ 1 (mod φ), c = me, m = cd (সবই mod n).

Key space আর entropy

৩.১(সহজ) ধরুন সেকেন্ডে 109টি key পরীক্ষা করা যায়। ৫৬ bit আর ১২৮ bit key-র পুরো brute force-এ কত বছর, গড়ে কত? ১০০০ গুণ সময় বাড়াতে কত bit লাগে? (ঝালিয়ে নিন: পর্ব ৭)
56 bit : 2^56 = 7.21 x 10^16
         / 10^9 = 7.21 x 10^7 s
         / 31,557,600 = 2.28 years, average 1.14
128 bit: 2^128 = 3.40 x 10^38
         / 10^9 / 31,557,600 = 1.08 x 10^22 years
factor 1000: 2^10 = 1024, so 10 more bits

১২৮ bit-এর সময় মহাবিশ্বের বয়সের (প্রায় 1.38 × 1010 বছর) প্রায় ৭৮ হাজার কোটি গুণ। ২.২৮ বছর (গড় ১.১৪); 1.08 × 1022 বছর; ১০ bit. এই হিসাব ধরে নেয় key সত্যিই এলোমেলো। সেই শর্ত ভাঙলে কী হয়, পরের প্রশ্নে দেখুন।

৩.২(মাঝারি) (ক) ৯০% head পড়ে এমন মুদ্রার entropy কত? (খ) চারটি প্রতীকের সম্ভাবনা ১/২, ১/৪, ১/৮, ১/৮ হলে? (গ) একটি system-এর ১২৮ bit key আসে ৩২ bit seed থেকে। Key-র আসল শক্তি কত, আর 109/s গতিতে সব seed পার হতে কত সময়? (ঝালিয়ে নিন: পর্ব ৭)
(a) H = -(0.9 log2 0.9 + 0.1 log2 0.1)
      = 0.137 + 0.332 = 0.469 bit
(b) H = 0.5 x 1 + 0.25 x 2 + 0.125 x 3 + 0.125 x 3
      = 0.5 + 0.5 + 0.375 + 0.375 = 1.75 bit
(c) strength = min(128, 32) = 32 bit
    2^32 / 10^9 = 4.29 s

(খ)-তে সমান সম্ভাব্য হলে ২ bit হতো। অসমান হলে অনিশ্চয়তা কমে। (গ)-তে key যত লম্বাই হোক, CSPRNG-এর seed-এর চেয়ে বেশি অনিশ্চয়তা তাতে থাকতে পারে না। ০.৪৬৯ bit; ১.৭৫ bit; ৩২ bit, ৪.২৯ সেকেন্ড।

Nonce সীমা আর birthday

৩.৩(কঠিন) একটি সেবা ৯৬ bit random nonce দিয়ে এক চাবিতে সেকেন্ডে ১ লাখ বার্তা AES-GCM-এ encrypt করে। (ক) কত ঘণ্টায় ২৩২ বার্তা? (খ) তখন পুনরাবৃত্তির সম্ভাবনা? (গ) ১০০ কোটি আর ২৪৮ বার্তায়? (ঘ) p ≤ ২−৩২ রাখতে সর্বোচ্চ কত বার্তা, nonce ৬৪ bit হলে কত? (ঝালিয়ে নিন: পর্ব ৮, ১৪)
(a) 2^32 = 4,294,967,296
    / 100,000 = 42,950 s = 11.9 hours
(b) p = n^2 / 2^97 = 2^64 / 2^97 = 2^-33 = 1.16 x 10^-10
(c) n = 10^9: 10^18 / 2^97 = 6.31 x 10^-12
    n = 2^48: 2^96 / 2^97 = 0.5 is too big for the short form
              1 - e^-0.5 = 0.393
(d) n^2 / 2^97 = 2^-32, n^2 = 2^65, n = 2^32.5 = 6.07 x 10^9
    b = 64: n^2 = 2^33, n = 2^16.5 = 92,682

এই কারণেই NIST SP 800-38D random nonce-এ এক key-তে প্রায় ২৩২ বার্তার সীমা রাখে। সেবাটিকে প্রতিদিন একাধিকবার key ঘোরাতে হবে, অথবা counter nonce বা ১৯২ bit nonce নিতে হবে। ১১.৯ ঘণ্টা; 1.16 × 10−10; 6.31 × 10−12 আর ৩৯.৩%; 6.07 × 109টি বার্তা, ৬৪ bit-এ মাত্র ৯২,৬৮২টি।

৩.৪(মাঝারি) একটি system প্রতিটি ফাইলের id হিসেবে SHA-256-এর প্রথম ৪৮ bit রাখে, ফাইল আছে 107টি। (ক) অন্তত একটি collision-এর সম্ভাবনা? (খ) কতটি ফাইলে ৫০%? (গ) ১২৮ bit আর ২৫৬ bit digest-এ সেকেন্ডে 1012 hash ধরে ৫০%-এ পৌঁছাতে কত সময়? (ঝালিয়ে নিন: পর্ব ৯)
(a) k^2 / 2N = 10^14 / 2^49 = 0.1776
    p = 1 - e^-0.1776 = 0.163
(b) k = 1.1774 x 2^24 = 1.98 x 10^7
(c) 128 bit: 1.1774 x 2^64 = 2.17 x 10^19
             / 10^12 / 31,557,600 = 0.688 years
    256 bit: 1.1774 x 2^128 = 4.01 x 10^38 -> 1.27 x 10^19 years

ফাঁদ: collision খোঁজার কাজ 2n/2, কিন্তু একটি নির্দিষ্ট digest মেলানোর (preimage) কাজ 2n. দুটো গুলিয়ে ফেলবেন না। প্রায় ১৬.৩%; প্রায় ২ কোটি ফাইল; ০.৬৮৮ বছর আর 1.27 × 1019 বছর। Digest ছাঁটার আগে তাই birthday হিসাব করুন।

// Key space, entropy and birthday checker. Rates are assumed.
const YEAR = 31557600;
const sci = (x, d = 2) => x.toExponential(d);
for (const [bits, rate] of [[56, 1e9], [57, 1e9], [128, 1e9], [64, 1e11]]) {
  const years = 2 ** bits / rate / YEAR;
  console.log(`${bits}-bit at ${sci(rate, 0)}/s: all ${sci(years)} y, average ${sci(years / 2)} y`);
}
const H = ps => -ps.reduce((s, p) => s + p * Math.log2(p), 0);
console.log('H(0.9, 0.1) =', H([0.9, 0.1]).toFixed(3), 'bit');
console.log('H(1/2, 1/4, 1/8, 1/8) =', H([.5, .25, .125, .125]), 'bit');
console.log('32-bit seed at 1e9/s, all:', (2 ** 32 / 1e9).toFixed(2), 's');
// P(collision) = 1 - exp(-n^2 / 2^(b+1)); expm1 stays accurate for tiny values.
const P = (n, b) => -Math.expm1(-n * n / 2 ** (b + 1));
for (const [n, b, label] of [[2 ** 32, 96, '2^32'], [1e9, 96, '1e9'], [2 ** 48, 96, '2^48'],
  [2 ** 32, 64, '2^32'], [2 ** 64, 192, '2^64'], [1e7, 48, '1e7']])
  console.log(`b=${b}, n=${label}: p = ${sci(P(n, b))}`);
console.log('hours to 2^32 at 1e5/s:', (2 ** 32 / 1e5 / 3600).toFixed(1));
console.log('n for p=2^-32, b=96:', sci(2 ** 32.5), ' b=64:', Math.round(2 ** 16.5));
const k50 = b => Math.sqrt(2 * Math.LN2) * 2 ** (b / 2);
for (const b of [48, 64, 128, 256])
  console.log(`${b}-bit digest: 50% near k = ${sci(k50(b))}, at 1e12/s ${sci(k50(b) / 1e12 / YEAR)} y`);

56-bit at 1e+9/s: all 2.28e+0 y, average 1.14e+0 y ৩.১-এর সাথে মেলে, আর পর্ব ৭-এর ৫৭ bit-এর সারিও 4.57e+0 y. H(0.9, 0.1) = 0.469 bit আর H(1/2, 1/4, 1/8, 1/8) = 1.75 bit ৩.২-এর। b=96, n=2^32: p = 1.16e-10, b=96, n=2^48: p = 3.93e-1 আর n for p=2^-32, b=96: 6.07e+9 b=64: 92682 ৩.৩-এর। শেষের 128-bit digest: ... 6.88e-1 y পর্ব ৯-এর সারণির সমান। Math.expm1 ব্যবহারের কারণ: খুব ছোট p-তে সাধারণ 1 - Math.exp(...) শূন্য হয়ে যায়।

ছোট সংখ্যায় Diffie-Hellman আর RSA

৩.৫(সহজ) Diffie-Hellman: p = 29, g = 2, রিমার গোপন a = 5, সজীবের গোপন b = 11. A, B আর দুই দিকের shared secret হাতে বের করুন। (ঝালিয়ে নিন: পর্ব ১০)
A = 2^5 mod 29 = 32 mod 29 = 3
B = 2^11 mod 29 = 2048 mod 29 = 18   (29 x 70 = 2030)
Rima : 18^2 mod 29 = 324 mod 29 = 5
       18^4 mod 29 = 25
       18^5 mod 29 = 25 x 18 mod 29 = 450 mod 29 = 15
Sajib: 3^3 = 27 = -2 (mod 29)
       3^9 = (-2)^3 = -8 (mod 29)
       3^11 = -8 x 9 = -72 = 15 (mod 29)

দুই দিকেই gab mod p, তাই মিল। মান ছোট রাখতে ধাপে ধাপে mod নিন, শেষে একবারে নয়। বাস্তবে সই ছাড়া DH-এ MITM ঠেকে না। A = 3, B = 18, s = 15.

৩.৬(মাঝারি) RSA: p = 47, q = 59, e = 17. n, φ, d বের করুন, d-র জন্য extended Euclid দেখান। m = 920 হলে c = 948 আর sig = 192 কি মেলে? (ঝালিয়ে নিন: পর্ব ১০)
n = 47 x 59 = 2773
phi = 46 x 58 = 2668
Euclid: 2668 = 156 x 17 + 16
        17   =   1 x 16 + 1
back  : 1 = 17 - 16
          = 17 - (2668 - 156 x 17)
          = 157 x 17 - 2668
d = 157   check: 17 x 157 = 2669 = 2668 + 1
c   = 920^17  mod 2773 = 948
m   = 948^157 mod 2773 = 920
sig = 920^157 mod 2773 = 192
ver = 192^17  mod 2773 = 920

বড় ঘাত হাতে নয়, repeated squaring-এ করা হয়। পরীক্ষায় সাধারণত ছোট সংখ্যা আসে, যেমন p = 5, q = 11, e = 3 হলে n = 55, φ = 40, d = 27. n = 2773, φ = 2668, d = 157; দুটো মানই মেলে। এটি textbook RSA, শুধু শেখার জন্য। এই রূপে একই বার্তা সবসময় একই ciphertext দেয়, তাই বাস্তবে OAEP বা PSS লাগে।

# Textbook RSA and Diffie-Hellman with tiny numbers. Learning only, never real use.
p, g, a, b = 29, 2, 5, 11
A, B = pow(g, a, p), pow(g, b, p)
print("DH  A =", A, " B =", B, " s =", pow(B, a, p), pow(A, b, p))

def egcd(x, y):              # returns (g, s, t) with s*x + t*y = g
    if y == 0:
        return x, 1, 0
    g2, s, t = egcd(y, x % y)
    return g2, t, s - (x // y) * t

P, Q, e = 47, 59, 17
n, phi = P * Q, (P - 1) * (Q - 1)
gcd, s, _ = egcd(e, phi)
d = s % phi
print("RSA n =", n, " phi =", phi, " gcd =", gcd, " d =", d)
print("e*d mod phi =", e * d % phi)
m = 920
c, sig = pow(m, e, n), pow(m, d, n)
print("c =", c, " back =", pow(c, d, n), " sig =", sig, " verify =", pow(sig, e, n))
print("small: n = 55, d =", pow(3, -1, 40), " c =", pow(2, 3, 55), " back =", pow(8, 27, 55))

DH A = 3 B = 18 s = 15 15: দুই পক্ষ একই মানে পৌঁছেছে। RSA n = 2773 phi = 2668 gcd = 1 d = 157: gcd ১ না হলে e-র কোনো inverse থাকত না। c = 948 back = 920 sig = 192 verify = 920 ৩.৬-এর সব মান মেলায়। শেষ লাইন small: n = 55, d = 27 c = 8 back = 2 ছোট উদাহরণটি, m = 2 ধরে। Python-এর pow(a, b, n) দিয়েই নিজের খাতা মিলিয়ে নিন।

Security level আর password hash-এর খরচ

Security level (bit)SymmetricRSA, DHElliptic curve
১১২—২০৪৮২২৪
১২৮AES-128৩০৭২২৫৬
১৯২AES-192৭৬৮০৩৮৪
২৫৬AES-256১৫৩৬০৫১২

টেবিলটি NIST SP 800-57 Part 1 Rev. 5 অনুসারে, সরল করা। Hash-এর collision resistance digest-এর অর্ধেক bit: SHA-256-এ ১২৮.

৩.৭(মাঝারি) একটি নকশা: ডেটা AES-256-এ, key আদান-প্রদান RSA-2048-এ, সই ECDSA P-256 আর SHA-256-এ। পুরো ব্যবস্থার security level কত? ১২৮ bit-এ আনতে কী বদলাবেন? ১১২ থেকে ১২৮-এ কাজ কত গুণ বাড়ে? (ঝালিয়ে নিন: পর্ব ১০, ১৪)
AES-256        -> 256
RSA-2048       -> 112
P-256          -> 128
SHA-256 (coll.)-> 128
system = min(...) = 112
fix: RSA-2048 -> RSA-3072 (or an EC key exchange at 256 bit)
work ratio = 2^(128 - 112) = 2^16 = 65,536

শিকলের মতো, সবচেয়ে দুর্বল আংটাই পুরো শক্তি ঠিক করে। AES-256 থাকলেও তার key যদি RSA-2048-এ মোড়ানো হয়, আক্রমণের সহজ পথ সেখানেই। ১১২ bit; RSA-3072 বা সমমানের curve; ৬৫,৫৩৬ গুণ। RSA-2048 আজও বহু জায়গায় গ্রহণযোগ্য, তাই এটি “এখনই ভাঙা” নয়, পরিকল্পনা করে বদলানোর বিষয়। Quantum-এর প্রশ্ন আলাদা, পর্ব ১৪ দেখুন।

৩.৮(মাঝারি) ধরে নিন দ্রুত hash-এ সেকেন্ডে 5 × 109টি, ধীর password hash-এ 2 × 103টি পরীক্ষা সম্ভব। ৩৬ bit entropy-র password-এ গড় সময় কত? কত bit-এর সমান সুরক্ষা যোগ হলো? আপনার সেবায় peak-এ ৪০টি login/s, প্রতি hash-এ ০.২ s আর ৪৬ MiB হলে কত core আর memory লাগবে? (ঝালিয়ে নিন: পর্ব ১৩)
half space = 2^35 = 34,359,738,368
fast: / (5 x 10^9) = 6.9 s
slow: / (2 x 10^3) = 1.718 x 10^7 s = 198.8 days
ratio = 2.5 x 10^6
log2(2.5 x 10^6) = 21.25 bit
defender: 40 x 0.2 = 8 cores busy
          8 x 46 MiB = 368 MiB

Password বদলায়নি, শুধু আপনার বাছা algorithm বদলেছে। কিন্তু দাম আপনিও দেন, তাই নিজের মেশিনে মেপে parameter ঠিক করুন। ৬.৯ সেকেন্ড বনাম ১৯৮.৮ দিন; প্রায় ২১.২৫ bit; ৮টি core আর ৩৬৮ MiB. Hash করা হয় salt-সহ, আর ধীর hash দুর্বল password-কে শক্তিশালী করে না, শুধু ধীর করে।

৪ · মডিউল ৩ — Password, lockout, TOTP আর token

ঝালিয়ে নিন: পর্ব ১৫ · Authentication (entropy, lockout), পর্ব ১৬ · MFA আর passkey (TOTP, recovery code), System Design · Rate limiting.

সূত্রের কার্ড

Password: এলোমেলোভাবে বাছা হলে entropy = দৈর্ঘ্য × log₂(প্রতীক); search space = প্রতীকদৈর্ঘ্য. মানুষের বাছা password-এ এই সূত্র খাটে না।

Lockout: দিনে অনুমান = প্রতি দফায় চেষ্টা × দিনে দফা। TOTP: এক অনুমানে p = বৈধ code ÷ 10অঙ্ক; n বারে অন্তত একবার = 1 − (1 − p)n. Token: অঙ্ক = ⌈bit ÷ log₂ প্রতীক⌉.

৪.১(মাঝারি) এলোমেলোভাবে বাছা ধরে entropy বের করুন: ৮ অক্ষর (৯৫ চিহ্ন), ১৫ অক্ষর (শুধু ছোট হাতের), ৪টি আর ৬টি শব্দ (৭,৭৭৬ শব্দের তালিকা)। ৮টি ছোট হাতের অক্ষর (২৬ চিহ্ন) আর ১২টি alphanumeric (৬২ চিহ্ন)-এর search space কত গুণ আলাদা? (ঝালিয়ে নিন: পর্ব ১৫)
8 of 95  : 8 x 6.57   = 52.6 bit
15 of 26 : 15 x 4.70  = 70.5 bit
4 words  : 4 x 12.92  = 51.7 bit
6 words  : 6 x 12.92  = 77.5 bit
26^8  = 2.09 x 10^11 (37.6 bit)
62^12 = 3.23 x 10^21 (71.5 bit)
ratio = 1.54 x 10^10 (33.8 bit more)

দৈর্ঘ্য চিহ্নের মিশ্রণকে হারায়: ১৫টি সাধারণ অক্ষর ৮টি জটিল অক্ষরের চেয়ে ১৮ bit বেশি। এই কারণেই নতুন নির্দেশনায় দৈর্ঘ্যে জোর। ৫২.৬, ৭০.৫, ৫১.৭, ৭৭.৫ bit; প্রায় 1.54 × 1010 গুণ। মনে রাখবেন, “Dhaka@2026”-এর মতো মানুষের বাছা password-এ এই হিসাব অনেক বাড়িয়ে বলে, তাই blocklist লাগে।

৪.২(মাঝারি) একটি কাল্পনিক অনলাইন বাজারে ২০,০০০ হিসাব, নীতি: ৫ ব্যর্থতায় ১৫ মিনিট বন্ধ। (ক) একটি হিসাবে দিনে আর বছরে সর্বোচ্চ কত অনুমান? (খ) কেউ পুরো সেবা আটকে রাখতে চাইলে প্রতি ১৫ মিনিটে কত অনুরোধ লাগে, সেকেন্ডে কত? (গ) ০.৩% ব্যবহারকারী একই সাধারণ password রাখলে, প্রতি হিসাবে মাত্র একটি চেষ্টায় (password spraying) গড়ে কত হিসাব ঝুঁকিতে? Lockout কি ধরে? (ঝালিয়ে নিন: পর্ব ১৫)
(a) per hour = 4 x 5 = 20
    per day  = 20 x 24 = 480
    per year = 480 x 365 = 1,75,200
(b) 20,000 x 5 = 1,00,000 requests in 15 min
    1,00,000 / 900 = 111.1 per second
(c) 20,000 x 0.003 = 60 accounts

তিনটি উত্তর তিনটি শিক্ষা দেয়। সময়ের lockout থামায় না, ধীর করে, তাই NIST SP 800-63B-4-এর মতো মোট ব্যর্থতার সীমা লাগে। Lockout নিজেই সেবা বন্ধের হাতিয়ার হতে পারে। আর (গ)-তে প্রতি হিসাবে চেষ্টা ১টি, তাই lockout কিছুই দেখে না। ৪৮০ আর ১,৭৫,২০০; ১,০০,০০০ অনুরোধ, সেকেন্ডে ১১১.১; ৬০টি হিসাব, lockout ধরে না। সমাধান blocklist, MFA আর পুরো সেবার ওপর নজর।

৪.৩(কঠিন) ছয় অঙ্কের TOTP, window ±১. সীমা: ১৫ মিনিটে ৫টি ব্যর্থ চেষ্টা, তারপর বিরতি, আবার ৫টি; account স্থায়ীভাবে বন্ধ হয় না। (ক) ৩০ দিনে সর্বোচ্চ কত অনুমান, অন্তত একবার সফল হওয়ার সম্ভাবনা? (খ) ১০০ ব্যর্থতায় বন্ধ হলে? (গ) Window ±৩ করলে (ক)-র উত্তর কত? (ঝালিয়ে নিন: পর্ব ১৬)
valid codes (+-1) = 3, p = 3 / 10^6 = 0.000003
(a) n = 5 x 4 x 24 x 30 = 14,400
    P = 1 - (1 - 0.000003)^14400 = 0.0423
(b) n = 100
    P = 1 - (1 - 0.000003)^100 = 0.0003
    ratio = about 140
(c) +-3 means 7 valid codes, p = 0.000007
    P = 1 - (1 - 0.000007)^14400 = 0.0959

ছোট সম্ভাবনা বহুবার গুণ হলে আর ছোট থাকে না। Window বাড়ানো ঘড়ির সমস্যার সস্তা সমাধান মনে হয়, কিন্তু ঝুঁকি দ্বিগুণের বেশি হয়। ১৪,৪০০ অনুমান, ৪.২৩%; ০.০৩%, প্রায় ১৪০ গুণ কম; ৯.৫৯%. একই code দ্বিতীয়বার না নেওয়ার নিয়মও রাখতে হয়, আর এই ধরনের হিসাব শুধু TOTP-র জন্য, phishing এতে ঠেকে না।

৪.৪(মাঝারি) (ক) ৮ অঙ্ক, ১৬ hex অক্ষর, ১৩ Base32 অক্ষর: কোনটি ৬৪ bit-এর recovery code লক্ষ্য পূরণ করে? দশমিকে কত অঙ্ক লাগে? (খ) ৩২ byte random token Base64url-এ কত অক্ষর? (গ) ৬ অঙ্কের reset code-এ ৫টি চেষ্টা: একটি হিসাবে সম্ভাবনা কত, ১০ লাখ হিসাবে ছড়ালে গড়ে কয়টি মেলে? (ঝালিয়ে নিন: পর্ব ১৫, ১৬)
(a)  8 digits : 8 x 3.32 = 26.6 bit  no
     16 hex   : 16 x 4   = 64 bit    yes, at the limit
     13 Base32: 13 x 5   = 65 bit    yes
     digits needed = ceil(64 / 3.32) = 20
(b) 32 x 8 = 256 bit; ceil(256 / 6) = 43 chars
(c) one account: 5 / 10^6 = 0.0005%
    10,00,000 x 0.000005 = 5 accounts

অক্ষরগুলো CSPRNG থেকে এলে তবেই এই হিসাব খাটে। (গ)-র শিক্ষা: ছোট code-এ হিসাব-প্রতি সীমাই যথেষ্ট নয়, পুরো সেবার সীমাও লাগে। লম্বা link-token-এ এই ভয় নেই। ১৬ hex আর ১৩ Base32 পারে, ৮ অঙ্ক পারে না; ২০ অঙ্ক; ৪৩ অক্ষর; ০.০০০৫%, গড়ে ৫টি হিসাব।

// Password, lockout, TOTP and token arithmetic. Rates are assumed.
const bits = (n, sym) => n * Math.log2(sym);
for (const [name, n, sym] of [['8 of 95', 8, 95], ['15 of 26', 15, 26], ['4 words', 4, 7776],
  ['6 words', 6, 7776], ['8 of 26', 8, 26], ['12 of 62', 12, 62]])
  console.log(name.padEnd(9), bits(n, sym).toFixed(1), 'bit');
console.log('half of 26^8 at 1e10/s:', (26 ** 8 / 2 / 1e10).toFixed(1), 's');
const half = E => 2 ** (E - 1);
console.log('36 bit: fast', (half(36) / 5e9).toFixed(1), 's, slow',
  (half(36) / 2e3 / 86400).toFixed(1), 'days');
console.log('defender:', 40 * 0.2, 'cores,', 40 * 0.2 * 46, 'MiB');
// Lockout: 5 failures, then 15 minutes.
const perDay = 5 * 4 * 24;
console.log('guesses a day', perDay, 'a year', perDay * 365);
console.log('whole-site lockout:', 20000 * 5, 'requests,', (20000 * 5 / 900).toFixed(1), 'per s');
// TOTP: 6 digits, window +-1, so 3 valid codes.
const atLeastOne = (p, n) => -Math.expm1(n * Math.log1p(-p));
const g30 = perDay * 30;
console.log('30 days:', g30, 'guesses, P =', (atLeastOne(3e-6, g30) * 100).toFixed(2) + '%');
console.log('cap 100 :', (atLeastOne(3e-6, 100) * 100).toFixed(2) + '%');
console.log('window +-3:', (atLeastOne(7e-6, g30) * 100).toFixed(2) + '%');
console.log('digits for 64 bit:', Math.ceil(64 / Math.log2(10)));
console.log('base64url chars for 256 bit:', Math.ceil(256 / 6));

ওপরের ছয় লাইন ৪.১, যেমন 15 of 26 70.5 bit আর 6 words 77.5 bit. 36 bit: fast 6.9 s, slow 198.8 days আর defender: 8 cores, 368 MiB ৩.৮-এর। guesses a day 480 a year 175200 ৪.২-এর। 30 days: 14400 guesses, P = 4.23%, cap 100 : 0.03% আর window +-3: 9.59% ৪.৩-এর। শেষ দুই লাইন digits for 64 bit: 20 আর base64url chars for 256 bit: 43 ৪.৪-এর। Math.log1p ব্যবহার হয়েছে, কারণ ১ − ০.০০০০০৩-এর মতো মান সরাসরি ঘাতে তুললে দশমিকের নির্ভুলতা হারাতে পারে।

৫ · মডিউল ৪ — Firewall, base rate আর DDoS capacity

সূত্রের কার্ড

Zone: n zone-এ n(n−1)টি দিক। CIDR: /p-তে 232−pটি ঠিকানা। Rule-এর পরিধি: উৎস × গন্তব্য × port.

Base rate: আগে মোটকে দুই ভাগ, তারপর TP = আসল × recall, FP = নিরীহ × FP rate, precision = TP ÷ (TP + FP).

Capacity: bit/s = pps × byte × ৮. rps সীমা = worker ÷ অনুরোধের সময়। Origin-এ যায় = rps × (১ − hit). SYN backlog ভরে যদি জাল SYN-এর হার × timeout ≥ আকার। সবচেয়ে দুর্বল আংটাই bottleneck.

Rule গোনা আর subnet exposure

৫.১(সহজ) (ক) ৫টি আর ৭টি zone-এ কতগুলো দিকের সিদ্ধান্ত নিতে হয়? (খ) ৪০টি host-এর flat network-এ মোট কতগুলো host-to-host পথ? Zone বসিয়ে ৩৪৬ আর microsegmentation-এ ৪৬-এ নামলে কত শতাংশ বাকি থাকে? (ঝালিয়ে নিন: পর্ব ২২)
(a) 5 x 4 = 20    7 x 6 = 42
(b) flat = 40 x 39 = 1,560
    346 / 1,560 = 22.2%
     46 / 1,560 = 2.9%

A থেকে B আর B থেকে A আলাদা, তাই ২ দিয়ে ভাগ হয় না। Default deny থাকলে ৪২টি দিকের বেশিরভাগে কিছুই লিখতে হয় না। পথ কমা মানেই lateral movement-এর জায়গা কমা। ২০ আর ৪২; ১,৫৬০; ২২.২% আর ২.৯%.

৫.২(মাঝারি) একটি rule: উৎস 192.168.40.0/24, গন্তব্য 192.168.30.0/28, port 445 আর 3389. (ক) rule-টি কতগুলো (উৎস, গন্তব্য, port) জোড়া খোলে? (খ) আসলে শুধু ৩টি নির্দিষ্ট host থেকে ১টি server-এর ১টি port দরকার। পরিধি কত শতাংশ কমে? (গ) ৩০টি উৎস, ১০টি গন্তব্য, ৩টি service: আলাদা লিখলে কতগুলো সারি, object group-এ কয়টি? (ঝালিয়ে নিন: পর্ব ২২)
(a) /24 -> 2^8 = 256, /28 -> 2^4 = 16
    256 x 16 x 2 = 8,192
    (usable only: 254 x 14 x 2 = 7,112)
(b) 3 x 1 x 1 = 3
    1 - 3 / 8,192 = 99.96% smaller
(c) 30 x 10 x 3 = 900 lines, or 1 rule with groups

প্রতি ধাপ prefix বাড়লে subnet অর্ধেক। পরীক্ষায় বলে দিন আপনি মোট ঠিকানা গুনছেন, নাকি network আর broadcast বাদ দিয়ে। Object group-এ সারি কমে, পরিধি কমে না; ১টি সারিও ৯০০টি জোড়া খোলে। ৮,১৯২টি; ৩টি, ৯৯.৯৬% কম; ৯০০ সারি বনাম ১টি।

Base rate — ৯৯% ঠিক, তবু ১% alert আসল

ধাপ ১আগে দুই ভাগ
events = 1,000,000
real   = 1,000,000 x 0.0001 = 100
benign = 999,900
ধাপ ২আসলগুলো থেকে TP
TP = 100 x 0.99 = 99
FN = 100 - 99   = 1
recall = 99%
ধাপ ৩নিরীহগুলো থেকে FP
FP = 999,900 x 0.01 = 9,999
alerts = 99 + 9,999 = 10,098
ধাপ ৪Precision আর accuracy
precision = 99 / 10,098 = 0.98%
TN = 999,900 - 9,999 = 989,901
accuracy = (99 + 989,901) / 1,000,000
         = 99.00%
ধাপ ৫মানুষের খরচ আর সমাধান
work = 10,098 x 5 min = 841.5 h
8 h a day: 105.2 = about 105
whole people: 106 analysts
FP rate 0.01%: FP = 99.99
precision = 99 / 198.99 = 49.75%
  1. আগে মোটকে ভাগ করুন। ক্ষতিকর ১০০টি, নিরীহ ৯,৯৯,৯০০টি। এই ভাগটি বাদ দিলেই ভুল শুরু হয়।
  2. TP. ৯৯% ধরা পড়ে, ৯৯টি। একটি ছুটে যায়। Recall দেখতে দারুণ।
  3. FP. ১% শুনতে ছোট, কিন্তু বসেছে ৯,৯৯,৯০০-এর ওপর, তাই ৯,৯৯৯টি ভুল alert. মোট alert ১০,০৯৮টি।
  4. Precision. ৯৯ ÷ ১০,০৯৮ = ০.৯৮%, প্রতি ১০২টি alert-এ প্রায় ১টি আসল। অথচ accuracy ঠিকই ৯৯.০০%. এই ফাঁকটির নামই base-rate fallacy.
  5. দাম। প্রতি alert-এ ৫ মিনিট ধরলে ৮৪১.৫ ঘণ্টা। ৮ ঘণ্টার দিনে এটি ১০৫.২ জনের কাজ, অর্থাৎ পর্ব ২৩-এর মতো প্রায় ১০৫ জন analyst. এই পাতার নিয়মে মানুষ ওপরে তোলা হয়, তাই ১০৬ জন। Recall একই রেখে FP rate ১০০ ভাগের এক ভাগ করলে precision ৪৯.৭৫%. শিক্ষা: বিরল ঘটনায় FP rate-ই মূল হাতল।
৫.৩(কঠিন) দিনে ৫,০০,০০০টি ঘটনা, ৫০টি আসলেই ক্ষতিকর। Recall ৯০%, FP rate ০.৫%. (ক) TP, FP আর precision কত? (খ) Recall একই রেখে precision ২০% করতে FP rate কত হতে হবে? (ঝালিয়ে নিন: পর্ব ২৩)
benign = 500,000 - 50 = 499,950
(a) TP = 50 x 0.9 = 45
    FP = 499,950 x 0.005 = 2,499.75 (about 2,500)
    precision = 45 / 2,544.75 = 1.77%
(b) 45 / (45 + FP) = 0.2 -> 45 + FP = 225 -> FP = 180
    FP rate = 180 / 499,950 = 0.036%
    0.5% / 0.036% = about 14 times lower

উল্টো প্রশ্নে precision-এর সংজ্ঞা থেকে FP বের করুন, তারপর নিরীহ দিয়ে ভাগ করুন। মোট ৫ লাখ দিয়ে ভাগ করলে এখানে ফল প্রায় একই আসে, কিন্তু আসল ঘটনা বেশি হলে ভুল হবে। ৪৫, প্রায় ২,৫০০, ১.৭৭%; FP rate ০.০৩৬%, প্রায় ১৪ গুণ কম।

DDoS capacity আর SYN backlog

একই হামলা, তিন আংটায় তিন রকম চাপ

Load on each link of the chain — numbers for problem ৫.৪

Capacity chain: link, firewall and origin load Link: 400 Mbps / 2 Gbps 20% Firewall: 5 / 3 lakh pps 167% Origin: 3,000 / 4,000 rps 75% ১০০% সীমা
ছবি ৭৬.১ — ড্যাশ দাগটি ১০০%. শুধু Gbps-এর graph দেখলে সব ঠিক মনে হতো, অথচ firewall আগেই ভেঙে পড়ে।
৫.৪(মাঝারি) Firewall ৩,০০,০০০ pps, link ২ Gbps, app-এর সীমা ৪,০০০ rps, আর ৭৫% traffic cache থেকে যায়। (ক) ১০০ byte প্যাকেটে ৫,০০,০০০ pps এলে কোনটি আগে ভরবে? (খ) ১২,০০০ rps এলে origin-এ কত যাবে? (গ) সর্বোচ্চ কত rps পর্যন্ত origin নিরাপদ? (ঘ) ৬টি server-এ ৫০টি করে worker: ১০০ ms-এর অনুরোধে আর ৫০০ ms-এর search-এ সীমা কত? (ঙ) ১ Gbps link-এ ৬৪ byte frame-এ সর্বোচ্চ pps? (ঝালিয়ে নিন: পর্ব ২৮)
(a) 500,000 x 100 x 8 = 400 Mbps = 20% of link
    500,000 / 300,000 = 167% of firewall
(b) 12,000 x 0.25 = 3,000 rps (under 4,000)
(c) 4,000 / 0.25 = 16,000 rps
(d) workers = 6 x 50 = 300
    300 / 0.1 = 3,000 rps; 300 / 0.5 = 600 rps
(e) 84 bytes on the wire = 672 bit
    10^9 / 672 = 1,488,095 pps

(গ)-র হিসাব ধরে নেয় hit ratio একই থাকে। চাপ যদি cache-এর বাইরের জিনিসে পড়ে, এই সংখ্যা ভেঙে যায়। (ঘ) বলে, কোন path-এর rps না বললে rps অর্থহীন। (ঙ)-তে ৬৪ byte-এর সাথে preamble আর ফাঁকের ২০ byte যোগ হয়। Firewall আগে; ৩,০০০; ১৬,০০০; ৩,০০০ আর ৬০০; প্রায় ১৪.৯ লাখ pps.

৫.৫(মাঝারি) (ক) SYN flood-এ backlog ১২৮, জাল SYN সেকেন্ডে ৬০টি, timeout ৫ s. Backlog ভরবে? Timeout ২ s হলে? এই হারে সর্বোচ্চ কত timeout নিরাপদ? (খ) ৪০ Gbps reflection traffic ৫টি anycast কেন্দ্রে সমান ভাগ হলে প্রতিটিতে কত? (গ) ৫,৯০০ rps বৈধ (hit ৬০%) আর ১,৫০০ rps flood (hit ৮০%): origin-এ কত যায়, সীমা ৩,০০০ হলে সাইট টিকবে? (ঝালিয়ে নিন: পর্ব ২৮)
(a) 60 x 5 = 300 >= 128  full
    60 x 2 = 120 <  128  not full
    largest timeout: 128 / 60 = 2.13 s
(b) 40 / 5 = 8 Gbps per site
(c) 5,900 x 0.4 = 2,360
    1,500 x 0.2 =   300
    origin = 2,660 < 3,000  survives

Timeout কমানোও প্রতিরক্ষা, তবে ধীর আসল client-এর ক্ষতি হতে পারে, আর flood বড় হলে আবার ভরবে। তাই SYN cookie লাগে, যা সারি ভরা থাকলেও আসল client-কে ঢুকতে দেয়। ৩০০ ≥ ১২৮, ভরবে; ১২০-এ ভরবে না; ২.১৩ s; ৮ Gbps; ২,৬৬০ rps, টিকবে।

// Firewall exposure, base rate and DDoS capacity. All numbers are assumed.
const dirs = n => n * (n - 1);
console.log('zones 5:', dirs(5), ' zones 7:', dirs(7), ' flat 40 hosts:', dirs(40));
console.log('paths left:', (346 / 1560 * 100).toFixed(1) + '%', (46 / 1560 * 100).toFixed(1) + '%');
const addrs = p => 2 ** (32 - p);
const wide = addrs(24) * addrs(28) * 2, narrow = 3 * 1 * 1;
console.log('wide', wide, 'narrow', narrow, 'cut', ((1 - narrow / wide) * 100).toFixed(2) + '%');
function baseRate(total, real, recall, fpr) {
  const tp = real * recall, fp = (total - real) * fpr;
  return { tp, fp, precision: tp / (tp + fp), accuracy: (tp + (total - real - fp)) / total };
}
const r = baseRate(1e6, 100, 0.99, 0.01);
console.log('TP', r.tp, 'FP', r.fp, 'precision', (r.precision * 100).toFixed(2) + '%',
  'accuracy', (r.accuracy * 100).toFixed(2) + '%', 'analysts', ((r.tp + r.fp) * 5 / 60 / 8).toFixed(1));
const s = baseRate(5e5, 50, 0.9, 0.005);
console.log('precision', (s.precision * 100).toFixed(2) + '%',
  'FPR for 20%', (180 / 499950 * 100).toFixed(3) + '%');
const mbps = (pps, bytes) => pps * bytes * 8 / 1e6;
console.log('400k pps, 64 B:', mbps(4e5, 64), 'Mbps; 1 Gbps max', Math.round(1e9 / 672), 'pps');
console.log('500k pps, 100 B:', mbps(5e5, 100), 'Mbps; firewall',
  (5e5 / 3e5 * 100).toFixed(0) + '%');
console.log('app limit', 300 / 0.1, 300 / 0.5, ' safe rps', 4000 / 0.25);
const full = (rate, sec, cap) => `${rate * sec}/${cap} ${rate * sec >= cap ? 'full' : 'ok'}`;
console.log('SYN', full(60, 5, 128), '|', full(60, 2, 128), '| max timeout',
  (128 / 60).toFixed(2), 's');

zones 5: 20 zones 7: 42 flat 40 hosts: 1560 আর wide 8192 narrow 3 cut 99.96% ৫.১ আর ৫.২-এর। TP 99 FP 9999 precision 0.98% accuracy 99.00% analysts 105.2 stepper-এর, precision 1.77% FPR for 20% 0.036% ৫.৩-এর, 500k pps, 100 B: 400 Mbps; firewall 167% ৫.৪-এর, আর SYN 300/128 full | 120/128 ok | max timeout 2.13 s ৫.৫-এর।

৬ · মডিউল ৫ আর ৬ — CVSS, EPSS, restore আর API সীমা

সূত্রের কার্ড — CVSS v3.1 base score

ISS = 1 − (1 − C)(1 − I)(1 − A). Exploitability = 8.22 × AV × AC × PR × UI.

Impact: Scope Unchanged হলে 6.42 × ISS; Changed হলে 7.52(ISS − 0.029) − 3.25(ISS − 0.02)15. Impact ≤ 0 হলে Base = 0.

Base = Roundup(min(Impact + Exploitability, 10)); Changed হলে যোগফল × 1.08. Roundup মানে এক দশমিকে ওপরে তোলা: 8.0124 থেকে 8.1, কিন্তু ঠিক 8.0 থাকলে 8.0.

Metricওজন
AVN 0.85, A 0.62, L 0.55, P 0.20
ACL 0.77, H 0.44
PR (S:U)N 0.85, L 0.62, H 0.27
PR (S:C)N 0.85, L 0.68, H 0.50
UIN 0.85, R 0.62
C, I, AH 0.56, L 0.22, N 0

মাত্রা: ০.১–৩.৯ Low, ৪.০–৬.৯ Medium, ৭.০–৮.৯ High, ৯.০–১০ Critical.

৬.১(মাঝারি) Vector AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N-এর base score হাতে বের করুন। (ঝালিয়ে নিন: পর্ব ৩২)
E   = 8.22 x 0.85 x 0.77 x 0.62 x 0.85 = 2.8353
ISS = 1 - (0.44 x 0.44 x 1) = 0.8064
Imp = 6.42 x 0.8064 = 5.1771
sum = 5.1771 + 2.8353 = 8.0124
Base = Roundup(8.0124) = 8.1  High

ফাঁদ: সাধারণ rounding-এ ৮.০ আসত, CVSS-এ সবসময় ওপরে। আরেক ফাঁদ: PR-এর ওজন Scope-এর ওপর নির্ভর করে। ৮.১, High.

ধাপ ১বদল চিহ্নিত করুন
AV:N/AC:L/PR:L/UI:N
S:C/C:H/I:H/A:N
PR:L = 0.68 (not 0.62)
ধাপ ২Exploitability
E = 8.22 x 0.85 x 0.77
    x 0.68 x 0.85
  = 3.1096
ধাপ ৩ISS একই থাকে
ISS = 1 - (0.44 x 0.44 x 1)
    = 0.8064
ধাপ ৪Impact, Changed সূত্র
7.52 x (0.8064 - 0.029) = 5.8460
3.25 x 0.7864^15        = 0.0884
Imp = 5.8460 - 0.0884 = 5.7576
ধাপ ৫Base
sum = 5.7576 + 3.1096 = 8.8672
1.08 x 8.8672 = 9.5766
Roundup = 9.6  Critical
  1. আগে বদলটি দেখুন। Scope Changed হলে PR:L-এর ওজন ০.৬২ থেকে ০.৬৮ হয়। সবচেয়ে সাধারণ ভুল এটিই।
  2. Exploitability. নতুন ওজনে ৩.১০৯৬, আগের ২.৮৩৫৩-এর চেয়ে বেশি।
  3. ISS. C, I, A বদলায়নি, তাই ০.৮০৬৪-ই থাকে।
  4. Impact. এবার দীর্ঘ সূত্র। দ্বিতীয় অংশ ছোট, কিন্তু বাদ দেওয়া যায় না। ফল ৫.৭৫৭৬.
  5. Base. যোগফলে ১.০৮ গুণ, তারপর Roundup. ৮.১ থেকে ৯.৬: একটি metric বদলেই High থেকে Critical.
৬.২(কঠিন) ৬.১-এর vector-এ শুধু S:U বদলে S:C করলে base score কত? ওপরের stepper না দেখে আগে নিজে করুন। Scope Changed মানে কী, এক লাইনে বলুন। (ঝালিয়ে নিন: পর্ব ৩২)
E = 3.1096, ISS = 0.8064, Imp = 5.7576
1.08 x (5.7576 + 3.1096) = 9.5766
Base = 9.6  Critical

Scope Changed মানে ত্রুটিটি যে উপাদানে, তার নিরাপত্তা-সীমার বাইরের কিছুকেও প্রভাবিত করে, যেমন একটি container থেকে host-এ পৌঁছানো। ৯.৬, Critical. CVSS তীব্রতা মাপে, কিন্তু আপনার পরিবেশে ঝুঁকি কত, তা বলে না।

// CVSS v3.1 base score from the published equations.
const W = { AV: { N: .85, A: .62, L: .55, P: .2 }, AC: { L: .77, H: .44 },
  UI: { N: .85, R: .62 }, CIA: { H: .56, L: .22, N: 0 } };
const PR = { U: { N: .85, L: .62, H: .27 }, C: { N: .85, L: .68, H: .5 } };
function roundup(x) {         // Appendix A of the specification
  const i = Math.round(x * 100000);
  return i % 10000 === 0 ? i / 100000 : (Math.floor(i / 10000) + 1) / 10;
}
function score(v) {
  const m = Object.fromEntries(v.split('/').map(p => p.split(':')));
  const c = k => 1 - W.CIA[m[k]];
  const iss = 1 - c('C') * c('I') * c('A');
  const ex = 8.22 * W.AV[m.AV] * W.AC[m.AC] * PR[m.S][m.PR] * W.UI[m.UI];
  const imp = m.S === 'U' ? 6.42 * iss : 7.52 * (iss - .029) - 3.25 * (iss - .02) ** 15;
  if (imp <= 0) return { iss, ex, imp, base: 0 };
  const raw = m.S === 'U' ? imp + ex : 1.08 * (imp + ex);
  return { iss, ex, imp, raw, base: roundup(Math.min(raw, 10)) };
}
for (const v of ['AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N', 'AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N',
  'AV:A/AC:H/PR:N/UI:R/S:U/C:H/I:L/A:N', 'AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H',
  'AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H', 'AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:N']) {
  const r = score(v);
  console.log(v.slice(0, 23) + ' ' + v.slice(24), 'E', r.ex.toFixed(4), 'Imp', r.imp.toFixed(4), '=>', r.base);
}

প্রথম দুই সারি ৬.১ আর ৬.২: E 2.8353 Imp 5.1771 => 8.1 আর E 3.1096 Imp 5.7576 => 9.6. তৃতীয় সারি পর্ব ৩২-এর অনুশীলনের => 5.4. C:H/I:H/A:H E 3.8870 Imp 5.8731 => 9.8 সেই পরিচিত ৯.৮, আর C:N/I:N/A:H ... => 7.5 শুধু availability-র ক্ষতি। শেষ সারিতে C, I, A তিনটিই N, তাই Imp 0.0000 => 0: Impact শূন্য হলে Exploitability যত বেশিই হোক, base ০. তালিকায় নিজের vector বসিয়ে দেখুন।

৬.৩(কঠিন) খোলা ১,০০০টি CVE: ৯০০টির EPSS ০.০১, ৮০টির ০.১০, ২০টির ০.৭০. (ক) পরের ৩০ দিনে প্রত্যাশিত কতটিতে exploit কার্যকলাপ দেখা যাবে? (খ) ওপরের ২০টি patch করলে কত অংশ ঢাকা পড়ে? (গ) তিনটি CVE-এর EPSS ০.৪০, ০.১০, ০.০২ হলে (স্বাধীন ধরে) অন্তত একটির সম্ভাবনা? (ঘ) ধরে নিন ৪% CVE-তে মাসে exploit দেখা যায়। একটি filter সেগুলোর ৬০% ধরে, আর বাকিদের ২%-এ ভুল করে। Filter-এর precision কত? (ঝালিয়ে নিন: পর্ব ৩২)
(a) 900 x 0.01 + 80 x 0.10 + 20 x 0.70
    = 9 + 8 + 14 = 31
(b) 14 / 31 = 45.2% of the risk with 2% of the work
(c) 1 - 0.60 x 0.90 x 0.98 = 0.4708
(d) TP share = 0.60 x 0.04 = 0.024
    FP share = 0.02 x 0.96 = 0.0192
    precision = 0.024 / 0.0432 = 55.6%

EPSS ০.৪০ মানে কোথাও exploit কার্যকলাপ দেখার অনুমিত সম্ভাবনা ৪০%, আপনার server-এ হামলার নয়। তাই (ক)-র ৩১ মোটা দাগের অগ্রাধিকার, ভবিষ্যদ্বাণী নয়। (ঘ) ঠিক আগের base rate-এর হিসাব, আর সংখ্যাগুলো অনুমিত, EPSS-এর প্রকাশিত মান নয়। ৩১টি; ৪৫.২%; ৪৭.০৮%; ৫৫.৬%. বাস্তবে KEV, exposure আর asset-এর গুরুত্বও মেলাতে হয়।

৬.৪(কঠিন) (ক) ১২ TB ডেটা, আসল গতি ৪০০ Mbps, rebuild ৮ ঘণ্টা, যাচাই ৬ ঘণ্টা: মোট সময়? (খ) ৬ TB, ৮০০ Mbps, rebuild ৫, যাচাই ৪, RTO ২৪ ঘণ্টা: পূরণ হয়? না হলে কত Mbps লাগবে? (গ) Backup প্রতি ২৪ ঘণ্টায়, অন্য জায়গায় পৌঁছাতে ২ ঘণ্টা, RPO ২৪ ঘণ্টা: সবচেয়ে খারাপ ক্ষেত্রে পূরণ হয়? (ঘ) Retention ১৪ দিন, dwell time ১৮ দিন হলে কী সমস্যা? (ঝালিয়ে নিন: পর্ব ৩৪)
copy seconds = GB x 8,000 / Mbps
(a) 12,000 x 8,000 / 400 = 2,40,000 s = 66.7 h
    total = 66.7 + 8 + 6 = 80.7 h
(b) 6,000 x 8,000 / 800 = 60,000 s = 16.67 h
    total = 16.67 + 5 + 4 = 25.67 h > 24  miss
    copy budget = 24 - 9 = 15 h = 54,000 s
    speed = 4,80,00,000 / 54,000 = 889 Mbps
(c) worst RPO = 24 + 2 = 26 h > 24  miss
(d) 14 < 18: no system copy is older than the intrusion

“৮০০ Mbps” কাগজের গতি নয়, মেপে পাওয়া গতি হতে হবে। একদম সীমায় পরিকল্পনা না করে আগে জরুরি ডেটা ফেরানোর ক্রম ঠিক করুন, যেমন শুধু ১,৫০০ GB আগে আনলে পর্ব ৩৪-এর উদাহরণে মোট ১৯.৩ ঘণ্টা। (ঘ)-তে সব system কপিতে হামলাকারীর ব্যবস্থা থাকতে পারে, তাই retention সম্ভাব্য dwell time-এর চেয়ে লম্বা হওয়া উচিত। ৮০.৭ ঘণ্টা; পূরণ হয় না, প্রায় ৮৮৯ Mbps; ২৬ ঘণ্টা, পূরণ হয় না; কোনো পরিষ্কার system কপি নাও থাকতে পারে।

৬.৫(সহজ) (ক) Token bucket: ধারণক্ষমতা ১০০, সেকেন্ডে ১ token, শুরুতে ভরা। ৬০ সেকেন্ডে সর্বোচ্চ কত অনুরোধ? (খ) ৫,০০,০০০ রেকর্ড মিনিটে ১২০ অনুরোধে একটি করে পড়তে কত সময়? প্রতি উত্তরে ১০০টি হলে? (গ) ১০ লাখ অর্ডারের API-তে BOLA আছে, প্রতি key-তে মিনিটে ৬০ অনুরোধ। সব পড়তে কত দিন? ২০টি key থাকলে? (ঝালিয়ে নিন: পর্ব ৪৩)
(a) b + rT = 100 + 1 x 60 = 160
(b) 5,00,000 / 120 = 4,166.7 min = 69.4 h = 2.9 days
    5,000 requests / 120 = 41.7 min
(c) 10,00,000 / 86,400 = 11.6 days
    with 20 keys: 10,00,000 / 20 / 3,600 = 13.9 h

“মিনিটে ৬০” লিখলেও বালতি ভরা থাকলে প্রথম মিনিটে দ্বিগুণ যেতে পারে। আর সীমা গতি কমায়, সময় কেনে, কিন্তু ফুটো বন্ধ করে না। Rate limit BOLA সারায় না, সারায় server-এ মালিকানা যাচাই। ১৬০; ২.৯ দিন আর ৪১.৭ মিনিট; ১১.৬ দিন আর ১৩.৯ ঘণ্টা।

// EPSS expectation, a Bayes check, restore time and API limits. All numbers assumed.
const groups = [[900, 0.01], [80, 0.10], [20, 0.70]];
const expected = groups.map(([n, e]) => n * e);
const sum = expected.reduce((a, b) => a + b, 0);
console.log('expected', expected.map(x => x.toFixed(0)).join(' + '), '=', sum.toFixed(0));
console.log('top 20 share', (expected[2] / sum * 100).toFixed(1) + '%');
console.log('any of 0.40, 0.10, 0.02:', (1 - 0.6 * 0.9 * 0.98).toFixed(4));
const tp = 0.60 * 0.04, fp = 0.02 * 0.96;
console.log('filter precision', (tp / (tp + fp) * 100).toFixed(1) + '%');
const copyH = (gb, mbps) => gb * 8000 / mbps / 3600;
function rto(gb, mbps, fixedH, target) {
  const total = copyH(gb, mbps) + fixedH;
  const need = gb * 8000 / ((target - fixedH) * 3600);
  return `copy ${copyH(gb, mbps).toFixed(2)} h, total ${total.toFixed(2)} h, need ${need.toFixed(0)} Mbps`;
}
console.log('12 TB:', rto(12000, 400, 14, 24));
console.log(' 6 TB:', rto(6000, 800, 9, 24));
console.log('bucket 60 s:', 100 + 1 * 60, ' records at 120 per min:',
  (500000 / 120 / 60).toFixed(1), 'h, pages:', (5000 / 120).toFixed(1), 'min');
console.log('1,000,000 orders at 1/s:', (1e6 / 86400).toFixed(1), 'days; 20 keys:',
  (1e6 / 20 / 3600).toFixed(1), 'h');

expected 9 + 8 + 14 = 31, top 20 share 45.2%, any of 0.40, 0.10, 0.02: 0.4708 আর filter precision 55.6% ৬.৩-এর চার ভাগ। 12 TB: copy 66.67 h, total 80.67 h আর 6 TB: copy 16.67 h, total 25.67 h, need 889 Mbps ৬.৪-এর। ১২ TB-র সারিতে need 2667 Mbps দেখায়, ২৪ ঘণ্টার মধ্যে সব ফেরাতে কত লাগত। শেষ দুই লাইন ৬.৫: bucket 60 s: 160, 11.6 days; 20 keys: 13.9 h.

৭ · মডিউল ৯ আর ১০ — Detection, log, SOC আর MTTx

সূত্রের কার্ড

Precision = TP ÷ (TP + FP). Recall = TP ÷ (TP + FN). F1 = 2PR ÷ (P + R) = 2TP ÷ (2TP + FP + FN). FP rate = FP ÷ (FP + TN).

Log: দৈনিক GB = event × byte ÷ 10⁹; জমা = দৈনিক GB × দিন; cold-এ compression দিয়ে ভাগ।

Staffing: জন = দরকারি ঘণ্টা ÷ একজনের কাজের ঘণ্টা; shrinkage বাদ দিয়ে। Workload: জন = মোট কাজের ঘণ্টা ÷ দিনে মনোযোগের ঘণ্টা। অপেক্ষা (M/M/1): ρ ÷ (1 − ρ) × কাজের সময়।

MTTD: শুরু থেকে ধরা পড়া। MTTA: alert থেকে হাতে নেওয়া। MTTR: সংজ্ঞা দলভেদে আলাদা (respond, resolve, recover), তাই লিখে নিন। গড়ের সাথে median-ও দিন।

৭.১(মাঝারি) একটি rule এক সপ্তাহে ৫০০টি alert দিল, ২৫টি আসল। ওই সপ্তাহে মোট ৩০টি আসল ঘটনা, আর ৯৯,৯৭০টি নিরীহ ঘটনা। প্রতি alert-এ ১২ মিনিট। Tuning-এর পরে alert ১০০টি, TP ২৪. দুই অবস্থায় precision, recall, F1, FP rate আর মোট কাজ কত? SOC-এর দৈনন্দিন “FP rate” আগের অবস্থায় কত? (ঝালিয়ে নিন: পর্ব ৫৬, ৬০)
before: TP 25, FP 475, FN 5
  P = 25 / 500 = 5%      R = 25 / 30 = 83.3%
  F1 = 2 x 25 / (50 + 475 + 5) = 9.4%
  FPR = 475 / 99,970 = 0.475%
  work = 500 x 12 / 60 = 100 h
after : TP 24, FP 76, FN 6
  P = 24%   R = 80%   F1 = 48 / 130 = 36.9%
  FPR = 76 / 99,970 = 0.076%
  work = 20 h
SOC daily "FP rate" = FP / closed alerts = 475 / 500 = 95%

একটি আসল ঘটনা হারিয়ে কাজ পাঁচ ভাগের এক ভাগ। এই বিনিময় ঠিক কি না, হারানো ঘটনাটি কত গুরুতর তার ওপর নির্ভর করে। ফাঁদ: ০.৪৭৫% আর ৯৫%, দুটোকেই “FP rate” বলা হয়, অর্থ আলাদা। আগে ৫%, ৮৩.৩%, ৯.৪%, ০.৪৭৫%, ১০০ ঘণ্টা; পরে ২৪%, ৮০%, ৩৬.৯%, ০.০৭৬%, ২০ ঘণ্টা; দৈনন্দিন হিসাবে ৯৫%.

৭.২(কঠিন) একটি rule-এ ৮৪০টি alert, ১৪টি আসল। বিকল্প X: পুরো subnet ছাড়, থাকে ৫৭টি, TP ১১. বিকল্প Y: সরু ছাড় আর মূল কারণ সারানো, থাকে ৮০টি, TP ১৪. প্রতি alert-এ ১০ মিনিট। Precision, recall, F1 আর কাজ কত? F1 কোনটিকে এগিয়ে রাখে, আর আপনি কোনটি নেবেন? (ঝালিয়ে নিন: পর্ব ৫৬)
start: P 14/840 = 1.7%   R 100%   F1 3.3%   140.0 h
X    : P 11/57  = 19.3%  R 78.6%  F1 31.0%    9.5 h
Y    : P 14/80  = 17.5%  R 100%   F1 29.8%   13.3 h
F1 check X: 2 x 11 / (22 + 46 + 3) = 22 / 71 = 31.0%
F1 check Y: 2 x 14 / (28 + 66 + 0) = 28 / 94 = 29.8%

F1 বলছে X সামান্য ভালো, কিন্তু X-এ ৩টি আসল ঘটনা চিরতরে অদৃশ্য, আর ছাড়ের মেয়াদ নেই। F1 জানে না একটি FN-এর দাম একটি FP-এর চেয়ে কত বেশি। F1-এ X (৩১.০%) এগিয়ে, তবু Y নেওয়া উচিত: recall ১০০%, বাড়তি মাত্র ৩.৮ ঘণ্টা। পরীক্ষায় লিখুন, মাপটি সিদ্ধান্ত নয়, সিদ্ধান্তের একটি উপাদান।

// Precision, recall, F1 and FP rate. Fake counts, same as the problems above.
function m(tp, alerts, real, benign) {
  const fp = alerts - tp, fn = real - tp;
  const p = tp / alerts, r = tp / real, f1 = 2 * p * r / (p + r);
  const pct = x => (x * 100).toFixed(1).padStart(5) + '%';
  return `P ${pct(p)} R ${pct(r)} F1 ${pct(f1)} FP ${String(fp).padStart(3)} FN ${fn}` +
    (benign ? ` FPR ${(fp / benign * 100).toFixed(3)}%` : '');
}
console.log('before ', m(25, 500, 30, 99970));
console.log('after  ', m(24, 100, 30, 99970));
for (const [name, tp, alerts] of [['start ', 14, 840], ['subnet', 11, 57],
  ['narrow', 14, 230], ['fixed ', 14, 80]])
  console.log(name, ' ', m(tp, alerts, 14), 'hours', (alerts * 10 / 60).toFixed(1));

before P 5.0% R 83.3% F1 9.4% FP 475 FN 5 FPR 0.475% আর after P 24.0% R 80.0% F1 36.9% FP 76 FN 6 FPR 0.076% ৭.১-এর। নিচের চার সারি পর্ব ৫৬-এর ধাপগুলো: subnet সারিতে F1 31.0%, FN 3, আর fixed সারিতে F1 29.8%, FN 0, hours 13.3. m()-এ TP, মোট alert আর মোট আসল ঘটনা বসিয়ে নিজের rule মাপুন।

৭.৩(সহজ) ৪০টি server, প্রতিটি দিনে ২০ লাখ event, গড়ে ৩০০ bytes. (ক) দৈনিক GB, গড় events/s? (খ) Hot ৩০ দিন আর cold ৩৩৫ দিনে (cold-এ ৪:১ compression) কত জমা? (গ) ধরে নেওয়া দাম hot ৳৩, cold ৳০.৪ প্রতি GB-মাস: মাসিক storage খরচ? (ঝালিয়ে নিন: পর্ব ৫৫)
(a) 40 x 20,00,000 = 8,00,00,000 events
    80,000,000 x 300 / 10^9 = 24 GB/day
    80,000,000 / 86,400 = 926 events/s
(b) hot  = 24 x 30 = 720 GB
    cold = (24 / 4) x 335 = 2,010 GB
(c) 720 x 3 + 2,010 x 0.4 = 2,160 + 804 = 2,964 taka

৯২৬ গড়, চূড়া আরও বেশি হয়। ২৪ GB/দিন, ৯২৬ events/s; ৭২০ GB আর ২,০১০ GB; ৳২,৯৬৪ প্রতি মাসে। পর্ব ৫৫-এর উদাহরণে ২৬.৭ GB/দিন, ingest ৳২০/GB, cold-এ ৫:১ ধরলে এক বছরের Plan A ৳১৯,১৩৯, আর সব hot রাখলে Plan B ৳৪৫,২৫৭, প্রায় ২.৪ গুণ।

৭.৪(মাঝারি) একটি ২৪x৭ আসন। প্রতি shift ৮.৫ ঘণ্টা (handover-সহ), দিনে ৩টি shift. (ক) সপ্তাহে ৪৮ ঘণ্টা, ২৫ দিন ছুটি, ৫ দিন প্রশিক্ষণ, দিনে ৮ ঘণ্টা, ১০% shrinkage: কত জন? (খ) সপ্তাহে ৪০ ঘণ্টা আর মোট ৪০ দিন ছুটি ও প্রশিক্ষণে? (গ) দিনে ৪০০টি alert, প্রতিটিতে ১২ মিনিট, একজন দিনে ৬ ঘণ্টা মনোযোগ দিতে পারেন: কত জন? Alert অর্ধেক হলে? (ঘ) ১২ মিনিটের কাজে ρ = ০.৫, ০.৮, ০.৯৫-এ গড় অপেক্ষা? (ঝালিয়ে নিন: পর্ব ৬০)
need = 8.5 x 3 x 365 = 9,307.5 h a year
(a) contract = 52 x 48 = 2,496
    off = 30 x 8 = 240, left 2,256
    on floor = 2,256 x 0.9 = 2,030.4
    9,307.5 / 2,030.4 = 4.58 -> 5 people
(b) 52 x 40 = 2,080, minus 40 x 8 = 1,760
    1,760 x 0.9 = 1,584
    9,307.5 / 1,584 = 5.88 -> 6 people
(c) 400 x 12 / 60 = 80 h; 80 / 6 = 13.3 -> 14 people
    half: 40 / 6 = 6.67 -> 7 people
(d) wait = rho / (1 - rho) x 12
    0.5 -> 12 min   0.8 -> 48 min   0.95 -> 228 min

“২৪x৭-এ তিনজন” ভুল ধারণা। কোর্সের সংখ্যাগুলো পরস্পরবিরোধী নয়: ১৬৮ ÷ ৪০ = ৪.২ ছুটি ছাড়া নিচের সীমা, ছুটি ধরলে অন্তত ৫ জন (পর্ব ৫৯, পর্ব ৭৫), আর (খ)-র পূর্ণ হিসাবে পর্ব ৬০-এর মতো প্রায় ৬ জন। দীর্ঘ সপ্তাহে সংখ্যা কমে, কিন্তু ক্লান্তি বাড়ে, আর আইন ও চুক্তি না দেখে এই অনুমান ব্যবহার করা যায় না। এই সংখ্যা শুধু analyst-দের। ৫ জন; ৬ জন; ১৪ জন, অর্ধেকে ৭ জন; ১২, ৪৮, ২২৮ মিনিট। ব্যস্ততা ০.৮ থেকে ০.৯৫ হলে অপেক্ষা প্রায় পাঁচ গুণ, তাই tuning-ই সবচেয়ে সস্তা নিয়োগ।

৭.৫(মাঝারি) ঘটনা ১: ক্ষতিকর কাজ শুরু 09:00, alert 09:40, analyst হাতে নিলেন 09:52, containment 11:10. ঘটনা ২: 14:00, 14:06, 14:10, 14:40. (ক) গড় detect, acknowledge আর alert থেকে containment সময়? (খ) পাঁচ দিন পর ধরা পড়া তৃতীয় ঘটনা যোগ হলে গড় আর median detect? (গ) পাঁচটি ঘটনার detect সময় ১২, ২০, ৪৫, ১৮০, ২,৮৮০ মিনিট: গড় আর median? (ঝালিয়ে নিন: পর্ব ৫৬, ৬০, ৬১)
(a) detect : 40, 6   -> mean 23 min
    ack    : 12, 4   -> mean 8 min
    contain: 90, 34  -> mean 62 min
(b) third = 5 x 1,440 = 7,200 min
    mean = (40 + 6 + 7,200) / 3 = 2,415.3 min
    median of 6, 40, 7,200 = 40 min
(c) sum 3,137; mean 627.4 min = 10.5 h
    median = 45 min

একটি দীর্ঘ ঘটনা গড়কে টেনে তোলে, median তা দেখায় না, তাই দুটোই আর সবচেয়ে ধীর ঘটনাটিও দেখুন। MTTD শুধু যা ধরা পড়েছে তা গোনে; অজানা ঘটনা হিসাবে নেই। ২৩, ৮, ৬২ মিনিট; ২,৪১৫.৩ আর ৪০ মিনিট; ৬২৭.৪ আর ৪৫ মিনিট।

// Log volume, 24x7 staffing and MTTx. All inputs are assumed.
const gb = 40 * 2e6 * 300 / 1e9;
const hot = gb * 30, cold = gb / 4 * 335;
console.log('GB/day', gb, 'events/s', Math.round(40 * 2e6 / 86400));
console.log('hot', hot, 'cold', cold, 'cost', hot * 3 + cold * 0.4);
const g = 26.7, ingest = g * 30 * 20;
const planA = ingest + g * 30 * 3 + g / 5 * 335 * 0.4, planB = ingest + g * 365 * 3;
console.log('plan A', Math.round(planA), 'plan B', Math.round(planB), (planB / planA).toFixed(1) + 'x');
const need = 8.5 * 3 * 365;
const onFloor = (wk, offDays, dayH) => (52 * wk - offDays * dayH) * 0.9;
for (const [wk, off] of [[48, 30], [40, 40]]) {
  const f = onFloor(wk, off, 8);
  console.log(`${wk} h week: on floor ${f.toFixed(1)}, need ${need}, per seat ${(need / f).toFixed(2)}`);
}
console.log('workload', (400 * 12 / 60 / 6).toFixed(2), 'half', (200 * 12 / 60 / 6).toFixed(2));
const wait = (rho, s) => rho / (1 - rho) * s;
console.log('M/M/1 wait', [0.5, 0.8, 0.9, 0.95].map(r => Math.round(wait(r, 12))).join(' '));
const avg = a => a.reduce((s, v) => s + v, 0) / a.length;
const med = a => [...a].sort((x, y) => x - y)[Math.floor(a.length / 2)];
console.log('detect', avg([40, 6]), 'ack', avg([12, 4]), 'contain', avg([90, 34]));
const t = [12, 20, 45, 180, 2880];
console.log('MTTD mean', avg(t), 'median', med(t));

GB/day 24 events/s 926 আর hot 720 cold 2010 cost 2964 ৭.৩-এর। plan A 19139 plan B 45257 2.4x পর্ব ৫৫-এর ফল। 48 h week: on floor 2030.4, need 9307.5, per seat 4.58 আর 40 h week: ... per seat 5.88 ৭.৪-এর। workload 13.33 half 6.67 আর M/M/1 wait 12 48 108 228 বাকি অংশ। শেষে detect 23 ack 8 contain 62 আর MTTD mean 627.4 median 45 ৭.৫-এর।

৮ · মডিউল ১১ — FAIR, percentile, privacy noise আর k-anonymity

সূত্রের কার্ড

FAIR: LEF = TEF × Vulnerability; Risk = LEF × Loss Magnitude. Lognormal: ৯০% range lo থেকে hi হলে median = √(lo × hi), σ = ln(hi ÷ lo) ÷ 3.29, গড় = median × eσ²/2.

Percentile: P90 মানে ৯০% বছরে ক্ষতি এর চেয়ে কম বা সমান। n বছরে অন্তত একবার Pq ছাড়ানোর সম্ভাবনা = 1 − qn.

Laplace: b = Δ ÷ ε (Δ = sensitivity); ৯৫% সীমা = b × ln 20 ≈ ৩b. মোট ε = প্রশ্নের ε-এর যোগফল। k-anonymity: k = সবচেয়ে ছোট দলের আকার; l = কোনো দলে সবচেয়ে কম রকম সংবেদনশীল মান; সর্বোচ্চ মিলের সম্ভাবনা ১ ÷ k.

৮.১(মাঝারি) (ক) একটি কাল্পনিক ক্লিনিক: TEF বছরে ৪, vulnerability ০.১, এক ঘটনার ক্ষতি ২০ লাখ। LEF আর সরল বার্ষিক ক্ষতি? (খ) বছরে ১.৫ লাখের control vulnerability ০.০৫ করলে নিট লাভ আর ROSI? (গ) একটি দোকান: TEF ১–৮, vulnerability ০.০৫–০.২৫ (মাঝের মান দুই প্রান্তের গুণোত্তর গড়), primary ক্ষতি ১৫ লাখ, ৪০% ঘটনায় বাড়তি ২৪ লাখ। মাঝের মানের ঝুঁকি কত? (ঝালিয়ে নিন: পর্ব ৬৮)
(a) LEF = 4 x 0.1 = 0.4
    risk = 0.4 x 20 = 8 lakh a year
(b) LEF = 4 x 0.05 = 0.2, risk 4 lakh
    reduced 4, net 4 - 1.5 = 2.5 lakh
    ROSI = 2.5 / 1.5 = 166.7%
(c) TEF  = sqrt(1 x 8) = 2.83
    vuln = sqrt(0.05 x 0.25) = 0.112
    LEF  = 2.83 x 0.112 = 0.316 (unrounded inputs)
    LM   = 15 + 0.4 x 24 = 24.6 lakh
    risk = 0.316 x 24.6 = 7.8 lakh

LEF হার, সম্ভাবনা নয়: ০.৩১৬ মানে তিন বছরে প্রায় একবার। সাবধান: মাঝের মান গুণ করলে গড় আসে না। পর্ব ৬৮-এর সিমুলেশনে একই ঝুঁকির গড় প্রায় ১৭.২ লাখ। ০.৪, ৮ লাখ; ২.৫ লাখ, ১৬৬.৭%; প্রায় ৭.৮ লাখ।

৮.২(মাঝারি) একটি Monte Carlo সিমুলেশনের ফল: ৩১.৩% বছরে ক্ষতি হয়, গড় ১৭.২, P50 ০, P90 ৫৫.৮, P95 ৯৫.২, P99 ২১১.৭ লাখ। (ক) P50 ০ কেন, অথচ গড় ১৭.২? (খ) ১ কোটির tolerance কি পার হওয়ার সম্ভাবনা ৫%-এর বেশি? (গ) ১০ বছরে অন্তত এক বছর P95 ছাড়ানোর সম্ভাবনা (বছরগুলো স্বাধীন ধরে)? (ঘ) ১০ বছরের ক্ষতি ০, ০, ০, ০, ০, ০, ২, ৫, ২০, ৭৩ লাখ হলে গড় আর সূচক ⌊০.৯ × ১০⌋ ধরে P90? (ঝালিয়ে নিন: পর্ব ৬৮)
(a) 100 - 31.3 = 68.7% of years have zero loss
    so the middle year (P50) is 0
(b) P95 = 95.2 lakh, and 100 > 95.2
    so P(loss > 100) is a little under 5%
(c) 1 - 0.95^10 = 1 - 0.599 = 0.401
(d) mean = 100 / 10 = 10
    index 9 (from 0) -> 73

গড় আসে অল্প কয়েকটি বড় বছর থেকে, যা বেশিরভাগ বছরের চেহারা নয়। তাই একটি সংখ্যা নয়, পুরো loss exceedance curve দেখুন। “৫% সম্ভাবনা” এক বছরের জন্য ছোট শোনায়, দশ বছরে তা ৪০%. দশটি নমুনায় P90 খুব অস্থির, একটি মান বদলালেই লাফ দেয়। ৬৮.৭% বছরে ক্ষতি নেই; ৫%-এর সামান্য কম; ৪০.১%; ১০ লাখ আর ৭৩ লাখ।

৮.৩(কঠিন) এক ঘটনার ক্ষতির ৯০% range ৫ লাখ থেকে ১.২ কোটি, lognormal ধরে। Median, σ আর গড় কত? “মাঝের মান” দিয়ে হিসাব করলে গড় থেকে কত ভুল হয়? (ঝালিয়ে নিন: পর্ব ৬৮)
median = sqrt(5 x 120) = sqrt(600) = 24.5 lakh
sigma  = ln(120 / 5) / 3.29 = 3.178 / 3.29 = 0.966
mean   = 24.5 x e^(0.966^2 / 2)
       = 24.5 x 1.59 = 39 lakh
gap    = 39 / 24.5 = 1.59 times

৩.২৯ এসেছে ২ × ১.৬৪৫ থেকে, কারণ ৯০% range-এর প্রতি পাশে ৫%. ডানদিকের লম্বা লেজ গড়কে median-এর ওপরে টানে। Sam Savage একে বলেছেন flaw of averages. Median প্রায় ২৪.৫ লাখ, σ ≈ ০.৯৬৬, গড় প্রায় ৩৯ লাখ, median-এর ১.৫৯ গুণ।

// Reading a loss simulation. Toy model with a seeded PRNG; numbers are assumed.
function mulberry32(a) {
  return () => { 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 rnd = mulberry32(76), Y = 20000;
const normal = () => Math.sqrt(-2 * Math.log(1 - rnd())) * Math.cos(2 * Math.PI * rnd());
const sigma = Math.log(120 / 5) / 3.29, median = Math.sqrt(5 * 120);
console.log('sigma', sigma.toFixed(3), 'median', median.toFixed(1),
  'event mean', (median * Math.exp(sigma * sigma / 2)).toFixed(1));
const years = [];
for (let i = 0; i < Y; i++) {           // ARO 0.3: at most one event a year here
  years.push(rnd() < 0.3 ? median * Math.exp(sigma * normal()) : 0);
}
years.sort((a, b) => a - b);
const pct = p => years[Math.floor(p * (Y - 1))].toFixed(1);
const mean = years.reduce((s, v) => s + v, 0) / Y;
console.log('mean', mean.toFixed(1), 'P50', pct(.5), 'P90', pct(.9), 'P95', pct(.95), 'P99', pct(.99));
const over = years.filter(v => v > 100).length / Y;
console.log('share of years above 100 lakh:', (over * 100).toFixed(1) + '%');
for (const q of [95, 99])
  console.log(`P(at least one year in 10 above P${q}):`, (1 - (q / 100) ** 10).toFixed(3));
const L = [0, 0, 0, 0, 0, 0, 2, 5, 20, 73];
console.log('ten years: mean', L.reduce((s, v) => s + v, 0) / 10, 'P90 by index', L[Math.floor(.9 * 10)]);

sigma 0.966 median 24.5 event mean 39.1 ৮.৩-এর (৩৯.১ পুরো দশমিকে, হাতে ১.৫৯ দিয়ে ৩৯). এখানে বছরে সর্বোচ্চ একটি ঘটনা আর ARO ০.৩ ধরা, তাই সংখ্যা পর্ব ৬৮-এর চেয়ে আলাদা, কিন্তু আকৃতি একই: mean 12.0 P50 0.0 P90 37.2 P95 62.8 P99 144.1. P50 শূন্য, গড় ওপরে, আর লেজ অনেক লম্বা। share of years above 100 lakh: 2.3% সরাসরি tolerance-এর প্রশ্নের উত্তর। P(at least one year in 10 above P95): 0.401 আর ten years: mean 10 P90 by index 73 ৮.২-এর।

৮.৪(মাঝারি) Differential privacy-তে count query, Δ = ১. (ক) ε = ১ আর ε = ০.১-এ b আর ৯৫% সীমা? (খ) ε = ০.৫-এ? ২০ বার চালালে মোট ε? (গ) ε = ০.১-এ আসল গণনা ৪০ আর ৪০,০০০ হলে আপেক্ষিক ত্রুটি? (ঘ) বেতনের যোগফলে প্রতিটি বেতন ১,০০,০০০ টাকায় আটকানো, ε = ০.৫: b কত? (ঝালিয়ে নিন: পর্ব ৭০)
ln 20 = 2.996
(a) eps 1  : b = 1,  bound = 3.00
    eps 0.1: b = 10, bound = 29.96
(b) eps 0.5: b = 2,  bound = 5.99
    total eps = 20 x 0.5 = 10
(c) 29.96 / 40 = 74.9%
    29.96 / 40,000 = 0.075%
(d) sensitivity = 1,00,000
    b = 1,00,000 / 0.5 = 2,00,000
    bound = 2,00,000 x 2.996 = 5,99,146

শব্দের মাত্রা দলের আকারের ওপর নির্ভর করে না, তাই DP ছোট দলের চেয়ে বড় পরিসংখ্যানে বেশি কাজের। (ঘ)-তে কেউ এক কোটি টাকা বেতন পেলে Δ অনেক বড় হতো, তাই আগে মান আটকানো (clipping) লাগে। ১ ও ±৩; ১০ ও ±৩০; ২ ও ±৫.৯৯, মোট ε ১০; ৭৪.৯% বনাম ০.০৭৫%; b = ২,০০,০০০. মোট ε, মানে privacy budget-এর এই যোগফল সরল নিয়ম; উন্নত composition-এ সীমা কিছুটা আঁটসাঁট হয়।

৮.৫(সহজ) Quasi-identifier (দশক, অঞ্চল), সংবেদনশীল মান রোগ। সারি: (20s, A, Flu), (20s, A, Flu), (20s, A, Asthma), (30s, B, Cancer), (30s, B, Cancer), (40s, B, Flu). k আর l কত? শেষ সারি বাদ দিলে? সর্বোচ্চ মিলের সম্ভাবনা? (ঝালিয়ে নিন: পর্ব ৭০)
groups: (20s, A) 3 people, 2 diseases
        (30s, B) 2 people, 1 disease
        (40s, B) 1 person, 1 disease
k = min(3, 2, 1) = 1     l = min(2, 1, 1) = 1
drop last row:
k = min(3, 2) = 2        l = min(2, 1) = 1
worst match = 1 / k = 50%

k বেড়েছে, কিন্তু “30s, B” দলের দুজনেরই Cancer. কেউ জানলে যে পরিচিত মানুষটি এই দলে, সারি না চিনেও রোগ জেনে গেলেন। একেই homogeneity সমস্যা বলে। k = ১, l = ১; বাদ দিলে k = ২, l = ১; ৫০%. k = ১ মানে কেউ একা, আর মিলের সম্ভাবনা ১০০%.

// Differential privacy scale and a k, l checker on invented rows.
for (const [eps, delta] of [[1, 1], [0.1, 1], [0.5, 1], [0.5, 100000]]) {
  const b = delta / eps;
  console.log(`eps ${eps}, sensitivity ${delta}: b = ${b}, 95% bound +-${(b * Math.log(20)).toFixed(2)}`);
}
console.log('20 asks of eps 0.5, simple sum:', 20 * 0.5);
const bound = 10 * Math.log(20);
console.log('relative error at eps 0.1: n=40', (bound / 40 * 100).toFixed(1) + '%',
  ' n=40000', (bound / 40000 * 100).toFixed(3) + '%');
function kl(rows) {
  const groups = new Map();
  for (const [dec, area, disease] of rows) {
    const key = dec + '|' + area;
    if (!groups.has(key)) groups.set(key, []);
    groups.get(key).push(disease);
  }
  const all = [...groups.values()];
  const k = Math.min(...all.map(g => g.length));
  const l = Math.min(...all.map(g => new Set(g).size));
  return `groups ${all.length}, k ${k}, l ${l}, worst match ${(100 / k).toFixed(0)}%`;
}
const t = [['20s', 'A', 'Flu'], ['20s', 'A', 'Flu'], ['20s', 'A', 'Asthma'],
  ['30s', 'B', 'Cancer'], ['30s', 'B', 'Cancer'], ['40s', 'B', 'Flu']];
console.log('all rows  :', kl(t));
console.log('drop last :', kl(t.slice(0, 5)));

eps 0.1, sensitivity 1: b = 10, 95% bound +-29.96 আর eps 0.5, sensitivity 100000: b = 200000, 95% bound +-599146.45 ৮.৪-এর। relative error at eps 0.1: n=40 74.9% n=40000 0.075% দেখায় একই শব্দ ছোট দলে কত ক্ষতি করে। all rows : groups 3, k 1, l 1, worst match 100% আর drop last : groups 2, k 2, l 1, worst match 50% ৮.৫-এর। সব সারি বানানো, কোনো আসল মানুষের নয়।

৯ · শেষ মুহূর্তের সূত্র-তালিকা

পরীক্ষার আগে এই এক টেবিলই যথেষ্ট। শেষ কলামে সবচেয়ে সাধারণ ফাঁদ। সূত্রের চেয়ে সেটি মনে রাখাই বেশি কাজের।

বিষয়সূত্রফাঁদ
ALE, ROSISLE = AV × EF; ALE = SLE × ARO; ROSI = (কমানো − খরচ) ÷ খরচদুই control-এর ফল যোগ করা
Key space2n ÷ হার; গড়ে অর্ধেকSeed-এর entropy ভুলে key-র দৈর্ঘ্য দেখা
Entropy−Σ p log₂ p; n × log₂ প্রতীকমানুষের বাছা password-এ এই সূত্র খাটানো
Birthdayp ≈ 1 − e−n²/2b+1; ৫০% ≈ 1.1774 × 2b/2Collision আর preimage গুলিয়ে ফেলা
Nonce৯৬ bit random: এক key-তে প্রায় ২৩২ বার্তাবার্তার হার থেকে সময় বের না করা
DHA = ga, B = gb, s = Ba = Ab mod pধাপে ধাপে mod না নেওয়া
RSAn = pq, φ = (p−1)(q−1), d = e⁻¹ mod φn দিয়ে inverse নেওয়া, φ দিয়ে নয়
Security levelmin(সব অংশ); ১২৮ bit = RSA-3072 = P-256AES-256 দেখে পুরো ব্যবস্থা ২৫৬ ভাবা
Lockout, TOTPদফা × চেষ্টা; 1 − (1 − p)n; p = বৈধ ÷ 10অঙ্কWindow ±১-এ ৩টি code ভুলে যাওয়া
Firewalln(n−1); উৎস × গন্তব্য × port২ দিয়ে ভাগ করা; object group-কে কম পরিধি ভাবা
Base rateTP = আসল × recall; FP = নিরীহ × FPRRecall-কে precision ভাবা; accuracy দেখে খুশি হওয়া
DDoSbps = pps × byte × ৮; rps = worker ÷ সময়; origin = rps × (১ − hit)শুধু Gbps দেখা
SYN backlogহার × timeout ≥ আকার হলে ভরাCookie সারি খালি করে ভাবা
CVSS v3.1ISS, E, Impact; S:C-তে × ১.০৮; RoundupPR-এর ওজন, সাধারণ rounding
EPSSপ্রত্যাশা = Σ n × e; ৩০ দিনের সম্ভাবনাআপনার server-এ হামলার সম্ভাবনা ভাবা
RTO, RPOGB × ৮,০০০ ÷ Mbps + স্থির ধাপ; I + S৮ ভুলে যাওয়া; retention < dwell time
Token bucketb + rT“মিনিটে ৬০” মানে সর্বোচ্চ ৬০ ভাবা
F1, FPR2TP ÷ (2TP + FP + FN); FP ÷ (FP + TN)SOC-এর “FP rate”-এর সাথে গুলিয়ে ফেলা
Logevent × byte ÷ 10⁹ × দিনগড় দেখে চূড়া ভুলে যাওয়া
Staffing৮.৫ × ৩ × ৩৬৫ ÷ কাজের ঘণ্টাShrinkage আর ছুটি বাদ দিতে ভুলে যাওয়া
MTTxগড় আর median; দুটি সময়ের বিয়োগশুধু গড় বলা; MTTR-এর সংজ্ঞা না লেখা
FAIRLEF = TEF × V; গড় = median × eσ²/2মাঝের মান গুণ করে গড় বলা
Percentile1 − qnP50-কে গড় ভাবা
DPb = Δ ÷ ε; সীমা ≈ ৩bপ্রশ্নের সংখ্যায় ε গুণ না করা
k, lk = সবচেয়ে ছোট দল; মিল ≤ ১ ÷ kk বড় দেখে l না দেখা

AI-এর যুগে — নিরাপত্তার হিসাব যাচাই

AI-কে CVSS বা ALE-এর অঙ্ক দিলে পরিষ্কার টেবিলে আত্মবিশ্বাসী উত্তর আসে। তাতে প্রায়ই ভুল থাকে, আর বানানো CVE নম্বর বা পরিসংখ্যানও মিশে থাকে। ভুলগুলো চেনা:

AI-এর ভুলপরিণামকীভাবে ধরবেন
CVSS স্কোর স্মৃতি থেকে বলা; PR-এর ওজন বা Roundup ভুল; নেই এমন CVE বানানোভুল অগ্রাধিকারVector নিজে চালান, cve.org আর NVD-তে নম্বর মেলান
Password-এর entropy সূত্র মানুষের বাছা password-এ খাটানোনিরাপত্তা বাড়িয়ে দেখায়“এলোমেলো কি?” জিজ্ঞেস করুন
পুরোনো পরামর্শ: MD5, ECB, salt ছাড়া hash, ৯০ দিনে password বদলদুর্বল নকশাNIST আর OWASP-এর বর্তমান নথি, পর্ব ১৪
Accuracy ৯৯% দেখে detector-কে ভালো বলা; base rate বাদAnalyst alert-এ ডুবে যানTP, FP আলাদা করে গুনতে বলুন
ARO আর ক্ষতির সংখ্যা নিজে বানানো, উৎস ছাড়াALE নিখুঁত দেখায়, ভিত্তি নেইপ্রতিটি অনুমানের উৎস চান, নিজের log-এর সাথে মেলান
Bit আর byte গুলিয়ে ফেলা; MTTR-এর সংজ্ঞা না বলা; triage-এ অতি-নিশ্চিত রায়RTO ৮ গুণ ভুল; ভুল সিদ্ধান্তএকক আলাদা লাইনে; মূল log পড়ুন; মানুষের চূড়ান্ত সিদ্ধান্ত
Error সরাতে verify=False, chmod 777 বা খোলা CORS বলা; কোডে injection বা authorization-এর ফাঁকনিয়ন্ত্রণটিই বন্ধ হয়Diff পড়ুন, নিজের ল্যাবে পরীক্ষা করুন

AI-কে উত্তরদাতা নয়, যাচাইকারী হিসেবে ব্যবহার করুন। কোনো secret, আসল log, ব্যক্তিগত তথ্য বা প্রতিষ্ঠানের গোপন সংখ্যা prompt-এ দেবেন না।

আমি সাইবার নিরাপত্তার numerical অনুশীলন করছি। নিচে প্রশ্ন, শর্ত আর আমার হাতে করা সমাধান দিলাম। প্রশ্ন: [যেমন: CVSS v3.1 vector / ALE আর ROSI / precision ও recall] শর্ত: সব গতি আর টাকা অনুমিত; বছর = ৩৬৫ দিন; ঘটনা স্বাধীন ধরা। আমার সমাধান: [ধাপগুলো পেস্ট করুন] ১. পুরো উত্তর আগে দিও না। আমার সমাধানের প্রথম যে ধাপে ভুল আছে, শুধু সেটি বলো। ২. তুমি নিজে হিসাব করলে প্রতিটি ধাপে একক আর সূত্র লেখো। ৩. শেষে একটি উল্টো হিসাব দাও, উত্তর থেকে আবার প্রশ্নের সংখ্যায় ফেরার মতো। ৪. একই ধরনের একটি নতুন, ফাঁদওয়ালা প্রশ্ন দাও। উত্তর লুকিয়ে রাখো। ৫. কোনো standard, CVE বা পরিসংখ্যান উল্লেখ করলে লিখে দাও যে সেটি মূল উৎসে যাচাই করতে হবে। না জানলে “জানি না” বলো। ৬. শুধু রক্ষার দিক থেকে উত্তর দাও: কোন control কত কমায়, কীভাবে ধরা যায়।

যাচাইয়ের চেকলিস্ট

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

প্রতিটি প্রশ্নে খাতায় হিসাব করে তবে উত্তর বাছুন। সব তথ্য প্রশ্নের ভেতরেই আছে, আর সব গতি ও দাম অনুমিত।

ক্রমপরীক্ষার খাতায় একটি পূর্ণ numerical উত্তরের ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. দেওয়া তথ্য আর একক এক লাইনে লেখা
  2. ধরে নেওয়া শর্ত ঘোষণা করা
  3. সূত্র লেখা
  4. মান বসিয়ে ধাপে ধাপে হিসাব
  5. উল্টো হিসাব বা sanity check
  6. শেষ উত্তর, একক আর এক লাইনের অর্থ

(সহজ) একটি asset-এর মূল্য ৮০ লাখ টাকা, Exposure Factor ০.২৫, ARO ০.৪. ALE কত?

  • ২০ লাখ
  • ৮ লাখ
  • ৩২ লাখ
  • ৫০ লাখ

(মাঝারি) একটি control ALE ৬ লাখ থেকে ২ লাখে নামায়, খরচ বছরে ১.৬ লাখ। ROSI = (কমানো ঝুঁকি − খরচ) ÷ খরচ ধরে উত্তর কত?

  • ২৫০%
  • ৬০%
  • ২৪০%
  • ১৫০%

(মাঝারি) ৬৪ bit key, সেকেন্ডে 1011 চেষ্টা ধরে, বছর = ৩১,৫৫৭,৬০০ সেকেন্ড। পুরো key space পার হতে কত সময়?

  • প্রায় ৫.৮৫ বছর
  • প্রায় ২.৯২ বছর
  • প্রায় ৫৮৫ বছর
  • প্রায় ২ দিন

(কঠিন) ৯৬ bit random nonce, এক key-তে 109টি বার্তা। p ≈ n² ÷ 297 ধরে পুনরাবৃত্তির সম্ভাবনা প্রায় কত?

  • 1.16 × 10−10
  • ০.৩৯
  • 6.31 × 10−12
  • 1.26 × 10−11

(সহজ) RSA: p = 5, q = 11, e = 3. d কত?

  • ৭
  • ২৭
  • ১৩
  • ৩৭

(মাঝারি) একটি নকশায় AES-256, RSA-2048 আর SHA-256 (collision ১২৮ bit). NIST SP 800-57 অনুযায়ী RSA-2048 ≈ ১১২ bit ধরে পুরো ব্যবস্থার security level কত?

  • ১১২ bit
  • ১২৮ bit
  • ২৫৬ bit
  • ১৬৫ bit

(মাঝারি) নীতি: ৫ ব্যর্থতায় ৩০ মিনিট বন্ধ, হিসাব কখনো স্থায়ীভাবে বন্ধ হয় না। একটি হিসাবে দিনে সর্বোচ্চ কত অনুমান?

  • ৪৮০
  • ১২০
  • ৪৮
  • ২৪০

(কঠিন) ছয় অঙ্কের TOTP, window ±১. ১,০০০টি এলোমেলো অনুমানে অন্তত একবার সফল হওয়ার সম্ভাবনা প্রায় কত?

  • ০.১%
  • ৩%
  • ০.৩%
  • ০.০০৩%

(সহজ) ৬টি zone-এ, A থেকে B আর B থেকে A আলাদা ধরে, কতগুলো দিকের সিদ্ধান্ত নিতে হয়?

  • ১৫
  • ৩০
  • ৩৬
  • ১২

(মাঝারি) ১,০০,০০০টি ঘটনায় ১০০টি আসল। Recall ৯০%, FP rate ১%. Precision প্রায় কত?

  • ৮.৩%
  • ৯০%
  • ৯৯%
  • ১%

(মাঝারি) SYN backlog ২৫৬, জাল SYN সেকেন্ডে ১০০টি, timeout ৩ s. হার × timeout ≥ আকার হলে সারি ভরে। ফল কী?

  • ভরবে না, ২০০ < ২৫৬
  • ভরবে না, ২৫৬ ÷ ১০০ = ২.৫৬
  • ভরবে, কারণ জাল SYN থাকলেই সারি ভরে
  • ভরবে, ৩০০ ≥ ২৫৬

(কঠিন) CVSS v3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H. দেওয়া আছে Exploitability = 3.8870, ISS = 0.56, Impact = 6.42 × ISS. Base score কত?

  • ৭.৪
  • ৭.৪৮
  • ৭.৫
  • ৯.৮

(মাঝারি) ৪ TB ডেটা, আসল গতি ৫০০ Mbps. শুধু কপিতে কত ঘণ্টা (1 GB = 8,000 megabit)?

  • ২.২২ ঘণ্টা
  • ১৭.৭৮ ঘণ্টা
  • ১৪২ ঘণ্টা
  • ৮ ঘণ্টা

(মাঝারি) TP ৪০, FP ১০, FN ৪০. F1 কত?

  • ৮০%
  • ৫০%
  • ৬৫%
  • ৬১.৫%

(সহজ) ২০টি server, প্রতিটি দিনে ১০ লাখ event, গড়ে ৫০০ bytes. দৈনিক কত GB?

  • ১০ GB
  • ০.৫ GB
  • ১০০ GB
  • ৫০০ GB

(মাঝারি) detect সময় ১০, ২০, ৩০, ৪০, ৯০০ মিনিট। গড় আর median কত?

  • গড় ৩০, median ২০০
  • গড় ২৫, median ২৫
  • গড় ২০০, median ৩০
  • গড় ২০০, median ২০০

(মাঝারি) Count query, sensitivity ১, ε = ০.২. Laplace scale b আর ৯৫% সীমা (≈ ৩b) কত?

  • b = ০.২, সীমা ±০.৬
  • b = ৫, সীমা ±১৫
  • b = ১, সীমা ±৩
  • b = ১০, সীমা ±৩০

(সহজ) একটি টেবিলে quasi-identifier অনুযায়ী দলের আকার ৫, ৩ আর ৭. k কত, আর সর্বোচ্চ মিলের সম্ভাবনা কত?

  • k = ৭, ১৪%
  • k = ৫, ২০%
  • k = ১৫, ৭%
  • k = ৩, প্রায় ৩৩%

(সহজ) Phishing মহড়ায় ৫০০ জনের ৪০ জন link চাপলেন, আর ১২০ জন রিপোর্ট করলেন। Click rate আর report rate কত?

  • ৮% আর ২৪%
  • ৪% আর ১২%
  • ২৪% আর ৮%
  • ২৫% আর ৭৫%

শব্দকোষ

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

মনে রাখুন

  1. একক আগে: bit না byte, GB না MiB, প্রতি সেকেন্ড না প্রতি বছর। অর্ধেক ভুল এখানেই।
  2. সবচেয়ে দুর্বল আংটাই সীমা: RSA-2048, seed-এর entropy, firewall-এর pps, বা ধীরতম restore পথ।
  3. ছোট সম্ভাবনা বড় সংখ্যায় গুণ হয়: ১% FP rate, ০.০০০৩% TOTP, ৫% খারাপ বছর। Base আর n দেখুন।
  4. একটি সংখ্যা পুরো গল্প নয়: গড়ের পাশে median, precision-এর পাশে recall, CVSS-এর পাশে EPSS আর KEV.
  5. সংখ্যা অনুমান, সিদ্ধান্ত মানুষের: উৎস লিখুন, মেপে মেলান, আর শর্ত স্পষ্ট রাখুন।

পরের পর্বে: পর্ব ৭৭-এ পুরো কোর্সের MCQ প্রশ্নব্যাংক, মডিউল ধরে, প্রতিটি অপশনের ব্যাখ্যাসহ।

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

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