Python SMTP റിലേ സമർപ്പണം: 587-ൽ STARTTLS അതോ 465-ൽ TLS അതോ?
587-ലെ STARTTLS-ഉം 465-ലെ ഗൂഢ TLS-ഉം രണ്ടും Python സമർപ്പണം കൊണ്ടുപോകുന്നു, പക്ഷേ നിങ്ങളുടെ റിലേയ്ക്ക് ഒരെണ്ണം മാത്രം യോജിക്കുന്നു. ഹാൻഡ്ഷേക്കും പരാജയ മാതൃകകളും താരതമ്യം ചെയ്യുക.
രണ്ട് കണക്ഷൻ രീതികളും ഒരേ സന്ദേശം ഒരേ റിലേ അക്കൗണ്ടിലേക്ക് എത്തിക്കുന്നു, വ്യത്യാസം TLS എവിടെ തുടങ്ങുന്നു എന്നതിലാണ്, എന്താണ് അയയ്ക്കുന്നത് എന്നതിലല്ല. ഒന്ന് സ്പഷ്ട ടെക്സ്റ്റിൽ തുറന്ന് ബാൻഡിനുള്ളിൽ അപ്ഗ്രേഡ് ചെയ്യുന്നു; മറ്റൊന്ന് ആദ്യ ബൈറ്റ് മുതൽ എൻക്രിപ്റ്റ് ചെയ്തതാണ്. ആ ഒരു വ്യത്യാസമാണ് കർശനമായ റിലേ നയം എന്ത് സ്വീകരിക്കും, ഇടനില ഉപകരണത്തിന് എന്ത് നിരീക്ഷിക്കാം, ഏത് പിശക് സന്ദേശമാണ് നിങ്ങൾ ഒരു ഉച്ചയ്ക്ക് വായിക്കുക എന്നത് നിർണ്ണയിക്കുന്നത്. സ്വകാര്യ നെറ്റ്വർക്കിലെ ഒരു ആപ്ലിക്കേഷൻ ആന്തരിക സമർപ്പണ സേവനത്തിന് സന്ദേശം നൽകുമ്പോൾ ഇവയിൽ നിന്ന് ഞാൻ എങ്ങനെ തിരഞ്ഞെടുക്കുന്നു എന്നത് ഇതാ.
രണ്ട് രീതികളും യഥാർത്ഥത്തിൽ വേർതിരിയുന്നിടം
രണ്ട് സന്ദർഭങ്ങളിലും ജോലി ഒന്നുതന്നെ: അംഗീകൃത അക്കൗണ്ടായി പ്രാമാണീകരിക്കുക, അനുവദനീയമായ അയയ്ക്കുന്നയാളെ പേരിടുക, സ്വീകർത്താക്കളെ പട്ടികപ്പെടുത്തുക, റിലേ ഉത്തരവാദിത്വം ഏറ്റെടുക്കുന്നതുവരെ കാത്തിരിക്കുക. മാറുന്നത് പ്രവർത്തനങ്ങളുടെ ക്രമമാണ്. പോർട്ട് 587 സ്പഷ്ട ടെക്സ്റ്റ് SMTP സെഷനായി തുടങ്ങുന്നു, EHLO പ്രതികരണത്തിൽ STARTTLS പ്രഖ്യാപിക്കുന്നു, ക്ലയന്റ് ആവശ്യപ്പെട്ടാൽ മാത്രം അപ്ഗ്രേഡ് ചെയ്യുന്നു. പോർട്ട് 465 ഏതെങ്കിലും SMTP കമാൻഡ് പറയുന്നതിന് മുമ്പ് TLS ഹാൻഡ്ഷേക്ക് പ്രതീക്ഷിക്കുന്നു.
സമർപ്പണവും റിലേയും വ്യത്യസ്ത ജോലികളാണ്, അതിനാൽ പോർട്ട് നമ്പറുകൾ പരസ്പരം മാറ്റാവുന്ന ശീലങ്ങളല്ല. RFC 6409 സന്ദേശ സമർപ്പണത്തെ സ്വന്തം സേവനമായി വിവരിക്കുന്നു, RFC 8314 മിക്ക ആധുനിക റിലേകളും 465-ൽ നൽകുന്ന ഗൂഢ-TLS രൂപഭേദം ഉൾക്കൊള്ളുന്നു. നിങ്ങളുടെ റിലേ രണ്ടിൽ ഒന്ന് രേഖപ്പെടുത്തിയാൽ, ആ രേഖ മുൻ തൊഴിലുടമയിൽ നിന്ന് നേടിയ ഏത് മുൻഗണനയ്ക്കും മേലെ നിൽക്കുന്നു.
587-ലെ STARTTLS നിങ്ങൾക്ക് എന്ത് നൽകുന്നു
അപ്ഗ്രേഡ് SMTP സംഭാഷണത്തിനുള്ളിൽ നടക്കുന്നു, അതിനാൽ റിലേ അത് പ്രഖ്യാപിക്കാം, ക്ലയന്റിന് അതില്ലാതെ തുടരാൻ വിസമ്മതിക്കാം. Python-ൽ, സെർവർ ആ വിപുലീകരണം വാഗ്ദാനം ചെയ്യാത്തപ്പോൾ starttls() ഒരു അപവാദം ഉയർത്തുന്നു, ഇത് ഡൗൺഗ്രേഡ് ശ്രമത്തെ നിശ്ശബ്ദ സ്പഷ്ട-ടെക്സ്റ്റ് ലോഗിന് പകരം ദൃശ്യമായ പരാജയമാക്കി മാറ്റുന്നു. ആ സ്വഭാവമാണ് ഈ രീതിയുടെ പ്രധാന വാദം, യാദൃച്ഛികമായല്ല, ബോധപൂർവം അതിൽ ആശ്രയിക്കുന്നത് ഉചിതമാണ്.
എക്സ്പോഷർ ജാലകം ചെറുതാണെങ്കിലും യാഥാർത്ഥ്യമാണ്: പ്രാരംഭ EHLO കൈമാറ്റം വായിക്കാവുന്നതാണ്, അപ്ഗ്രേഡിന് മുമ്പ് ഒന്നും ക്രെഡൻഷ്യലുകൾ കൊണ്ടുപോകുന്നില്ല. ആപ്ലിക്കേഷൻ സബ്നെറ്റും ആന്തരിക റിലേയും തമ്മിലുള്ള സ്വകാര്യ പാതയിൽ ആ ജാലകം സാധാരണയായി സ്വീകാര്യമാണ്. നിങ്ങൾ നിയന്ത്രിക്കാത്ത പാതയിൽ, ചില ടീമുകൾ മറ്റേ രീതി ശഠിക്കുന്നതിന് കാരണം അതുതന്നെയാണ്.
STARTTLS കഴിവ് നീക്കിക്കളയുന്ന ഇന്റർസെപ്ഷൻ ഉപകരണം പരാജയപ്പെട്ട സമർപ്പണം സൃഷ്ടിക്കുന്നു, ഫോൾബാക്കല്ല. അതാണ് നിങ്ങൾ ആഗ്രഹിക്കുന്ന ഫലം, പാതയിൽ എന്തോ SMTP വീണ്ടും എഴുതുന്നുണ്ടെന്ന് കണ്ടെത്താനുള്ള വേഗമേറിയ മാർഗവുമതാണ്.
465-ലെ ഗൂഢ TLS എന്ത് മാറ്റുന്നു
സ്പഷ്ട ടെക്സ്റ്റ് ഘട്ടമേ ഇല്ല. സോക്കറ്റ് തുറക്കുന്നതോടെ ക്ലയന്റ് TLS ഹാൻഡ്ഷേക്ക് നടത്തുന്നു, സ്വന്തം ട്രസ്റ്റ് സ്റ്റോറിനെതിരെ സർട്ടിഫിക്കറ്റ് സാധൂകരിക്കുന്നു, അതിനുശേഷം മാത്രം EHLO, AUTH, സന്ദേശം എന്നിവ കൈമാറുന്നു. ചർച്ച ചെയ്യാൻ സ്പഷ്ട ടെക്സ്റ്റ് അവസ്ഥയില്ലാത്തതിനാൽ സെഷൻ ഡൗൺഗ്രേഡ് ചെയ്യാനാവില്ല, ഇത് ഇന്റർസെപ്ഷൻ പരാജയങ്ങളുടെ ഒരു മുഴുവൻ വിഭാഗം ഒഴിവാക്കുന്നു.
കൈമാറ്റം രോഗനിർണ്ണയക്ഷമതയാണ്. 465-ൽ സ്പഷ്ട ടെക്സ്റ്റ് SMTP ഉപയോഗിച്ച് ഉത്തരം നൽകുന്ന റിലേ, അല്ലെങ്കിൽ തെറ്റായ സർട്ടിഫിക്കറ്റ് പേരിൽ TLS അവസാനിപ്പിക്കുന്ന ലോഡ് ബാലൻസർ, ഹാൻഡ്ഷേക്കിൽ പരാജയപ്പെടുകയും മെയിൽ പിശകിന് പകരം നിങ്ങൾക്ക് SSL പിശക് നൽകുകയും ചെയ്യുന്നു. അത് സംഭവിക്കുമ്പോൾ, പ്രശ്നം ആപ്ലിക്കേഷന് താഴെയാണ്, എത്ര സന്ദേശ നിർമ്മാണം നടത്തിയാലും അത് ശരിയാക്കില്ല.
ഒരു സമർപ്പണ ഫംഗ്ഷൻ, രണ്ട് ഗതാഗതങ്ങൾ
കോഡ് രണ്ട് രീതികൾക്കിടയിൽ ഏറെക്കുറെ വ്യത്യസ്തമല്ല, അതിനാൽ തിരഞ്ഞെടുപ്പ് ലൈബ്രറിയുടെ സൗകര്യത്തിൽ നിന്നല്ല, റിലേ നയത്തിൽ നിന്ന് വേണം. ആദ്യം ക്രമീകരണങ്ങൾ കയറ്റുമതി ചെയ്യുക, തുടർന്ന് ക്രമീകരിച്ച പോർട്ടിൽ നിന്ന് ഗതാഗതം തിരഞ്ഞെടുക്കുന്ന ഒരൊറ്റ സ്ക്രിപ്റ്റ് പ്രവർത്തിപ്പിക്കുക.
export SMTP_HOST=smtp.relay.internal export SMTP_PORT=587 export SMTP_USER=svc-notify export [email protected] export [email protected] export SMTP_PASSWORD="$(cat /run/secrets/smtp_password)"
import os, smtplib, ssl
from email.message import EmailMessage
ctx = ssl.create_default_context()
msg = EmailMessage()
msg["From"] = os.environ["MAIL_FROM"]
msg["To"] = os.environ["MAIL_TEST_TO"]
msg["Subject"] = "relay submission test"
msg.set_content("One authorized test message from the app.")
host = os.environ["SMTP_HOST"]
port = int(os.environ.get("SMTP_PORT", "587"))
if port == 465:
client = smtplib.SMTP_SSL(host, port, context=ctx, timeout=15)
else:
client = smtplib.SMTP(host, port, timeout=15)
client.ehlo()
client.starttls(context=ctx)
client.ehlo()
with client:
client.login(os.environ["SMTP_USER"], os.environ["SMTP_PASSWORD"])
refused = client.send_message(msg)
print("refused:", refused)
create_default_context() ശൃംഖലയും ഹോസ്റ്റ്നാമും പരിശോധിക്കുന്നു, അതിനാൽ സ്വകാര്യ CA ട്രസ്റ്റ് സ്റ്റോറിൽ ഇൻസ്റ്റാൾ ചെയ്യണം, സ്ഥിരീകരിക്കാത്ത സന്ദർഭം ഉപയോഗിച്ച് ഒഴിവാക്കരുത്. send_message() റിലേ നിരസിച്ച സ്വീകർത്താക്കളുടെ നിഘണ്ടു തിരികെ നൽകുന്നു; ശൂന്യമായ നിഘണ്ടു എന്നാൽ അത് എല്ലാവരെയും സ്വീകരിച്ചു എന്നർത്ഥം. പതിനഞ്ച് സെക്കൻഡ് ടൈംഔട്ട് ഒരു തുടക്കമാണ്, നിങ്ങളുടെ നെറ്റ്വർക്കിനായി ട്യൂൺ ചെയ്ത മൂല്യമല്ല.
പാസ്വേഡ് ഇമേജിന് പുറത്തും ലോഗുകൾക്ക് പുറത്തും സൂക്ഷിക്കുക. റൺടൈമിൽ മൗണ്ട് ചെയ്ത് പരിസ്ഥിതിയിലേക്ക് വായിക്കുന്ന രഹസ്യം കുഴപ്പമില്ല; പരിസ്ഥിതി ഒരു ലോഗ് വരിയിൽ പ്രതിധ്വനിപ്പിക്കുന്നത് കുഴപ്പമാണ്, AUTH കൈമാറ്റത്തിന്റെ ഡീബഗ് ട്രെയ്സും അങ്ങനെതന്നെ.
ശീലത്തിൽ നിന്നല്ല, റിലേ നയത്തിൽ നിന്നും പാതയിൽ നിന്നും തിരഞ്ഞെടുക്കുക
മൂന്ന് നിബന്ധനകൾ അത് തീരുമാനിക്കുന്നു. ഒന്നാമത്, റിലേ യഥാർത്ഥത്തിൽ എന്ത് പ്രഖ്യാപിക്കുന്നു: 587-ൽ STARTTLS-നൊപ്പം മാത്രം കേൾക്കുന്ന സേവനത്തിൽ 465-ൽ എത്താനാവില്ല, നിങ്ങൾ എത്ര ഗൂഢ TLS ഇഷ്ടപ്പെട്ടാലും. രണ്ടാമത്, ആപ്ലിക്കേഷനും റിലേയും തമ്മിലുള്ള പാത വായിക്കാവുന്ന EHLO കൈമാറ്റം സ്വീകരിക്കാൻ മതിയായ വിശ്വസനീയമാണോ എന്നത്. മൂന്നാമത്, നടുവിൽ എന്തെങ്കിലും SMTP വീണ്ടും എഴുതുന്നുണ്ടോ അല്ലെങ്കിൽ പ്രോക്സി ചെയ്യുന്നുണ്ടോ എന്നത്, കാരണം ഡൗൺഗ്രേഡ് അപകടം സൈദ്ധാന്തികമാണോ യഥാർത്ഥമാണോ എന്നത് അതാണ് നിർണ്ണയിക്കുന്നത്.
റിലേ രണ്ടും വാഗ്ദാനം ചെയ്യുമ്പോൾ, മേൽനോട്ടമില്ലാതെ പ്രവർത്തിക്കുന്ന സേവനത്തിന് ഞാൻ 465 എടുക്കുന്നു, ആദ്യ വിന്യാസം ഒരാൾ നിരീക്ഷിക്കുന്ന സേവനത്തിന് 587-ഉം, പരാജയ സന്ദേശങ്ങൾ വ്യത്യസ്ത പാളികളെ ചൂണ്ടുന്നു എന്ന ഒറ്റ കാരണത്താൽ. ആ മുൻഗണന എന്റേതാണ്, അത് നയമല്ല.
നിങ്ങൾ എന്ത് തിരഞ്ഞെടുത്താലും, പോർട്ട്, ട്രസ്റ്റ് മെറ്റീരിയൽ, അയയ്ക്കുന്നയാളുടെ ഡൊമെയ്ൻ എന്നിവ വിന്യാസത്തോടൊപ്പം രേഖപ്പെടുത്തുക. തുടർന്ന് ഒരു അംഗീകൃത പരീക്ഷണ സന്ദേശം അയച്ച് റിലേ അത് സ്വീകരിച്ചുവെന്ന് ഉറപ്പാക്കുക, സമർപ്പണ ഫലവും പിന്നീടുള്ള ഏതെങ്കിലും ഡെലിവറി റിപ്പോർട്ടും വേറിട്ട രേഖകളായി സൂക്ഷിക്കുക. റിലേയിലേക്കുള്ള വിജയകരമായ കൈമാറ്റം ആപ്ലിക്കേഷന്റെ ഉത്തരവാദിത്വത്തിന്റെ അവസാനമാണ്, സന്ദേശം ഇൻബോക്സിൽ എത്തിയതിന്റെ തെളിവല്ല.