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

DNS আর email নিরাপত্তা — DNSSEC, SPF, DKIM আর DMARC

DNS and Email Security — DNSSEC, SPF, DKIM & DMARC

Taught in Bangla, this lesson covers DNS risks and defenses (cache poisoning, registrar takeover, dangling records), DNSSEC's chain of trust, DoT, DoH, protective DNS and DNS logs, then email authentication: reading and writing SPF, DKIM and DMARC records, alignment, phased DMARC rollout with aggregate reports, forwarding problems, MTA-STS, TLS-RPT, BIMI, and protecting non-sending domains, with toy evaluators.

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

  • Cache poisoning, registrar account দখল আর ঝুলে থাকা record, প্রতিটির প্রতিরক্ষা
  • DNSSEC-এর বিশ্বাসের শিকল, এটি কী প্রমাণ করে আর কী করে না
  • DoT, DoH, protective DNS, sinkhole আর DNS log দিয়ে detection
  • SPF, DKIM আর DMARC নিজে পড়া, লেখা আর ভুল ধরা
  • DMARC rollout, aggregate report পড়া, forwarding আর mailing list-এর সমস্যা
  • MTA-STS, TLS-RPT, BIMI, বড় mail সেবার নিয়ম আর চিঠি না পাঠানো domain-এর সুরক্ষা

১ · নামের ওপর বিশ্বাস — কেন DNS আর email একসাথে

এলাকার পোস্ট অফিসের কথা ভাবুন। ঠিকানা-খাতায় লেখা আছে কোন বাড়ি কোথায়। পিয়ন সেই খাতা দেখে চিঠি দেন। কেউ খাতার একটি লাইন বদলে দিলে আপনার চিঠি অন্য বাড়িতে যাবে। আবার কেউ খামে আপনার নাম লিখে চিঠি পাঠালে প্রাপক ভাববেন, চিঠিটি আপনারই।

ইন্টারনেটে এই ঠিকানা-খাতা হলো DNS, আর চিঠি পৌঁছানোর নিয়ম হলো SMTP. দুটিই ১৯৮০-এর দশকের নকশা। তখন network-এর মানুষ একে অপরকে চিনতেন, তাই পরিচয় প্রমাণের ব্যবস্থা মূল নকশায় ছিল না। DNS কীভাবে কাজ করে তা Computer Networks-এর DNS পর্বে আর চিঠি কীভাবে পৌঁছায় তা email পর্বে দেখানো হয়েছে। এখানে আমরা রক্ষকের চোখে দেখব: কী ভাঙতে পারে, কীভাবে ঠেকাবেন, আর কীভাবে জানবেন।

দুটি বিষয় একই পর্বে থাকার কারণ সহজ। Email-এর সব প্রতিরক্ষা DNS-এর record-এ প্রকাশ হয়। আর ওয়েবের certificate পাওয়ার domain validation-ও অনেক সময় DNS বা mail-এর ওপর নির্ভর করে। নিচের ছবিটি দেখুন: ওপরের স্তর ভাঙলে নিচের সবকিছু একসাথে ঝুঁকিতে পড়ে।

কে কার ওপর দাঁড়িয়ে

Registrar account sits above the zone, and the zone sits above web and mail trust

Registrar থেকে ব্যবহারকারীর বিশ্বাস পর্যন্ত নির্ভরতার স্তর Registrar account MFA, lock, নবায়ন, পরিবর্তনের alert Authoritative DNS zone NS, DS, সব record-এর উৎস A, CAAMXTXT ওয়েব সার্ভারTLS certificate কোন সার্ভারচিঠি নেবে SPF, DKIM keyDMARC নীতি ব্যবহারকারীর বিশ্বাস: এই সাইট, এই চিঠি আসল
ছবি ২৬.১ — Registrar account সবার ওপরে। এখানে ভাঙলে নিচের প্রতিটি নিয়ন্ত্রণ আক্রমণকারী নিজেই বদলাতে পারে।

সীমারেখা: এই পর্বের প্রতিটি কমান্ড আর পরীক্ষা শুধু আপনার নিজের domain-এর জন্য, অথবা যে domain-এর লিখিত অনুমতি আছে তার জন্য। অন্যের নামে চিঠি পাঠিয়ে “পরীক্ষা” করা, অন্যের DNS-এ খোঁজাখুঁজি বা কারও record দখলের চেষ্টা বেআইনি হতে পারে। অনুমতি আর আইনের বিষয়ে পর্ব ৬ দেখুন।

২ · DNS-এর তিন ঝুঁকি আর তাদের প্রতিরক্ষা

DNS-এর ভুল উত্তর তিনটি জায়গা থেকে আসতে পারে: পথের মাঝে বা resolver-এর cache-এ, উৎসে অর্থাৎ registrar বা authoritative server-এ, আর আপনার নিজের ভুলে যাওয়া পুরোনো record থেকে।

ক. Cache poisoning — খাতায় ভুল লাইন ঢোকা

Resolver একবার উত্তর পেলে TTL শেষ না হওয়া পর্যন্ত সেটি মনে রাখে। Cache poisoning মানে সেই cache-এ ভুল উত্তর ঢুকে যাওয়া। তখন একই resolver-এর সব ব্যবহারকারী ভুল ঠিকানা পান। Spoofing-এর সাধারণ ধারণা পর্ব ২১-এ, আর network-এর দিক Computer Networks-এর আক্রমণ ও প্রতিরক্ষা পর্বে আছে। পুরোনো resolver শুধু ১৬ bit-এর query ID মেলাত, আর আধুনিক resolver এলোমেলো source port-ও মেলায়। হিসাবটি দেখুন।

হিসাব

ধরুন একটি উত্তরের সময়সীমায় ১০০টি ভুল উত্তর পৌঁছাল। শুধু ID থাকলে সম্ভাবনা ১০০ ÷ ৬৫,৫৩৬ ≈ ০.১৫%. ID-র সাথে প্রায় ৬০,০০০টি port মিশলে (অনুমান) সম্ভাবনা ১০০ ÷ (৬৫,৫৩৬ × ৬০,০০০) ≈ ০.০০০০০২৫%. এটি প্রায় ৬০,০০০ গুণ কম, তবু শূন্য নয়। তাই গণিতের সুরক্ষার ওপর DNSSEC বসানো হয়।

প্রতিরক্ষা: Resolver আপডেট রাখা, port randomization, RFC 5452-এর সুপারিশ মানা, ভেতরের resolver বাইরের সবার জন্য খোলা না রাখা, আর সম্ভব হলে DNSSEC যাচাই চালু করা।

খ. Registrar বা DNS account দখল — দলিলই বদলে যাওয়া

পোস্ট অফিসের খাতায় ভুল লেখা এক জিনিস। আর ভূমি অফিসের দলিলে মালিকের নাম বদলে যাওয়া আরেক জিনিস। দ্বিতীয় ক্ষেত্রে সব কাগজ “বৈধ” দেখায়। Registrar account দখলও তেমন: আক্রমণকারীর পাঠানো record কোনো জাল record নয়, zone-এর আসল record.

DNS hijacking-এ NS, A বা MX record বদলে যায়। সবচেয়ে পরিচিত প্রকাশিত উদাহরণ যুক্তরাষ্ট্রের CISA-র Emergency Directive 19-01 (জানুয়ারি ২০১৯). সেখানে বলা হয়, আক্রমণকারীরা DNS বদলানোর অধিকারওয়ালা account-এর credential পেয়ে record বদলেছিল, ট্রাফিক নিজেদের দিকে নিয়েছিল, আর ওই domain-এর জন্য বৈধ certificate-ও পেয়েছিল। সংস্থাগুলোকে যা করতে বলা হয়: record audit, DNS account-এর password বদল, MFA চালু, আর Certificate Transparency log নজরে রাখা।

  • Account: Phishing-প্রতিরোধী MFA (পর্ব ১৬), SMS নয়। ব্যক্তিগত নয়, প্রতিষ্ঠানের নিয়ন্ত্রিত account. কম মানুষের হাতে অধিকার (পর্ব ২০).
  • Lock: Registrar lock চালু রাখুন। গুরুত্বপূর্ণ domain-এ registry lock দেখুন, যদি আপনার TLD আর registrar দেয়।
  • চক্র ভাঙুন: Registrar account-এর recovery email ওই একই domain-এ রাখবেন না। Domain হারালে recovery-ও হারাবে। অন্য domain-এর একটি নিয়ন্ত্রিত ঠিকানা রাখুন।
  • নবায়ন: Auto-renew চালু রাখুন, একাধিক যোগাযোগ দিন, মেয়াদের তারিখ asset তালিকায় লিখুন।
  • পরিবর্তন নজরদারি: বাইরে থেকে নিজের NS, MX, DS, CAA আর TXT নিয়মিত মেলান। DNS পরিবর্তনে review আর ticket রাখুন। CAA record দিয়ে অনুমোদিত CA সীমিত করুন, আর CT monitoring চালান।

গ. Dangling record আর subdomain takeover — পুরোনো সাইনবোর্ড

দোকান উঠে গেছে, কিন্তু মোড়ে সাইনবোর্ড রয়ে গেছে: “এই গলিতে আমাদের শাখা।” কেউ সেই জায়গা ভাড়া নিলে সাইনবোর্ডের বিশ্বাসটুকুও পেয়ে যায়। Dangling record-ও তাই। promo.example.com-এর CNAME একটি cloud সেবার দিকে ছিল। সেবা মোছা হলো, record থাকল। অন্য কেউ সেই নামটি নিতে পারলে আপনার subdomain তার হাতে চলে যায়। একে বলে subdomain takeover. ফল হতে পারে phishing পাতা, cookie-র ঝুঁকি, এমনকি আপনার নামে certificate.

Guardio Labs-এর ২০২৪ সালের “SubdoMailing” প্রতিবেদনে বলা হয়, বহু প্রতিষ্ঠানের ভুলে যাওয়া CNAME আর SPF include-এর লক্ষ্য মেয়াদোত্তীর্ণ domain ছিল। সেগুলো নতুন করে কিনে spam পাঠানো হচ্ছিল, আর চিঠিগুলো যাচাইও পার হতো। শিক্ষা হলো: SPF include মানে বিশ্বাস ধার দেওয়া। যাকে দিয়েছেন, সে না থাকলে বিশ্বাসটি ফিরিয়ে নিন।

  • ক্রম ঠিক রাখুন: আগে DNS record মুছুন, তারপর সেবা। শুরুতে উল্টোটি করলে মাঝের সময়টি ঝুঁকির।
  • তালিকা রাখুন: প্রতিটি record-এর মালিক আর কারণ লিখে রাখুন। Infrastructure as Code হলে record আর সেবা একসাথে তৈরি ও মোছা যায়।
  • নিয়মিত মিলিয়ে দেখুন: নিজের zone-এর CNAME, NS, MX আর SPF include-এর লক্ষ্য এখনও আপনার বা আপনার vendor-এর কি না।

৩ · DNSSEC — উত্তরের ওপর সিলমোহর

DNSSEC (মূল মান RFC 4033–4035, ২০০৫) প্রতিটি record-সেটে digital signature জোড়ে। সরকারি চিঠিতে সিলের মতো: সিল দেখে বোঝা যায় চিঠি কোন দপ্তরের, চিঠি গোপন থাকে না। Signature আর key-র ভিত্তি পর্ব ১১-এ দেখেছেন। DNSSEC-এর বিশ্বাসের শিকল PKI-র মতো, তবে CA-র বদলে DNS-এর গাছ ধরে চলে। নিচে একটি resolver কীভাবে www.example.com-এর উত্তর যাচাই করছে দেখুন। মানগুলো কাল্পনিক।

  1. উত্তরA + RRSIGwww.example.com
  2. Zone keyDNSKEYexample.com
  3. Parent-এর hashDS.com-এ রাখা
  4. RootDS, DNSKEYtrust anchor
  5. ফলAD = 1secure
Resolver পেলউত্তরের সাথে signature
www.example.com.  300  IN  A      192.0.2.10
www.example.com.  300  IN  RRSIG  A 13 3 300 (...)
signer = example.com, key tag = 11111
Zone-এর keyZSK দিয়ে সই মেলানো
example.com. DNSKEY  ZSK (tag 11111)  record সই করে
example.com. DNSKEY  KSK (tag 22222)  DNSKEY-সেট সই করে
RRSIG(A) ZSK দিয়ে যাচাই: মিলেছে
প্রশ্ন বাকি: এই key কি সত্যিই example.com-এর?
.com zoneParent বলছে কোন key ঠিক
example.com. DS  22222 13 2 h1
hash(KSK 22222) = h1  মিলেছে
এই DS-এ .com-এর নিজের RRSIG আছে
Root zoneশিকলের শেষ মাথা
com. DS  33333 13 2 h2   root-এর সই করা
hash(.com KSK) = h2     মিলেছে
root key = resolver-এ আগে থেকে রাখা trust anchor
Client পেলশিকল সম্পূর্ণ
flags: qr rd ra ad
www.example.com.  300  IN  A  192.0.2.10
ad = resolver যাচাই করেছে
যদি পথে উত্তর বদলায়Bogus
www.example.com.  300  IN  A  203.0.113.66
RRSIG(A) যাচাই: মেলেনি
Client পায়: status: SERVFAIL
ভুল ঠিকানার বদলে কোনো ঠিকানাই নয়
  1. উত্তর আর সই। Resolver DNSSEC চেয়ে প্রশ্ন করল। Authoritative server দিল A record 192.0.2.10, সাথে তার RRSIG সই।
  2. Zone-এর key. Resolver example.com-এর DNSKEY আনল। ছোট কাজের key (ZSK) দিয়ে A record-এর সই মিলল। KSK সই করে DNSKEY-সেটকে। কিন্তু এই key-গুলো কি আসল?
  3. Parent-এর সাক্ষ্য। .com zone-এ DS record আছে, যা KSK-র hash. Resolver নিজে hash করে দেখল h1 মিলছে। আর DS-এর ওপর .com-এর সই আছে।
  4. Root পর্যন্ত। একইভাবে .com-এর key-কে সমর্থন করে root zone-এর DS. Root-এর key resolver-এ আগে থেকেই রাখা trust anchor, যেমন browser-এ root CA রাখা থাকে। Root zone ২০১০ সালে সই করা শুরু হয়।
  5. Secure. শিকল সম্পূর্ণ। Resolver উত্তরে AD (Authenticated Data) flag বসাল। খেয়াল করুন, এই flag বসিয়েছে resolver, তাই client-কে resolver পর্যন্ত পথটি বিশ্বাস করতে হয়।
  6. Bogus. কেউ পথে A record বদলে 203.0.113.66 করলে সই মেলে না। যাচাই করা resolver ভুল ঠিকানা না দিয়ে SERVFAIL দেয়। নিরাপত্তা বাড়ে, তবে ভুল সইয়ে সেবাও বন্ধ হয়। তাই key rollover সাবধানে করতে হয়।
DNSSEC প্রমাণ করেDNSSEC প্রমাণ করে না
উত্তর zone-এর key দিয়ে সই করা, পথে বদলায়নিZone-এর record ঠিক উদ্দেশ্যে লেখা। Registrar দখল হলে আক্রমণকারীও বৈধ সই পেতে পারে
একটি নাম বা record type সত্যিই নেই (NSEC, NSEC3)প্রশ্ন গোপন। DNSSEC কোনো encryption দেয় না
Parent থেকে child পর্যন্ত key-র ধারাবাহিকতাওই IP-তে আসল সার্ভার আছে। সেটি দেখে TLS (পর্ব ১২)
Resolver পর্যন্ত যাচাইResolver থেকে আপনার device-এর শেষ পথটি নিরাপদ
—সাইটটি নিরাপদ বা সৎ। Scam সাইটের domain-ও DNSSEC দিতে পারে

নিজের domain-এ DNSSEC আছে কি না দেখতে নিচের কমান্ড কাজে লাগে। example.com-এর জায়গায় নিজের domain বসাবেন।

# ১. উত্তরে RRSIG আছে কি না, আর ad flag বসেছে কি না
dig +dnssec A example.com

# ২. Parent-এ DS প্রকাশিত আছে কি না
dig +short DS example.com

নমুনা আউটপুট — version-ভেদে আলাদা হতে পারে (কমান্ড ১-এর অংশ, হাতে সাজানো; কোনো আসল query নয়):

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4242
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; ANSWER SECTION:
example.com.  300  IN  A      192.0.2.10
example.com.  300  IN  RRSIG  A 13 2 300 20261130000000 20261101000000 11111 example.com. example-signature==

আরও গভীরে: DNSSEC-এর সবচেয়ে বড় ঝুঁকি ব্যবহারে। Slack-এর প্রকাশিত ২০২১ সালের postmortem বলে, DNSSEC চালুর এক চেষ্টায় DS record resolver-এর cache-এ থেকে যাওয়ায় কিছু ব্যবহারকারীর সমস্যা হয়েছিল। ২০২৪ সালে প্রকাশিত KeyTrap গবেষণা দেখায়, যাচাইয়ের কাজ নিজেই resolver-এর ওপর বাড়তি চাপ হতে পারে, আর পরে বড় resolver-গুলো patch দেয়। Algorithm 13 (ECDSA P-256) ছোট সই দেয়, যা DNS-এর জন্য সুবিধাজনক। DNSSEC চালু করার আগে TTL, rollover-এর ক্রম আর rollback পরিকল্পনা লিখে রাখুন।

৪ · DoT, DoH, protective DNS আর DNS log

সাধারণ DNS খোলা পোস্টকার্ডের মতো: পথের যে কেউ পড়তে পারে আপনি কোন নাম খুঁজছেন। DoT (RFC 7858) আর DoH (RFC 8484) সেই পোস্টকার্ডকে খামে ভরে। তবে এটি শুধু আপনার device থেকে resolver পর্যন্ত। Resolver সব দেখে। তাই “এনক্রিপ্ট করেছি, এখন কেউ দেখে না” কথাটি ঠিক নয়, শুধু দেখার লোক বদলেছে।

ব্যবস্থাকী দেয়প্রতিষ্ঠানের জন্য সতর্কতা
DNSSECউত্তরের সত্যতাভুল key-তে সেবা বন্ধ। গোপনীয়তা দেয় না
DoTDevice থেকে resolver পথে গোপনীয়তা, TCP 853আলাদা port, তাই চেনা, অনুমোদন বা আটকানো সহজ
DoHএকই গোপনীয়তা, port 443ওয়েব ট্রাফিকে মিশে থাকে। Application নিজের resolver বেছে নিলে আপনার filter আর log এড়িয়ে যায়
Protective DNSক্ষতিকর domain আটকানো আর logFalse positive আর log-এর privacy সামলাতে হয়

এখানে দুটি ন্যায্য স্বার্থের টানাপোড়েন আছে। কফিশপের Wi-Fi-তে ব্যক্তির গোপনীয়তা বাড়ে, কিন্তু প্রতিষ্ঠানের নিরাপত্তা দল DNS-ভিত্তিক দৃশ্যমানতা হারাতে পারে। NSA-এর ২০২১ সালের নির্দেশিকা “Adopting Encrypted DNS in Enterprise Environments” প্রতিষ্ঠানের জন্য যা বলে তার সারকথা: সব DNS, এনক্রিপ্টেড হোক বা না হোক, নির্ধারিত প্রতিষ্ঠানের resolver-এ যাবে, আর সেই resolver এনক্রিপ্টেড DNS সমর্থন করবে। ভালো নকশা তাই encrypted DNS বন্ধ করা নয়, বরং অনুমোদিত resolver-এ encrypted DNS দেওয়া।

Protective DNS হলো সেই resolver, যা threat intelligence দেখে পরিচিত ক্ষতিকর নাম আটকায়। DNS sinkhole ক্ষতিকর নামের জন্য নিজের নিয়ন্ত্রণের ঠিকানা ফেরত দেয়, যেমন 192.0.2.53. ফলে C2 সংযোগ আসল সার্ভারে পৌঁছায় না, আর log দেখায় কোন device প্রশ্নটি করেছিল। সীমাও আছে: সরাসরি IP-তে সংযোগ এটি থামায় না, আর নতুন domain তালিকায় ঢুকতে সময় লাগে। এটি defense in depth-এর একটি স্তর মাত্র।

DNS log — ছোট log, বড় ইঙ্গিত

প্রায় সব সংযোগের আগে একটি নাম খোঁজা হয়। তাই DNS log সস্তায় অনেক কিছু দেখায়। নিচের ইঙ্গিতগুলো প্রমাণ নয়, তদন্তের শুরু।

ইঙ্গিতকী হতে পারেসাধারণ নির্দোষ কারণ
একটি device-এ হঠাৎ বহু NXDOMAINMalware এলোমেলো নাম খুঁজছেভুল config, পুরোনো সফটওয়্যার
খুব লম্বা, এলোমেলো subdomain, অনেক TXT প্রশ্নDNS দিয়ে তথ্য পাচার বা গোপন যোগাযোগCDN, anti-virus lookup
অনুমোদিত resolver ছাড়া port 53 বা 853-এ ট্রাফিকনিয়ন্ত্রণ এড়ানোLab, নতুন device
সদ্য নিবন্ধিত domain-এ প্রশ্নPhishing বা নতুন অবকাঠামোবৈধ নতুন সেবা
নিজের zone-এর NS, MX, DS বা TXT বদলAccount দখল বা অননুমোদিত পরিবর্তননির্ধারিত change
title: DNS over TLS to an unapproved resolver
status: experimental
description: Port 853 traffic to any address other than the approved resolver
logsource:
  category: firewall
detection:
  selection:
    dst_port: 853
  filter_approved:
    dst_ip: 192.0.2.53
  condition: selection and not filter_approved
falsepositives:
  - A lab network that is not yet registered
level: medium

DNS log ব্যক্তিগত তথ্যও বটে, কারণ এতে কে কোন সাইট খুঁজেছে তা থাকে। তাই সংরক্ষণের মেয়াদ আর পড়ার অধিকার সীমিত রাখুন। Log রাখা আর নিয়ম লেখা নিয়ে পর্ব ৫৫ (নিরাপত্তার log) আর পর্ব ৫৬ (SIEM আর detection rule)-এ আরও আছে।

৫ · SMTP-র ফাঁক আর SPF

SMTP-র প্রথম মান RFC 821 (১৯৮২), আর বর্তমান মূল মান RFC 5321 (২০০৮). একটি চিঠিতে দুটি আলাদা “প্রেরক” থাকে। ডাকঘরের খাম আর খামের ভেতরের চিঠির প্যাডের মতো। খামে এক ঠিকানা, প্যাডে আরেক ঠিকানা লেখা সম্ভব। মূল প্রোটোকল দুটির কোনোটিই যাচাই করে না। তাই spoofing এত সহজ ছিল, আর phishing এত সফল।

একটি চিঠিতে তিনটি domain

SPF checks the envelope, DKIM checks d=, DMARC compares both with the From the reader sees

Envelope, DKIM domain আর header From-এর সম্পর্ক Header From — পাঠক যা দেখেন news@example.com DMARC: মিল আছে? খাম: MAIL FROM bounce@example.net DKIM সই d=example.com SPF: এই IP কি অনুমোদিত? DKIM: সই কি অক্ষত?
ছবি ২৬.২ — খামের প্রেরক আর Header From আলাদা হতে পারে। DMARC-এর কাজ এদের মেলানো।

SPF (RFC 7208, ২০১৪) domain-এর TXT record-এ অনুমোদিত প্রেরকের তালিকা রাখে। Receiver খামের MAIL FROM-এর domain ধরে দেখে, সংযোগের IP তালিকায় আছে কি না। বাঁ থেকে ডানে প্রথম মিলেই ফল ঠিক হয়।

; নিজের নিয়ন্ত্রিত zone-এর উদাহরণ। ঠিকানাগুলো documentation block.
example.com.                     3600 IN MX  10 mail.example.com.
example.com.                     3600 IN TXT "v=spf1 ip4:192.0.2.0/25 include:_spf.example.net -all"
sel2026._domainkey.example.com.  3600 IN TXT "v=DKIM1; k=rsa; p=example-public-key-base64"
_dmarc.example.com.              3600 IN TXT "v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com"
অংশ বা ফলমানে
-allতালিকার বাইরে সবাই fail
~allSoftfail: সন্দেহজনক, সাধারণত গ্রহণ করে চিহ্ন দেয়
+allসবাই অনুমোদিত। কখনো ব্যবহার করবেন না
কিছুই না মিললে, all না থাকলেNeutral
permerrorRecord ভাঙা, অথবা lookup সীমা পার

১০-lookup সীমা: include, a, mx, ptr, exists আর redirect, এই সবগুলো DNS প্রশ্ন ঘটায়। RFC 7208 (অংশ ৪.৬.৪) বলে, পুরো যাচাইয়ে এদের মোট সংখ্যা ১০ পেরোলে ফল permerror. ভেতরের include-গুলোও এই হিসাবে ঢোকে। শূন্য উত্তর দেওয়া lookup-এর (void lookup) সীমা ২ রাখা উচিত, এমন সুপারিশও আছে। ip4 আর all কোনো DNS প্রশ্ন করে না, তাই গোনা হয় না। আর একটি domain-এ SPF record একটিই থাকবে।

নিচের simulator-এ DNS নেই, record একটি object-এ রাখা। এটি শুধু ip4, include আর all বোঝে, পূর্ণ SPF নয়। heavy.example.org-এ ১১টি include আছে।

// Toy SPF evaluator: in-memory records only, no DNS query is sent.
const zone = {
  'example.com': 'v=spf1 ip4:192.0.2.0/25 include:_spf.example.net -all',
  '_spf.example.net': 'v=spf1 ip4:198.51.100.0/26 ~all',
  'soft.example.org': 'v=spf1 ip4:192.0.2.128/25 ~all',
  'heavy.example.org': 'v=spf1 ' + Array.from({ length: 11 },
    (_, i) => `include:v${i + 1}.example.net`).join(' ') + ' -all',
};
for (let i = 1; i <= 11; i++) zone[`v${i}.example.net`] = 'v=spf1 ip4:203.0.113.' + i + '/32 -all';
const num = ip => ip.split('.').reduce((a, b) => a * 256 + Number(b), 0);
const inCidr = (ip, cidr) => { const [net, bits = '32'] = cidr.split('/'), size = 2 ** (32 - Number(bits));
  return Math.floor(num(ip) / size) === Math.floor(num(net) / size); };
const QUAL = { '+': 'pass', '-': 'fail', '~': 'softfail', '?': 'neutral' };
function spf(domain, ip, st) {
  const rec = zone[domain]; if (!rec) return 'none';
  for (const term of rec.split(' ').slice(1)) {
    const q = QUAL[term[0]] ? term[0] : '+';
    const t = term.replace(/^[-+~?]/, ''), [mech, arg] = t.split(':');
    if (mech === 'all') return QUAL[q];
    if (mech === 'ip4' && inCidr(ip, arg)) return QUAL[q];
    if (mech === 'include') {
      if (++st.lookups > 10) return 'permerror';   // RFC 7208 section 4.6.4
      const r = spf(arg, ip, st);
      if (r === 'pass') return QUAL[q];
      if (r === 'permerror' || r === 'none') return 'permerror';
    }
  }
  return 'neutral';                                // no match, no "all"
}
for (const [d, ip] of [['example.com', '192.0.2.10'], ['example.com', '198.51.100.5'],
  ['example.com', '203.0.113.9'], ['soft.example.org', '203.0.113.9'], ['heavy.example.org', '192.0.2.10']]) {
  const st = { lookups: 0 };
  console.log(d.padEnd(18), ip.padEnd(13), spf(d, ip, st).padEnd(10), 'lookups=' + st.lookups);
}

আউটপুট:

example.com        192.0.2.10    pass       lookups=0
example.com        198.51.100.5  pass       lookups=1
example.com        203.0.113.9   fail       lookups=1
soft.example.org   203.0.113.9   softfail   lookups=0
heavy.example.org  192.0.2.10    permerror  lookups=11

প্রথম লাইনে 192.0.2.10 সরাসরি /25-এ মিলেছে, তাই lookups=0. দ্বিতীয় লাইনে IP include-এর ভেতরে মিলেছে, এক lookup খরচ হয়েছে। তৃতীয় লাইনে include-এর ভেতরের ~all “মিলল না” অর্থ দিয়েছে, শেষে বাইরের -all ফল দিয়েছে fail. এটিই সাধারণ ভুল বোঝাবুঝি: include-এর ভেতরের fail পুরো ফল নয়। শেষ লাইনে আসল চিঠিটি বৈধ হলেও record ১১তম include-এ ভেঙে গেছে, তাই permerror.

সীমা পেরোলে কী করবেন: অব্যবহৃত vendor-এর include সরান। প্রতিটি vendor-কে আলাদা subdomain দিন, যেমন news.example.com. ptr এড়িয়ে চলুন। IP-তে “flatten” করলে lookup কমে, কিন্তু vendor-এর IP বদলালে record পুরোনো হয়ে যায়, তাই সতর্ক থাকুন।

৬ · DKIM — চিঠির ওপর সিলমোহর

SPF পিয়নের তালিকা দেখে। DKIM (RFC 6376, ২০১১) দেখে চিঠির সিলমোহর। পাঠানো সার্ভার private key দিয়ে নির্বাচিত header আর body-র hash-এর ওপর সই করে। Receiver public key আনে DNS থেকে। Selector দিয়ে একই domain-এ একাধিক key রাখা যায়। তাই s=sel2026 আর d=example.com হলে key থাকে sel2026._domainkey.example.com-এ।

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
  d=example.com; s=sel2026;
  h=from:to:subject:date:message-id;
  bh=example-body-hash-base64=;
  b=example-signature-base64=
  • কী প্রমাণ করে: d= domain-এর key-ধারী এই চিঠি সই করেছে, আর সই করা অংশ বদলায়নি।
  • কী করে না: চিঠি encrypt করে না। বিষয়বস্তু সত্য কি না বলে না। From-এর সাথে d=-এর মিল নিজে দেখে না।
  • Key: RFC 8301 (২০১৮) rsa-sha1 সই নিষেধ করে, আর RSA key-তে ন্যূনতম ১০২৪ bit, পছন্দসই ২০৪৮ bit বলে। RFC 8463 (২০১৮) Ed25519 যোগ করেছে, তবে সব receiver সমর্থন করে না বলে অনেকে RSA-ও রাখেন।
  • Rotation: নতুন selector প্রকাশ, সই বদল, পুরোনো চিঠি পৌঁছানোর সময় দেওয়া, তারপর পুরোনো key-র p= খালি করা। এটিই নিরাপদ key rotation.

নিচের Python কোডে আসল hashlib দিয়ে শুধু bh= অংশটি বোঝানো হয়েছে। এটি সরলীকৃত উদাহরণ: সই নেই, key নেই, আর DKIM-এর সব নিয়ম নেই। লক্ষ্য একটি প্রশ্ন: body-র কোন বদল hash ভাঙে?

# Simplified DKIM-style body hash: the "bh=" part only, no key and no signature.
# Based on the relaxed body rules of RFC 6376, section 3.4.4. A teaching sketch.
import base64, hashlib, re

def relaxed_body(text):
    lines = text.replace("\r\n", "\n").split("\n")
    lines = [re.sub(r"[ \t]+", " ", ln).rstrip(" ") for ln in lines]
    while lines and lines[-1] == "":
        lines.pop()
    return "".join(ln + "\r\n" for ln in lines) if lines else ""

def simple_body(text):
    body = text.replace("\r\n", "\n").rstrip("\n")
    return body.replace("\n", "\r\n") + "\r\n"

def bh(canonical):
    digest = hashlib.sha256(canonical.encode("utf-8")).digest()
    return base64.b64encode(digest).decode("ascii")

original = "Your invoice 1042 is ready.\nAmount: 500 BDT\n"
samples = [
    ("original", original),
    ("spaces changed", "Your invoice  1042 is ready.   \nAmount: 500 BDT\n\n\n"),
    ("amount changed", "Your invoice 1042 is ready.\nAmount: 900 BDT\n"),
    ("footer added", original + "--\nTo leave this list, see the list page.\n"),
]
signed_relaxed = bh(relaxed_body(original))
signed_simple = bh(simple_body(original))
print("signed bh (relaxed):", signed_relaxed)
print("signed bh (simple) :", signed_simple)
print(f"{'version':16} {'relaxed':9} simple")
for name, body in samples:
    r = "match" if bh(relaxed_body(body)) == signed_relaxed else "MISMATCH"
    s = "match" if bh(simple_body(body)) == signed_simple else "MISMATCH"
    print(f"{name:16} {r:9} {s}")

আউটপুট:

signed bh (relaxed): qOCIdhqYXswU0nEXgpKCVf9k9onSaZg4JRHoSQE8vFk=
signed bh (simple) : qOCIdhqYXswU0nEXgpKCVf9k9onSaZg4JRHoSQE8vFk=
version          relaxed   simple
original         match     match
spaces changed   match     MISMATCH
amount changed   MISMATCH  MISMATCH
footer added     MISMATCH  MISMATCH

মূল চিঠিতে দুই hash একই, কারণ এতে বাড়তি ফাঁকা জায়গা নেই। “spaces changed”-এ শুধু ফাঁকা বদলেছে। Relaxed নিয়ম সেটি মেনে নিয়েছে, simple নেয়নি। “amount changed”-এ ৫০০ থেকে ৯০০ হয়েছে, দুটিই ধরেছে। এটিই DKIM-এর সবচেয়ে কাজের গুণ। “footer added” দেখায় কেন mailing list-এর footer সই ভাঙে: সে কোনো ক্ষতি করেনি, তবু body বদলেছে। তাই সই ব্যর্থ হওয়া মানেই জাল চিঠি নয়।

৭ · DMARC — পাঠকের দেখা From-এর সাথে মিল

SPF আর DKIM একটি domain প্রমাণ করে, কিন্তু সেটি পাঠকের দেখা domain কি না বলে না। ধরুন প্রতারক নিজের example.net-এর SPF আর DKIM ঠিক রাখল, আর From-এ লিখল example.com. দুটিই pass, পাঠক ঠকলেন। DMARC এখানে একটি শর্ত যোগ করে: pass করতে হবে, এবং aligned হতে হবে।

DMARC pass = (SPF pass আর aligned) অথবা (DKIM pass আর aligned)

Alignment-এর দুটি রূপ। Relaxed (r, ডিফল্ট): একই organizational domain হলেই চলে, যেমন mail.example.com আর example.com. Strict (s): হুবহু একই। RFC 9989-ই বলছে, প্রায় সব domain-মালিকের জন্য relaxed যথেষ্ট হয়েছে।

DMARC ২০১২ সালের দিকে কয়েকটি বড় mail সেবা আর প্রেরকের উদ্যোগে শুরু হয়। RFC 7489 (২০১৫) ছিল Informational, IETF-এর মানদণ্ড নয়। মে ২০২৬-এ RFC 9989 (মূল প্রোটোকল), RFC 9990 (aggregate report) আর RFC 9991 (failure report) প্রকাশিত হয়ে RFC 7489-কে obsolete করেছে। RFC 9989 Proposed Standard, আর এটি RFC 9091-কেও প্রতিস্থাপন করে। v=DMARC1 অপরিবর্তিত। প্রধান বদল: organizational domain এখন Public Suffix List-এর বদলে DNS tree walk দিয়ে বের হয় (সর্বোচ্চ ৮টি query), pct, rf, ri বাদ, আর np, psd, t যোগ। অনেক পুরোনো লেখায় এখনো RFC 7489 আর pct দেখবেন।

নিচে একটি বৈধ চিঠির যাত্রা দেখুন। example.com তার newsletter পাঠায় একটি vendor দিয়ে, যার খাম mailer.example.net-এর, কিন্তু DKIM সই example.com-এর।

Receiver-এর হিসাব · From: news@example.com
SPF
DKIM
DMARC
সিদ্ধান্ত
সংযোগReceiver যা পেল
connection IP : 198.51.100.7
MAIL FROM     : bounce@mailer.example.net
From          : news@example.com
DKIM          : d=example.com; s=sel2026
SPFখামের domain ধরে
mailer.example.net TXT
  "v=spf1 ip4:198.51.100.0/26 -all"
198.51.100.7 আছে .0 থেকে .63-এর মধ্যে
spf=pass, domain=mailer.example.net
DKIMSelector ধরে key
sel2026._domainkey.example.com TXT
  "v=DKIM1; k=rsa; p=example-public-key-base64"
body hash মিলেছে, signature মিলেছে
dkim=pass, d=example.com
DMARC recordFrom-এর domain ধরে
_dmarc.example.com TXT
  "v=DMARC1; p=quarantine;
   rua=mailto:dmarc-reports@example.com"
adkim, aspf নেই, তাই ডিফল্ট r
AlignmentRelaxed
From org domain   = example.com
SPF  org domain   = example.net  মেলেনি
DKIM org domain   = example.com  মিলেছে
ফলএকটি aligned pass যথেষ্ট
(SPF pass, not aligned)  = false
(DKIM pass, aligned)     = true
dmarc=pass
Authentication-Resultsনমুনা, হাতে সাজানো
Authentication-Results: mx.example.org;
  spf=pass smtp.mailfrom=mailer.example.net;
  dkim=pass header.d=example.com;
  dmarc=pass header.from=example.com
  1. চিঠি এল। সংযোগ 198.51.100.7 থেকে। খামে mailer.example.net, From-এ example.com. দুটি আলাদা, আর vendor ব্যবহারে এটি স্বাভাবিক।
  2. SPF. Receiver খামের domain-এর record আনল। /26 মানে শেষ ৬ bit খোলা, ৬৪টি ঠিকানা, .০ থেকে .৬৩. IP .7 এর ভেতরে, ফল pass. তবে এই pass example.net-এর জন্য।
  3. DKIM. d= আর s= মিলিয়ে key আনা হলো, body hash আর সই মিলল। ফল pass, domain example.com.
  4. DMARC record. From-এর domain ধরে _dmarc.example.com খোঁজা হলো। সেখানে নীতি quarantine, alignment-এর tag নেই, তাই relaxed.
  5. Alignment. SPF-এর org domain example.net, From-এর example.com, মিলছে না। DKIM-এর example.com মিলছে।
  6. DMARC pass. শর্তে “অথবা” আছে। একটি aligned pass-ই যথেষ্ট, তাই ফল pass. Vendor DKIM না দিলে দুটিই ব্যর্থ হতো।
  7. সিদ্ধান্ত। Receiver Authentication-Results header যোগ করে চিঠি নিল। DMARC pass মানে পরিচয় মিলেছে, চিঠি নিরাপদ নয়। Spam আর malware যাচাই তবুও চলে।

এবার ছয়টি চিঠিতে relaxed আর strict পাশাপাশি দেখুন। সব চিঠির From example.com. এখানে organizational domain “শেষ দুই label” ধরে সরল করা হয়েছে, আসল receiver DNS tree walk করে।

// Toy DMARC alignment checker. Real receivers find the organizational domain
// with a DNS tree walk (RFC 9989); here "last two labels" stands in for it.
const orgDomain = d => d.split('.').slice(-2).join('.');
const aligned = (a, b, mode) => mode === 's' ? a === b : orgDomain(a) === orgDomain(b);

function dmarc(m, adkim = 'r', aspf = 'r') {
  const dkimOk = m.dkim.pass && aligned(m.from, m.dkim.d, adkim);
  const spfOk = m.spf.pass && aligned(m.from, m.spf.d, aspf);
  return { dkimOk, spfOk, pass: dkimOk || spfOk };
}
const messages = [
  { name: 'own server', from: 'example.com',
    spf: { pass: true, d: 'example.com' }, dkim: { pass: true, d: 'example.com' } },
  { name: 'subdomain mail', from: 'example.com',
    spf: { pass: true, d: 'mail.example.com' }, dkim: { pass: true, d: 'news.example.com' } },
  { name: 'vendor, own DKIM', from: 'example.com',
    spf: { pass: true, d: 'bounce.example.net' }, dkim: { pass: true, d: 'example.com' } },
  { name: 'forwarded', from: 'example.com',
    spf: { pass: false, d: 'example.org' }, dkim: { pass: true, d: 'example.com' } },
  { name: 'list changed body', from: 'example.com',
    spf: { pass: true, d: 'lists.example.org' }, dkim: { pass: false, d: 'example.com' } },
  { name: 'claimed From', from: 'example.com',
    spf: { pass: true, d: 'example.net' }, dkim: { pass: true, d: 'example.net' } },
];
const yn = b => (b ? 'yes' : 'no ');
console.log('message            relaxed: dkim spf dmarc | strict: dkim spf dmarc');
for (const m of messages) {
  const r = dmarc(m), s = dmarc(m, 's', 's');
  console.log(m.name.padEnd(18), '        ', yn(r.dkimOk), yn(r.spfOk), r.pass ? 'PASS ' : 'FAIL ', '|',
    '       ', yn(s.dkimOk), yn(s.spfOk), s.pass ? 'PASS' : 'FAIL');
}

আউটপুট:

message            relaxed: dkim spf dmarc | strict: dkim spf dmarc
own server                  yes yes PASS  |         yes yes PASS
subdomain mail              yes yes PASS  |         no  no  FAIL
vendor, own DKIM            yes no  PASS  |         yes no  PASS
forwarded                   yes no  PASS  |         yes no  PASS
list changed body           no  no  FAIL  |         no  no  FAIL
claimed From                no  no  FAIL  |         no  no  FAIL

“subdomain mail” relaxed-এ PASS, strict-এ FAIL: strict ভাঙে সহজে, তাই কারণ ছাড়া নেবেন না। “vendor, own DKIM” আর “forwarded” দেখায় DKIM কেন জরুরি: SPF ব্যর্থ বা অমিল হলেও DKIM বাঁচিয়েছে। “list changed body”-তে SPF pass, DKIM ভাঙা, কোনো alignment নেই, তাই FAIL, যদিও চিঠিটি নির্দোষ। “claimed From”-এ দুটিই pass, কিন্তু অন্য domain-এর জন্য। DMARC ঠিক এটি ধরে।

DMARC যা থামায় না: শুধু হুবহু আপনার domain-এর নকল থামায়। দেখতে একই রকম নাম (যেমন examp1e.com), display name-এ প্রতিষ্ঠানের নাম, বা দখল হওয়া বৈধ account থেকে আসা চিঠি DMARC pass করতে পারে। মানুষের দিকের প্রতিরক্ষা পর্ব ৫৩ (Phishing প্রতিরক্ষা)-তে আসবে।

৮ · DMARC rollout আর aggregate report

প্রথম দিনেই p=reject দিলে নিজের বিল, রসিদ বা OTP-এর চিঠিই ফেরত যেতে পারে। কারণ প্রতিষ্ঠান প্রায়ই জানে না কতগুলো সেবা তার নামে চিঠি পাঠায়। মহল্লায় নতুন গেট বসানোর আগে দারোয়ান যেমন কিছুদিন শুধু রেজিস্টার খাতায় লেখেন, কাউকে ফেরান না, DMARC-ও তেমন শুরু হয়। RFC 9989-ও p=none-এ অন্তত এক মাস, তারপর একই রকম সময় quarantine রাখার পরামর্শ দেয়।

example.com · report-এর হিসাব (কাল্পনিক)
নীতি
DMARC pass হার
ব্যর্থ চিঠি
ব্যর্থ চিঠির পরিণতি
  1. ধাপ ১ — তালিকা। প্রতিষ্ঠানের কোন কোন সেবা চিঠি পাঠায় তা লেখা হলো: mail server, newsletter, billing, HR, CRM. SPF আর DKIM ঠিক করা হলো। আগে TTL কমানো হলো, যাতে ভুল হলে দ্রুত ফেরা যায়।
  2. ধাপ ২ — p=none. কিছু আটকায় না, শুধু report আসে। প্রথম report-এ pass হার ৯৩.৬%: ১২,৩০০-এর মধ্যে ৭৯০টি ব্যর্থ, এর ৬৪০টি billing vendor, ১৫০টি অজানা উৎস।
  3. ধাপ ৩ — ঠিক করা। Billing vendor-কে নিজের domain-এ DKIM দিতে বলা হলো। এখন (১১,৫১০ + ৬৪০) ÷ ১২,৩০০ = ৯৮.৮%. বাকি ১৫০টি অজানা, এগুলোই সম্ভাব্য জাল চিঠি। তদন্ত করে দেখতে হবে।
  4. ধাপ ৪ — quarantine. কয়েক সপ্তাহ নতুন কোনো বৈধ ব্যর্থতা নেই, তাই নীতি কড়া হলো। ব্যর্থ চিঠি junk-এ যেতে পারে। কোনো বৈধ প্রবাহ ভাঙলে আগের ধাপে ফেরা যাবে। পরীক্ষার জন্য RFC 9989-এর t=y tag আছে, তবে receiver-এর সমর্থন আলাদা হতে পারে।
  5. ধাপ ৫ — reject. এবার receiver ব্যর্থ চিঠি SMTP-তেই ফিরিয়ে দিতে পারে। RFC 9989 অনুযায়ী p=reject-এর domain শুধু SPF-এর ওপর নির্ভর করবে না, DKIM লাগবে। আর সিদ্ধান্ত শেষ পর্যন্ত receiver-এর, নীতি একটি অনুরোধ।
  6. ধাপ ৬ — চলমান কাজ। sp subdomain-এর নীতি, np অস্তিত্বহীন subdomain-এর নীতি জানায়। নতুন vendor যোগ করলে আগে তালিকা আর DKIM, তারপর চালু। Report পড়া বন্ধ হয় না, কারণ report-ই প্রথম জানায় কেউ নতুন করে আপনার নাম ব্যবহার করছে।

Aggregate report সাধারণত দিনে একবার আসে, XML আকারে, RFC 9990 অনুযায়ী। এতে চিঠির বিষয়বস্তু থাকে না, থাকে উৎস IP, সংখ্যা আর ফল। অফিসের রেজিস্টার খাতার মাসিক সারসংক্ষেপের মতো। নিচের simulator একই কাল্পনিক ডেটা সাজিয়ে দেখায়। spf আর dkim এখানে মানে “pass এবং aligned”.

// Toy DMARC aggregate report summary. Real reports arrive as XML (RFC 9990);
// these rows are invented, and the source labels are our own inventory notes.
const rows = [
  { ip: '192.0.2.10',    src: 'own mail server',  n: 8200, spf: true,  dkim: true  },
  { ip: '198.51.100.7',  src: 'newsletter vendor', n: 3100, spf: false, dkim: true  },
  { ip: '198.51.100.40', src: 'billing vendor',   n: 640,  spf: false, dkim: false },
  { ip: '203.0.113.50',  src: 'known forwarder',  n: 210,  spf: false, dkim: true  },
  { ip: '203.0.113.99',  src: '(unknown)',        n: 150,  spf: false, dkim: false },
];
// spf and dkim here mean "passed AND aligned", so either one gives DMARC pass.
const pct = (a, b) => (100 * a / b).toFixed(1) + '%';
const total = rows.reduce((s, r) => s + r.n, 0);
const passed = rows.filter(r => r.spf || r.dkim).reduce((s, r) => s + r.n, 0);

console.log('source             ip             count  share  dmarc  action');
for (const r of [...rows].sort((a, b) => b.n - a.n)) {
  const ok = r.spf || r.dkim;
  let action = 'none';
  if (!ok) action = r.src === '(unknown)' ? 'investigate' : 'fix: sign with DKIM';
  console.log(r.src.padEnd(18), r.ip.padEnd(14), String(r.n).padStart(5),
    pct(r.n, total).padStart(6), ok ? ' pass ' : ' FAIL ', action);
}
console.log(`total=${total} dmarc_pass=${passed} rate=${pct(passed, total)}`);

const fixed = passed + rows.find(r => r.src === 'billing vendor').n;
console.log(`after billing fix: rate=${pct(fixed, total)}, still failing=${total - fixed}`);

আউটপুট:

source             ip             count  share  dmarc  action
own mail server    192.0.2.10      8200  66.7%  pass  none
newsletter vendor  198.51.100.7    3100  25.2%  pass  none
billing vendor     198.51.100.40    640   5.2%  FAIL  fix: sign with DKIM
known forwarder    203.0.113.50     210   1.7%  pass  none
(unknown)          203.0.113.99     150   1.2%  FAIL  investigate
total=12300 dmarc_pass=11510 rate=93.6%
after billing fix: rate=98.8%, still failing=150

পড়ার নিয়ম: আগে বড় সংখ্যা দেখুন, তারপর FAIL. Billing vendor ব্যর্থ, কিন্তু এটি আপনারই সেবা, তাই “ঠিক করুন”। (unknown) সংখ্যায় মাত্র ১.২%, তবু গুরুত্বপূর্ণ, কারণ এটিই সম্ভাব্য নকল। known forwarder SPF হারালেও DKIM-এ পার হয়েছে। হার ৯৩.৬% থেকে ৯৮.৮% হলো একটি vendor ঠিক করেই। এখানে ১০০% লক্ষ্য নয়। লক্ষ্য হলো, সব বৈধ প্রবাহ pass করা।

Forwarding, mailing list আর ARC

চিঠি forward হলে নতুন সংযোগের IP আলাদা, তাই SPF ব্যর্থ হয়। DKIM টেকে, যদি চিঠি না বদলায়। Mailing list subject-এ ট্যাগ বা নিচে footer বসালে DKIM-ও ভাঙে, তখন নির্দোষ চিঠি DMARC ব্যর্থ হয়। ২০১৪ সালে বড় mail সেবা p=reject দেওয়ার পর mailing list-এ এই সমস্যা ব্যাপকভাবে দেখা দেয়। RFC 9989 নিজেও সতর্ক করে: যে domain-এর ব্যবহারকারীরা mailing list-এ লেখেন, তাদের p=reject না দেওয়াই ভালো।

  • List-এর সমাধান: অনেক list From-কে নিজের ঠিকানায় বদলে দেয় (“From rewriting”), আর মূল প্রেরক অন্য header-এ থাকে।
  • ARC (RFC 8617, ২০১৯, Experimental): মাঝের সার্ভার যা দেখেছিল তার ফল সই করে পরের সার্ভারকে জানায়। Receiver সেই মধ্যস্থতাকারীকে বিশ্বাস করলে তবেই এটি কাজে লাগে। ARC নিজে কিছু pass করায় না।

যে domain চিঠি পাঠায় না

ব্র্যান্ড রক্ষার জন্য কেনা বা পড়ে থাকা domain-ও নকলের লক্ষ্য। চিঠি না পাঠালে সেটি ঘোষণা করুন। Null MX (RFC 7505) জানায় এই domain চিঠি নেয় না।

; এই domain কোনো চিঠি পাঠায় না, নেয়ও না
nomail.example.com.                3600 IN MX  0 .
nomail.example.com.                3600 IN TXT "v=spf1 -all"
_dmarc.nomail.example.com.         3600 IN TXT "v=DMARC1; p=reject"
*._domainkey.nomail.example.com.   3600 IN TXT "v=DKIM1; p="

৯ · MTA-STS, TLS-RPT, BIMI আর বড় mail সেবার নিয়ম

MTA-STS

RFC 8461 (২০১৮). Server-to-server SMTP-তে TLS ঐচ্ছিক, তাই পথের কেউ তা নামিয়ে দিতে পারে। এই নীতি বলে: যাচাই করা TLS ছাড়া চিঠি দেবেন না। Mode: testing, enforce, none.

_mta-sts.example.com + HTTPS policy

TLS-RPT

RFC 8460 (২০১৮). পাঠানো সার্ভার TLS সমস্যার report পাঠায়। MTA-STS-কে enforce-এ নেওয়ার আগে এটি পড়ুন, DMARC-এর report-এর মতো। DNSSEC থাকলে DANE (RFC 7672) আরেকটি পথ।

_smtp._tls.example.com

BIMI

Mail app-এ logo দেখানোর প্রস্তাব। ২০২৬ সালের অক্টোবর পর্যন্ত এটি একটি individual IETF draft, RFC নয়। DMARC enforcement সাধারণত পূর্বশর্ত। এটি ব্র্যান্ডের সুবিধা, নিরাপত্তা নিয়ন্ত্রণ নয়।

Draft, সমর্থন সেবাভেদে আলাদা

বড় mail সেবার নিয়ম

কয়েক বছরে email authentication ঐচ্ছিক থেকে কার্যত প্রয়োজনীয় হয়েছে। Google-এর প্রকাশিত নির্দেশিকা অনুযায়ী Gmail-এ দিনে ৫,০০০-এর বেশি চিঠি পাঠালে SPF আর DKIM দুটিই, DMARC (p=none হলেও), From alignment, আর বিপণনের চিঠিতে one-click unsubscribe লাগে। Spam হার ০.৩০%-এর নিচে রাখতে বলা হয়, আর সব প্রেরকের জন্যও SPF বা DKIM, TLS আর বৈধ PTR লাগে। Yahoo-র নিয়ম কাছাকাছি, আর Microsoft ২০২৫ সালে consumer mail সেবার জন্য একই ধরনের নিয়ম ঘোষণা করে। এই নিয়ম বদলায়, প্রয়োগের ধরনও সেবাভেদে আলাদা। তাই সিদ্ধান্তের আগে প্রতিটি সেবার বর্তমান সরকারি পাতা পড়ে নিন। ছোট প্রতিষ্ঠানও এই ভিত্তি রাখলে লাভ পায়।

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

  • SPF কোন ঠিকানা যাচাই করে? খামের MAIL FROM (আর HELO), পাঠকের দেখা From নয়।
  • DMARC pass-এর শর্ত? SPF বা DKIM-এর অন্তত একটি pass এবং From-এর সাথে aligned.
  • Forward করলে কোনটি সাধারণত ভাঙে? SPF. DKIM টেকে, যদি চিঠি না বদলায়।
  • DNSSEC আর DoH-এর পার্থক্য? DNSSEC উত্তরের সত্যতা, DoH পথের গোপনীয়তা।
  • Subdomain takeover কীভাবে ঠেকাবেন? সেবা মোছার আগে record মুছে, তালিকা রেখে, নিয়মিত নিজের zone মিলিয়ে।

১০ · AI-এর যুগে DNS আর email record

AI দিয়ে SPF বা DMARC record লেখানো সহজ, আর ভুলও সহজে হয়। Record সিনট্যাক্সে ঠিক থাকলেও আপনার প্রবাহ না জেনে লেখা record বৈধ চিঠি আটকে দিতে পারে। AI সাধারণত যেসব ভুল করে:

  • পুরোনো তথ্য: DMARC-এর জন্য শুধু RFC 7489 আর pct বলা, RFC 9989 না জানা।
  • বানানো মান বা CVE নম্বর, ভুল RFC নম্বর, আর আত্মবিশ্বাসী ভঙ্গিতে ভুল vendor include.
  • সমস্যা “সমাধান” করতে নিয়ন্ত্রণ দুর্বল করা: +all, DNSSEC বন্ধ, p=none-এ ফিরিয়ে দিয়ে ভুলে যাওয়া, TLS যাচাই বন্ধ (verify=False).
  • একই domain-এ দুটি SPF record দেওয়া, ১০-lookup সীমা না গোনা, পুরোনো rsa-sha1 বা ছোট key.
  • Prompt-এ পুরো DMARC report বা ব্যবহারকারীর ঠিকানা পেস্ট করলে ব্যক্তিগত তথ্য ফাঁস। DKIM private key বা API token কখনো নয়।

AI-কে সহকারী রাখুন, সিদ্ধান্ত আপনার। Prompt-এ আসল গোপন তথ্য নয়, শুধু প্রকাশ্য record দিন:

আমি আমার নিজের domain example.com-এর email নিরাপত্তা পর্যালোচনা করছি। নিচে প্রকাশ্য SPF, DMARC record আর আমার চিঠি পাঠানোর সেবার তালিকা দিলাম। private key, token বা ব্যবহারকারীর তথ্য দিচ্ছি না। [এখানে record আর সেবার তালিকা] ১. SPF-এর DNS lookup গুনে দেখাও, ধাপে ধাপে। ২. কোন বৈধ প্রবাহ ভাঙতে পারে, কারণসহ বলো। ৩. p=none থেকে reject পর্যন্ত একটি ধীর পরিকল্পনা দাও, প্রতিটি ধাপে rollback-সহ। ৪. RFC বা সরকারি নির্দেশিকার যে অংশে নির্ভর করছ তার নম্বর বলো। না জানলে "নিশ্চিত নই" লেখো। ৫. আমি কী নিজে যাচাই করব, তার তালিকা দাও।

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

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

প্র ০১TLS থাকতেও ২০১৯ সালের DNS hijack-এ ট্রাফিক কেন পড়া সম্ভব হয়েছিল? কোন নিয়ন্ত্রণ শিকলটি ভাঙত?

অনেকে ভাবেন, HTTPS থাকলে DNS ভুল হলেও browser সতর্ক করবে। সাধারণত ঠিক, কারণ আক্রমণকারীর কাছে আসল domain-এর certificate থাকে না। কিন্তু CISA-র Emergency Directive 19-01-এর বর্ণনা অনুযায়ী এখানে ধাপটিই আলাদা ছিল। আক্রমণকারীরা DNS-এর নিয়ন্ত্রণ পেয়ে record বদলেছিল, তারপর ওই domain-এর জন্য বৈধ certificate-ও পেয়েছিল।

কেন সম্ভব? কারণ CA-র domain validation মূলত প্রশ্ন করে: “আপনি কি এই domain নিয়ন্ত্রণ করেন?” DNS বা ওয়েব challenge পূরণ হলেই উত্তর “হ্যাঁ”। যে DNS বদলাতে পারে, CA-র চোখে সে-ই মালিক। অর্থাৎ TLS নিজে ভাঙেনি, TLS যে ভিত্তির ওপর দাঁড়িয়ে সেটি সরে গেছে। এটি পর্ব ১১-এর বিশ্বাসের শিকলের একটি অদেখা দিক: শিকলের প্রথম আংটা প্রায়ই একটি registrar password.

কোন নিয়ন্ত্রণ কোথায় ভাঙত, স্তর ধরে দেখুন। ফাঁস হওয়া password থামাত phishing-প্রতিরোধী MFA. Record বদল কঠিন করত registry lock আর পরিবর্তনের অনুমোদন। বদল হলে দ্রুত ধরত বাইরের DNS নজরদারি। অনাকাঙ্ক্ষিত certificate ধরত CT monitoring. CAA অনুমোদিত CA সীমিত করে, তবে DNS দখলকারী CAA-ও বদলাতে পারে, তাই একা যথেষ্ট নয়। DNSSEC-ও এখানে বাঁচাত না, কারণ নিয়ন্ত্রণ পেলে আক্রমণকারী বৈধ পথে record বদলাতে পারে।

লক্ষ্য করুন, ঘটনাটি প্রকাশিত প্রতিবেদনের স্তরে পড়লেই এই শিক্ষা পাওয়া যায়। CISA এই directive পরে বন্ধ করেছে, কিন্তু নিয়ন্ত্রণগুলোর যুক্তি এখনো একই।

মূল উপলব্ধি: ওপরের স্তরের দখল নিচের সব cryptography-কে “বৈধ” পথে পাশ কাটায়। তাই সবচেয়ে শক্ত সুরক্ষা দরকার সবচেয়ে সাধারণ দেখতে account-এ।

প্র ০২DNSSEC ২০০৫ সালে মান হলো, root ২০১০ সালে সই হলো। তবু এটি সব জায়গায় নেই কেন? চালু না করাও কি একটি যৌক্তিক সিদ্ধান্ত হতে পারে?

২০০৮ সালে Dan Kaminsky দেখান, DNS cache poisoning আগের ধারণার চেয়ে অনেক বাস্তব। শিল্প জুড়ে দ্রুত source port randomization ছড়ানো হয়, আর DNSSEC-এর প্রয়োজন নিয়ে আলোচনা জোরালো হয়। ২০১০ সালে root zone সই হওয়ায় শিকলের মাথা তৈরি হলো। তবু প্রচলন ধীর, আর এর পেছনে প্রকৌশলের কারণ আছে।

প্রথম কারণ ঝুঁকির অসমতা। DNSSEC ছাড়া একটি বিরল আক্রমণের ঝুঁকি। DNSSEC-এ ভুল করলে নিজের domain সব যাচাই করা resolver-এ অদৃশ্য। Slack-এর ২০২১ সালের প্রকাশিত postmortem এর উদাহরণ: DS record-এর cache আচরণ প্রত্যাশামতো না হওয়ায় এক দিন পর্যন্ত কিছু ব্যবহারকারীর সমস্যা হয়। ওই সেবার মতো বড় দলও এখানে হোঁচট খেতে পারে।

দ্বিতীয় কারণ TLS ইতিমধ্যে অনেকটা ঢেকেছে। ওয়েবে DNS ভুল হলেও certificate না মিললে browser থামায়। তাই ওয়েবের জন্য DNSSEC-এর বাড়তি লাভ কম মনে হয়। তবে certificate পাওয়াও DNS-এর ওপর নির্ভর করে, আর CA-র DNSSEC যাচাই এই ফাঁক কিছুটা ঢাকে। Mail-এর জন্য DANE-এ DNSSEC অপরিহার্য। তৃতীয় কারণ শেষ মাইল: অনেক client নিজে যাচাই করে না, resolver-এর AD flag-এ ভরসা করে।

তাহলে সিদ্ধান্ত কী? এটি ঝুঁকিভিত্তিক। আপনার DNS-host স্বয়ংক্রিয় key rollover দিলে, TLD সমর্থন করলে আর আপনার সেবা সরকারি, আর্থিক বা অবকাঠামোগত হলে লাভ বেশি। ছোট দলে স্বয়ংক্রিয়তা ছাড়া নিজে key সামলাতে গেলে ঝুঁকি বাড়তে পারে। যেভাবেই হোক, resolver-এর দিকে যাচাই চালু রাখা তুলনায় সহজ লাভ। নিয়ন্ত্রণ বাছাই নিয়ে পর্ব ৪-এর ঝুঁকিভিত্তিক চিন্তাই এখানে কাজে লাগে।

মূল উপলব্ধি: নিরাপত্তা নিয়ন্ত্রণও একটি ব্যর্থতার উৎস। “এটি কতটা শক্ত?”-এর সাথে জিজ্ঞেস করুন, “ভুল হলে কী বন্ধ হবে, আর কে তা ঠিক করবে?”

প্র ০৩Encrypted DNS কি ব্যবহারকারীর জয়, না নিরাপত্তা দলের ক্ষতি? প্রতিষ্ঠানের নীতি কেমন হওয়া উচিত?

দুটিই আংশিক সত্য, কারণ প্রশ্নটি আসলে কাকে বিশ্বাস করবেন। DoH আগে সাধারণ DNS দেখতে পারত এমন পক্ষ, যেমন ISP বা কফিশপের Wi-Fi, তাদের থেকে নাম লুকায়। ২০২০ সালে Firefox যুক্তরাষ্ট্রের ব্যবহারকারীদের জন্য DoH ডিফল্ট করা শুরু করে। এতে বিতর্ক হয়, কারণ DNS সিদ্ধান্ত OS বা network থেকে application-এর হাতে সরে যায়।

নিরাপত্তা দলের দিক থেকে ক্ষতিটি বাস্তব। DNS filter, sinkhole আর DNS log অনেক প্রতিষ্ঠানে সস্তা detection. Device বা malware নিজের DoH resolver বেছে নিলে এই সব দৃশ্যমানতা হারাতে পারে, আর ট্রাফিক সাধারণ HTTPS-এর মতো দেখায়। অন্যদিকে ব্যবহারকারীর দিক থেকে ক্ষতি নেই বললে ভুল হবে: হোটেল বা বিমানবন্দরের network-এ encrypted DNS সত্যিই নিরাপত্তা দেয়।

NSA-এর ২০২১ সালের অবস্থান এই সমন্বয়টি দেখায়: প্রতিষ্ঠানের সব DNS নির্ধারিত resolver-এ যাবে, সেই resolver encrypted DNS সমর্থন করবে, আর অন্য resolver আটকানো হবে। ফলে গোপনীয়তা পথের জন্য, দৃশ্যমানতা resolver-এর জন্য। বাস্তবে এর সাথে থাকে managed device-এ browser policy, port 853 নিয়ন্ত্রণ, পরিচিত DoH resolver-এর তালিকা, আর endpoint-এ দৃশ্যমানতা। তবে তালিকা কখনো সম্পূর্ণ হয় না, আর unmanaged device-এ এই নীতি কাজ করে না।

নিজের কর্মীর DNS পড়া একটি নৈতিক প্রশ্নও বটে। তাই লিখিত নীতি, সীমিত সংরক্ষণ আর সীমিত পড়ার অধিকার দরকার। ব্যক্তিগত device আর অফিসের device-এর জন্য একই উত্তর নয়। আর ECH-এর মতো প্রযুক্তি এলে নাম-ভিত্তিক দৃশ্যমানতা আরও কমবে, তাই নিরাপত্তা দলের নির্ভরতা ধীরে endpoint telemetry-র দিকে সরছে।

মূল উপলব্ধি: Encryption তথ্য মুছে দেয় না, কে দেখবে তা বদলে দেয়। নীতি লিখুন “কে কী দেখবে” দিয়ে, প্রযুক্তির নাম দিয়ে নয়।

প্র ০৪p=reject কি সব সময় সেরা? Mailing list-এর অভিজ্ঞতা email-এর বিশ্বাস নিয়ে কী শেখায়?

নিরাপত্তার চোখে reject সবচেয়ে কড়া, কিন্তু email-এর প্রবাহ সরল রেখা নয়। DMARC-এর মূল চিন্তা ছিল লেনদেনের চিঠি: ব্যাংক বা দোকান সরাসরি গ্রাহককে পাঠায়, আর পথে কেউ বদলায় না। মানুষের চিঠি আলাদা। মানুষ mailing list-এ লেখেন, পুরোনো ঠিকানা থেকে forward করেন, alumni ঠিকানা ব্যবহার করেন। RFC 5321-এর জগতে এগুলো স্বাভাবিক।

২০১৪ সালে বড় mail সেবা তাদের ব্যবহারকারীদের domain-এ p=reject দেওয়ার পর সমস্যাটি বড় আকারে দেখা দেয়। List-এ পাঠানো চিঠি অন্য সদস্যদের receiver প্রত্যাখ্যান করল, আর কিছু সদস্য bounce-এর কারণে list থেকে বাদও পড়লেন। কেন এমন নীতি নেওয়া হয়েছিল? প্রকাশিত ব্যাখ্যায় প্রেক্ষাপট হিসেবে নকল চিঠির চাপের কথাই আসে। অর্থাৎ এটি একটি বাস্তব ঝুঁকির বিপরীতে নেওয়া সিদ্ধান্ত, যার খরচের বড় অংশ অন্যের ওপর পড়ল।

এরপর কয়েকটি পথ এলো। List-গুলো From rewriting শুরু করল, যা কাজ করে, তবে From-এর অর্থই বদলে দেয়। ARC এলো, RFC 8617-এ Experimental হিসেবে। RFC 9989 আবার স্পষ্ট করে: indirect mail flow ভাঙতে পারে, ব্যবহারকারীরা list-এ লিখলে p=reject না দেওয়াই ভালো, আর receiver-এরও শুধু নীতি দেখে বিশ্লেষণ ছাড়া সিদ্ধান্ত নেওয়া ঠিক নয়।

তাই উত্তর প্রতিষ্ঠানভেদে আলাদা। শুধু লেনদেনের চিঠি পাঠানো subdomain, যেমন billing.example.com, আর চিঠি না পাঠানো domain-এ reject প্রায়ই সরল সিদ্ধান্ত। হাজারো মানুষের সাধারণ mail domain-এ quarantine বা প্রবাহভিত্তিক সিদ্ধান্ত বেশি যৌক্তিক হতে পারে। আর পরিচয় চুরির ঝুঁকি বেশি হলে কড়া নীতির খরচও মেনে নেওয়া যায়। এটি পর্ব ২-এর ঝুঁকি গ্রহণের সিদ্ধান্ত, কোনো চেকবক্স নয়।

মূল উপলব্ধি: নিরাপত্তা নীতির খরচ প্রায়ই নীতিদাতার বাইরের কেউ দেয়। সেরা নীতি “সবচেয়ে কড়া” নয়, বরং আপনার প্রবাহ জেনে নেওয়া সিদ্ধান্ত।

প্র ০৫“SPF include আর CNAME” কেন বিশ্বাসের ঋণ? Dangling record সমস্যা কারিগরি, না ব্যবস্থাপনার?

প্রতিটি CNAME বলে, “এই নাম সম্পর্কে ওই পক্ষের কথাই আমার কথা।” প্রতিটি SPF include বলে, “ওই পক্ষ যাকে অনুমোদন করে, সে আমার হয়েও চিঠি পাঠাতে পারে।” এগুলো কারিগরি record, কিন্তু অর্থে বিশ্বাসের অর্পণ, ঠিক পর্ব ১৯-এর অনুমতির মতো। আর অনুমতির মতোই এগুলো নিজে থেকে শেষ হয় না।

Guardio Labs-এর ২০২৪ সালের SubdoMailing প্রতিবেদন এর ব্যাপকতা দেখায়। প্রতিবেদনের দাবি অনুযায়ী হাজার হাজার পুরোনো domain আর subdomain, যাদের বিশ্বাস রয়ে গিয়েছিল, spam ছড়ানোর কাজে লাগে। চিঠি SPF আর DKIM পার হয়েছিল, কারণ DNS-এ অনুমোদন সত্যিই ছিল। প্রযুক্তি ঠিক কাজ করেছে, তথ্য ছিল পুরোনো। এই সংখ্যা গবেষকদের প্রতিবেদনের, তাই সেভাবেই পড়ুন।

সমস্যাটি কারিগরি মনে হয়, কিন্তু শিকড় ব্যবস্থাপনায়। Marketing দল একটি campaign চালায়, সাময়িক subdomain নেয়, কর্মী চলে যান, চুক্তি শেষ হয়। DNS-এ record থাকে, কারণ কেউ জানে না এটি কার। DNS মুছতে ভয়ও হয়: “কিছু ভেঙে গেলে?” তাই পুরোনো record জমতে থাকে। পর্ব ২০-এর secret sprawl-এর সাথে এর মিল স্পষ্ট।

সমাধানও তাই দুই স্তরে। কারিগরি দিকে: নিজের zone নিয়মিত স্বয়ংক্রিয়ভাবে পরীক্ষা, cloud সেবা মোছার ধাপে record মোছা, Infrastructure as Code, আর লক্ষ্য domain-এর মেয়াদ নজরে রাখা। ব্যবস্থাপনার দিকে: প্রতিটি record-এর মালিক, কারণ আর পর্যালোচনার তারিখ; vendor offboarding-এর চেকলিস্টে DNS আর SPF; DMARC report-এ অচেনা উৎসের সাড়া। পরীক্ষাটি শুধু নিজের zone-এ, অনুমতি নিয়ে। Cloud সেবার অনেক প্রদানকারী এখন এমন ঝুঁকি কমানোর ব্যবস্থা দেন, তবে তা আপনার তালিকার বিকল্প নয়।

মূল উপলব্ধি: DNS record হলো অনুমতি। অনুমতির মতোই এর মালিক, মেয়াদ আর পর্যালোচনা দরকার, নইলে পুরোনো বিশ্বাসই একদিন আক্রমণের পথ হয়ে ওঠে।

অনুশীলন

সব record কাল্পনিক। নিজের domain ছাড়া কোথাও DNS পরীক্ষা করবেন না।

  1. Lookup গোনা (সংখ্যাগত): example.com-এর SPF: v=spf1 ip4:192.0.2.0/25 mx a include:a.example.net include:b.example.net -all. a.example.net-এ আছে include:c.example.net include:d.example.net ~all, b.example.net-এ include:e.example.net redirect=f.example.net. বাকি domain-গুলোতে শুধু ip4. সবগুলো ঘটলে মোট lookup কত? আরও কয়টি include যোগ করা যাবে?

    গণনা: mx ১, a ১, include a ১, include b ১ = ৪. a-এর ভেতরে c আর d, ২টি, মোট ৬. b-এর ভেতরে include e আর redirect f, ২টি, মোট ৮. ip4 আর all গোনা হয় না। সীমা ১০, তাই আরও ২টি lookup-এর জায়গা আছে, যদি নতুন include-এর ভেতরে আর কোনো lookup না থাকে। (আসল যাচাইয়ে প্রথম মিলেই থেমে যায়, কিন্তু record নকশার সময় সবচেয়ে খারাপ ক্ষেত্রই ধরুন। আর একই record-এ all থাকলে redirect উপেক্ষিত হয়।)

  2. আউটপুট অনুমান: spf_toy.js-এর শেষ তালিকায় ['example.com', '198.51.100.200'] আর ['soft.example.org', '192.0.2.200'] যোগ করলে এই দুটি লাইনের আউটপুট কী হবে? চালানোর আগে লিখুন।

    প্রথমটি: 198.51.100.200 /25-এ নেই। Include-এ 198.51.100.0/26 মানে .০ থেকে .৬৩, মেলে না। ভেতরের ~all তাই “মিলল না”। বাইরের -all দেয় fail, আর lookups=1.

    দ্বিতীয়টি: 192.0.2.128/25 মানে .১২৮ থেকে .২৫৫. .২০০ মিলেছে, তাই pass, lookups=0. কোনো include নেই, তাই lookup শূন্য। ~all পর্যন্ত যাওয়াই হয়নি।

  3. নকশা সমালোচনা: একটি প্রতিষ্ঠানের zone: দুটি SPF record (v=spf1 include:_spf.example.net ~all আর v=spf1 +all), ১০২৪-bit DKIM key যা তিন বছর বদলানো হয়নি, প্রথম দিনেই v=DMARC1; p=reject আর কোনো rua নেই, registrar account-এর recovery email ওই একই domain-এ। ভুলগুলো বের করে একটি সংশোধন পরিকল্পনা লিখুন।
    • দুটি SPF: একাধিক record মানে permerror. আর +all সবাইকে অনুমোদন করে। একটি record রাখুন, বাস্তব প্রেরকের তালিকা দিয়ে।
    • DKIM: ২০৪৮-bit key-তে নতুন selector দিয়ে rotate করুন, পুরোনো key সময় দিয়ে সরান। নিয়মিত rotation-এর তারিখ রাখুন।
    • DMARC: Report ছাড়া reject অন্ধভাবে চালানো। p=none; rua=... দিয়ে শুরু করুন, report পড়ুন, ধাপে ধাপে এগোন।
    • Recovery: Domain হারালে recovery-ও হারাবে। অন্য domain-এর ঠিকানা, MFA আর registrar lock দিন।

    ক্রম: আগে registrar, তারপর SPF আর DKIM, শেষে DMARC. কারণ registrar সবার ওপরে, আর DMARC বাকিদের ওপর নির্ভর করে।

  4. নিজের domain-এর কমান্ড: আপনার নিজের একটি domain থাকলে dig +short TXT example.com, dig +short TXT _dmarc.example.com আর dig +short DS example.com-এ example.com-এর জায়গায় নিজের নাম বসিয়ে চালান। না থাকলে নিচের নমুনাটি পড়ুন। কী ঠিক আছে, কী বাকি?
    $ dig +short TXT example.com          # নমুনা, হাতে সাজানো
    "v=spf1 ip4:192.0.2.0/25 ~all"
    $ dig +short TXT _dmarc.example.com
    "v=DMARC1; p=none"
    $ dig +short DS example.com
    (খালি)

    SPF আছে, তবে ~all. সব প্রেরক জানা হলে -all বিবেচনা করা যায়, যদিও DMARC থাকলে অনেকেই ~all রাখেন। DMARC আছে, কিন্তু rua নেই, তাই p=none-এ কোনো report আসে না, আর শেখার কিছু থাকে না। প্রথম কাজ rua যোগ করা। DS খালি মানে DNSSEC-এর শিকল parent পর্যন্ত নেই। সিদ্ধান্তটি ঝুঁকি আর host-এর সমর্থন দেখে নিন। DKIM selector আলাদা করে দেখতে হয়, কারণ নাম না জানলে key পাওয়া যায় না।

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

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

ক্রমএকটি নিরাপদ DMARC rollout-এর ধাপ সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. চিঠি পাঠানো সব সেবার তালিকা করা, SPF আর DKIM ঠিক করা
  2. p=none আর rua প্রকাশ করা
  3. Aggregate report পড়ে বৈধ প্রেরক ঠিক করা আর অচেনা উৎস তদন্ত করা
  4. p=quarantine-এ যাওয়া আর নজর রাখা
  5. p=reject-এ যাওয়া, report পড়া চালিয়ে যাওয়া

SPF মূলত কোন পরিচয়ের জন্য প্রেরকের IP যাচাই করে?

  • চিঠির ভেতরের From header
  • SMTP খামের MAIL FROM বা HELO-র domain
  • Subject line-এর domain
  • DKIM-এর d= domain

একটি SPF record-এ include, a, mx মিলিয়ে পুরো যাচাইয়ে ১১টি DNS lookup লাগে। RFC 7208 অনুযায়ী ফল কী?

  • softfail
  • neutral
  • pass, যদি IP তালিকায় থাকে
  • permerror

From: news@example.com, SPF pass example.net-এর জন্য, DKIM pass d=example.com. Relaxed alignment-এ DMARC-এর ফল কী?

  • Fail, কারণ SPF aligned নয়
  • Pass, কারণ SPF pass করেছে
  • Pass, কারণ DKIM pass এবং aligned
  • ফল নির্ণয় করা যায় না

DNSSEC যাচাই করা resolver একটি উত্তরের সই মেলাতে না পারলে client সাধারণত কী পায়?

  • SERVFAIL
  • NXDOMAIN
  • AD flag-সহ উত্তর
  • সতর্কবার্তাসহ বদলানো IP

একটি domain চিঠি পাঠায়ও না, নেয়ও না। কোন সেটআপ সবচেয়ে উপযুক্ত?

  • কোনো record না রাখা
  • Null MX, v=spf1 -all আর p=reject
  • v=spf1 +all আর p=none
  • ~all আর p=none

ক্লাউডের একটি সেবা বন্ধ করার সময় subdomain takeover এড়াতে সবচেয়ে ভালো অভ্যাস কোনটি?

  • সেবা মুছে দেওয়া, DNS record রেখে দেওয়া
  • Record-এর TTL বাড়ানো
  • আগে DNS record সরিয়ে তারপর সেবা মোছা, আর record-এর তালিকা রাখা
  • Subdomain-এ TLS certificate নেওয়া

শব্দকোষ

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

মনে রাখুন

  1. Registrar account সবার ওপরে: phishing-প্রতিরোধী MFA, lock, নবায়ন আর পরিবর্তনের নজরদারি।
  2. DNSSEC সত্যতা দেয়, DoT আর DoH পথের গোপনীয়তা দেয়। কোনোটি অন্যটির বিকল্প নয়।
  3. DNS record হলো অনুমতি: মালিক রাখুন, পুরোনো CNAME আর include সরান, সেবার আগে record মুছুন।
  4. SPF খাম দেখে, DKIM সই দেখে, DMARC From-এর সাথে alignment দেখে। SPF-এর সীমা ১০ lookup.
  5. DMARC চলে none → quarantine → reject পথে, report পড়ে। মান এখন RFC 9989, আর চিঠি না পাঠানো domain-ও বন্ধ করুন।

পরের পর্বে: তার ছাড়া network-এ তথ্য বাতাসে ভাসে। পর্ব ২৭-এ দেখব WPA3, enterprise Wi-Fi আর wireless-এর ঝুঁকি কমানোর পথ।

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

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