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

Authentication — পরিচয় যাচাইয়ের উপায় আর password নীতি

Authentication — Factors, Login Threats, Password Policy & Safe Recovery

Taught in Bangla, this lesson separates identification, authentication and authorization, explains factors versus signals, reviews the main login risks and their defences, modern NIST password policy, throttling and lockout with a hands-on login simulator, preventing account enumeration through safe error messages, secure password reset, service accounts and API keys, and spotting suspicious patterns in login logs.

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

  • Identification, authentication আর authorization আলাদা করা, আর factor ও সংকেতের পার্থক্য বোঝা
  • Login-এর চার প্রধান ঝুঁকি আর প্রতিটির রক্ষা, ধারণার স্তরে
  • NIST SP 800-63B-4-এর password নীতি, আর পুরোনো নিয়ম কেন উল্টো ফল দিয়েছিল
  • Throttling, lockout, account enumeration আর নিরাপদ error বার্তা নকশা করা
  • নিরাপদ password reset, আর service account ও API key সামলানো
  • Login log থেকে সন্দেহজনক ধরন চেনা

সীমারেখা: এই পর্ব রক্ষকের জন্য। সব সিমুলেটর ছোট কাল্পনিক ডেটায় ব্রাউজারের ভেতরেই চলে। অন্যের হিসাবে login চেষ্টা বা অন্যের সেবায় limit পরীক্ষা করা লিখিত অনুমতি ছাড়া অপরাধ হতে পারে। পর্ব ৬-এর নিয়ম এখানেও প্রযোজ্য।

১ · নাম বলা, প্রমাণ দেওয়া, অনুমতি পাওয়া

একটি অফিসের গেটের কথা ভাবুন। দারোয়ান জিজ্ঞেস করলেন, “কে আপনি?” আপনি বললেন, “আমি রহিমা, হিসাব বিভাগের।” এটি শুধু দাবি। তিনি তখন পরিচয়পত্র দেখলেন, ছবির সঙ্গে মুখ মেলালেন। এবার দাবিটি যাচাই হলো। এরপর রেজিস্টার খাতায় দেখা হলো, আপনি কি সার্ভার রুমে যেতে পারেন? না, শুধু তিন তলার অফিসে।

একটি গেটেই তিনটি আলাদা কাজ হলো। কম্পিউটারেও ঠিক তাই হয়, আর এই তিনটি গুলিয়ে ফেলাই বহু ভুল নকশার শুরু।

ধাপপ্রশ্নকম্পিউটারে উদাহরণভুল হলে
Identificationআপনি কে বলে দাবি করছেন?Username বা email লেখাগোপন নয়, শুধু দাবি
Authenticationদাবিটির প্রমাণ কী?Password, passkey, OTPঅন্য কেউ আপনার হিসাবে ঢোকেন
Authorizationএই পরিচয় দিয়ে কী করা যাবে?Role, permission, policyনিজের সীমার বাইরের ডেটা দেখা যায়

একটি login-এর তিনটি প্রশ্ন

Identification, authentication, authorization, then an audit record

Identification, authentication, authorization আর audit log Identification “আমি rahima” — শুধু দাবি Authentication প্রমাণ: password, passkey Session তৈরি পর্ব ১৭-এর বিষয় Authorization প্রতিটি অনুরোধে আলাদা যাচাই প্রতিটি ধাপের ঘটনা যায় audit log-এ
ছবি ১৫.১ — Authentication একবার হয়, authorization প্রতিটি অনুরোধে হয়। দুটি একই জিনিস নয়।
মূল ধারণা

Login সফল হওয়া মানে শুধু “এই ব্যক্তি সম্ভবত তিনিই, যাঁর দাবি করছেন।” এর মানে “তিনি সবকিছু করতে পারবেন” নয়। আবার Authentication নিশ্চয়তা নয়, একটি সম্ভাবনার মাপ। তাই গুরুত্বপূর্ণ কাজের আগে আবার যাচাই করা হয়। Authorization-এর পুরো আলোচনা পর্ব ৩-এর least privilege থেকে এগিয়ে পর্ব ১৯-এ আসবে।

২ · Factor: প্রমাণের তিন ধরন, আর কেন স্থান প্রমাণ নয়

প্রমাণ দেওয়ার উপায় অনেক, কিন্তু ধরন মূলত তিনটি। প্রতিটি ধরনকে বলে authentication factor. যে জিনিস দিয়ে প্রমাণ দেওয়া হয়, তাকে NIST বলে authenticator.

যা জানেন · something you know

Password, PIN. মোবাইল ব্যাংকিংয়ের PIN-এর মতো। সমস্যা হলো গোপন কথা কপি করা যায়, আর কপি হলে আপনি টেরও পান না।

ঝুঁকি: ফাঁস, অনুমান, phishing

যা আছে · something you have

ফোন, hardware key, ব্যাংকের লকারের চাবি। হারালে টের পাওয়া যায়, তবে কপি ঠেকানো নির্ভর করে জিনিসটির নকশার ওপর।

ঝুঁকি: হারানো, চুরি, SIM বদল

আপনি নিজে যা · something you are

আঙুলের ছাপ, মুখ। সুবিধাজনক, কিন্তু গোপন নয়, আর ফাঁস হলে বদলানো যায় না। মিল হয় আনুমানিক, হুবহু নয়।

ঝুঁকি: ভুল মিল, বদলানো অসম্ভব

MFA মানে এই তিন ভিন্ন ধরনের অন্তত দুটি। Password আর security question মিলিয়ে দুটি জিনিস হয়, কিন্তু দুটিই “যা জানেন”। তাই এটি MFA নয়। একটি phishing পাতায় দুটিই একসঙ্গে চলে যেতে পারে। NIST SP 800-63B-4 আঙুলের ছাপ বা মুখকে একা authenticator হিসেবে নেয় না। এটি একটি physical authenticator-এর সঙ্গে জোড়া অবস্থায় কাজে লাগে, যেমন ফোন আনলক করে তার ভেতরের key ব্যবহার।

স্থান আর আচরণ কেন সংকেত, factor নয়

কিছু পুরোনো বইয়ে “somewhere you are” বা “something you do”-কে চতুর্থ বা পঞ্চম factor বলা হয়। বিভিন্ন পাঠ্যে এই শ্রেণিবিভাগ আলাদা, তাই পরীক্ষায় প্রশ্নটি মন দিয়ে পড়বেন। তবে রক্ষকের দিক থেকে পার্থক্যটি জরুরি।

IP ঠিকানা, দেশ, device, টাইপ করার ধরন, login-এর সময়, এগুলো কোনো গোপন জিনিস প্রমাণ করে না। IP অন্যের সঙ্গে ভাগ হতে পারে, VPN-এ বদলে যেতে পারে। ঢাকার একজন ব্যবহারকারী ঈদের ছুটিতে সিলেট গেলে তাঁর “স্থান” বদলায়, পরিচয় নয়। তাই এগুলো সন্দেহ বাড়ায় বা কমায়, নিজে প্রমাণ দেয় না। এই ব্যবহারকে বলে risk-based authentication: সংকেত অস্বাভাবিক হলে বাড়তি প্রমাণ চাওয়া। NIST-ও এটিকে অতিরিক্ত কৌশল হিসেবে দেখায়, factor হিসেবে নয়।

পাড়ার দারোয়ান আপনাকে রোজ সকাল ৯টায় দেখেন। আজ রাত ৩টায় দেখে তিনি একটু সন্দেহ করলেন। এই সন্দেহ কাজের, তাই তিনি পরিচয়পত্র চাইলেন। কিন্তু “প্রতিদিন ৯টায় আসেন” বললেই কেউ রহিমা হয়ে যান না। সংকেত প্রমাণ চাইতে শেখায়, প্রমাণের জায়গা নেয় না।

AAL: কত নিশ্চয়তা চাই

সব সেবায় একই মাত্রার যাচাই দরকার নেই। NIST SP 800-63B-4 তিনটি Authentication Assurance Level ঠিক করেছে। এটি মার্কিন সরকারি সংস্থার জন্য লেখা, বাংলাদেশে আইনি বাধ্যবাধকতা নয়, তবে সারা বিশ্বে মাপকাঠি হিসেবে ব্যবহার হয়।

স্তরনিশ্চয়তামূল শর্তপুনরায় যাচাই
AAL1মৌলিকএকক factor চলে; phishing-প্রতিরোধ বাধ্য নয়সার্বিক ৩০ দিনের মধ্যে থাকা উচিত
AAL2উচ্চদুই factor; verifier-কে অন্তত একটি phishing-resistant বিকল্প দিতে হবেসার্বিক ২৪ ঘণ্টা, নিষ্ক্রিয় ১ ঘণ্টার মধ্যে থাকা উচিত
AAL3খুব উচ্চCryptographic authenticator, key বের করা যায় না, phishing-প্রতিরোধ বাধ্যসার্বিক ১২ ঘণ্টা বাধ্য; নিষ্ক্রিয় ১৫ মিনিট উচিত

বাস্তব অনুবাদ, যা আমাদের নিজের ব্যাখ্যা, NIST-এর নয়: একটি মতামত-লেখার সাইটে AAL1-এর কাছাকাছি চলতে পারে, টাকা বা গ্রাহকের ডেটায় AAL2 লক্ষ্য করুন, আর production-এর admin হিসাবে AAL3-এর ধারণা নিন। সিদ্ধান্ত নেবেন পর্ব ২-এর ঝুঁকির হিসাব থেকে, ফ্যাশন দেখে নয়। Admin হিসাবের বিশেষ নিয়ম আসবে পর্ব ২০-এ।

৩ · একটি login-এর ওপর কী কী বিপদ আসে

কাউকে হিসাবে ঢুকতে হলে তালা ভাঙার দরকার পড়ে না, চাবি পেলেই চলে। তাই অন্যের হিসাব দখল বা account takeover বেশির ভাগ সময় চাবি-কেন্দ্রিক। নিচের টেবিলে প্রতিটি ঝুঁকি ধারণার স্তরে দেওয়া হলো, সঙ্গে রক্ষার উপায়।

ঝুঁকিকেন কাজ করেরক্ষালক্ষণ
Credential stuffingমানুষ এক password বহু সেবায় রাখেন; অন্য সাইটের ফাঁস আপনার সাইটে কাজে লাগেফাঁস-তালিকার সঙ্গে মিলিয়ে দেখা, MFA, password manager, bot নিয়ন্ত্রণঅনেক হিসাবে এক ধাক্কায় অস্বাভাবিক সংখ্যক চেষ্টা
Password sprayingঅল্প কিছু সাধারণ password বহু হিসাবে একটু একটু করে; প্রতি হিসাবে চেষ্টা কম, তাই lock হয় নাBlocklist, MFA, পুরো সাইটের ব্যর্থতার হার দেখাঅনেক হিসাবে অল্প ব্যর্থতা, একই সময়ে
Phishingব্যবহারকারী নিজেই ভুয়া পাতায় password দেনPhishing-resistant login, password manager-এর domain মিল, পর্ব ৫৩-এর অভ্যাসনতুন device থেকে সফল login
অনুমানছোট, চেনা বা ব্যক্তিগত তথ্য-ভিত্তিক passwordদৈর্ঘ্য, blocklist, throttlingএকটি হিসাবে পরপর ব্যর্থতা

আরেকটি উৎসও মনে রাখুন: infostealer নামের malware ব্যবহারকারীর ব্রাউজার বা যন্ত্র থেকে login তথ্য চুরি করে। Mandiant ২০২৪ সালে একটি cloud data সেবার গ্রাহকদের হিসাব-দখল নিয়ে যে রিপোর্ট প্রকাশ করে, তাতে সেবাটির নিজের system ভাঙার প্রমাণ মেলেনি। বড় ক্ষতির ঘটনাগুলোতে তিনটি মিল ছিল: হিসাবে MFA ছিল না, চুরি হওয়া তথ্য বহু বছর পরও চালু ছিল, আর network সীমা ছিল না। সেখানে সবচেয়ে কাজের রক্ষা হতো খুব সাধারণ তিনটি নিয়ম।

এবার দেখুন একটি ভালো login-এর ভেতরে পরপর কী কী যাচাই হয়। “পরে” চাপুন, আর ডান পাশের মানগুলো খেয়াল করুন।

1receive request over TLS2check ip and account limits3load user, or a dummy record4verify slow hash in constant time5ask second factor if required6reset counter, new session7write login event
Server-এর হিসাব
user
ব্যর্থ
limit
hash
factor ২
  1. অনুরোধ এলো। Rahima নতুন ফোন থেকে login করছেন। Password TLS দিয়ে এনক্রিপ্ট হয়ে আসে। তাঁর হিসাবে আগে থেকে ২টি ব্যর্থ চেষ্টা আছে।
  2. Limit আগে। ধীর hash হিসাবের আগেই rate limit দেখা হয়। এতে server-এর CPU বাঁচে। এই IP আর হিসাব দুটিই সীমার মধ্যে।
  3. Record আনা। Rahima-র salt, cost আর hash এলো। হিসাব না থাকলেও একই পথে একটি dummy record নেওয়া হয়, ধাপ ৮-এ দেখবেন।
  4. Hash যাচাই। Password-টি পর্ব ১৩-এর ধীর hash দিয়ে হিসাব করে মেলানো হলো। মিলেছে।
  5. দ্বিতীয় factor. নতুন device, তাই বাড়তি প্রমাণ চাওয়া হলো। এই অংশের বিস্তারিত পর্ব ১৬-এ আসবে।
  6. Session. প্রমাণ সফল, তাই ব্যর্থতার গোনা ০ হলো, আর নতুন session তৈরি হলো। Session-এর নিয়ম পর্ব ১৭-এ।
  7. লেখা থাকল। কখন, কোন হিসাব, কোন IP, কী ফল, সব log-এ গেল। Password log-এ যায় না।
  8. হিসাব না থাকলে? এবার ghost নামে চেষ্টা। সেবায় এমন হিসাব নেই, তবু ধাপ ৩ আর ৪ একই পথে চলল। বার্তাও সেই একই, তাই বাইরে থেকে পার্থক্য বোঝা যায় না।

৪ · আধুনিক password নীতি: কম নিয়ম, বেশি সুরক্ষা

আপনি নিশ্চয়ই এই বার্তা দেখেছেন: “বড় হাতের অক্ষর, ছোট হাতের অক্ষর, অঙ্ক আর চিহ্ন থাকতে হবে, আর ৯০ দিন পরপর বদলাতে হবে।” এই নিয়মের নাম composition rule আর periodic rotation. শুনতে শক্ত, কিন্তু মানুষের আচরণের ফল উল্টো।

এই ধরনের নিয়ম ছড়িয়ে পড়ে ২০০৩ সালের NIST SP 800-63-এর পরিশিষ্ট থেকে, যার লেখক ছিলেন NIST-এর Bill Burr. ২০১৭ সালে Wall Street Journal-এর সাক্ষাৎকারে তিনি বলেন, “Much of what I did I now regret”. একই বছর NIST নতুন সংস্করণে দিক বদলায়। ২০২৫ সালের জুলাইয়ে প্রকাশিত SP 800-63B-4 সেই দিকটিকে আরও শক্ত করে।

কেন উল্টো ফল? কারণ মানুষ নিয়ম মেনে চলেন, লক্ষ্য মেনে নয়। “চার ধরনের চিহ্ন” বললে অনেকে Password1!-এর মতো চেনা ছাঁচ বেছে নেন: শুরুতে বড় হাতের অক্ষর, শেষে অঙ্ক আর একটি চিহ্ন। Weir ও সহকর্মীদের ২০১০ সালের গবেষণা দেখায়, এমন নিয়মের মাপা entropy বাস্তবের অনুমান-প্রতিরোধকে ঠিকভাবে বোঝায় না। আর “৯০ দিনে বদলান” বললে Dhaka2026-এর পরে আসে Dhaka2027. Zhang, Monrose আর Reiter (CCS ২০১০) ৭,৭০০-র বেশি হিসাবের তথ্যে দেখান, পুরোনো password জানা থাকলে offline হিসাবে গড়ে প্রায় ৪১ শতাংশ হিসাবে নতুন password অনুমান করা যায়।

নিচের টেবিলে NIST SP 800-63B-4, Sec. 3.1.1.2-এর মূল শর্তগুলো দেওয়া হলো। এগুলো ২০২৬ সালের অক্টোবরে মূল নথি থেকে মেলানো, তবু বাস্তবায়নের আগে আপনিও মূল পাতাটি পড়ে নেবেন। NIST-এর ভাষায় SHALL মানে বাধ্য, SHOULD মানে জোরালো সুপারিশ।

বিষয়শর্তকেন
ন্যূনতম দৈর্ঘ্যএকক factor হলে ১৫ অক্ষর (SHALL); শুধু MFA-র অংশ হলে ৮ অক্ষর (SHALL)দৈর্ঘ্যই বেশি অনিশ্চয়তা দেয়
সর্বোচ্চ দৈর্ঘ্যঅন্তত ৬৪ অক্ষর পর্যন্ত অনুমতি (SHOULD)লম্বা বাক্য আর password manager
Compositionচিহ্নের মিশ্রণ চাপানো যাবে না (SHALL NOT)মানুষ চেনা ছাঁচে যান
Blocklistনতুন password সাধারণ, প্রত্যাশিত বা ফাঁস হওয়া তালিকার সঙ্গে মেলাতে হবে (SHALL); কারণ জানাতে হবেচেনা password-ই সবার আগে আসে
সময় ধরে বদলনিয়মিত বদলাতে বাধ্য করা যাবে না (SHALL NOT); ফাঁসের প্রমাণ পেলে বদলাতে হবেছোট বদল অনুমেয় হয়
Manager আর pastePassword manager আর autofill চালু রাখতে হবে (SHALL); paste চালু রাখা উচিত (SHOULD)প্রতি সেবায় আলাদা লম্বা password সম্ভব হয়
Hint আর প্রশ্নLogin না করা ব্যক্তি দেখতে পান এমন hint রাখা যাবে না; password বাছার সময় security question চাওয়া যাবে না (SHALL NOT)আলাদা দুর্বল দরজা তৈরি হয়
পুরোটা যাচাইপুরো password যাচাই করতে হবে, কেটে ছোট করা যাবে না (SHALL)ছোট করলে দৈর্ঘ্যের লাভ হারায়
UnicodeUnicode গ্রহণ করা উচিত; প্রতি code point এক অক্ষর (SHALL)বাংলাসহ সব ভাষার password

Password manager-এর আরেকটি নিরাপত্তা-সুবিধা আছে। এটি সাধারণত আসল domain মিলিয়ে পূরণ করে, তাই ভুয়া পাতায় চুপ করে থাকে। কিছু সাইট “নিরাপত্তার জন্য” paste বন্ধ রাখে। ফল হয় উল্টো: ব্যবহারকারী manager ছেড়ে ছোট, মনে রাখার মতো password-এ ফেরেন। আর লম্বা password-এর bcrypt-সীমা নিয়ে পর্ব ১৩ দেখুন। Server-এ password কীভাবে রাখবেন, সেটিও ওই পর্বের বিষয়।

সংখ্যায় দেখুন: দৈর্ঘ্য বনাম মিশ্রণ

সূত্র একটিই। প্রতি অক্ষরে k রকম মান এলোমেলোভাবে বাছলে, L অক্ষরের entropy = L × log2k bit. এলোমেলো শব্দটি জরুরি। মানুষের বাছা password এই হিসাব থেকে অনেক দুর্বল।

ধরন (এলোমেলোভাবে বাছা)হিসাবEntropy
৮ অক্ষর, ৯৫ রকম চিহ্ন8 × log295 = 8 × 6.57≈ ৫২.৬ bit
১৫ অক্ষর, শুধু ছোট হাতের15 × log226 = 15 × 4.70≈ ৭০.৫ bit
৪টি শব্দ, ৭৭৭৬ শব্দের তালিকা4 × log27776 = 4 × 12.92≈ ৫১.৭ bit
৬টি শব্দ, ওই তালিকা6 × 12.92≈ ৭৭.৫ bit

দেখুন, ছোট হাতের ১৫ অক্ষর মিশ্র ৮ অক্ষরকে অনেক পেছনে ফেলে। নিচের সিমুলেটরে পুরোনো আর নতুন নিয়ম পাশাপাশি চলছে। এখানে পাসওয়ার্ডগুলো উদাহরণ মাত্র। পাতায় ছাপা কোনো password নিজে ব্যবহার করবেন না।

// Toy policy checker with a tiny blocklist. A real blocklist is far larger.
const BLOCK = ["password", "qwerty", "letmein", "admin", "welcome", "abcshop", "amarsonarbangla"];
const LEET = { "@": "a", "0": "o", "1": "l", "3": "e", "$": "s", "5": "s" };

function oldRule(pw) {                 // পুরোনো নিয়ম: ৮ অক্ষর, চার ধরনের চিহ্ন
  const kinds = [/[a-z]/, /[A-Z]/, /[0-9]/, /[^a-zA-Z0-9]/].filter(r => r.test(pw)).length;
  return pw.length >= 8 && kinds === 4 ? "PASS" : "FAIL";
}
function core(pw) {                    // ছোট হাতের অক্ষর, leet উল্টে, শেষের অঙ্ক-চিহ্ন বাদ
  const s = pw.toLowerCase().replace(/[^a-z0-9@$]+$/, "").replace(/[0-9]+$/, "");
  return [...s].map(c => LEET[c] || c).join("").replace(/[^a-z]/g, "");
}
function newRule(pw, minLen) {         // নতুন নিয়ম: দৈর্ঘ্য আর blocklist
  if ([...pw].length < minLen) return "REJECT short";
  if (new Set(pw).size < 5) return "REJECT repetitive";
  const c = core(pw);
  if (BLOCK.some(b => c.startsWith(b))) return "REJECT blocklist";
  return "ACCEPT";
}
const samples = ["Password1!", "P@ssw0rd2026!", "Abcshop@2026", "Summer#2026",
  "amar-sonar-bangla-1971", "aaaaaaaaaaaaaaaa", "nodi-ilish-brishti-cha",
  "kathal tin jutar golpo"];
console.log("sample".padEnd(26) + "old".padEnd(6) + "new, single-factor (15)");
for (const pw of samples) {
  console.log(pw.padEnd(26) + oldRule(pw).padEnd(6) + newRule(pw, 15));
}
console.log("with MFA, minimum 8:");
for (const pw of ["P@ssw0rd2026!", "Abcshop@2026", "Summer#2026"]) {
  console.log(pw.padEnd(26) + newRule(pw, 8));
}

প্রথম সারি দেখুন: Password1! PASS REJECT short. পুরোনো নিয়ম চেনা ছাঁচকে পাস দিচ্ছে, আর লম্বা nodi-ilish-brishti-cha FAIL ACCEPT ফেল করছে। পুরোনো নিয়মে দুর্বলটি বেশি নম্বর পেল। amar-sonar-bangla-1971 FAIL REJECT blocklist দেখায়, শুধু লম্বা হলেই হয় না, বহুল পরিচিত বাক্যও আটকাতে হয়। MFA অংশে P@ssw0rd2026! REJECT blocklist আর Abcshop@2026 REJECT blocklist: অক্ষর বদলানো আর সেবার নিজের নাম, দুটিই ধরা পড়ল। কিন্তু Summer#2026 ACCEPT লক্ষ করুন। এই ছোট তালিকায় “summer” নেই। আসল blocklist অনেক বড় হয়। এটিই সীমা: blocklist একটি তালিকা, বুদ্ধি নয়।

নিয়ম বদলানোর আগে একটি কথা। এখনও কিছু পুরোনো compliance নথি বা প্রতিষ্ঠানের নীতিতে সময় ধরে বদলের শর্ত থাকতে পারে। আপনার ক্ষেত্রে যে মান প্রযোজ্য, তার সর্বশেষ সংস্করণ দেখে নিন। আর একটি বিষয়: ব্যবহারকারীর সামনে blocklist-এর ফল জানাতে হবে, শুধু “দুর্বল” বললে তিনি কী করবেন বুঝবেন না। ফাঁস হওয়া তালিকা নিরাপদে মেলানোর উপায় k-anonymity, যা পর্ব ১৩-এ আছে।

৫ · Throttling আর lockout: গতি কমানো, মানুষ না আটকানো

Online অনুমান ঠেকানোর উপায় হলো চেষ্টার গতি কমানো। দুটি শব্দ আলাদা করুন। Login throttling মানে ব্যর্থতার পরে অপেক্ষা করানো। Account lockout মানে হিসাব নির্দিষ্ট সময় বা স্থায়ীভাবে বন্ধ করা।

NIST SP 800-63B-4, Sec. 3.2.2 বলে, একটি হিসাবে একটি authenticator-এ পরপর ব্যর্থতা ১০০-র বেশি হওয়া চলবে না। সেখানে authenticator নিষ্ক্রিয় করতে হয়। সংখ্যাটি অবাক লাগতে পারে। কিন্তু blocklist আর ১৫ অক্ষর থাকলে ১০০টি অনুমানে মেলার সম্ভাবনা খুব কম। ১০০ হলো ঊর্ধ্বসীমা, প্রতিষ্ঠান চাইলে কম রাখতে পারে। NIST ঐচ্ছিকভাবে bot-পরীক্ষা, ক্রমে বাড়তে থাকা অপেক্ষা (যেমন ৩০ সেকেন্ড থেকে এক ঘণ্টা) আর risk-based কৌশলের কথাও বলে, যাতে অন্য কেউ আসল মালিককে আটকে দিতে না পারেন।

ব্যাংকের লকার কক্ষে ভুল চাবি দিলে কর্মচারী সন্দেহ করেন, আস্তে কাজ করেন, পরিচয় আবার দেখেন। কিন্তু তিনবার ভুল হলেই পুরো লকার সিল করে দিলে যে কেউ এসে যে কারো লকার সিল করাতে পারতেন। আসল মালিক তখন নিজের জিনিস পান না। Lockout-এর ঠিক এই ঝুঁকিই আছে।

নিচের ডায়াগ্রামে একটি হিসাবের একটি সিদ্ধান্ত ধাপে ধাপে দেখুন। ধরে নেওয়া নীতি: ৩টি ব্যর্থতা বিনা অপেক্ষায়, তারপর ৩০ সেকেন্ড থেকে দ্বিগুণ হতে হতে সর্বোচ্চ ১ ঘণ্টা, আর ১০০-তে নিষ্ক্রিয়।

Rahima-র হিসাব (simulated clock)
সময়
পরপর ব্যর্থতা
অপেক্ষা
পরের চেষ্টা
দীর্ঘ হিসাবের মোট ব্যর্থতা
  1. প্রথম তিনটি ভুল। মানুষ টাইপে ভুল করেন, তাই ৩টি ব্যর্থতায় অপেক্ষা নেই। সকাল ১০:০০:০৫-এ গোনা ৩ হলো।
  2. চতুর্থ ভুল। ১০:০০:২০-তে গোনা ৪। এবার ৩০ সেকেন্ড অপেক্ষা, মানে পরের চেষ্টা ১০:০০:৫০-এর আগে নয়।
  3. অপেক্ষার মধ্যে চেষ্টা। ১০:০০:৩৫-এ আরেকটি অনুরোধ, তখনও ১৫ সেকেন্ড বাকি। Hash হিসাবই হলো না, তাই গোনা বাড়ল না, আর server-এর CPU-ও বাঁচল।
  4. পঞ্চম ভুল। ১০:০০:৫৫-তে গোনা ৫, অপেক্ষা দ্বিগুণ হয়ে ৬০ সেকেন্ড। পরের চেষ্টা ১০:০১:৫৫-এ।
  5. বিকল্প ক: কড়া lockout. ৫ ব্যর্থতায় ৩০ মিনিট বন্ধ করলে অনুমান থামে। কিন্তু আসল Rahima-ও ১০:৩০:৫৫ পর্যন্ত বাইরে। অন্য কেউ ৫টি ভুল দিলেই তাঁকে আটকে রাখতে পারেন।
  6. বিকল্প খ: ক্রমবর্ধমান অপেক্ষা। ১০:০২:১০-এ Rahima সঠিক password দিলেন, অপেক্ষা তখন শেষ, তাই ঢুকলেন, পরপর গোনা ০ হলো। সতর্কতা: সফল login পরপর গোনা মুছে দেয়, তাই দীর্ঘ সময়ের মোট ব্যর্থতা আলাদা করে রাখা হয়। এখানে সেটি ৫-ই রইল।
  7. ধৈর্যশীল চেষ্টা? ধরুন Rahima আর login করলেনই না। ৩০ সেকেন্ড থেকে দ্বিগুণ হতে হতে ১ ঘণ্টায় আটকালে ১০০তম ব্যর্থতা পর্যন্ত মোট অপেক্ষা ৩,২৪,২১০ সেকেন্ড, প্রায় ৩.৮ দিন। তারপর authenticator বন্ধ, আর recovery ছাড়া ফেরা যায় না। ১০০টি অনুমান পেতেই এত সময়, আর password ফাঁস-তালিকার বাইরে হলে তা প্রায় মূল্যহীন।

হিসাবে দেখুন: lockout কতটা ঠেকায়, কতটা ক্ষতি করে

ঠেকানো: ধরুন ৫ ব্যর্থতায় ১৫ মিনিট বন্ধ। ঘণ্টায় ৪ বার, দিনে ৯৬ বার। প্রতিবার ৫টি চেষ্টা মানে দিনে ৪৮০, বছরে ৪৮০ × ৩৬৫ = ১,৭৫,২০০টি অনুমান। অর্থাৎ শুধু সময়ের lockout অনুমান থামায় না, ধীর করে। তাই NIST-এর মতো মোট সংখ্যার ঊর্ধ্বসীমা দরকার।

ক্ষতি: ১০,০০০ হিসাবের সেবায় প্রতি হিসাবে ৫টি ভুল চেষ্টা মানে ৫০,০০০ অনুরোধ। ৯০০ সেকেন্ডে ছড়ালে সেকেন্ডে প্রায় ৫৫.৬টি অনুরোধেই সবাই বাইরে থাকতে পারেন। এটিও একধরনের denial of service. কাস্টমার সাপোর্টের ফোন বাজতে শুরু করবে, আর সেই চাপে ভুল সিদ্ধান্তের ঝুঁকিও বাড়ে।

Per-account, per-IP আর ধীরে-ছড়ানো ধরন

এবার সিমুলেটর। একটি কাল্পনিক login-প্রবাহে ৩০০টি ব্যর্থ চেষ্টা আছে, সবই নকল। আমরা শুধু গুনছি, চারটি নীতির অধীনে কতগুলো চেষ্টা password যাচাই পর্যন্ত পৌঁছায়। Limit ধরে নেওয়া: একটি হিসাবে ১৫ মিনিটে ৫, একটি IP-তে ২০. শেষের কলাম পুরো সাইটের ১৫ মিনিটের সর্বোচ্চ ব্যর্থতা।

// Toy login simulator: in-memory events, simulated clock, no network.
const WIN = 900;                              // 15 min, in simulated seconds
const LIMIT = { account: 5, ip: 20 };         // assumed policy
function run(events, useAccount, useIp) {     // returns attempts that reach the check
  const hist = {}, until = {};
  let checked = 0;
  for (const e of events) {
    const keys = [];
    if (useAccount) keys.push(["account", e.user]);
    if (useIp) keys.push(["ip", e.ip]);
    if (keys.some(([kind, id]) => (until[kind + id] || 0) > e.t)) continue;
    checked++;
    for (const [kind, id] of keys) {
      const k = kind + id;
      hist[k] = (hist[k] || []).filter(t => e.t - t < WIN).concat(e.t);
      if (hist[k].length >= LIMIT[kind]) until[k] = e.t + WIN;
    }
  }
  return checked;
}
const make = (gap, ip, user) => Array.from({ length: 300 },
  (_, i) => ({ t: i * gap, ip: ip(i), user: user(i) }));
const oneIp = () => "203.0.113.5", manyIp = i => "198.51.100." + (i % 250 + 1);
const oneUser = () => "rahima", manyUser = i => "user" + i;
const patterns = { "A one ip, one account  ": make(2, oneIp, oneUser),
  "B one ip, many accounts": make(5, oneIp, manyUser),
  "C many ip, one account ": make(20, manyIp, oneUser),
  "D many ip, many, slow  ": make(20, manyIp, manyUser) };
console.log("pattern                  none acct   ip both sitePeak15m");
for (const [name, ev] of Object.entries(patterns)) {
  const peak = Math.max(...ev.map(a => ev.filter(b => b.t >= a.t && b.t < a.t + WIN).length));
  const cols = [[0, 0], [1, 0], [0, 1], [1, 1]].map(([a, b]) => String(run(ev, a, b)).padStart(4));
  console.log(name, cols.join(" "), String(peak).padStart(6), peak > 30 ? "ALERT" : "");
}

সারিগুলো পড়ুন। A one ip, one account 300 5 20 5 300 ALERT: দুই limit-ই ভালো কাজ করে, per-account ৩০০ থেকে ৫-এ নামায়। B one ip, many accounts 300 300 40 40 180 ALERT: per-account একদম অন্ধ, per-IP থামায়। C many ip, one account 300 35 300 35 45 ALERT: এবার per-IP অন্ধ, per-account থামায়। আর শেষটি: D many ip, many, slow 300 300 300 300 45 ALERT. দুই limit মিলিয়েও কিছুই আটকায় না, কারণ কোনো একক হিসাব বা IP সীমায় পৌঁছায় না। ধরা পড়ে শুধু পুরো সাইটের সংকেতে, ১৫ মিনিটে ৪৫টি ব্যর্থতা, ধরে নেওয়া সীমা ৩০-এর ওপরে। এই সিমুলেটর রক্ষকের তুলনা: limit যা দেখে না, তার জন্য blocklist, MFA আর পুরো সাইটের detection দরকার।

২০২৪ সালের জানুয়ারিতে Microsoft জানায়, একটি পুরোনো test হিসাবে password spraying করে ঢোকা হয়েছিল, যাতে MFA ছিল না। তাদের প্রকাশিত বিবরণে চেষ্টা ছিল খুব অল্প, যাতে সহজে ধরা না পড়ে। শিক্ষাটি রক্ষকের জন্য: test আর পুরোনো হিসাবকেও একই নিয়মে আনুন, কারণ limit একা সব ধরে না।

Per-IP limit-এ সতর্ক থাকুন। বাংলাদেশে অনেক মোবাইল ব্যবহারকারী operator-এর একটি ভাগ করা ঠিকানা (CGNAT) দিয়ে বের হন, আর অফিস বা বিশ্ববিদ্যালয়েও একই অবস্থা হতে পারে। একটি IP-তে কড়া limit দিলে হাজারো নির্দোষ মানুষ আটকে যেতে পারেন। তাই per-IP limit তুলনামূলক উদার রাখা, আর আলাদা করে অ্যাকাউন্ট-ভিত্তিক গোনা জরুরি। Rate limit-এর algorithm দেখতে Rate limiting পড়ুন।

৬ · Account enumeration: বার্তা যেন গোপন কথা না বলে

“এই email-এ কোনো হিসাব নেই” বার্তাটি ব্যবহারকারীর কাজে লাগে। কিন্তু সেটি বাইরের মানুষকেও জানিয়ে দেয়, কোন ঠিকানা আপনার সেবায় আছে, কোনটি নেই। একে বলে account enumeration. হিসাবের অস্তিত্ব নিজেই তথ্য। ধরুন একটি রোগের সহায়তা সেবা বা ঋণের অ্যাপ। সেখানে হিসাব আছে জানা গেলেও ব্যক্তিগত ক্ষতি হতে পারে। আর phishing-ও তখন নিশানা পায়।

কোথায়অনিরাপদনিরাপদ
Login“Username পাওয়া যায়নি” / “Password ভুল”“Username বা password সঠিক নয়”
Reset“এই email নিবন্ধিত নয়”“ঠিকানাটি থাকলে একটি link পাঠানো হবে”
নিবন্ধন“এই email আগেই আছে”“নিশ্চিত করতে আপনার email দেখুন”, আর মালিককে আলাদা জানানো
HTTPআলাদা status codeএকই code, একই রকম body
সময়হিসাব না থাকলে hash ছাড়াই দ্রুত উত্তরDummy hash, বা পেছনে কাজ করে একই সময়ে উত্তর

শেষ সারিটিই সবচেয়ে সূক্ষ্ম। Argon2id-এর মতো ধীর hash ব্যবহার করলে হিসাব থাকা আর না থাকার উত্তরে স্পষ্ট সময়ের ফারাক হয়। পর্ব ১৩-এর ধীর hash যে সুরক্ষা দেয়, সেটিই এখানে তথ্য ফাঁস করতে পারে, যদি হিসাব না থাকলে তা বাদ দেওয়া হয়। নকশাটি নিচে উদাহরণ হিসেবে দেখুন। এটি pseudocode, চালানোর জন্য নয়।

# অনিরাপদ ধরন: দুই পথ, দুই বার্তা, দুই রকম সময়
user = find_user(email)
if user is None:
    return error("no such user")          # দ্রুত, আর পরিচয় ফাঁস করে
if not verify_hash(password, user.hash):
    return error("wrong password")

# নিরাপদ ধরন: এক পথ, এক বার্তা, প্রায় এক সময়
user = find_user(email)
stored = user.hash if user else DUMMY_HASH     # একই cost-এ আগে বানানো
ok = verify_hash(password, stored)
if user is None or not ok:
    return error("username or password incorrect")

একটি সৎ সীমা মনে রাখুন। অনেক ভোক্তা-সেবায় নিবন্ধনের সময় পুরো গোপনীয়তা কঠিন, আর username যদি প্রকাশ্য নাম হয়, লুকানোর কিছু নেই। তাই প্রশ্নটি হলো ক্ষতি কতটা। স্বাস্থ্য, আর্থিক বা সংবেদনশীল সেবায় অনেক কড়া হোন। সামাজিক সেবায় যেখানে প্রোফাইল প্রকাশ্য, সেখানে login আর reset-এ একই বার্তাই যথেষ্ট হতে পারে।

৭ · Password reset: পেছনের দরজা, সবচেয়ে দুর্বল দরজা

সামনের দরজায় ভালো তালা লাগানো হলো। কিন্তু পেছনের একটি দরজা বলছে, “চাবি হারিয়েছেন? নাম বলুন, খুলে দিচ্ছি।” তাহলে সামনের তালার দাম কতটুকু? একটি হিসাবের নিরাপত্তা সবচেয়ে দুর্বল প্রবেশপথের সমান। পর্ব ৪-এর attack surface-এর কথা মনে করুন।

একটি হিসাবের কয়টি দরজা

Every path that grants access must be as strong as the front door

একটি হিসাবে ঢোকার চারটি পথ rahima-র হিসাব ডেটা আর টাকা Login পাতা limit, MFA Password reset token, মেয়াদ, নোটিশ সাপোর্ট ডেস্ক লিখিত যাচাই প্রক্রিয়া API key scope, মেয়াদ, মালিক
ছবি ১৫.২ — লাল ঘরের দরজাগুলোই প্রায়ই সবচেয়ে কম পাহারায় থাকে।

NIST SP 800-63B-4-এর Sec. 4.2 account recovery-কে আলাদা গুরুত্ব দেয়। Email, SMS বা ডাকে পাঠানো code-কে সেখানে recovery code বলা হয়। পাঠানো code-এ অন্তত ৬টি দশমিক অঙ্ক, আর আগে থেকে সংরক্ষণ করা code-এ অন্তত ৬৪ bit এলোমেলো মান চায়। মেয়াদ SMS-এ ১০ মিনিট, email-এ ২৪ ঘণ্টা পর্যন্ত। প্রতিটি recovery-তে ব্যবহারকারীকে জানাতে হয়। OWASP-এর Forgot Password Cheat Sheet যোগ করে: একই বার্তা, একই সময়, কড়া random, সীমিত আয়ু, একবার ব্যবহার, আর reset-এর পরে স্বয়ংক্রিয় login নয়।

নিচের ডায়াগ্রামে একটি নিরাপদ reset দেখুন। এখানে আসল token-এর বদলে example-token দেখানো হচ্ছে, আর পাশের hash তার আসল SHA-256 শুরুর অংশ।

1same reply for every address2token = secure_random(32 bytes)3store sha256(token), expiry4send link to registered email5check hash, expiry, unused6screen new password7mark token used, end sessions8notify owner, write log
reset_tokens টেবিল
hash
মেয়াদ
used
session
  1. অনুরোধ। ১৪:০০-এ কেউ rahima@example.com লিখলেন। ঠিকানা থাকুক বা না থাকুক, উত্তর একই। ওই ঠিকানায় একই সঙ্গে অনুরোধের সংখ্যাও সীমিত, যাতে কেউ inbox ভরে দিতে না পারেন।
  2. Token তৈরি। CSPRNG থেকে ৩২ byte. টেবিলে যায় তার hash 4d1566a1…, আর মেয়াদ ১৪:৩০। Database ফাঁস হলেও আসল token পাওয়া যাবে না।
  3. Link পাঠানো। Link শুধু নিবন্ধিত ঠিকানায় যায়। Link-এর domain আসে কনফিগারেশন থেকে, request-এর Host header থেকে নয়।
  4. Link খোলা। ১৪:০৫-এ খোলা হলো। Server token-এর hash মেলায়, মেয়াদ আর ব্যবহার দেখে। পাতায় Referrer-Policy: no-referrer, যাতে token অন্য সাইটে না যায়।
  5. নতুন password যাচাই। Password1! চলল না, ১৫ অক্ষরের কম আর blocklist-এও ধরা পড়ে। Token এখনও used হয়নি, তাই আবার চেষ্টা করা যায়।
  6. সফল বদল। লম্বা নতুন password গৃহীত। Token এখন used, আর চলবে না। স্বয়ংক্রিয় login নেই, ব্যবহারকারী স্বাভাবিকভাবে ঢুকবেন।
  7. অন্য session বন্ধ। Rahima-র ২টি চলমান session শেষ করা হলো। হিসাব দখল হয়ে থাকলে অন্য ব্যক্তি এখানেই বের হন। এই বিকল্প ব্যবহারকারীকেও দেখানো যায়।
  8. মালিককে জানানো। Email-এ জানানো হলো password বদল হয়েছে, password ছাড়াই। আপনি না করে থাকলে কী করবেন, সেই পথও থাকে। ঘটনাটি log-এ গেল।

একই নকশা এবার আসল কোডে। প্রথম লাইনগুলোতে একটি reset token-এর অনিরাপদ ধরন আছে: email আর সময় থেকে বানানো, তাই অনুমেয়। পরের অংশে নিরাপদ ধরন। সবই একটি কাল্পনিক in-memory টেবিলে।

import hashlib, hmac, secrets

def unsafe_token(email, clock):      # অনিরাপদ নকশা, শুধু তুলনার জন্য
    return hashlib.md5(f"{email}{clock}".encode()).hexdigest()

same = unsafe_token("a@example.com", 1000) == unsafe_token("a@example.com", 1000)
print("unsafe: same input gives same token:", same)

TTL = 1800                           # ৩০ মিনিট, simulated seconds
DB = {}                              # toy in-memory table
def fp(token):
    return hashlib.sha256(token.encode()).hexdigest()
def issue(user, now):                # নতুন token পুরোনোটিকে বাতিল করে
    token = secrets.token_urlsafe(32)        # 32 byte = 256 bit
    DB[user] = {"hash": fp(token), "expires": now + TTL, "used": False}
    return token
def redeem(user, token, now):
    row = DB.get(user)
    ok = row is not None and hmac.compare_digest(row["hash"], fp(token))
    if not ok or row["used"] or now > row["expires"]:
        return "rejected"            # কারণ ভেতরের log-এ, বাইরে একই বার্তা
    row["used"] = True
    return "ok"

t1 = issue("rahima", 0)
print("safe: token length:", len(t1), "| plain token in table:", t1 in str(DB))
print("wrong token, t=60      :", redeem("rahima", "example-token", 60))
print("right token, t=120     :", redeem("rahima", t1, 120))
print("same token again, t=130:", redeem("rahima", t1, 130))
t2 = issue("rahima", 5000)
print("late token, t=6801     :", redeem("rahima", t2, 6801))
t3, t4 = issue("rahima", 7000), issue("rahima", 7010)
print("older of two, t=7020   :", redeem("rahima", t3, 7020))
print("newest of two, t=7030  :", redeem("rahima", t4, 7030))

unsafe: same input gives same token: True: এমন token গোপন নয়, হিসাব করা যায়। নিরাপদ অংশে safe: token length: 43 | plain token in table: False, টেবিলে শুধু hash. তারপর wrong token, t=60 : rejected, right token, t=120 : ok, same token again, t=130: rejected (একবার ব্যবহার), late token, t=6801 : rejected (মেয়াদ ৬৮০০-তে শেষ), older of two, t=7020 : rejected আর newest of two, t=7030 : ok. একটি প্রশ্ন আসতে পারে: পর্ব ১৩ তো দ্রুত hash নিষেধ করেছিল, এখানে SHA-256 কেন? কারণ token ২৫৬ bit-এর এলোমেলো মান, অনুমান করে মেলানো অবাস্তব। ধীর hash দরকার হয় কম entropy-র মানুষের password-এর জন্য।

ছোট code-এর হিসাব: ৬ অঙ্কের code-এ ১০৬ সম্ভাব্য মান। ৫টি চেষ্টায় সীমা রাখলে একটি code-এ মেলার সম্ভাবনা ৫ ÷ ১০৬ = ০.০০০৫%. কিন্তু ১০ লাখ হিসাবে একই চেষ্টা ছড়ালে গড়ে ৫টি হিসাবে মিলতে পারে। তাই ছোট code-এ হিসাব-প্রতি নয়, পুরো সেবার limit-ও জরুরি। লম্বা link-token-এ এই ভয় নেই।

Security question: একটি বাতিল ধারণা

“আপনার মায়ের বিয়ের আগের নাম কী?” “প্রথম স্কুলের নাম?” এই উত্তরগুলো অনেকের ক্ষেত্রেই আত্মীয়, ফেসবুক বা সরকারি নথি থেকে জানা যায়। আর বদলানো যায় না। Google-এর গবেষকদের ২০১৫ সালের গবেষণা (Secrets, Lies, and Account Recovery, WWW ২০১৫) জানায়, security question ব্যবহারকারীর বাছা password-এর চেয়েও দুর্বল, আর একটি বড় অংশ নিজের উত্তর মনে রাখতে পারেননি। নতুন NIST নীতিতে password বাছার সময় এমন প্রশ্ন চাওয়া যাবে না। OWASP-ও একে একমাত্র reset পদ্ধতি হিসেবে ব্যবহার করতে নিষেধ করে।

SMS OTP: ভালো, তবে সীমাসহ

পর্ব ১৬-এর আগে একটি সরাসরি কথা বলে রাখি। SMS-এ পাঠানো OTP মোবাইল ব্যাংকিংসহ অনেক জায়গায় পরিচিত, আর শুধু password-এর চেয়ে অনেক ভালো। কিন্তু এর সীমা আছে। SP 800-63B-4 টেলিফোন নেটওয়ার্কে out-of-band code পাঠানোকে “restricted” বলে: ব্যবহার করা যায়, তবে অন্য authenticator বিকল্পও দিতে হবে। ঝুঁকি মূলত তিনটি: operator-কে ধোঁকা দিয়ে নম্বর সরিয়ে নেওয়া (SIM swap), ফোনে থাকা ক্ষতিকর app, আর ফোনে প্রতারণা করে code জেনে নেওয়া। শেষটির উত্তর এক লাইনে: কোনো কর্মী, ব্যাংক বা অফিস কখনো আপনার OTP চাইবে না। আর SMS code ভুয়া পাতায় টাইপ করলে phishing থেকে রক্ষা দেয় না। এ নিয়ে পরের পর্বে বিস্তারে দেখব।

৮ · মানুষ নয় এমন পরিচয়, আর login log

Service account আর API key

সব login মানুষের নয়। রাত ২টার backup job, payment সেবার সঙ্গে সংযোগ, CI pipeline, এরাও পরিচয় ব্যবহার করে। এগুলোকে বলে non-human identity. এর দুই প্রধান রূপ service account আর API key. বড় প্রতিষ্ঠানে এদের সংখ্যা মানুষের চেয়ে অনেক বেশি হতে পারে, কিন্তু মালিক প্রায়ই অস্পষ্ট।

সমস্যা হলো, মানুষের নিয়ম এখানে হুবহু চলে না। Script-এর ফোনে OTP যায় না। Password সাধারণত কোডে বা config-এ বসে যায়, আর কেউ বদলায় না কারণ “কিছু ভেঙে যাবে”। মানুষ চাকরি ছাড়ে, হিসাব থেকে যায়।

নিয়মযা করবেনকেন
স্বল্পায়ু আগেসম্ভব হলে workload identity, স্থায়ী key নয়চুরি হওয়া key অল্পক্ষণেই মূল্যহীন
দৈর্ঘ্যCSPRNG থেকে অন্তত ২৫৬ bitমানুষের মনে রাখার দরকার নেই
সংরক্ষণServer-এ শুধু hash; মালিকের দিকে vault-এ, কোডে নয়ফাঁসের সম্ভাব্য ক্ষতি কম
সীমাএকটি কাজের জন্য একটি key, ন্যূনতম scope, IP বা network সীমাBlast radius ছোট থাকে
মালিকপ্রতিটি key-এর দলগত মালিক, তৈরির তারিখ, মেয়াদপুরোনো key খুঁজে বন্ধ করা যায়
Interactive login নয়Service account দিয়ে মানুষ login করবেন নাLog-এ অস্বাভাবিকতা স্পষ্ট হয়

Key rotation নীতি ও secret store দেখতে Secrets ও KMS, আর cloud-এর পরিচয়ের যাচাই দেখতে IAM policy evaluation পড়ুন। Machine-to-machine token পর্ব ১৮-এ, আর vault পর্ব ২০-এ আসবে।

Login log আর alert: কী দেখবেন

রক্ষা ব্যর্থ হতে পারে, তাই দেখার ব্যবস্থা লাগে। প্রতিটি login ঘটনার audit log-এ থাকবে: সময়, হিসাব, উৎস IP, device-এর মোটা বিবরণ, ফল, কারণ, আর কোন factor ব্যবহৃত হলো। থাকবে না: password, OTP, token বা সম্পূর্ণ reset link. OWASP ব্যর্থ login আর lockout নজরে রাখতে বলে।

ধরনকী বোঝায়সম্ভাব্য false positive
একটি উৎস থেকে বহু হিসাবে ব্যর্থতাSpraying বা stuffing-এর সংকেতঅফিসের ভাগ করা IP
পুরো সাইটের ব্যর্থতার হার হঠাৎ বেশিছড়ানো ধরনApp update-এ login ভাঙা
বহু ব্যর্থতার পরে সফলসম্ভাব্য দখলটাইপে ভুল করা মালিক
সফল login-এর পরপরই password, email বা MFA বদলদখল পাকা করার চেষ্টাআসল মালিকের reset
দুই দূরের স্থান থেকে অল্প সময়ে login (impossible travel)চুরি হওয়া তথ্যVPN, cloud প্রক্সি
Service account-এর interactive loginচুরি হওয়া keyভুল ব্যবহার, তবু দেখতে হবে

নিচের Bash ব্লকে একটি নকল log আপনার চোখের সামনে তৈরি হচ্ছে, IP-গুলো নথিপত্রের জন্য সংরক্ষিত ঠিকানা। এই ধরনের প্রশ্ন আপনি নিজের system-এর log-এ করতে পারেন।

cat > auth.log <<'EOF'
02:00:04 login_failed tania 198.51.100.7
02:00:31 login_failed rafiq 198.51.100.7
02:01:02 login_failed sumi 198.51.100.7
02:01:40 login_failed nabil 198.51.100.7
02:02:15 login_failed rahima 198.51.100.7
02:02:49 login_success rahima 198.51.100.7
02:03:20 password_changed rahima 198.51.100.7
09:10:11 login_failed karim 203.0.113.20
09:10:30 login_success karim 203.0.113.20
09:45:02 login_success tania 203.0.113.44
EOF

echo "== distinct accounts failed per ip =="
awk '$2=="login_failed" {print $4, $3}' auth.log | sort -u |
  awk '{n[$1]++} END {for (ip in n) print n[ip], ip}' | sort -rn

echo "== success from an ip that failed on 3+ accounts =="
awk '$2=="login_failed" {k=$4 " " $3; if (!(k in seen)) {seen[k]=1; n[$4]++}}
     $2=="login_success" && n[$4]>=3 {print $1, $3, $4, "REVIEW"}' auth.log

echo "== sensitive change right after that login =="
awk '$2=="login_success" {who[$3 " " $4]=1}
     $2=="password_changed" && (($3 " " $4) in who) {print $1, $3, $4}' auth.log

প্রথম অংশ: 5 198.51.100.7 আর 1 203.0.113.20. একটি IP পাঁচটি আলাদা হিসাবে ব্যর্থ, এটিই spraying-এর সংকেত। দ্বিতীয় অংশ: 02:02:49 rahima 198.51.100.7 REVIEW, ওই IP থেকেই সফল login. তৃতীয় অংশ: 02:03:20 rahima 198.51.100.7, ঢোকার পরেই password বদল। তিনটি সংকেত একসঙ্গে হলে তদন্ত শুরু করা উচিত। Karim-এর একটি টাইপের ভুল আর পরের সফল login এখানে alert তোলে না। Log রাখা, সময়সীমা ও সুরক্ষার পুরো আলোচনা পর্ব ৫৫ · নিরাপত্তার log-এ, আর Sigma ধরনের নিয়ম পর্ব ৫৬-এ আসবে। Cloud-এ log জমা করার নকশা দেখুন Centralized logging-এ।

আরও গভীরে: Bonneau, Herley, van Oorschot আর Stajano-র ২০১২ সালের The Quest to Replace Passwords (IEEE S&P) বহু বিকল্পকে ব্যবহারযোগ্যতা, প্রয়োগযোগ্যতা আর নিরাপত্তার মাপকাঠিতে তুলনা করে দেখায়, কোনো একটি বিকল্প সব দিকে জেতে না। NIST SP 800-63B-4-এর রেট-লিমিট নিয়ম পরপর ব্যর্থতার ওপর, তাই বাস্তব নকশায় দীর্ঘ সময়ের মোট গোনাও রাখা যুক্তিযুক্ত। আর বিস্তারে দেখতে Sec. 3.1.1.2, 3.2.2 আর 4.2 মূল নথি থেকে পড়ুন।

পরীক্ষা ও ইন্টারভিউতে: এই ধরনের প্রশ্ন আসতে পারে।

  • Authentication আর authorization-এর পার্থক্য? প্রথমটি পরিচয়ের প্রমাণ, দ্বিতীয়টি অনুমতি। প্রথমটি ছাড়া দ্বিতীয়টি অর্থহীন।
  • Password আর PIN মিলিয়ে কি MFA? না, দুটিই “যা জানেন”।
  • NIST কেন ৯০ দিনের বদল বাদ দিল? ছোট, অনুমেয় বদল আসে। ফাঁসের প্রমাণ পেলে বদলানোই যথেষ্ট।
  • Credential stuffing আর password spraying-এর পার্থক্য? প্রথমটি ফাঁস হওয়া জোড়া ব্যবহার করে, দ্বিতীয়টি অল্প সাধারণ password বহু হিসাবে চেষ্টা করে।
  • Reset token-এ SHA-256 চলে, password-এ কেন নয়? Token এলোমেলো ও লম্বা, password মানুষের বাছা।

৯ · AI-এর যুগে login কোড আর নীতি

Login আর reset কোড AI খুব দ্রুত লিখে দেয়, আর দেখতে পরিপাটি হয়। কিন্তু এই পথের ভুল সাধারণ bug-এর মতো নয়। এটি সরাসরি হিসাব-দখলের রাস্তা। আর AI প্রায়ই পুরোনো ইন্টারনেটের অভ্যাস নকল করে।

AI-এর ভুলকেন বিপজ্জনককীভাবে যাচাই করবেন
৯০ দিনের বদল আর চিহ্নের মিশ্রণ সুপারিশপুরোনো নীতিNIST-এর মূল Sec. 3.1.1.2 পড়া
Reset token-এ Math.random(), MD5 বা সময়অনুমেয়CSPRNG আছে কি না দেখা
“User not found” আলাদা বার্তাEnumerationদুই পথের বার্তা ও সময় মেলানো
ডিবাগে request body log-এ পাঠানোPassword log-এ যায়Diff পড়া, log নমুনা দেখা
কোডে API key বসানোRepository-তে গোপন তথ্যSecret scan, env বা vault
Error সারাতে verify=False বা TLS check বন্ধপরিচয় যাচাই বন্ধ হয়ে যায়Certificate সমস্যা ঠিক করা
বানানো section নম্বর বা CVEভুল সূত্রে সিদ্ধান্তমূল নথি খুলে মেলানো

AI-কে কোড লিখতে না বলে পর্যালোচক হিসেবে ব্যবহার করুন। আসল password, token বা ব্যবহারকারীর তথ্য prompt-এ পেস্ট করবেন না। Secret থাকলে আগে সরিয়ে ফেলুন।

তুমি একজন defensive application security reviewer. নিচে আমার নিজের সেবার login আর password reset কোড দিচ্ছি (secret সরানো হয়েছে)। শুধু প্রতিরক্ষার দিক থেকে পর্যালোচনা করো। [এখানে কোড] যাচাই করো: ১. Login আর reset-এ বার্তা, status code আর সময়ে account enumeration আছে কি না। ২. Reset token কি CSPRNG থেকে, hash করে রাখা, একবার ব্যবহারযোগ্য আর মেয়াদসহ? ৩. Limit ধীর hash-এর আগে বসেছে কি না, আর per-account গোনা আছে কি না। ৪. Password, token বা OTP log-এ যাচ্ছে কি না। ৫. নীতি কি NIST SP 800-63B-4-এর সঙ্গে মেলে? প্রতিটি দাবির পাশে section নম্বর দাও, নিশ্চিত না হলে "নিশ্চিত নই" লেখো। প্রতিটি সমস্যার ঝুঁকি, ঠিক করার ছোট diff আর পরীক্ষার উপায় দাও। কোনো আক্রমণের ধাপ লিখবে না।

AI-এর পরামর্শ হাতে পেলে — যাচাইয়ের চেকলিস্ট

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

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

প্র ০১যে নিয়ম ২০ বছর “নিরাপত্তার সেরা অভ্যাস” ছিল, সেটি কীভাবে ভুল প্রমাণিত হলো? এখান থেকে নীতি লেখার কী শিক্ষা?

২০০৩ সালের NIST-এর পরিশিষ্টে যে নিয়মগুলো ছিল, সেগুলো তখনকার সীমিত জ্ঞান থেকে এসেছিল। ফাঁস হওয়া বিশাল password-তালিকা তখন গবেষকদের হাতে ছিল না। Bill Burr পরে ২০১৭ সালের সাক্ষাৎকারে দুঃখ প্রকাশ করেন। মনে রাখবেন, তিনি তখনকার সেরা অনুমানটিই করেছিলেন। ভুলটি ব্যক্তির নয়, প্রমাণ ছাড়া অনুমানকে স্থায়ী নিয়ম বানানোর।

ফাঁস হওয়া তালিকা বিশ্লেষণ করে গবেষকেরা বাস্তব দেখতে পান। Weir ও সহকর্মীরা (CCS ২০১০) ৩ কোটিরও বেশি password নিয়ে দেখান, সরল entropy-র সূত্র আসল অনুমান-প্রতিরোধ মাপতে পারে না। Zhang, Monrose আর Reiter (CCS ২০১০) একটি বিশ্ববিদ্যালয়ের হিসাব নিয়ে পরীক্ষা করে সময় ধরে বদলের উপকার নিয়েই প্রশ্ন তোলেন। আর Carnegie Mellon-এর দলের ২০১১ সালের গবেষণা (Of Passwords and People) composition নীতি নিয়ে কিছু প্রচলিত বিশ্বাসকে ভুল পায়।

তিনটি কারণে নিয়মটি টিকে ছিল। এটি মাপা সহজ, নিরীক্ষক টিক দিতে পারেন। এটি দেখায় “আমরা কিছু করছি”। আর এর খরচ পড়ে ব্যবহারকারীর ওপর, নিয়ম-লেখকের ওপর নয়। নিরাপত্তার ভাষায় এটি পর্ব ৩-এর psychological acceptability-র লঙ্ঘন: মানুষ যা সহজে মানতে পারেন না, তিনি তার ফাঁক খুঁজবেন, লিখে রাখবেন, বা একই password সবখানে রাখবেন।

নতুন নীতি আলাদা, কারণ এটি লক্ষ্য থেকে ভাবে। লক্ষ্য হলো অনুমান কঠিন করা। Blocklist সরাসরি চেনা password বন্ধ করে। দৈর্ঘ্য স্বাভাবিক উপায়ে অনিশ্চয়তা বাড়ায়। আর ফাঁসের প্রমাণ পেলে তবেই বদল করা হয়, যখন বদলের সত্যিকারের কারণ আছে।

মূল উপলব্ধি: নিরাপত্তা-নিয়ম আসলে একটি অনুমান, যা মাপা দরকার। মানুষের আচরণ বাদ দিয়ে লেখা নিয়ম কাগজে শক্ত, বাস্তবে দুর্বল। তাই আজকের NIST-ও একদিন বদলাবে, আর বদলানোই উচিত।

প্র ০২“৩ বার ভুল দিলেই হিসাব বন্ধ” — খুব নিরাপদ শোনায়। তবু এটি ভালো নকশা নয় কেন?

প্রথম সমস্যা, এটি নিয়ন্ত্রণ অন্যের হাতে তুলে দেয়। হিসাব বন্ধ করতে শুধু username লাগে, আর username গোপন নয়। ফলে কেউ চাইলে আপনার গ্রাহকদের, এমনকি CEO বা সাপোর্ট টিমের হিসাব পরপর আটকে দিতে পারেন। পর্ব ২-এর CIA triad-এ আপনি confidentiality বাঁচাতে গিয়ে availability হারালেন। আমাদের হিসাবে ১০,০০০ হিসাবের সেবা সেকেন্ডে প্রায় ৫৫.৬টি অনুরোধেই পুরো সময় আটকে রাখা যায়।

দ্বিতীয় সমস্যা, এটি আসল বিপদে কাজ করে না। Password spraying প্রতি হিসাবে এত কম চেষ্টা করে যে সীমায় পৌঁছায় না। Credential stuffing অনেক সময় প্রথম চেষ্টাতেই মেলে, কারণ password ফাঁস হওয়া সঠিক password. ২০২৪ সালের Microsoft-এর প্রকাশিত ঘটনায় চেষ্টার পরিমাণ খুব কম ছিল। তাই lockout থাকলেও মূল ফাঁকটি ছিল একটি পুরোনো হিসাবে MFA না থাকা।

তৃতীয় সমস্যা, মানুষের স্বাভাবিক ভুল। ফোনে আগের password সংরক্ষিত থাকলে পুরোনো password নিজে থেকেই বারবার যেতে পারে। তিন ভুলেই বন্ধ হলে সাপোর্টে ফোন বাড়ে। আর সাপোর্টের চাপ সামলাতে কর্মীরা দ্রুত খুলে দিতে শুরু করেন, যা নিজেই এক দুর্বল দরজা।

তাহলে কী করবেন? ধাপে ধাপে অপেক্ষা, দীর্ঘ সময়ের মোট সীমা, NIST-এর ১০০-র ঊর্ধ্বসীমা, পরিচিত device-এর জন্য আলাদা বিবেচনা, মালিকের জন্য নিরাপদ reset, আর পুরো সাইটের ব্যর্থতার হার নজরে রাখা। সবার ওপরে blocklist আর MFA, যাতে অনুমান সফল হলেও ফল কম হয়।

মূল উপলব্ধি: প্রতিটি নিরাপত্তা-নিয়ন্ত্রণ নিজেও একটি নতুন আচরণ, যা অন্য কেউ ব্যবহার করতে পারেন। নকশা করার সময় জিজ্ঞেস করুন: এই নিয়মটি কেউ আমার ব্যবহারকারীর বিরুদ্ধে ব্যবহার করতে পারবেন কি?

প্র ০৩একটি email inbox কেন আপনার সব হিসাবের “মাস্টার চাবি”? Recovery নকশায় এর প্রভাব কী?

প্রায় সব সেবার password reset শেষে একটি email-এ পৌঁছায়। তাই কেউ আপনার email দখল করলে সামনের সব দরজা খুলে যায়: ব্যাংকের বার্তা, ফেসবুক, অফিসের সেবা। এখানে সেবাগুলোর নিজের password ভালো হলেও লাভ হয় না, কারণ নির্ভরতা একটি জায়গায় জমা। এটিই পর্ব ৪-এর attack surface-এর শিকল। সিস্টেমের নিরাপত্তা তার সবচেয়ে দুর্বল recovery পথের সমান।

সেবা নকশার দিক থেকে কয়েকটি সিদ্ধান্ত আসে। NIST SP 800-63B-4 ঝুঁকি অনুযায়ী recovery-কে কঠিন করে: AAL2-র হিসাবে দুটি আলাদা পথে পাওয়া recovery code, বা একটি code আর একটি একক-factor authenticator চায়। অর্থাৎ শুধু একটি email link যথেষ্ট নয়। সেবাগুলো recovery code আগেই দিতে পারে, যাতে ফোন হারালেও ফেরা যায়। মনে রাখবেন, reset-ও login-এর মতোই limit আর log-এর অধীনে থাকবে।

সাপোর্ট ডেস্কও এই শিকলের অংশ। কেউ ফোন করে কাঁদো কাঁদো গলায় বললেন, “আমার ফোন চুরি হয়েছে, হিসাব খুলে দিন।” কর্মী মানুষ, দয়া করতে চান। প্রকাশিত অনেক ঘটনায় সাপোর্ট প্রক্রিয়া দুর্বল জায়গা হয়েছে। তাই লিখিত যাচাই প্রক্রিয়া, দ্বিতীয় ব্যক্তির অনুমোদন, আর মালিককে সব সক্রিয় পথে জানানো দরকার। Social engineering পর্ব ৫২-এ আসবে।

ব্যক্তি ব্যবহারকারীর জন্য পরামর্শ সহজ: email হিসাবে সবচেয়ে শক্ত সুরক্ষা দিন, recovery ফোন ও ঠিকানা হালনাগাদ রাখুন, recovery code অফলাইনে রাখুন।

মূল উপলব্ধি: নিরাপত্তা একটি চিত্র, একটি বিন্দু নয়। একটি হিসাব রক্ষা করা মানে তার সবগুলো ফেরার পথ এঁকে দেখা, আর সবচেয়ে দুর্বলটিকে আগে শক্ত করা।

প্র ০৪SMS OTP-কে NIST কেন “restricted” বলে, তবু সেটি বাদ না দিয়ে কেন রাখা হয়? ভালো সিদ্ধান্তটি কীভাবে নেবেন?

ইতিহাসটি শিক্ষণীয়। ২০১৬ সালে SP 800-63B-র খসড়ায় SMS-কে “deprecated” বলা হয়েছিল, মানে ভবিষ্যতে বাতিলের পথে। এতে বড় বিতর্ক হয়, কারণ তখন বহু সেবার একমাত্র দ্বিতীয় factor ছিল SMS. ২০১৭ সালের চূড়ান্ত সংস্করণে শব্দটি নরম হয়ে “restricted” হয়। ২০২৫ সালের SP 800-63B-4-ও একই শ্রেণিতে রাখে, আর বলে অন্য authenticator বিকল্প সবার জন্য থাকতে হবে, SIM বদলের মতো ঝুঁকির সংকেত বিবেচনা করা উচিত।

দুর্বলতা কোথায়? SMS-এর নিরাপত্তা আপনার হাতে নেই, টেলিফোন নেটওয়ার্ক আর operator-এর প্রক্রিয়ার হাতে। কেউ operator-কে ধোঁকা দিয়ে নম্বর সরিয়ে নিলে code তাঁর কাছে যায়, যে ধরনের ঘটনা NIST-এর নিজের ঝুঁকি-টেবিলেও আছে। ফোনে ক্ষতিকর app থাকলেও পড়া যায়। আর OTP-টি ভুয়া পাতায় টাইপ হলে সেটিও ব্যবহারযোগ্য, কারণ code জানে না কোন সাইটে লেখা হচ্ছে। Passkey-এর সঙ্গে আসল পার্থক্য এটিই, যা পর্ব ১৬-এ দেখবেন।

তবু কেন রাখা? কারণ নিরাপত্তা সবসময় ঝুঁকির তুলনা। Password একা হলে credential stuffing আর spraying সরাসরি সফল হয়। SMS থাকলে সেগুলো অনেকটা আটকায়, কারণ চুরি হওয়া password-ই যথেষ্ট থাকে না। বিপুল সংখ্যক মানুষের কাছে সাধারণ ফোন আছে, smartphone বা hardware key নেই। Bonneau ও সহকর্মীদের ২০১৫ সালের গবেষণায় SMS reset code-এর সাফল্যের হার ৮০ শতাংশের বেশি ছিল, যা security question-এর চেয়ে ভালো।

ভালো সিদ্ধান্তের কাঠামো: ঝুঁকি কম হলে SMS রাখুন, ঝুঁকি বেশি হলে phishing-প্রতিরোধী বিকল্প দিন, admin হিসাবে SMS নয়। Enrollment-এর সময় বুঝিয়ে দিন, আর ব্যবহারকারীকে ওপরের ধাপে উঠতে উৎসাহ দিন।

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

প্র ০৫মানুষের জন্য এত নিয়ম, অথচ service account আর পুরোনো key প্রায়ই নিয়মের বাইরে থাকে। কেন, আর সমাধান কী?

মানুষের হিসাবের একটি স্বাভাবিক জীবনচক্র আছে: চাকরিতে যোগদান, চাকরি ছাড়া, HR-এর নথি। মানুষ নিজেই জানান, “আমি ঢুকতে পারছি না।” Key বা service account-এর এমন কোনো সংকেত নেই। একজন developer এক শুক্রবার রাতে তৈরি করলেন, কাজ চলল, তিনি অন্য দলে গেলেন। কেউ জানেন না key-টি কী করে, তাই কেউ বন্ধ করার সাহস পান না। সময়ের সঙ্গে তার অনুমতি শুধু বাড়ে, কমে না।

দুটি প্রকাশিত ঘটনা এই সমস্যা দেখায়। ২০২৪ সালে Mandiant যে cloud data সেবার গ্রাহকদের ঘটনা বর্ণনা করে, সেখানে বহু ক্ষেত্রে চুরি হওয়া login তথ্য কয়েক বছর পরও চালু ছিল, রিপোর্ট অনুযায়ী কিছু তথ্যের উৎস ২০২০ সালের। তার মানে কেউ বদলাননি। একই বছর Microsoft-এর প্রকাশিত ঘটনায় একটি পুরোনো test হিসাব আর একটি পুরোনো OAuth app বড় ক্ষতির পথে ছিল। দুটিতেই “পুরোনো, ভুলে যাওয়া, MFA ছাড়া পরিচয়” মূল বিষয়।

সমাধানের প্রথম ধাপ তালিকা। আপনি যা জানেন না, তা রক্ষা করতে পারবেন না। প্রতিটি পরিচয়ের মালিক দল, উদ্দেশ্য, শেষ ব্যবহারের তারিখ আর মেয়াদ থাকা চাই। দ্বিতীয় ধাপ, স্থায়ী key-এর বদলে স্বল্পায়ু token বা workload identity, যাতে চুরি হওয়া তথ্যের আয়ু অল্প হয়। তৃতীয় ধাপ, অনেকদিন অব্যবহৃত পরিচয় নিষ্ক্রিয় করে দেখা, মুছে ফেলার আগে। চতুর্থ ধাপ, প্রতিটি key-এর স্বাভাবিক আচরণ মাপা: কোন IP, কোন সময়, কোন API. বাইরে গেলে alert.

আরেকটি বিষয়: test পরিবেশ। “এটি তো শুধু test” বলে MFA বাদ দেওয়া হয়। কিন্তু test হিসাবের সঙ্গে আসল সেবার সংযোগ থাকলে সেটিই পথ।

মূল উপলব্ধি: পরিচয় মানেই মানুষ নয়। পরিচয়ের তালিকা, মালিকানা আর মেয়াদ না থাকলে আপনার সবচেয়ে শক্তিশালী হিসাবগুলোই হতে পারে সবচেয়ে কম নজরে থাকা।

অনুশীলন

হিসাব, পূর্বাভাস, নকশা-সমালোচনা আর একটি ছোট log কাজ। আগে নিজে করুন, তারপর উত্তর মেলান।

  1. হিসাব: একটি কাল্পনিক অনলাইন বাজারে ২০,০০০ হিসাব। নীতি: ৫ ব্যর্থতায় ১৫ মিনিট বন্ধ। (ক) পুরো সেবা আটকে রাখতে প্রতি ১৫ মিনিটে কতটি অনুরোধ, আর সেকেন্ডে কত? (খ) একটি হিসাবে বছরে সর্বোচ্চ কতটি অনুমান সম্ভব? (গ) ধরে নিন ০.৩% ব্যবহারকারী একই সাধারণ password রাখেন। প্রতি হিসাবে একটি চেষ্টায় গড়ে কয়টি হিসাব মিলবে? (ঘ) ১৫ অক্ষরের এলোমেলো ছোট হাতের password-এর entropy কত?

    (ক) ২০,০০০ × ৫ = ১,০০,০০০ অনুরোধ, ১,০০,০০০ ÷ ৯০০ ≈ সেকেন্ডে ১১১.১টি। (খ) ঘণ্টায় ৪ × ৫ = ২০, দিনে ৪৮০, বছরে ১,৭৫,২০০। (গ) ২০,০০০ × ০.০০৩ = ৬০টি হিসাব। Lockout এখানে কিছুই ধরে না, কারণ প্রতি হিসাবে চেষ্টা মাত্র ১টি। সমাধান blocklist আর MFA. (ঘ) 15 × log226 ≈ ৭০.৫ bit.

  2. ফল অনুমান করুন: নীতি: ১০ মিনিটে ৩ ব্যর্থতায় ১০ মিনিট বন্ধ, সফল login-এ গোনা ০. Rahima-র হিসাবে এই ঘটনাগুলো ঘটল: ১০:০০ ভুল, ১০:০২ ভুল, ১০:০৪ ভুল, ১০:০৫ সঠিক, ১০:১৫ সঠিক, ১০:১৬ ভুল। প্রতিটির ফল আর শেষে গোনা কত?

    ১০:০০ ব্যর্থ, গোনা ১। ১০:০২ ব্যর্থ, গোনা ২। ১০:০৪ ব্যর্থ, গোনা ৩, তাই ১০:১৪ পর্যন্ত বন্ধ। ১০:০৫ সঠিক হলেও যাচাই হয় না, “পরে চেষ্টা করুন”, গোনা ৩ থাকে। ১০:১৫ বন্ধ শেষ, সঠিক, সফল, গোনা ০। ১০:১৬ ব্যর্থ, গোনা ১। শেষ অবস্থা: সক্রিয়, গোনা ১। ১০:০৫-এর ঘটনাটিই lockout-এর দাম: আসল মালিক সঠিক password দিয়েও বাইরে থাকলেন।

  3. নকশার সমালোচনা: একটি কাল্পনিক অফিস-পোর্টালের reset নকশা: “ব্যবহারকারী email দেন। নেই হলে ‘email পাওয়া যায়নি’ দেখায়। থাকলে ৬ অঙ্কের code পাঠায়, যা ২৪ ঘণ্টা চলে, চেষ্টার সীমা নেই। Code টেবিলে খোলা থাকে। Security question ঠিক হলে code ছাড়াই reset হয়। Reset-এর পরে সরাসরি login.” কমপক্ষে ৫টি সমস্যা ও সমাধান লিখুন।
    • “Email পাওয়া যায়নি”: enumeration. একই বার্তা দিন।
    • চেষ্টার সীমা নেই: ১০৬ মানের code সহজে অনুমান করা যায়। হিসাব-প্রতি ও সাইট-স্তরের limit দিন।
    • ২৪ ঘণ্টা ছোট code-এর জন্য বেশি: সময় কমান, বা লম্বা link-token ব্যবহার করুন।
    • Code খোলা অবস্থায়: database ফাঁসে সব চালু reset ফাঁস। Hash করে রাখুন।
    • Security question: দুর্বল বিকল্প পথ, পুরো নকশাকে ছোট করে। বাদ দিন।
    • সরাসরি login: reset-এর পরে স্বাভাবিক login করান, পুরোনো session বন্ধ করুন, মালিককে জানান।
  4. Log কাজ: ওপরের login_review.sh ব্লকে একটি awk লাইন যোগ করুন, যা প্রতিটি হিসাবের ব্যর্থতার সংখ্যা গুনবে, তারপর বেশি থেকে কমে সাজাবে। আউটপুট কী হবে? কেন এই প্রশ্নটি এই log-এ spraying ধরতে পারবে না?
    awk '$2=="login_failed" {n[$3]++} END {for (u in n) print n[u], u}' auth.log | sort -rn

    এই log-এ ৬টি হিসাবের প্রতিটিতে ১টি করে ব্যর্থতা, তাই সব সারি 1 <name> (sort-এর ফলে ক্রম নামের উল্টো দিকে)। প্রতি হিসাবে চোখে পড়ার মতো কিছু নেই। Spraying ধরতে হলে হিসাব ধরে নয়, উৎস ধরে গুনতে হয়, যা ব্লকের প্রথম অংশ করেছে। নিজের system-এর log-এই এমন পরীক্ষা করবেন।

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

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

ক্রমনিরাপদ password reset-এর ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. অনুরোধে সব ঠিকানার জন্য একই উত্তর দেওয়া
  2. CSPRNG থেকে token বানিয়ে তার hash আর মেয়াদ রাখা
  3. নিবন্ধিত ঠিকানায় link পাঠানো
  4. Token-এর hash, মেয়াদ আর অব্যবহৃত অবস্থা যাচাই করা
  5. নতুন password যাচাই করে token বাতিল করা
  6. পুরোনো session বন্ধ করে মালিককে জানানো

একটি সেবা password আর পরে আরেকটি গোপন PIN চায়। এটি কি multi-factor authentication?

  • হ্যাঁ, কারণ দুটি গোপন জিনিস লাগছে
  • না, কারণ দুটিই একই ধরনের factor
  • না, কারণ PIN-এ শুধু সংখ্যা থাকে
  • হ্যাঁ, যদি PIN ফোনে টাইপ করা হয়

NIST SP 800-63B-4 অনুযায়ী, MFA ছাড়া একক factor হিসেবে ব্যবহৃত password-এর জন্য কোন নীতিটি সঠিক?

  • ৮ অক্ষর, চার ধরনের চিহ্ন, ৯০ দিনে বদল
  • ১২ অক্ষর, বছরে একবার বদল
  • ন্যূনতম ১৫ অক্ষর, blocklist যাচাই, composition চাপানো নয়
  • ন্যূনতম ৮ অক্ষর, paste বন্ধ, hint বাধ্যতামূলক

৩০০ আলাদা IP থেকে ৩০০ আলাদা হিসাবে ধীরে একটি করে ব্যর্থ login এলো। প্রতি হিসাবে limit ৫, প্রতি IP-তে limit ২০। কোন ব্যবস্থায় এই ধরন সবচেয়ে ভালো ধরা পড়বে?

  • প্রতি হিসাবের limit ৫ থেকে ৩ করা
  • প্রতি IP-র limit ২০ থেকে ১০ করা
  • Password hash-এর cost বাড়ানো
  • পুরো সাইটের ব্যর্থতার হার নজরে রেখে alert তোলা

Argon2id ব্যবহারকারী login পথে হিসাব না থাকলে hash না করে সঙ্গে সঙ্গে “incorrect” উত্তর আসে, আর হিসাব থাকলে উত্তর দেরিতে আসে। ঝুঁকি কী?

  • সময় দেখে হিসাবের অস্তিত্ব বোঝা যায় (account enumeration)
  • Password সময় দেখেই পড়া যায়
  • Salt ফাঁস হয়ে যায়
  • TLS session key দুর্বল হয়

Password reset token সম্পর্কে কোনটি সবচেয়ে ভালো নকশা?

  • email আর সময়ের MD5, খোলা অবস্থায় টেবিলে
  • CSPRNG থেকে ৩২ byte, টেবিলে hash, ছোট মেয়াদ, একবার ব্যবহার
  • Random token, ৩০ দিনের মেয়াদ, বারবার ব্যবহার
  • Token ছাড়া security question-এর উত্তরে reset

IP ঠিকানা, device আর টাইপ করার ধরন ব্যবহার করে login-এ বাড়তি যাচাই চাওয়া হলে সেগুলোকে কী বলা সঠিক?

  • চতুর্থ ও পঞ্চম authentication factor, যা একাই login দিতে পারে
  • Authorization-এর নিয়ম
  • ঝুঁকির সংকেত, যা বাড়তি প্রমাণ চাওয়া ঠিক করে
  • Encryption key-এর অংশ

শব্দকোষ

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

মনে রাখুন

  1. Identification দাবি, authentication প্রমাণ, authorization অনুমতি। Factor তিন ধরনের, আর স্থান ও আচরণ শুধু সংকেত।
  2. Password নীতি: দৈর্ঘ্য, blocklist, password manager. চিহ্নের বাধ্যতামূলক মিশ্রণ আর সময় ধরে বদল নয়।
  3. Lockout অনুমান ধীর করে, কিন্তু অন্যকে আটকে রাখার পথও খোলে। ধীরে-ছড়ানো ধরন ধরতে পুরো সাইটের দিকে তাকান।
  4. Reset নিরাপদ করুন: একই বার্তা, CSPRNG token, hash, মেয়াদ, একবার ব্যবহার, নোটিশ। Security question বাদ দিন।
  5. Non-human পরিচয়ের মালিক, scope, মেয়াদ রাখুন, আর login log থেকে ধরন খুঁজুন।

পরের পর্বে: আজ দেখলেন password-এর সীমা আর SMS-এর সীমা। পরের পর্বে দেখব MFA আর passkey কীভাবে ভুয়া পাতায় চাবি দেওয়াকেই অসম্ভব করে তোলে।

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

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