এই পর্বে যা শিখবেন
- Saltzer ও Schroeder-এর আটটি নীতি আর দুটি বাড়তি নোট, প্রতিটি বাস্তব উদাহরণসহ
- Default deny কেন ভুলকেও নিরাপদ দিকে ঠেলে দেয়
- স্তরের ঝুঁকি হিসাব করা, আর correlated failure কোথায় সেই হিসাব ভেঙে দেয়
- Fail secure, fail safe আর fail open-এর মধ্যে পরিস্থিতি বুঝে বেছে নেওয়া
- Separation of duties, zero trust মনোভাব আর usability-কে নকশায় আনা
- AI-এর দেওয়া পরামর্শ এই নীতিগুলো দিয়ে যাচাই করা
১ · Tool বদলায়, নীতি বদলায় না
একটি কাল্পনিক অনলাইন বাজারের কথা ভাবুন। প্রতিষ্ঠানটি দামি firewall কিনেছে, antivirus বসিয়েছে, password-এ বড় হাতের অক্ষর বাধ্যতামূলক করেছে। তবু একদিন দেখা গেল, পুরো গ্রাহক তালিকা বাইরে চলে গেছে। তদন্তে যা বের হলো, তাতে কোনো জটিল কৌশল নেই। এক support কর্মীর account-এ পুরো database দেখার অনুমতি ছিল, যদিও তাঁর কাজে লাগত মাত্র কয়েকটি অর্ডার। সেই account-এর password চুরি হলো, আর কেউ টেরই পেল না।
সমস্যাটি tool-এর অভাব নয়। সমস্যা হলো নীতির অভাব। প্রতিটি tool-এর পেছনে একটি প্রশ্ন থাকে: কাকে কতটুকু দেওয়া হবে, একটি বাধা ভাঙলে পরেরটি কী, আর কিছু নষ্ট হলে সিস্টেম কোন দিকে যাবে? এই প্রশ্নগুলোর উত্তর যে চিন্তার কাঠামো থেকে আসে, সেটিই নিরাপত্তার মূলনীতি।
বাড়ির নিরাপত্তা ভাবুন। তালা, গ্রিল, দারোয়ান, CCTV হলো tool. কিন্তু “অতিথিকে শুধু বসার ঘর পর্যন্ত আনা”, “আলমারির চাবি সবার হাতে না দেওয়া”, “একটি তালা ভাঙলেও পরের বাধা থাকা”, এগুলো হলো নীতি। Tool দশ বছরে পুরোনো হয়। নীতি পুরোনো হয় না।
১৯৭০-এর দশকে অনেকে একই কম্পিউটার ভাগ করে ব্যবহার করতেন, আর তাঁদের ডেটা একে অপরের থেকে রক্ষা করা ছিল বড় প্রশ্ন। MIT-র Jerome Saltzer আর Michael Schroeder Multics সিস্টেমের অভিজ্ঞতা থেকে লিখলেন “The Protection of Information in Computer Systems”, যা Proceedings of the IEEE-তে ১৯৭৫ সালের সেপ্টেম্বরে ছাপা হয়। এর আগের একটি রূপ ১৯৭৩ সালের সম্মেলনে উপস্থাপিত হয়েছিল। নিরাপত্তার বেশিরভাগ আধুনিক নকশা-তালিকা এখনো এই লেখাকেই শিকড় হিসেবে দেখায়।
পর্ব ০২-এ কথা হয়েছে কী রক্ষা করতে হবে: confidentiality, integrity, availability. এই পর্বের প্রশ্ন হলো, সেটি কীভাবে নকশা করতে হবে। নিয়ন্ত্রণ বাছাইয়ের আগে এই নীতিগুলো মাথায় থাকলে অনেক দামি ভুল শুরুতেই আটকে যায়।
২ · আটটি নকশা-নীতি আর দুটি বাড়তি নোট
নিচের সারণিতে আটটি নীতি আছে, মূল লেখার ক্রমে। মুখস্থের চেয়ে প্রতিটির পেছনের যুক্তিটি ধরা বেশি জরুরি। শেষ কলামে দেখুন, একই নীতি আজ কোন রূপে কাজ করছে।
| নীতি | সহজ কথায় | দৈনন্দিন ছবি | আজকের রূপ |
|---|---|---|---|
| Economy of mechanism | নকশা যতটা সম্ভব ছোট ও সরল রাখা, কারণ সরল জিনিসই পুরোটা যাচাই করা যায় | একটি শক্ত তালা, বিশটি জটিল ফন্দি নয় | ছোট kernel অংশ, কম configuration, কম feature |
| Fail-safe defaults | অনুমতির ভিত্তি হবে “দেওয়া হয়েছে কি না”, “নিষেধ আছে কি না” নয় | নাম তালিকায় থাকলে তবেই অনুষ্ঠানে ঢোকা | Default deny firewall, cloud IAM |
| Complete mediation | প্রতিটি বস্তুতে প্রতিটি প্রবেশ যাচাই করা, একবার পাস পেলেই চিরকাল নয় | প্রতিবার গেটে পরিচয়পত্র দেখা | প্রতিটি API অনুরোধে অনুমতি যাচাই, ছোট মেয়াদের token |
| Open design | নিরাপত্তা নকশার গোপনীয়তায় নয়, key বা password-এ নির্ভর করবে | তালার নকশা সবাই জানে, চাবি জানে না | প্রকাশিত AES, খোলা TLS standard |
| Separation of privilege | এক চাবির বদলে দুই শর্ত পূরণ হলে তবেই কাজ হওয়া | ব্যাংকের লকার: আপনার চাবি আর ব্যাংকের চাবি | MFA, দুজনের অনুমোদন |
| Least privilege | প্রতিটি মানুষ ও প্রোগ্রাম কাজের জন্য ন্যূনতম অনুমতি নিয়ে চলবে | রাঁধুনির হাতে রান্নাঘরের চাবি, সিন্দুকের নয় | Role, ছোট scope, just-in-time access |
| Least common mechanism | সবার ব্যবহৃত অভিন্ন যন্ত্র কমানো, কারণ সেটি ফাঁসের পথও, একক ব্যর্থতার জায়গাও | একই পানির ট্যাংকে সমস্যা হলে পুরো ভবন আক্রান্ত | Process isolation, tenant আলাদা রাখা |
| Psychological acceptability | মানুষের জন্য সহজ, যাতে সে নিজে থেকেই ঠিক কাজটি করে | তালা এত ঝামেলার যে দরজা খোলাই থাকে | Passkey, স্পষ্ট সতর্কবার্তা |
লেখকেরা (সংক্ষেপে S&S) নিজেই বলেছিলেন, এগুলো অলঙ্ঘনীয় আইন নয়; এগুলো সবচেয়ে ভালো কাজ করে সতর্কবার্তা হিসেবে। কোনো নীতি ভাঙলে সেটি একটি লাল পতাকা: হয়তো যুক্তিসঙ্গত কারণ আছে, তবে ভালো করে যাচাই করতে হবে। নীতিগুলো কখনো পরস্পরের বিরুদ্ধেও যায়, যেমন এক জায়গায় authorization রাখা সরল (economy), কিন্তু সেটি সবার অভিন্ন যন্ত্রও (common mechanism).
Open design আর Kerckhoffs-এর উত্তরাধিকার
Open design-এর শিকড় আরও পুরোনো। ১৮৮৩ সালে Auguste Kerckhoffs সামরিক cryptography নিয়ে লিখেছিলেন, পদ্ধতিটি শত্রুর হাতে পড়লেও যেন সিস্টেম ভেঙে না পড়ে। Kerckhoffs-এর নীতি আর ১৯৪৯ সালে Claude Shannon-এর “শত্রু সিস্টেমটি জানে” কথাটি একই চিন্তা। পর্ব ০৭ (Cryptography-র ভিত্তি) এই নীতি থেকেই শুরু হবে। উল্টো চর্চাটির নাম security through obscurity, অর্থাৎ শুধু লুকিয়ে রেখে নিরাপদ থাকার আশা। গোপনীয়তা বাড়তি বাধা হতে পারে, কিন্তু একমাত্র ভিত্তি হলে একবার ফাঁসেই সব শেষ, আর নকশা বদলানো চাবি বদলানোর মতো সহজ নয়।
দুটি বাড়তি নোট, যা লেখকেরা আলাদা করে রেখেছিলেন
Work factor
বাধা ভাঙতে যে খরচ, তা আক্রমণকারীর সামর্থ্যের সাথে তুলনা করা। ভল্টের দেয়াল আর গ্রামের মুদি দোকানের তালা এক হয় না।
কত কঠিন, কার জন্যCompromise recording
পুরোপুরি ঠেকানো না গেলেও, ক্ষতি যে হয়েছে তা নির্ভরযোগ্যভাবে লিখে রাখা। খামের সিলমোহর ভাঙলে প্রাপক বুঝতে পারেন।
ঠেকাতে না পারলে ধরালেখকেরা এ দুটিকে ভৌত নিরাপত্তার ধারণা বলেছিলেন, যা কম্পিউটারে পুরোপুরি খাটে না। কম্পিউটার নিজেই হিসাব করতে পারে, তাই work factor হঠাৎ কমে যেতে পারে; আর log-ও মুছে ফেলা যায়। তবু আজ দুটিই জীবন্ত। Work factor-এর একটি ছোট হিসাব দেখুন:
কাজের হিসাব: ধরুন একটি মোবাইল ব্যাংকিং PIN চার অঙ্কের। সম্ভাব্য PIN = 104 = ১০,০০০টি। কোনো সীমা না থাকলে কেউ সব মান পরীক্ষা করতে পারত, আর কম্পিউটারের কাছে সেটি সামান্য কাজ। এখন ধরুন তিনবার ভুল হলেই account আটকে যায়। তখন PIN এলোমেলো হলে অনুমানে মেলার সম্ভাবনা ৩ ÷ ১০,০০০ = ০.০০০৩, অর্থাৎ ০.০৩%. PIN লম্বা হয়নি, কিন্তু work factor আকাশ-পাতাল বদলে গেছে। চার অঙ্কের PIN-এর শক্তি তার দৈর্ঘ্যে নয়, চেষ্টার সীমায়। PIN এলোমেলো না হলে, যেমন জন্মসাল হলে, এই হিসাব খাটে না।
৩ · Least privilege আর default deny — ভুলকেও নিরাপদ দিকে ঠেলে দেওয়া
Least privilege ক্ষতির সীমা ঠিক করে। অনুমতি যত ছোট, চুরি যাওয়া account বা ভুল প্রোগ্রাম তত কম ক্ষতি করতে পারে। একে বলা হয় blast radius কমানো। শুরুর কাল্পনিক ঘটনায় support কর্মীর account-এ শুধু নিজের টিকিটের অর্ডার দেখার অনুমতি থাকলে password চুরি হলেও পুরো তালিকা বের হতো না।
Least privilege শুধু মানুষের জন্য নয়। একটি web server যদি root হিসেবে চলে, তার একটি ত্রুটি পুরো মেশিনের ত্রুটি হয়ে দাঁড়ায়। OS-এর দিক থেকে এর ভিত্তি Operating Systems-এর protection পর্বে আছে, আর বাস্তব নকশা আসবে পর্ব ১৯ (Authorization model) ও পর্ব ২০-এ (Privileged access).
Fail-safe defaults কথাটির অর্থ হলো: default deny. প্রশ্নটি “এই কাজ কি নিষিদ্ধ?” নয়, প্রশ্নটি “এই কাজের অনুমতি কি স্পষ্টভাবে দেওয়া আছে?” পার্থক্যটি শোনায় ছোট, কিন্তু ফল উল্টো। Saltzer ও Schroeder-এর যুক্তিটি সুন্দর: অনুমতি-ভিত্তিক ব্যবস্থায় ভুল হলে কাউকে আটকে দেয়, তিনি অভিযোগ করেন, ভুল দ্রুত ধরা পড়ে। আর নিষেধ-ভিত্তিক ব্যবস্থায় ভুল হলে কাউকে ঢুকতে দেয়, কেউ অভিযোগ করে না, ভুলটি চুপচাপ থেকে যায়।
নিচের toy simulator একই অনুরোধগুলো দুই ধরনের নিয়মে চালায়। ইচ্ছা করে দুই নিয়মেই একটি করে বানান ভুল রাখা হয়েছে। এখানে সবকিছু memory-র ভেতরের খেলনা ডেটা, কোনো আসল সিস্টেম নয়। চালিয়ে দেখুন:
// Toy permission check on in-memory requests. Nothing real is touched.
const requests = [
['cashier', 'invoice.read'], ['cashier', 'refund.approve'],
['intern', 'customer.export'], ['intern', 'report.read'],
['report-bot', 'backup.delete'], // new action, nobody wrote a rule
['guest-77', 'invoice.read'], // unknown identity
];
// What the owner really wants to be allowed:
const legit = new Set(['cashier invoice.read', 'intern report.read']);
// Default allow: list what is forbidden. Note the typo "refund.aprove".
const denied = new Set(['cashier refund.aprove', 'intern customer.export']);
// Default deny: list what is granted. Same kind of typo: "report.raed".
const granted = new Set(['cashier invoice.read', 'intern report.raed']);
const defaultAllow = key => !denied.has(key);
const defaultDeny = key => granted.has(key);
let unsafeAllows = 0, refusedValid = 0;
console.log('request'.padEnd(30), 'default-allow', ' default-deny');
for (const [who, act] of requests) {
const key = who + ' ' + act;
const a = defaultAllow(key), d = defaultDeny(key);
console.log(key.padEnd(30), (a ? 'ALLOW' : 'deny').padEnd(14), d ? 'ALLOW' : 'deny');
if (a && !legit.has(key)) unsafeAllows++;
if (!d && legit.has(key)) refusedValid++;
}
console.log('\nunsafe allows under default-allow:', unsafeAllows);
console.log('valid work refused under default-deny:', refusedValid, '(someone will complain)');আউটপুটের শেষে দেখা যায় unsafe allows under default-allow: 3 আর valid work refused under default-deny: 1. Default allow-তে বানান ভুলের কারণে refund.approve খুলে গেছে। যে নতুন কাজের কথা কেউ ভাবেনি (backup.delete) আর অচেনা guest-77, দুটোই ঢুকে গেছে। কেউ জানতেও পারে না। Default deny-তে ভুলের ফল শুধু intern report.read আটকে যাওয়া; পরদিনই intern অভিযোগ করবেন, নিয়ম ঠিক হবে। ভুল দুই দিকেই হয়, কিন্তু default deny-তে ভুল শব্দ করে। এই নিয়মে তালিকাভিত্তিক খাতাকে বলে allowlist, আর নিষেধের তালিকাকে denylist.
Complete mediation — প্রথম দরজায় যাচাই যথেষ্ট নয়
অফিসের সকালের গেটে পরিচয়পত্র দেখা হলো। দুপুরে চাকরি চলে গেলেও বিকেলে ওই কর্মী যদি সার্ভার-কক্ষে ঢুকতে পারেন, তবে গেট-পাহারা অর্থহীন। সফটওয়্যারে এর রূপ হলো দীর্ঘমেয়াদি session বা token: অনুমতি প্রত্যাহার হলো, কিন্তু পুরোনো token এখনো কাজ করছে। আরেকটি রূপ হলো শুধু login পাতায় যাচাই রেখে ভেতরের URL-এ যাচাই না রাখা, যা broken access control-এর পরিচিত চেহারা (পর্ব ৩৮)।
সাবধান: Cache করা অনুমতি দ্রুত, কিন্তু complete mediation দুর্বল করে। তাই যেকোনো cache-এর সঙ্গে দুটি প্রশ্ন আসে: এর মেয়াদ কত, আর অনুমতি বাতিল হলে সে কত দ্রুত জানবে? একই কারণে যাচাই আর ব্যবহারের মাঝখানে অবস্থা বদলে গেলে যে সমস্যা হয়, তাকে বলে TOCTOU (time of check to time of use).
৪ · Defense in depth — স্তর তখনই কাজের, যখন স্তরগুলো স্বাধীন
কোনো একটি নিয়ন্ত্রণ নিখুঁত নয়। Defense in depth এই সত্যটি মেনে নিয়ে শুরু করে: একটি বাধা ভাঙলে পরেরটি থাকবে, আর কেউ বাধা পার হওয়ার চেষ্টা করলে সেটি ধরা পড়বে। আক্রমণকারীর চোখে পৃথিবীটা এমন: তাঁর শুধু একটি পথ লাগে। রক্ষকের চোখে পৃথিবীটা হলো, পথটি লম্বা, ধীর আর শব্দময় করে তোলা। মহল্লার গেট, ভবনের দারোয়ান, ফ্ল্যাটের দরজা, সিন্দুক আর রাতের পাহারা এই একই চিন্তা।
একটি অনুরোধ স্তরগুলোর মধ্য দিয়ে কীভাবে যায়, সেটি ধাপে ধাপে দেখুন। ঘটনাটি কাল্পনিক: কারও চুরি যাওয়া password দিয়ে একটি পুরোনো support account থেকে পুরো গ্রাহক তালিকা নামানোর চেষ্টা। লক্ষ করুন, কোন স্তর কী জানে আর কী জানে না।
- অনুরোধ
export203.0.113.50 - Firewall
443port দেখে - Password
মিলেছেকিন্তু চুরি করা - MFA
বন্ধপুরোনো account - Authorization
denyrole দেখে - Log ও alert
ধরা পড়লaccount বন্ধ
| এখন কোন স্তর | |
| স্তরের রায় | |
| পেরোনো স্তর | |
| বের হওয়া গ্রাহক তথ্য |
- অনুরোধ এলো। ঠিকানা
203.0.113.50, উদ্দেশ্য গ্রাহক তালিকার export. এখনো কোনো স্তর এটি দেখেনি। - Firewall: পার। Firewall শুধু দেখে port 443 খোলা কি না। খোলা, তাই ছেড়ে দিল। এটি ভুল নয়; এই স্তর বোঝেই না, অনুরোধের পেছনে মানুষটি কে।
- Password: পার। Authentication ধাপে password মিলে গেল, কারণ এটি আসল password, শুধু আসল মালিকের হাতে নেই। Password স্তর “জ্ঞান” যাচাই করে, “মানুষ” যাচাই করে না।
- MFA: ফসকাল। এটি পরিকল্পিত স্তরের ফাঁক। পুরোনো account-টিতে MFA চালু করা হয়নি। প্রতিটি স্তরে এমন কোনো না কোনো ছিদ্র থাকে। এখন পর্যন্ত তিনটি স্তর পেরিয়ে গেছে।
- Authorization: DENY. Authorization জিজ্ঞেস করে, “এই role কি পুরো export করতে পারে?” Support role-এ সে অনুমতি নেই। Least privilege এখানে কাজ করল: পরিচয় ভুয়া হলেও ক্ষমতা সীমিত। বের হওয়া তথ্য শূন্য।
- Log ও alert: ধরা পড়ল। অচেনা জায়গা থেকে login আর তারপরই বড় export-এর চেষ্টা, এই দুই মিলে একটি alert তৈরি হলো। নিরাপত্তা দল account বন্ধ করল, MFA-র ফাঁকটিও বন্ধ করল। ঠেকানোর পর জানতে পারা ছিল শেষ স্তর। ব্যবস্থাটি ছিদ্রসহ ছিল, তবু ক্ষতি হয়নি।
গুণের হিসাব আর তার শর্ত
ধরুন তিনটি স্তর একটি খারাপ অনুরোধ ফসকায় যথাক্রমে ০.৩০, ০.১০ আর ০.২০ সম্ভাবনায় (সংখ্যাগুলো কল্পিত)। স্তরগুলো স্বাধীন হলে তিনটিই ফসকানোর সম্ভাবনা গুণ হয়:
অর্থাৎ ১,০০০টির মধ্যে ৬টি
কিন্তু গুণ করার অধিকার আসে একটি শর্ত থেকে: স্বাধীনতা। ধরুন একটি common cause আছে, যা c সম্ভাবনায় সব স্তর একসাথে অকেজো করে। তখন হিসাব হয়:
c = ০.০২ হলে P = ০.০২ + ০.৯৮ × ০.০০৬ = ০.০২৫৮৮
লোডশেডিংয়ের একটি ছবি মনে রাখুন। ভবনের electronic গেট, CCTV আর alarm, তিনটিই একই বিদ্যুৎ লাইনে চলে। কাগজে তিন স্তর, বাস্তবে বিদ্যুৎ গেলে একটিও নেই। নিচের ছবিতে ছিদ্রগুলো দেখুন। এই “ছিদ্রওয়ালা পনিরের টুকরো” ছবিটি James Reason-এর দুর্ঘটনা-বিশ্লেষণের Swiss cheese model থেকে জনপ্রিয় হয়েছে।
ছিদ্র এলোমেলো, নাকি এক সারিতে
Independent layers vs a common-cause failure
এবার সূত্র আর simulation মিলিয়ে দেখি। Seed নির্দিষ্ট, তাই প্রতিবার একই ফল আসবে। সব সংখ্যা কল্পিত:
// Toy model with assumed numbers. Each layer misses a bad request with
// probability p. With chance c one common cause blinds every layer at once.
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 miss = [0.30, 0.10, 0.20]; // firewall, MFA, segmentation
const c = 0.02, N = 200000, rnd = mulberry32(2026);
const allMiss = miss.reduce((a, p) => a * p, 1);
console.log('formula, independent :', allMiss.toFixed(5));
console.log('formula, common cause:', (c + (1 - c) * allMiss).toFixed(5));
let indep = 0, corr = 0;
for (let i = 0; i < N; i++) {
const through = miss.every(p => rnd() < p);
if (through) indep++;
if (rnd() < c || through) corr++;
}
console.log('simulated, independent :', (indep / N).toFixed(5));
console.log('simulated, common cause:', (corr / N).toFixed(5));
console.log('\nlayers independent with c=0.02 (every layer p=0.20)');
for (let n = 1; n <= 6; n++) {
const q = 0.2 ** n, w = c + (1 - c) * q;
console.log(String(n).padStart(6), q.toFixed(6).padStart(12), w.toFixed(6).padStart(12));
}স্বাধীন স্তরে সূত্র 0.00600, simulation 0.00601; common cause-এ সূত্র 0.02588, simulation 0.02598. অর্থাৎ ঝুঁকি চার গুণের বেশি বেড়েছে, যদিও কোনো স্তর বদলায়নি। নিচের সারণি আরও স্পষ্ট: স্বাধীন হলে ৬ স্তরে ঝুঁকি 0.000064, কিন্তু common cause থাকলে 0.020063, মানে সেটি c = 0.02-র নিচে নামেই না। ৪ স্তরের পর আরও স্তর যোগ করে প্রায় কিছুই পাওয়া যায় না (0.021568 থেকে 0.020314). তখন পরের টাকাটি নতুন স্তরে নয়, common cause দূর করায় খরচ করা বুদ্ধিমানের কাজ।
স্তরের স্বাধীনতা কীভাবে যাচাই করবেন
- একই মানুষ: একজন admin কি সব স্তর একসাথে বন্ধ করতে পারেন? তাঁর একটি account চুরি হলেই সব গেল।
- একই পরিচয়-ব্যবস্থা: VPN, email আর server, সবই কি একই login-এর ওপর? তবে সেগুলো তিন স্তর নয়, এক স্তর।
- একই সফটওয়্যার বা vendor: একই ইঞ্জিনের দুই কপি একই ত্রুটিতে পড়ে। একই update চ্যানেলও একটি অভিন্ন পথ; ২০২০ সালের SolarWinds ঘটনায় প্রকাশিত প্রতিবেদন অনুযায়ী বিশ্বস্ত update পথেই ক্ষতিকর কোড পৌঁছেছিল।
- একই ভৌত ভিত্তি: একই বিদ্যুৎ, একই data center, একই network লাইন।
- একই নীরব ব্যর্থতা: কোনো স্তর বন্ধ হলে কেউ কি জানতে পারবেন? যে স্তর চুপচাপ মরে যায়, হিসাবে সে অনুপস্থিত।
স্তর বাড়ানোর দামও আছে। প্রতিটি নতুন product নিজেও একটি সফটওয়্যার, নিজেও ত্রুটি আনতে পারে, আর economy of mechanism-এর বিরুদ্ধে যায়। তিনটি স্বাধীন, দেখা-যায় এমন স্তর দশটি জড়িয়ে থাকা স্তরের চেয়ে ভালো। Network-এর দিক থেকে স্তর ভাগ করার কাজ segmentation, যা পর্ব ২২-এ বিস্তারিত আসবে।
৫ · Attack surface, secure by default আর secure by design
Attack surface মানে একটি সিস্টেমে বাইরে থেকে পৌঁছানো যায় এমন সব পথের যোগফল: খোলা port, API, login পাতা, upload বক্স, admin panel, এমনকি সেই কর্মীরা যাঁদের কাছে phishing পৌঁছাতে পারে। যে দরজা নেই, তাতে তালা দিতে হয় না, patch-ও করতে হয় না। বাড়িতে দশটি জানালার পাঁচটি যদি অকারণে খোলা থাকে, সবচেয়ে সস্তা নিরাপত্তা হলো সেগুলো বন্ধ করা। পুরোটা বিশ্লেষণ করা হবে পর্ব ০৪-এ (Threat modeling).
কাজের হিসাব: ধরুন একটি কাল্পনিক server-এ ১২টি service বাইরে থেকে পৌঁছানো যায়, অথচ দরকার ৩টি। অপ্রয়োজনীয় ৯টি বন্ধ করলে পৌঁছানোর পথ ৭৫% কমল (৯ ÷ ১২)। এর মানে ঝুঁকি ঠিক ৭৫% কমল, তা নয়, কারণ সব পথের ওজন সমান নয়। তবু patch করার, নজর রাখার আর ভুল configuration-এর জায়গা অনেক কমে গেল।
Secure by design
নিরাপত্তা শুরুর নকশার সিদ্ধান্ত, পরে জোড়া দেওয়া জিনিস নয়। যেমন শুরু থেকেই ধরে নেওয়া হলো, অনুমতি server-এ যাচাই হবে আর password সরাসরি জমা হবে না।
কীভাবে বানানোSecure by default
বাক্স খোলার মুহূর্তেই নিরাপদ অবস্থা। ব্যবহারকারীকে কিছু খুঁজে চালু করতে হয় না; ঝুঁকি নিতে চাইলে সেটি জেনেবুঝে নিজে বদলাতে হয়।
কেমন অবস্থায় পৌঁছায়পার্থক্যটি বাস্তব। মানুষ বেশিরভাগ সময় default-ই রেখে দেন, তাই default-ই আসল নীতি হয়ে দাঁড়ায়। ২০১৬ সালের Mirai botnet-এর প্রকাশিত বিশ্লেষণে দেখা যায়, বহু IoT যন্ত্র কারখানার default password নিয়েই অনলাইনে ছিল। প্রতি যন্ত্রে আলাদা password দেওয়া একটি নকশার সিদ্ধান্ত, যা লাখো ক্রেতার ভুল একসঙ্গে এড়াতে পারত। ২০২৩ সালে যুক্তরাষ্ট্রের CISA ও কয়েকটি দেশের সংস্থার যৌথ নির্দেশিকা এই দুটি ধারণাকে সামনে আনে; তাদের মূল কথা হলো, নিরাপত্তার বোঝা গ্রাহকের কাঁধে না চাপিয়ে নির্মাতার দায়িত্বে আনা। MFA আর log-এর মতো মৌলিক সুবিধা বাড়তি দামের feature হওয়া উচিত নয়, এটিও সেই বার্তার অংশ।
৬ · ব্যর্থ হলে কোন দিকে — fail secure, fail safe আর fail open
সব নিয়ন্ত্রণ একদিন নষ্ট হবে। বিদ্যুৎ যাবে, server থামবে, network কাটবে। প্রশ্ন হলো, সেই মুহূর্তে সিস্টেম কোন অবস্থায় যাবে। এটি দুর্ঘটনায় ঠিক হতে দেওয়া যায় না, আগেই নকশা করতে হয়।
দুটি দরজা ভাবুন। ব্যাংকের ভল্ট: বিদ্যুৎ গেলে বন্ধই থাকে, কারণ রক্ষা করার জিনিস ভেতরের সম্পদ। ভবনের অগ্নিনির্গমন পথের দরজা: আগুন বা বিদ্যুৎ বিপর্যয়ে মানুষ ভেতর থেকে বের হতে পারতেই হবে, কারণ রক্ষা করার জিনিস প্রাণ। দুটোই সঠিক, কারণ দুটো ভিন্ন ক্ষতি ঠেকায়।
| ধরন | ব্যর্থ হলে | কখন ঠিক | দাম |
|---|---|---|---|
| Fail secure (software-এ fail closed) | প্রবেশ বন্ধ থাকে | ভল্ট, payment অনুমোদন, admin login, গোপন ডেটা, firewall | Availability: বৈধ কাজও থেমে যায় |
| Fail safe (প্রাণ-নিরাপত্তা অর্থে) | মানুষ ক্ষতিগ্রস্ত না হওয়ার অবস্থা | অগ্নিনির্গমন পথ, লিফট, রেলের সংকেত, চিকিৎসা যন্ত্র | সম্পদের নিরাপত্তা কমতে পারে |
| Fail open | যাচাই ছাড়াই চলতে থাকে | প্রকাশ্য খবরের পাতা, কম ঝুঁকির optional নিয়ন্ত্রণ; alert বাধ্যতামূলক | Confidentiality ও integrity: ফাঁক খোলা থাকে |
| Break-glass | জরুরি পথ খোলে, কিন্তু সব রেকর্ড হয় | হাসপাতালের রোগীর তথ্য, উৎপাদন-সংকটে admin access | পরে কড়া পর্যালোচনা লাগে |
শব্দের ফাঁদ: এই পরিভাষা সব জায়গায় এক অর্থে চলে না। S&S-এর “fail-safe defaults” মানে default deny, যা তালার ভাষায় “fail secure”-এর কাছাকাছি। অথচ দরজার হার্ডওয়্যারে “fail safe” মানে বিদ্যুৎ গেলে তালা খুলে যাওয়া। আবার বিদ্যুৎ-প্রকৌশলে “closed circuit” মানে বিদ্যুৎ চলছে। তাই শব্দ নয়, আচরণটি লিখে নিন: “Auth service বন্ধ থাকলে এই endpoint 503 দেবে।”
এবার সফটওয়্যারের ভেতরে একই সিদ্ধান্ত দেখুন। একটি কাল্পনিক report service প্রতিটি অনুরোধে একটি authorization service-কে জিজ্ঞেস করে। সেই service হঠাৎ বন্ধ হলো।
1function canExport(user, report) {2 try {3 return authz.check(user, report);4 } catch (outage) {5 audit.log("authz-down", user);6 return FAIL_MODE;7 }8}
| authz | |
| user | |
| FAIL_MODE | |
| log |
- স্বাভাবিক দিন।
authzচালু।user-a-র অনুরোধে লাইন ৩ উত্তর দিল, অনুমতি আছে, report গেল। - Outage.
authzবন্ধ হয়ে গেছে।user-b-র অনুরোধে লাইন ৩ আর উত্তর পেল না, error ছুড়ল। এখন কোড একটি প্রশ্নের সামনে: অনুমতি জানা নেই, কী করা হবে? - আগে লিখে রাখা। লাইন ৪–৫-এ ঘটনাটি log-এ গেল। সিদ্ধান্ত যাই হোক, এই রেকর্ড পরে কাজে লাগবে।
logএখন ১। - পথ ১: FAIL_MODE = ALLOW. এটি fail open. কাজ চলতে থাকল, কিন্তু
user-b-র অনুমতি আসলে ছিল কি না কেউ জানে না। Outage এখন একটি নিরাপত্তা-ফাঁক, আর কেউ ইচ্ছা করে outage ঘটাতে পারলে সেটি পুরো নিয়ন্ত্রণটিই সরিয়ে ফেলার পথ। - পথ ২: FAIL_MODE = DENY. এটি fail closed.
user-b503 পেলেন। ডেটা নিরাপদ, তবে বৈধ ব্যবহারকারীরাও আটকে গেলেন। এর দাম availability-তে। - সিদ্ধান্ত। এই report-এ গ্রাহকের ব্যক্তিগত তথ্য আছে, তাই পথ ২ ঠিক, সঙ্গে alert. প্রশ্নটি কখনোই সাধারণ নয়; এটি প্রতিটি endpoint-এর ডেটা ধরে ঠিক করতে হয়। পণ্যের প্রকাশ্য দামের পাতা হলে উত্তর ভিন্ন হতে পারত।
দুই চরমের মাঝখানেও পথ আছে। সদ্য যাচাই করা উত্তর অল্প সময়ের জন্য মনে রাখা (cached decision) অনেক বৈধ কাজ বাঁচায়, তবে complete mediation-এ একটু ফাঁক রাখে। নিচের simulation-এ ৩০০ সেকেন্ডে প্রতি সেকেন্ডে একটি অনুরোধ আসে, ১০০ থেকে ১৬০ সেকেন্ডে outage, আর ১১০ সেকেন্ডে একজনের অনুমতি বাতিল হয়। সব সংখ্যা কল্পিত:
// Toy outage: one request per simulated second, 300 seconds. Assumed numbers.
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 users = ['u1', 'u2', 'u3', 'u4', 'u5', 'u6', 'u7', 'u8', 'u9', 'bad'];
const OUT_FROM = 100, OUT_TO = 160, REVOKE_AT = 110, TTL = 30; // u9 loses access at t=110
const entitled = (u, t) => u !== 'bad' && !(u === 'u9' && t >= REVOKE_AT);
function run(mode) {
const rnd = mulberry32(7), cache = {}, s = { served: 0, refused: 0, leaked: 0 };
for (let t = 0; t < 300; t++) {
const u = users[Math.floor(rnd() * users.length)], up = t < OUT_FROM || t >= OUT_TO;
let ok;
if (up) { ok = entitled(u, t); cache[u] = { ok, t }; }
else if (mode === 'fail-open') ok = true;
else if (mode === 'fail-closed') ok = false;
else ok = !!cache[u] && t - cache[u].t <= TTL && cache[u].ok; // cached, short TTL
const should = entitled(u, t);
if (ok && should) s.served++;
if (!ok && should) s.refused++;
if (ok && !should) s.leaked++;
}
return s;
}
console.log('mode served refused-valid allowed-wrongly');
for (const m of ['fail-closed', 'fail-open', 'cached-ttl30']) {
const s = run(m);
console.log(m.padEnd(12), String(s.served).padStart(5), String(s.refused).padStart(13), String(s.leaked).padStart(16));
}fail-closed: 195 বৈধ অনুরোধ চলেছে, 49টি আটকে গেছে, ভুল অনুমতি 0. fail-open: কোনো বৈধ কাজ আটকায়নি, কিন্তু 11টি অনুরোধ ভুলভাবে ঢুকেছে। cached-ttl30: মাঝামাঝি, 34টি আটকেছে আর 2টি ভুলে ঢুকেছে; এই দুটি সেই ব্যবহারকারীর, যাঁর অনুমতি outage চলাকালে বাতিল হয়েছিল। কোনো “শূন্য-দামের” সারি নেই। নকশার কাজ হলো ঠিক করা, এই ডেটার জন্য কোন ভুলটি কম ভয়ংকর।
হাসপাতালের যন্ত্র — যেখানে দুই ভুলই ভয়ংকর
একটি হাসপাতালের জরুরি বিভাগ ভাবুন। রোগীর তথ্য বা ওষুধের ক্যাবিনেট login-সার্ভারের ওপর নির্ভরশীল। Server বন্ধ হলে fail closed মানে ডাক্তার রোগীর allergy দেখতে পারছেন না, যা প্রাণের ঝুঁকি। Fail open মানে সবাই সব দেখতে পারছে। সমাধান সাধারণত break-glass: জরুরি মুহূর্তে একটি বিশেষ পথে প্রবেশ মেলে, কিন্তু কে, কখন, কী দেখলেন, সবটা আলাদাভাবে রেকর্ড হয়, পরে পর্যালোচনা হয়, আর ভুল ব্যবহারে জবাবদিহি থাকে। লক্ষ করুন, এটি S&S-এর compromise recording আর psychological acceptability-র চমৎকার মিলন। একই যুক্তিতে চিকিৎসা যন্ত্র নিজে license বা network-এর জন্য চিকিৎসা থামিয়ে দেওয়া উচিত নয়।
লিফটের পাশে কাচে ঢাকা জরুরি বোতাম ভাবুন। কেউ চাইলেই ভাঙতে পারেন, কিন্তু ভাঙা কাচ সবাই দেখবে। ব্যবস্থাটি প্রবেশ ঠেকায় না, প্রবেশকে দৃশ্যমান করে।
৭ · Separation of duties — এক হাতে পুরো কাজ নয়
Separation of privilege প্রযুক্তিগত ধারণা: দুটি শর্ত পূরণ হতে হবে। Separation of duties এর সাংগঠনিক রূপ: একটি সংবেদনশীল কাজের ধাপগুলো একজনের হাতে থাকবে না, যাতে ভুল বা জালিয়াতির জন্য অন্তত দুজনের ব্যর্থতা বা যোগসাজশ লাগে। অফিসের রেজিস্টার খাতায় একজন হিসাব লেখেন, আরেকজন যাচাই করে সই করেন, ক্যাশিয়ার টাকা দেন। ব্যাংকে এই জুটিকে বলে maker-checker.
১৯৯৫ সালে যুক্তরাজ্যের পুরোনো ব্যাংক Barings ধসে পড়ে। প্রকাশিত তদন্ত অনুযায়ী, সিঙ্গাপুর শাখার এক trader ব্যবসা করতেন, আবার পেছনের হিসাব মেলানোর দিকটিও তাঁর নিয়ন্ত্রণে ছিল। তাই ক্ষতি লুকানো সম্ভব হয়েছিল। ঘটনাটি আজও separation of duties-এর ক্লাসিক শিক্ষা।
একটি কাল্পনিক প্রতিষ্ঠানে একটি vendor payment ধাপে ধাপে দেখুন। সব id কাল্পনিক।
- Maker
user-aতৈরি করেন - Checker
user-bযাচাই করেন - Treasury
user-cটাকা ছাড়েন
| পরিমাণ | |
| গ্রহীতার account | |
| অবস্থা | |
| audit log-এর লাইন |
- Maker তৈরি করলেন।
user-avendor V-17-এর জন্য ৳২,৫০,০০০ payment খসড়া করলেন, accountACC-9931. একটি ইমেইলে পাওয়া তথ্য থেকে তিনি account নম্বরটি তুলেছেন। - নিজে অনুমোদনের চেষ্টা। তাড়ার কারণে
user-aনিজেই অনুমোদন চাপলেন। সিস্টেমের নিয়ম: maker ≠ checker. অনুরোধ DENY, আর সেটিও log-এ উঠল। অবস্থা বদলায়নি। - Checker যাচাই করলেন।
user-bvendor-এর নিবন্ধিত তথ্যের সাথে মেলালেন। সেখানে accountACC-1207. অমিল ধরা পড়ল, payment ফেরত গেল। ইমেইলের তথ্য বদলে যাওয়া একটি পরিচিত প্রতারণার ছবি (পর্ব ৫২)। - সংশোধন।
user-aনিবন্ধিত তথ্য থেকেACC-1207বসিয়ে আবার জমা দিলেন। কোনো রেকর্ড মুছে নয়, নতুন লাইন যোগ করে। - অনুমোদন।
user-bপরিমাণ, vendor আর account মিলিয়ে অনুমোদন দিলেন। এখনো টাকা বের হয়নি। - ছাড়।
user-cটাকা ছাড়লেন। পরে হিসাব বিভাগ ব্যাংকের বিবরণীর সাথে মিলিয়ে দেখবে। একজনের ভুল বা অসততা একা এই পথ পেরোতে পারত না, আর log-এর ছয়টি লাইনই পরে প্রমাণ হিসেবে থাকল।
এই নিয়ন্ত্রণের সীমাও জানা দরকার। দুজন মিলে যোগসাজশ করলে এটি একা ঠেকাতে পারে না; তখন কাজ করে পালাক্রমে দায়িত্ব বদল, বাধ্যতামূলক ছুটি আর স্বাধীন audit log. ছোট প্রতিষ্ঠানে যথেষ্ট লোক না থাকলে দ্বিতীয় স্বাক্ষরের বদলে মালিকের পর্যালোচনা বা পরের দিনের মিলিয়ে দেখা ক্ষতিপূরক নিয়ন্ত্রণ হতে পারে। তাড়া আর আবেগ দিয়ে এই ধাপ ভাঙার চাপ আসে, যে কারণে প্রতারকেরা প্রায়ই “এখনই পাঠান, স্যার বলেছেন” ধরনের চাপ দেন। Software-এ এর আত্মীয় হলো একই ব্যক্তির কোড লিখে নিজেই production-এ না পাঠানো (code review).
৮ · Zero trust মনোভাব আর usability — দুটি আধুনিক শিক্ষা
Zero trust — অবস্থানকে বিশ্বাসের কারণ না ভাবা
পুরোনো নকশা ছিল দুর্গের মতো: বাইরের দেয়াল শক্ত, ভেতরে সবাই বিশ্বস্ত। মুশকিল হলো, একবার ভেতরে ঢুকলে আর বাধা নেই, আর আজকের কর্মী, ডেটা আর সার্ভার কোনোটিই এক দেয়ালের ভেতরে থাকে না। Zero trust মানে নেটওয়ার্কের অবস্থানকে বিশ্বাসের কারণ হিসেবে না ধরা। অফিসের Wi-Fi-তে থাকা মানেই বিশ্বস্ত নয়। প্রতিটি অনুরোধে পরিচয়, যন্ত্রের অবস্থা আর অনুমতি যাচাই হয়।
ভেবে দেখুন, এটি নতুন কিছু নয়: complete mediation আর least privilege, আধুনিক নেটওয়ার্কে প্রয়োগ করা। আর “কিছুই বিশ্বাস করা হয় না” কথাটি আক্ষরিক নয়; কোথাও না কোথাও একটি trust anchor থাকেই। আজ শুধু মনোভাবটি মনে রাখুন। NIST SP 800-207 (২০২০) ধরে পুরো নকশা আসবে পর্ব ৭৪-এ (Zero trust architecture).
Usability একটি নিরাপত্তা-গুণ
ধরুন একটি অফিসে প্রতি মাসে ১৬ অক্ষরের নতুন password বদলাতে হয়। ফল কী? মনিটরে কাগজ সাঁটা, Dhaka2026!-এর পর Dhaka2027!, আর সহকর্মীর সাথে ভাগাভাগি। নিয়ম কাগজে কঠিন, বাস্তবে দুর্বল। যে নিয়ন্ত্রণ মানুষের কাজে বাধা দেয়, মানুষ তার পাশ কাটানোর পথ বের করেন। তখন নিরাপত্তা নিয়ন্ত্রণটিই ঝুঁকি হয়ে ওঠে।
তাই ভালো নকশা নিরাপদ পথকেই সহজ পথ বানায়। সতর্কবার্তা হবে কম কিন্তু অর্থপূর্ণ, কারণ দিনে পঞ্চাশটি alert পেলে মানুষ সব না দেখেই “OK” চাপেন। Password-এর আধুনিক নীতি পর্ব ১৫-এ, আর phishing-প্রতিরোধী login পর্ব ১৬-এ আসবে। মানুষকে দোষ দেওয়ার বদলে ব্যবস্থা ঠিক করার সংস্কৃতি নিয়ে কথা হবে পর্ব ৫৪-এ।
আরও গভীরে: S&S-এর complete mediation আর economy of mechanism-এর কাছাকাছি চিন্তা দেখা যায় ১৯৭২ সালের Anderson Report-এর reference monitor ধারণায়: সব প্রবেশ অবশ্যই এর মধ্য দিয়ে যাবে, এটি বিকৃত করা যাবে না, আর এটি যাচাইয়ের মতো ছোট হবে। আজকের standard-এ NIST SP 800-53 Rev. 5-এর AC-5 (separation of duties), AC-6 (least privilege), SC-24 (fail in known state) আর SA-8 (নিরাপত্তা-প্রকৌশল নীতি) এই ধারণাগুলো নিয়ন্ত্রণে রূপ দেয়; NIST SP 800-160 Vol. 1 Rev. 1 সিস্টেম-প্রকৌশলের দিক থেকে নীতিগুলো সাজায়।
পরীক্ষা ও ইন্টারভিউতে:
- Least privilege আর separation of duties-এর পার্থক্য কী? প্রথমটি অনুমতির পরিমাণ সীমিত করে, দ্বিতীয়টি এক কাজের ধাপ ভিন্ন মানুষে ভাগ করে।
- Fail open কখন গ্রহণযোগ্য? যখন নিয়ন্ত্রণটি বন্ধ থাকার চেয়ে সেবা বন্ধের ক্ষতি বেশি, ডেটা কম সংবেদনশীল, আর ঘটনার alert নিশ্চিত।
- Defense in depth কোথায় ব্যর্থ হয়? যখন স্তরগুলোর একটি common cause থাকে, যেমন একই admin account বা একই নীরব ব্যর্থতা।
- Open design মানে কি সব প্রকাশ করা? না। পদ্ধতি প্রকাশ্য হলেও key, password আর secret গোপন থাকে।
- Secure by design আর secure by default-এর পার্থক্য? প্রথমটি কীভাবে তৈরি হয়েছে, দ্বিতীয়টি কেনার পর কোন অবস্থায় পৌঁছায়।
৯ · AI-এর যুগে এই নীতিগুলো
AI খুব দ্রুত configuration আর কোড লিখে দেয়, আর সেখানেই নীতিগুলো যাচাইয়ের ছাঁকনি হয়ে ওঠে। AI-এর প্রথম লক্ষ্য সাধারণত “error চলে যাক”। Permission error এলে সহজ উত্তর হলো অনুমতি বাড়িয়ে দেওয়া, যা least privilege-এর ঠিক উল্টো।
| AI-এর পরামর্শ | কোন নীতি ভাঙে | আপনি যা করবেন |
|---|---|---|
chmod 777 বা সবকিছু root হিসেবে চালানো | Least privilege | ঠিক কোন ব্যবহারকারীর কোন অনুমতি লাগে, তা বের করা |
verify=False দিয়ে certificate error “ঠিক” করা | Complete mediation, fail secure | Certificate সমস্যার আসল কারণ ঠিক করা |
CORS-এ *, firewall-এ 0.0.0.0/0 | Default deny, attack surface | নির্দিষ্ট উৎসের allowlist |
try/except: return True ধরনের যাচাই | Fail secure | ত্রুটিতে কী হবে, তা স্পষ্টভাবে লিখে পর্যালোচনা করা |
| Route-এ authorization বাদ রাখা | Complete mediation | প্রতিটি route-এর পরীক্ষা লেখা |
| পুরোনো পরামর্শ: MD5, ECB, salt ছাড়া hash | পুরোনো জ্ঞান | Primary source দেখা, পর্ব ১৩–১৪ |
| অস্তিত্বহীন CVE বা standard-এর উদ্ধৃতি | যাচাইহীন নির্ভরতা | মূল উৎসে নম্বরটি খুঁজে দেখা |
নিজের লেখা বা AI-এর দেওয়া নকশা পর্যালোচনায় নিচের ধরনের prompt কাজে দেয়। এটি রক্ষার জন্য: ত্রুটি ধরা আর শক্ত করা। পাঠানোর আগে আসল secret, IP আর গ্রাহকের তথ্য সরিয়ে নিন।
AI-এর পরামর্শ গ্রহণের আগে চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন। এগুলোই আপনাকে নিয়ম-মানা থেকে নকশা-চিন্তায় নিয়ে যাবে।
প্র ০১১৯৭৫ সালের একটি লেখার নীতি আজকের cloud আর phone-এ কেন এখনো খাটে? সব কি তখনই বলা হয়ে গেছে?
নীতিগুলো টিকে আছে, কারণ এগুলো কোনো প্রযুক্তি নিয়ে নয়, কয়েকটি স্থায়ী সত্য নিয়ে: মানুষ ভুল করে, সফটওয়্যারে ত্রুটি থাকে, জটিল জিনিস যাচাই করা যায় না, আর অনুমতি একবার ছড়ালে ফেরানো কঠিন। ১৯৭০-এর দশকের Multics-এ যে কারণে default deny দরকার ছিল, আজকের cloud account-এও ঠিক সেই কারণেই দরকার।
একটি চমৎকার উদাহরণ least common mechanism. ২০১৮ সালে প্রকাশিত Spectre ত্রুটি দেখাল, একই CPU-র ভাগ করে নেওয়া অংশ ব্যবহার করলে প্রোগ্রামগুলোর মধ্যে তথ্য চুইয়ে পড়তে পারে। যুক্তিটি প্রায় হুবহু S&S-এর: অভিন্ন যন্ত্রই ফাঁসের পথ। Browser নির্মাতারা এরপর ভিন্ন site আলাদা process-এ রাখার দিকে আরও জোর দেন। পঞ্চাশ বছরের পুরোনো সতর্কবার্তা একটি নতুন স্তরে ফিরে এলো।
তবে সব বলা হয়ে যায়নি। সেই সময়ের চিন্তা মূলত একটি ভাগ করা সিস্টেমের ভেতরকার সুরক্ষা নিয়ে। আজকের বড় প্রশ্নগুলো হলো supply chain, যেখানে আপনার কোডের বেশিরভাগই অন্যের লেখা; হাজারো সেবায় ছড়িয়ে থাকা পরিচয়-ব্যবস্থা; বড় মাপের detection; আর AI. লেখকেরা নিজেরাও এগুলোকে আইন বলেননি, বলেছিলেন সতর্কবার্তা।
NIST SP 800-160-এর মতো আধুনিক কাঠামো তাই তালিকাটি আরও লম্বা করেছে, কিন্তু শিকড় অস্বীকার করেনি। তাই আপনি যখন কোনো নতুন প্রযুক্তি শিখবেন, তখন জিজ্ঞেস করবেন: এখানে default কী, প্রতিটি অনুরোধ যাচাই হচ্ছে কি না, আর অভিন্ন অংশ কোনটি। এই তিন প্রশ্ন প্রায় যেকোনো নতুন সিস্টেমে কাজে দেয়।
মূল উপলব্ধি: নীতি হলো ভুলের ইতিহাস থেকে ছেঁকে নেওয়া সাধারণ কথা। প্রযুক্তি বদলালে ভুলের চেহারা বদলায়, ধরন খুব কম বদলায়।
প্র ০২Equifax ২০১৭-এর প্রকাশিত প্রতিবেদন থেকে defense in depth সম্পর্কে কী শেখা যায়? বড় প্রতিষ্ঠানে তো অনেক স্তরই ছিল।
২০১৭ সালের Equifax ঘটনায় বিপুল সংখ্যক মানুষের ব্যক্তিগত তথ্য ফাঁস হয়। যুক্তরাষ্ট্রের সরকারি তদন্ত প্রতিবেদনগুলোতে (যেমন GAO, ২০১৮) যা উঠে আসে, তা একটি ত্রুটির গল্প নয়, কয়েকটি স্তরের একসাথে দুর্বল থাকার গল্প।
- Patch: একটি জানা ত্রুটির সংশোধন প্রকাশিত হলেও সব জায়গায় পৌঁছায়নি।
- নজরদারি: Encrypted traffic দেখার একটি যন্ত্রের certificate মেয়াদোত্তীর্ণ ছিল, তাই সেই স্তর দীর্ঘদিন কাজ করছিল না, আর সেটি কেউ খেয়াল করেননি।
- Segmentation: ভেতরের সীমানা দুর্বল থাকায় একটি জায়গা থেকে আরও database-এ পৌঁছানো সহজ ছিল।
- Secret: প্রতিবেদন অনুযায়ী কিছু credential সুরক্ষিতভাবে রাখা ছিল না।
এই ঘটনায় দ্বিতীয় স্তরটি সবচেয়ে শিক্ষণীয়। মেয়াদোত্তীর্ণ certificate একটি নীরব fail open: যন্ত্র বন্ধ হলেও traffic চলতে থাকল, কোনো ঘণ্টা বাজল না। কাগজে স্তরটি ছিল, ঝুঁকির হিসাবে ছিল না। যে হিসাবে আপনি ধরেছিলেন “এই স্তর ফসকায় ০.১০”, বাস্তবে তার মান ১.০০ হয়ে গিয়েছিল। মেয়াদ শেষ হওয়া ধরতে পারার মতো একটি সরল নজরদারি থাকলেই সমস্যাটি অনেক আগে সামনে আসত।
রক্ষকের শিক্ষা হলো, প্রতিটি স্তরের জন্য জিজ্ঞেস করতে হবে: এটি যে কাজ করছে, তার প্রমাণ কী? certificate-এর মেয়াদ, patch-এর অবস্থা আর log পাওয়ার ধারাবাহিকতা নিজেই পর্যবেক্ষণের বিষয়। পরীক্ষামূলক ঘটনা দিয়ে নিয়মিত detection যাচাই করা হলে এই নীরবতা ধরা পড়ে। পর্ব ৬৫-এ এমন আরও ঘটনা আসবে।
মূল উপলব্ধি: স্তর সংখ্যা গোনা যথেষ্ট নয়। যে স্তরের কাজ করা প্রমাণ করা যায় না, ঝুঁকির হিসাবে সেটি না থাকার সমান।
প্র ০৩Open design যদি ভালো হয়, তবে কি নিজের নকশা গোপন রাখা ভুল? Port বদলানো বা version লুকানো কি অর্থহীন?
দুটি প্রশ্ন আলাদা করা দরকার: নিরাপত্তা কি গোপনীয়তার ওপর নির্ভর করছে, নাকি গোপনীয়তা শুধু একটি বাড়তি বাধা?
ইতিহাসে নির্ভরতার দামটি বহুবার দেখা গেছে। GSM মোবাইল ফোনের A5/1 cipher-এর নকশা গোপন ছিল, কিন্তু ১৯৯০-এর দশকের শেষে গবেষকেরা সেটি উন্মোচন করেন, আর প্রকাশিত দুর্বলতা নিয়ে পরে অনেক গবেষণা হয়। MIFARE Classic কার্ডের গোপন Crypto-1 নকশাও ২০০৮ সালের দিকে একইভাবে উন্মোচিত হয়, অথচ লক্ষ লক্ষ কার্ড তখন বাজারে। গোপন নকশা চাইলেই বদলানো যায় না; হার্ডওয়্যারে থাকলে তো আরও নয়।
অন্যদিকে AES বাছাই হয়েছিল প্রকাশ্য প্রতিযোগিতায়, যেখানে সারা পৃথিবীর গবেষকেরা বছরের পর বছর চেষ্টা করেছেন। সেই প্রকাশ্য পরীক্ষাই আস্থার উৎস। Kerckhoffs-এর নীতি তাই বলে: যা সহজে বদলানো যায়, সেই key-ই হবে একমাত্র গোপন জিনিস। এটি চাবি-ব্যবস্থাপনাকে সহজ করে, কারণ ফাঁস হলে শুধু চাবি বদলাতে হয়।
তাহলে সব প্রকাশ করতে হবে? না। আপনার ভেতরের network-এর মানচিত্র, ব্যক্তিগত configuration, detection rule-এর বিস্তারিত গোপন রাখা যুক্তিসঙ্গত। Version লুকানো বা service-কে অচেনা port-এ রাখা আক্রমণকারীর কাজ সামান্য বাড়ায় আর log-এর গোলমাল কমায়। সমস্যা হয় তখন, যখন সেটিকেই নিরাপত্তা ধরে মূল নিয়ন্ত্রণ ফেলে রাখা হয়। পরীক্ষাটি সহজ: কাল এই গোপন তথ্য প্রকাশ পেলেও কি সিস্টেম নিরাপদ থাকবে? না হলে সেটি শিকড়ের সমস্যা।
মূল উপলব্ধি: গোপনীয়তা বাড়তি পাহারা হতে পারে, ভিত্তি নয়। ভিত্তি হবে এমন কিছু, যা প্রকাশ্য যাচাইয়ে টেকে আর ফাঁস হলে সহজে বদলানো যায়।
প্র ০৪নিরাপত্তা ঘটনায় “সব বন্ধ করে দেওয়া” কি সবসময় ঠিক? Colonial Pipeline ২০২১ থেকে fail closed-এর দাম কী বোঝা যায়?
২০২১ সালের মে মাসে যুক্তরাষ্ট্রের Colonial Pipeline ransomware আক্রমণের শিকার হয়। প্রকাশিত তথ্য অনুযায়ী আক্রমণটি মূলত IT ও ব্যবসায়িক সিস্টেমে হয়েছিল, কিন্তু প্রতিষ্ঠানটি সাবধানতা হিসেবে জ্বালানি সরবরাহ ব্যবস্থাও কয়েক দিন বন্ধ রাখে। ফলে যুক্তরাষ্ট্রের পূর্ব উপকূলের কিছু এলাকায় জ্বালানির সংকট ও আতঙ্ক দেখা দেয়।
এটি একটি প্রাতিষ্ঠানিক fail closed সিদ্ধান্ত। যুক্তি শক্ত: আক্রমণ কতদূর ছড়িয়েছে তা জানা না গেলে নিয়ন্ত্রণ-ব্যবস্থায় ঝুঁকি নেওয়া বিপজ্জনক, আর বিলিং ঠিকমতো না চললে সরবরাহ হিসাব করাও কঠিন। কিন্তু দাম ছিল বিশাল, আর সেটি আক্রমণের সরাসরি ক্ষতি ছিল না, ছিল নিজের নেওয়া availability-র ক্ষতি। এখান থেকেই একটি নকশার শিক্ষা আসে: IT আর operational network-এর আলাদা থাকার মাত্রা যত ভালো আর প্রমাণিত, তত ছোট অংশ বন্ধ করেই কাজ চলে। প্রকাশিত সাক্ষ্য অনুযায়ী ঢোকার পথ ছিল MFA ছাড়া একটি পুরোনো VPN account, যা এই পর্বের প্রথম stepper-এর সঙ্গে মিলে যায়।
হাসপাতালে প্রশ্নটি আরও কঠিন। Ransomware-এর সময় network কেটে দিলে রোগীর চিকিৎসা ব্যাহত হতে পারে, আবার না কাটলে ক্ষতি ছড়াতে পারে। তাই আগে থেকেই ঠিক করে রাখতে হয়: কোন system কত সময় বন্ধ থাকলে কী ক্ষতি, কাগজে কাজ চালানোর পরিকল্পনা কী, আর সিদ্ধান্ত কে নেবেন। মাঝরাতের আতঙ্কে এ সিদ্ধান্ত নেওয়া যায় না। পর্ব ৬২ আর ৬৬-এ এই মহড়া আসবে।
মূল উপলব্ধি: Fail closed-ও একটি ক্ষতি, শুধু সেটি আপনার বেছে নেওয়া ক্ষতি। ভালো নকশা সেই ক্ষতিকে ছোট রাখে: টুকরো করে বন্ধ করার সুযোগ রাখে, আর সিদ্ধান্তটি আগেই মহড়া দেয়।
প্র ০৫“মানুষই সবচেয়ে দুর্বল স্তর” — কথাটি কি ঠিক? নিরাপত্তা গবেষণা কী বলে?
কথাটি জনপ্রিয়, কিন্তু অনেক গবেষক একে অলস সিদ্ধান্ত মনে করেন। ১৯৯৯ সালে দুটি প্রভাবশালী লেখা প্রকাশিত হয়। Whitten ও Tygar-এর “Why Johnny Can't Encrypt” দেখায়, ভালো নকশার email encryption সফটওয়্যারও সাধারণ ব্যবহারকারীরা ঠিকভাবে ব্যবহার করতে পারছেন না; কেউ কেউ ভুল করে গোপন বার্তা খোলা অবস্থায় পাঠিয়ে দিয়েছিলেন। Adams ও Sasse-র “Users Are Not the Enemy” দেখায়, মানুষ password নিয়ম ভাঙেন কারণ নিয়মগুলো তাঁদের কাজের সাথে মেলে না, আর প্রতিষ্ঠান তাঁদের কারণ বোঝায় না। দুটি লেখাই S&S-এর psychological acceptability-কে নতুন করে সামনে আনে।
এর সবচেয়ে বাস্তব ফল password নীতিতে। বহু বছর ধরে নিয়ম ছিল ঘন ঘন password বদলানো আর বিভিন্ন ধরনের অক্ষর বাধ্যতামূলক করা। গবেষণা দেখাল, এতে মানুষ অনুমেয় ছোট পরিবর্তন করেন। NIST SP 800-63B-এর সংস্করণগুলো তাই বাধ্যতামূলক পর্যায়ক্রমিক বদলের বিপক্ষে অবস্থান নিয়েছে এবং ফাঁস হওয়া password যাচাই ও লম্বা password-এর ওপর জোর দিয়েছে। এটি একটি সরল শিক্ষা: কাগজে শক্ত নিয়ম আর বাস্তবে শক্ত নিরাপত্তা এক জিনিস নয়।
Phishing ক্ষেত্রেও একই। “লিংক দেখে চিনুন” শেখানো দরকার, কিন্তু দিনে শত email পাওয়া একজন কর্মীর পক্ষে প্রতিবার নিখুঁত থাকা অসম্ভব। তাই passkey-র মতো ব্যবস্থা বিচারের দায় মানুষ থেকে সরিয়ে নকশায় আনে: প্রমাণটি ভুল site-এ কাজই করে না। প্রতারকের চাপের সামনে মানুষকে একা না রেখে প্রক্রিয়ার দেয়াল তৈরি করাও এই দর্শন, যা পর্ব ৫২-তে আসবে।
তবে মানুষের দায় শূন্য, তা নয়। সচেতনতা দরকার, কিন্তু সেটি ব্যবস্থার ত্রুটির বিকল্প নয়। ভুল রিপোর্ট করলে শাস্তি পেলে মানুষ লুকাবেন, আর তখন detection-ও অন্ধ হবে।
মূল উপলব্ধি: মানুষ সিস্টেমের বাইরের কোনো বিরক্তিকর অংশ নন, তাঁরা সিস্টেমেরই অংশ। যে নকশা স্বাভাবিক মানুষের জন্য কাজ করে না, সেটি নকশার ত্রুটি।
অনুশীলন
হিসাব, নকশা-সমালোচনা আর নিজের যন্ত্রের যাচাই। পরীক্ষা শুধু নিজের সিস্টেমে করবেন; অন্যের সিস্টেমে পরীক্ষার জন্য লিখিত অনুমতি লাগে, আর অনুমতি ছাড়া প্রবেশ অপরাধ। বিস্তারিত পর্ব ০৬-এ (আইন আর নৈতিকতা)।
-
হিসাব: তিনটি স্তর ০.২৫, ০.১০ আর ০.৪০ সম্ভাবনায় একটি খারাপ অনুরোধ ফসকায়, আর একটি common cause-এর সম্ভাবনা c = ০.০১. (ক) স্বাধীন ধরে সব স্তর ফসকানোর সম্ভাবনা কত? (খ) common cause ধরে কত? (গ) সমান খরচে দুটি পথ আছে: প্রথম স্তর ০.২৫ থেকে ০.০৫-এ নামানো, অথবা c-কে ০.০০১-এ নামানো। কোনটি ভালো?
(ক) ০.২৫ × ০.১০ × ০.৪০ = ০.০১.
(খ) P = ০.০১ + ০.৯৯ × ০.০১ = ০.০১ + ০.০০৯৯ = ০.০১৯৯.
(গ) স্তর উন্নত করলে স্বাধীন অংশ ০.০৫ × ০.১০ × ০.৪০ = ০.০০২, মোট ০.০১ + ০.৯৯ × ০.০০২ = ০.০১১৯৮. আর c কমালে মোট ০.০০১ + ০.৯৯৯ × ০.০১ = ০.০১০৯৯. দ্বিতীয় পথটি ভালো, যদিও স্বাধীন হিসাবে প্রথমটিকে পাঁচ গুণ উন্নতি মনে হচ্ছিল।
-
আউটপুট অনুমান করুন: অনুমতির তালিকা
granted = {a read, a write, b read}, আর একটি আলাদা নিষেধের তালিকাdenied = {b write}. অনুরোধগুলো ক্রমে:a read,b write,c read,a delete. Default deny (granted-এ থাকলে ALLOW) আর default allow (denied-এ না থাকলে ALLOW) প্রতিটির জন্য চারটি উত্তর লিখুন।Default deny: ALLOW, deny, deny, deny.
Default allow: ALLOW, deny, ALLOW, ALLOW.
পার্থক্য দুটি জায়গায়: অচেনা
cআর কারও ভাবনায় না থাকাa delete. নিয়ম-লেখকের অজানা জিনিসে দুই ব্যবস্থা ঠিক উল্টো আচরণ করে। -
নকশা সমালোচনা: একটি কাল্পনিক ক্লিনিকের ব্যবস্থা: তিনজন কর্মী একটিই admin account ব্যবহার করেন; বিল তৈরি, ছাড় আর মুছে ফেলা একজনই করতে পারেন; backup একই server-এ থাকে; login server বন্ধ হলে একটি flag দিয়ে “সবাইকে ঢুকতে দিন” চালু করা হয়, আর সেটি কেউ log করে না। অন্তত পাঁচটি নীতির ভাঙন চিহ্নিত করে প্রতিটির একটি সমাধান বলুন।
- Least privilege ও জবাবদিহি: ভাগ করা admin account. সমাধান: আলাদা account, কাজ-ভিত্তিক role.
- Separation of duties: এক ব্যক্তি বিল তৈরি, ছাড় ও মুছতে পারেন। সমাধান: maker-checker, মুছে ফেলার বদলে সংশোধনী লাইন।
- Common cause: backup একই server-এ, তাই একই ঘটনায় দুটোই যাবে। সমাধান: আলাদা জায়গায় immutable backup (পর্ব ৩৪)।
- Fail open: সবার জন্য খুলে দেওয়া। সমাধান: সীমিত break-glass account, শুধু জরুরি তথ্যে।
- Compromise recording: log নেই। সমাধান: জরুরি প্রবেশের আলাদা, পরিবর্তন-অযোগ্য রেকর্ড আর পরদিন পর্যালোচনা।
- Psychological acceptability: ভাগ করা account হয়তো বারবার login-এর ঝামেলা এড়াতে। সমাধান: দ্রুত login, যেমন কার্ড বা passkey.
-
নিজের attack surface: শুধু নিজের phone আর কম্পিউটারে ১৫ মিনিটের একটি audit করুন: (ক) কোন app-এ camera, location বা SMS অনুমতি আছে, যা তার কাজে দরকার নেই? (খ) কম্পিউটারে দৈনন্দিন account-টি কি administrator? (গ) কোন অ্যাপ বা account গত এক বছরে ব্যবহার করেননি? তিনটি বদল বেছে নিন, আর প্রতিটির সাথে একটি নীতির নাম মেলান।
উত্তর ব্যক্তিভেদে আলাদা হবে। সাধারণ ফল: টর্চ বা photo-সম্পাদনা app-এর অপ্রয়োজনীয় অনুমতি বন্ধ করা (least privilege); ব্যবহার-না-করা app ও account মুছে ফেলা (attack surface reduction); দৈনন্দিন কাজে সাধারণ account আর শুধু দরকারে admin (least privilege, separation of privilege); Bank ও email-এ MFA চালু করা (defense in depth). কোনো অনুমতি বন্ধ করে app ভেঙে গেলে আবার চালু করা সহজ। এটিই ন্যূনতম থেকে শুরু করার সুবিধা।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমSeparation of duties মেনে একটি vendor payment-এর ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- Maker payment-এর খসড়া তৈরি করেন
- Checker নিবন্ধিত vendor তথ্যের সাথে মেলান
- Checker অনুমোদন দেন
- Treasury টাকা ছাড়ে
- হিসাব বিভাগ ব্যাংক বিবরণীর সাথে মিলিয়ে দেখে
একটি নিয়ম ভুল লেখা হলো। Default deny ব্যবস্থায় সাধারণত কী ঘটে, যা default allow ব্যবস্থায় ঘটে না?
- অচেনা সবাই ঢুকে পড়ে
- কোনো বৈধ ব্যবহারকারী আটকে যান, তাই ভুলটি দ্রুত ধরা পড়ে
- নিয়মের ভুলে কোনো প্রভাব পড়ে না
- সব ঘটনা নিজে থেকেই audit log-এ চলে যায়
তিনটি স্বাধীন স্তর ০.২০, ০.৫০ আর ০.১০ সম্ভাবনায় একটি খারাপ অনুরোধ ফসকায়। তিনটিই ফসকানোর সম্ভাবনা কত?
- ০.৮০
- ০.১০
- ০.০১
- ০.০০১
একটি প্রতিষ্ঠানে VPN, email আর server তিনটিই একই login সিস্টেমে চলে, আর সবগুলোর জন্য একটিই admin account. Defense in depth-এর দিক থেকে মূল সমস্যা কী?
- তিনটি পণ্য কেনার খরচ বেশি
- Traffic encrypted নয়
- স্তরের সংখ্যা তিনের কম হওয়া উচিত
- একটি common cause সব স্তর একসাথে অকেজো করতে পারে
একটি হাসপাতালের জরুরি বিভাগে login server বন্ধ থাকলে রোগীর তথ্য দেখার জন্য কোন নকশাটি সবচেয়ে উপযুক্ত?
- Break-glass: জরুরি প্রবেশ মেলে, আর সব প্রবেশ রেকর্ড ও পরে পর্যালোচনা হয়
- পুরো fail closed: server না ফেরা পর্যন্ত কেউ তথ্য দেখবেন না
- পুরো fail open: যাচাই বা রেকর্ড ছাড়াই সবাই সব দেখবেন
- সব ডাক্তারের জন্য একটি ভাগ করা password
Open design নীতি অনুযায়ী কোনটি সঠিক?
- পদ্ধতি আর key দুটোই প্রকাশ্য থাকবে
- পদ্ধতি জানা গেলেও নিরাপদ থাকবে; গোপন থাকবে শুধু key বা password
- নকশা গোপন রাখাই সিস্টেমের মূল নিরাপত্তা
- সব সফটওয়্যার অবশ্যই open source হতে হবে
Maker-checker ব্যবস্থায় একজন কর্মী payment তৈরি করে নিজেই অনুমোদনের চেষ্টা করলেন। ভালো নকশার সিস্টেম কী করবে, আর এই নিয়ন্ত্রণ একা কী ঠেকাতে পারে না?
- অনুমতি দেবে; একা ব্যক্তির জালিয়াতি ঠেকাতে পারে না
- Payment মুছে দেবে; সব ধরনের ভুল ঠেকাতে পারে না
- নিষেধ করে log-এ রাখবে; দুজনের যোগসাজশ একা ঠেকাতে পারে না
- নিষেধ করবে; এটি সব জালিয়াতি ঠেকাতে পারে
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- Saltzer ও Schroeder-এর (১৯৭৫) আট নীতি আইন নয়, সতর্কবার্তা; এগুলো tool নয়, চিন্তার কাঠামো শেখায়।
- Least privilege ক্ষতির সীমা ছোট করে, default deny ভুলকে নিরাপদ দিকে ঠেলে দেয়, complete mediation প্রতিটি প্রবেশ যাচাই করে।
- Defense in depth-এ ঝুঁকি গুণ হয় শুধু স্বাধীন স্তরে: P = c + (১ − c) × স্তরগুলোর গুণফল। Common cause আগে দূর করুন।
- ব্যর্থতার দিক আগেই ঠিক করুন: ভল্ট fail secure, অগ্নিনির্গমন fail safe, প্রকাশ্য পাতা হয়তো fail open, হাসপাতালে break-glass ও রেকর্ড।
- Separation of duties এক হাতে পুরো কাজ রাখে না; zero trust অবস্থানকে বিশ্বাস করে না; usability নিজেই একটি নিরাপত্তা-গুণ।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ০৪ · Threat modeling — STRIDE, attack surface আর কোন ঝুঁকি আগেপরবর্তী পর্বএই নীতিগুলো একটি নির্দিষ্ট সিস্টেমে প্রয়োগ করার পদ্ধতি।
- সাইবার নিরাপত্তা · কোর্স হোম৮০টি পর্বপুরো কোর্সের রোডম্যাপ।
- Operating Systems · Protectionগভীরে যানAccess matrix, capability আর OS-এর ভেতরের সুরক্ষা।
- Cloud & DevOps · IAM policy evaluationপাশের ট্র্যাকDefault deny আর least privilege বাস্তব cloud-এ।
- System Design · Security designপাশের ট্র্যাকTrust boundary আর বড় সিস্টেমে নিরাপত্তার নকশা।
- System Design · Resilience patternsপাশের ট্র্যাকব্যর্থতার সময় সিস্টেমকে সামলানোর নকশা।