🎧 Listen to this article: हिंदी · English · 日本語 · 中文
🌍 Read this in your language: हिंदी · தமிழ் · తెలుగు · ಕನ್ನಡ · മലയാളം · ଓଡ଼ିଆ · 日本語 · 中文
പാസ്വേഡ് ഇല്ലാത്ത ഒരു സെർവർ അക്കൗണ്ടിനെക്കുറിച്ച് ചിന്തിക്കുക. ഒരു പാസ്വേഡ് പരിശോധനയിൽ പിശക് സന്ദേശത്തെ ശരിയായ ഉത്തരമായി തെറ്റിദ്ധരിച്ചതിനാൽ, ഒരു അറ്റാക്കർക്ക് അതിലേക്ക് ലോഗിൻ ചെയ്യാൻ സാധിക്കുന്നുവെന്ന് കരുതുക. ഈ ആഴ്ചയിലെ OpenSSH എമർജൻസി റിലീസിന് പിന്നിലെ പ്രധാന ബഗ്ഗ് ഇതാണ്.
ഇന്ന് 2026 നവംബർ 6 ആണ്, ഇന്നലെ (നവംബർ 5-ന്) പ്രോജക്റ്റിൽ നിന്നുള്ള അടിയന്തര അഭ്യർത്ഥനയോടെ Portable OpenSSH 10.6p2 പുറത്തിറങ്ങിയതിനാൽ ഇത് ഇപ്പോൾ വളരെ പ്രധാനമാണ്. പാസ്വേഡ് ഓതന്റിക്കേഷൻ ഓൺ ചെയ്തിട്ടുള്ള musl-അധിഷ്ഠിത Linux സെർവറുകളാണ് നിങ്ങൾ പ്രവർത്തിപ്പിക്കുന്നതെങ്കിൽ, ആവശ്യമായ നടപടികൾ സ്വീകരിക്കുന്നതുവരെ പാസ്വേഡ് ലോഗിനുകൾ പ്രവർത്തനരഹിതമാക്കാനോ SSH ഉടനടി ഡിസേബിൾ ചെയ്യാനോ ഡെവലപ്പർമാർ ആവശ്യപ്പെടുന്നു.
പല ടീമുകളും ആ തലക്കെട്ട് വായിച്ച് ഭയപ്പെടുകയോ അല്ലെങ്കിൽ നിസ്സാരമായി തള്ളിക്കളയുകയോ ചെയ്തേക്കാം. രണ്ടും തെറ്റാണ്. ഭൂരിഭാഗം Linux സെർവറുകളെയും ഇത് ബാധിക്കില്ല, എന്നാൽ ബാധിക്കപ്പെടുന്നവയിൽ നിങ്ങൾ എപ്പോഴും "key-only" എന്ന് വിളിച്ചിരുന്ന സെർവറുകൾ ഉൾപ്പെട്ടേക്കാം. ഈ ഗൈഡ് ലളിതമായ ഭാഷയിൽ ബഗ്ഗ് വിശദീകരിക്കുകയും, ഒരു സെർവർ എങ്ങനെ കൃത്യമായി പരിശോധിക്കാമെന്ന് കാണിക്കുകയും, കണ്ടെത്തൽ മുതൽ പരിഹാരം സ്ഥിരീകരിക്കുന്നത് വരെയുള്ള ഒരു പൂർണ്ണ ഉദാഹരണത്തിലൂടെ വ്യക്തമാക്കുകയും ചെയ്യുന്നു.
എന്താണ് സംഭവിച്ചത്, ലളിതമായ വാക്കുകളിൽ
അഡ്മിനിസ്ട്രേറ്റർമാർ വിദൂരമായി സെർവറുകളിലേക്ക് ലോഗിൻ ചെയ്യാൻ ഉപയോഗിക്കുന്ന ടൂളാണ് SSH. ഇതിന്റെ ഏറ്റവും വ്യാപകമായി ഉപയോഗിക്കുന്ന പതിപ്പാണ് OpenSSH.
ഓരോ Linux പ്രോഗ്രാമും ഒരു C ലൈബ്രറിയെയാണ് (അടിസ്ഥാന ഫംഗ്ഷനുകളുടെ ഒരു ഷെയർഡ് ശേഖരം) ആശ്രയിക്കുന്നത്. മിക്ക Linux സിസ്റ്റങ്ങളും glibc എന്ന ലൈബ്രറിയാണ് ഉപയോഗിക്കുന്നത്. Alpine Linux ഉപയോഗിക്കുന്നത് musl എന്ന ചെറിയ ലൈബ്രറിയാണ്, ഇതാണ് കണ്ടെയ്നറുകൾക്കും ചെറിയ ക്ലൗഡ് സെർവറുകൾക്കും Alpine ഇത്രയധികം ജനപ്രിയമാകാൻ പ്രധാന കാരണം.
ആ രണ്ട് സോഫ്റ്റ്വെയറുകൾക്കിടയിലെ സംഗമസ്ഥാനത്താണ് ഈ ബഗ്ഗ് നിലനിൽക്കുന്നത്. ഇതിന്റെ യഥാർത്ഥ കാരണം OpenSSH-ന് പുറത്താണെന്ന് OpenSSH-ന്റെ ഡെവലപ്പർമാർ കരുതുന്നുണ്ടെങ്കിലും, ഇത് ചൂഷണം ചെയ്യാനുള്ള വഴിയൊരുക്കുന്നത് SSH സെർവറാണെന്നും അത് തടയാൻ അനുയോജ്യമായ പ്രായോഗികമായ ഇടം അതാണെന്നും അവർ തിരിച്ചറിയുന്നു. അതിനാൽ 10.6p2 ഒരു പരിഹാരമാർഗ്ഗം (workaround) ചേർക്കുന്നു. Wakefield-ൽ നിന്നുള്ള Özgün Kültekin ആണ് ഈ തകരാർ കണ്ടെത്തിയത്.
ഒരു പിശക് എങ്ങനെ വിജയകരമായ ലോഗിൻ ആയി മാറുന്നു
എക്സ്പ്ലോയിറ്റ് വിശദാംശങ്ങളൊന്നുമില്ലാതെ, ഘട്ടം ഘട്ടമായുള്ള ലോജിക് ഇതാ.
PAM (Pluggable Authentication Modules, ലോഗിനുകൾ കൈകാര്യം ചെയ്യുന്നതിനുള്ള ഒരു സാധാരണ സിസ്റ്റം) ഇല്ലാതെ ഒരു സെർവർ പാസ്വേഡ് പരിശോധിക്കുമ്പോൾ, അത് വളരെ ലളിതമായ ഒരു കാര്യമാണ് ചെയ്യുന്നത്. ഉപയോക്താവ് ടൈപ്പ് ചെയ്ത പാസ്വേഡ് അത് ഹാഷ് ചെയ്യുകയും, തുടർന്ന് ലഭിക്കുന്ന ഫലം ആ അക്കൗണ്ടിനായി സംഭരിച്ചിരിക്കുന്ന മൂല്യവുമായി താരതമ്യം ചെയ്യുകയും ചെയ്യുന്നു.
ഒരു ഹാഷിന് സാൾട്ട് (salt) ആവശ്യമാണ്; ഒരേ പാസ്വേഡുകൾ വ്യത്യസ്ത ഫലങ്ങൾ നൽകുന്നതിനായി ചേർക്കുന്ന ഒരു ചെറിയ ക്രമരഹിത മൂല്യമാണിത് (random value). ഒരു അക്കൗണ്ടിനായി സംഭരിച്ചിരിക്കുന്ന മൂല്യം ഒരു സാൾട്ട് നൽകാൻ തക്കവിധം ചെറുതാണെങ്കിൽ, OpenSSH-ന് അതേ മെഷീനിലെ മറ്റൊരു അക്കൗണ്ടിൽ നിന്ന് ഒരെണ്ണം കടമെടുക്കാൻ കഴിയും. നല്ലൊരു കാരണത്താലാണ് ഇത് ചെയ്യുന്നത്: CVE-2016-6210 എന്ന തകരാറിനുള്ള പ്രതികരണമായി, ഏതൊക്കെ ഉപയോക്തൃനാമങ്ങൾ നിലവിലുണ്ടെന്ന് അറ്റാക്കർമാർ ഊഹിക്കുന്നത് തടയാൻ 2016 മുതൽ ഇത് ശ്രമിക്കുന്നുണ്ട്.
ഇനി ആ വൈരുദ്ധ്യം (collision). musl-ന്റെ crypt() ഫംഗ്ഷനിലേക്ക് ചില ഹാഷ് തരങ്ങൾക്ക് അനുവദനീയമായതിലും നീളമുള്ള പാസ്വേഡ് നൽകുമ്പോൾ, അത് നിരസിക്കുകയും ഒറ്റ ക്യാരക്ടറായ * നൽകി ഒരു പിശക് സൂചിപ്പിക്കുകയും ചെയ്യുന്നു.
എന്നാൽ * എന്നത് തന്നെയാണ് പാസ്വേഡ് ആവശ്യമില്ലാത്ത അക്കൗണ്ടുകളുടെ പാസ്വേഡ് ഫീൽഡിൽ പല സിസ്റ്റങ്ങളും സംഭരിക്കുന്നതും.
അതിനാൽ സെർവർ രണ്ട് മൂല്യങ്ങളെ താരതമ്യം ചെയ്യുന്നു:
- അത് കണക്കുകൂട്ടിയ മൂല്യം:
*, ഇതിന്റെ യഥാർത്ഥ അർത്ഥം "error" എന്നാണ്. - അതിൽ സംഭരിച്ചിരിക്കുന്ന മൂല്യം:
*, ഇതിന്റെ യഥാർത്ഥ അർത്ഥം "no usable password" എന്നാണ്.
അവ പൊരുത്തപ്പെടുന്നു. ലോഗിൻ വിജയിക്കുന്നു.
ഒരു ലിസ്റ്റുമായി ഒത്തുനോക്കി ആളുകളെ പരിശോധിക്കുന്ന ഒരു ബൗൺസറെക്കുറിച്ച് ചിന്തിക്കുക. സ്കാനർ കേടായി "ERROR" എന്ന് പ്രിന്റ് ചെയ്യുന്നു. ജീവനക്കാർക്കുള്ള കുറിപ്പായി ലിസ്റ്റിൽ ചേർത്ത ഒരു എൻട്രിയിലും "ERROR" എന്ന് തന്നെയുണ്ട്. ബൗൺസർ സമാനമായ രണ്ട് വാക്കുകൾ കാണുകയും ആ വ്യക്തിയെ അകത്തേക്ക് കടത്തിവിടുകയും ചെയ്യുന്നു. ഇവിടെ ആരും കള്ളം പറഞ്ഞിട്ടില്ല, ഓരോ ഭാഗവും അതിന്റെ ചുമതല നിർവഹിച്ചു. എന്നാൽ ഒരൊറ്റ മൂല്യം രണ്ട് വ്യത്യസ്ത അർത്ഥങ്ങൾ നൽകിയതിലൂടെയാണ് ഈ അപകടമുണ്ടായത്.
2012-ലെ musl മാറ്റങ്ങളും 2016-ലെ OpenSSH മാറ്റങ്ങളുമാണ് ഇതിന് കാരണമായതെന്ന് ഗവേഷകൻ കണ്ടെത്തുന്നു. AI ഏജന്റുകളുടെ സഹായത്തോടെ, വിവിധ ബിൽഡ്, ലോഗിൻ കോമ്പിനേഷനുകളിലായി നടത്തിയ ഏകദേശം 17,600 ടെസ്റ്റ് ലോഗിനുകളിലൂടെയാണ് താൻ ഇത് കണ്ടെത്തിയതെന്ന് അദ്ദേഹം റിപ്പോർട്ട് ചെയ്യുന്നു.
നിങ്ങളെ ഇത് ബാധിക്കുന്നുണ്ടോ? നാല് സാഹചര്യങ്ങൾ
Alpine ഉപദേശക കുറിപ്പ് നാല് സാഹചര്യങ്ങൾ പട്ടികപ്പെടുത്തുന്നു, അവയെല്ലാം പ്രധാനമാണ്:
- OpenSSH, PAM ഇല്ലാതെ പാസ്വേഡുകൾ പരിശോധിക്കുന്നു.
PasswordAuthenticationഇനേബിൾ ചെയ്തിരിക്കുന്നു.- ടാർഗെറ്റ് അക്കൗണ്ടിന്റെ പാസ്വേഡ് ഫീൽഡിൽ അടങ്ങിയിരിക്കുന്നത്
*. - മറ്റൊരു ലോക്കൽ അക്കൗണ്ടിലെ പാസ്വേഡ് ഹാഷ് ആരംഭിക്കുന്നത്
$5$അല്ലെങ്കിൽ$6$.
Alpine-ന്റെ സാധാരണ openssh-server പാക്കേജ് PAM ഉപയോഗിക്കുന്നില്ല. വെറുതെ openssh-server-pam ഇൻസ്റ്റാൾ ചെയ്തതുകൊണ്ടും കാര്യമില്ല, കാരണം UsePAM no എന്ന് സെറ്റ് ചെയ്തിട്ടുണ്ടെങ്കിൽ അപകടസാധ്യത ഇപ്പോഴും നിലനിൽക്കുന്നുണ്ട്.
ഇവ പറഞ്ഞിരിക്കുന്ന പരിധിക്ക് (scope) പുറത്താണ്:
- Linux അല്ലാത്ത പ്ലാറ്റ്ഫോമുകൾ.
- glibc ഉപയോഗിക്കുന്ന Linux സിസ്റ്റങ്ങൾ.
- PAM വഴി പാസ്വേഡുകൾ പരിശോധിക്കുന്ന Linux സിസ്റ്റങ്ങൾ.
- SSH സെർവർ പ്രവർത്തിക്കാത്ത കണ്ടെയ്നറുകൾ.
- പാസ്വേഡ് ഓതന്റിക്കേഷൻ ഡിസേബിൾ ചെയ്തിട്ടുള്ള സിസ്റ്റങ്ങൾ.
- ഇതുപയോഗിച്ച് ലോക്ക് ചെയ്ത അക്കൗണ്ടുകൾ
!, ഇതിന് പകരമായി:*.
ഈ അവസാനത്തെ വിഭാഗം കാരണമാണ് "ഞങ്ങൾ Alpine ഉപയോഗിക്കുന്നു" എന്നത് "ഞങ്ങൾ അപകടസാധ്യതയിലാണ്" എന്നതിന് തുല്യമാകാത്തത്. മിക്ക Alpine കണ്ടെയ്നറുകളിലും യാതൊരു SSH സെർവറും പ്രവർത്തിക്കുന്നില്ല. അതുപോലെ തന്നെ, "OpenSSH ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ട്" എന്നത് കൊണ്ട് മാത്രം ഒന്നും വ്യക്തമാകില്ല. C ലൈബ്രറി, പാക്കേജ്, നിലവിൽ പ്രവർത്തിക്കുന്ന കോൺഫിഗറേഷൻ, അക്കൗണ്ട് ഡാറ്റ എന്നിവയെല്ലാം നിങ്ങൾ അറിഞ്ഞിരിക്കേണ്ടതുണ്ട്.
അപകടകരമായ സാഹചര്യം: ഔദ്യോഗിക ക്ലൗഡ് ഇമേജുകൾ
Alpine പ്രത്യേകമായി ഒരു സാഹചര്യം ചൂണ്ടിക്കാണിക്കുന്നു. പതിപ്പ് 3.18.11 മുതൽ 3.24.3 വരെയുള്ള ഇതിന്റെ ഔദ്യോഗിക tiny-cloud ഇമേജുകളിൽ ഉള്ളത് ഒരു alpine അക്കൗണ്ടാണ്; ഇതിൽ * പാസ്വേഡ് ഫീൽഡും പാസ്വേഡ് ആവശ്യമില്ലാത്ത doas അവകാശങ്ങളും (rights) ഉണ്ട്. doas എന്നത് ഒരു ചെറിയ ടൂളാണ്, ഏതാണ്ട് sudoപോലെ തന്നെ, ഇത് റൂട്ട് (root) ആയി കമാൻഡുകൾ പ്രവർത്തിപ്പിക്കാൻ ഉപയോക്താവിനെ അനുവദിക്കുന്നു.
നാലാമത്തെ സാഹചര്യം ഇല്ലാത്തതിനാൽ ആ ഇമേജുകൾ തുടക്കത്തിൽ സുരക്ഷിതമാണ്. മെഷീനിൽ യോഗ്യതയുള്ള പാസ്വേഡ് ഹാഷ് ഒന്നും തന്നെ ഉണ്ടാകില്ല.
തുടർന്ന് ആരെങ്കിലും സാധാരണ പാസ്വേഡുള്ള ഒരു ഉപയോക്താവിനെ ചേർക്കുന്നു (ഒരുപക്ഷേ കൺസോൾ ആക്സസിനായി). ആ ഒരൊറ്റ പതിവ് മാറ്റം ഈ സാഹചര്യങ്ങളെല്ലാം പൂർണ്ണമാക്കിയേക്കാം. ഒരു അറ്റാക്കർക്ക് ഇതായി പ്രവേശിക്കാനും: alpine തുടർന്ന് റൂട്ട് (root) ആയി മാറാനും സാധിക്കും.
ഡീഫോൾട്ടായ PermitRootLogin prohibit-password എന്ന ക്രമീകരണം ഇവിടെ സഹായിക്കില്ല. ഇത് റൂട്ടിലേക്കുള്ള നേരിട്ടുള്ള പാസ്വേഡ് ലോഗിനുകളെ തടയുമെങ്കിലും, ഈ വഴി പരോക്ഷമായി റൂട്ടിൽ എത്തിച്ചേരുന്നു.
ഒരു പ്രായോഗിക ഉദാഹരണം: Acme-യുടെ ജമ്പ് ഹോസ്റ്റ്
ഒരു സാങ്കൽപ്പിക കമ്പനിയെ നമുക്ക് ഉദാഹരണമായി എടുക്കാം. Acme ഒരു ചെറിയ Alpine സെർവർ പ്രവർത്തിപ്പിക്കുന്നുണ്ട്, bastion.example.com, ആന്തരിക സിസ്റ്റങ്ങളിലേക്ക് കണക്റ്റ് ചെയ്യുന്നതിനായി ജീവനക്കാർ ഇതിലൂടെയാണ് കടന്നുപോകുന്നത്. ഇത് key-only ആണെന്നാണ് എല്ലാവരും പറയുന്നത്. എന്നാൽ അത് തെളിയിക്കാൻ രോഹിത് (Rohit) എന്ന പുതിയ എഞ്ചിനീയറോട് ആവശ്യപ്പെട്ടിരിക്കുകയാണ്.
ഘട്ടം 1: പ്ലാറ്റ്ഫോം സ്ഥിരീകരിക്കുക
രോഹിത് ലോഗിൻ ചെയ്ത് സിസ്റ്റം പരിശോധിക്കുന്നു:
cat /etc/alpine-release
ldd --version
apk info -e openssh-server openssh-server-pam
ആദ്യത്തെ കമാൻഡ് Alpine പതിപ്പ് കാണിക്കുന്നു. രണ്ടാമത്തേത് musl-ന്റെ വിവരങ്ങൾ നൽകുന്നു. മൂന്നാമത്തേത് ഈ രണ്ട് പാക്കേജുകളിൽ ഏതാണ് ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്നതെന്ന് പട്ടികപ്പെടുത്തുന്നു. Acme-യുടെ സെർവറിൽ, openssh-server മാത്രമാണ് കാണുന്നത്, അതിനാൽ അവിടെ PAM ഇല്ല.
ഒരുവേള ldd --version എന്നത് glibc എന്നാണ് കാണിക്കുന്നതെങ്കിലോ, അല്ലെങ്കിൽ മെഷീനിൽ SSH സെർവർ ഒന്നും പ്രവർത്തിക്കുന്നില്ലെങ്കിലോ, അവർക്ക് പരിശോധന അവസാനിപ്പിച്ച് അടുത്ത സിസ്റ്റത്തിലേക്ക് നീങ്ങാം.
ഘട്ടം 2: sshd യഥാർത്ഥത്തിൽ എന്താണ് നടപ്പിലാക്കുന്നത് എന്ന് പരിശോധിക്കുക
ടീമുകൾ സാധാരണയായി ഒഴിവാക്കുന്ന ഘട്ടമാണിത്. കോൺഫിഗറേഷൻ ഫയൽ മാത്രം വായിച്ച് കാര്യങ്ങൾ ഊഹിക്കരുത്. നിലവിലുള്ള ക്രമീകരണങ്ങൾ (effective settings) എന്തൊക്കെയാണെന്ന് സെർവറോട് തന്നെ ചോദിക്കുക:
sshd -T | grep -iE '^(passwordauthentication|usepam|permitrootlogin|authenticationmethods)'
രോഹിത് ഇത് കാണുന്നു:
permitrootlogin prohibit-password
passwordauthentication yes
authenticationmethods any
അപ്രതീക്ഷിതമായ കാര്യം ഇവിടെയാണ്. പാസ്വേഡ് ലോഗിനുകൾ ഓൺ ആണ്. ജീവനക്കാർ എല്ലായ്പ്പോഴും കീകൾ (keys) മാത്രമാണ് ഉപയോഗിച്ചിരുന്നത് എന്നതിനാൽ ആരും ഇത് ശ്രദ്ധിച്ചില്ല. PAM ഇല്ലാത്ത ഒരു ബിൽഡ് usepam എന്ന് ഒട്ടും തന്നെ പ്രിന്റ് ചെയ്തേക്കില്ല, അതുകൊണ്ടാണ് ഈ ഔട്ട്പുട്ടിൽ അങ്ങനെയൊരു വരി ഇല്ലാത്തത്.
ഓരോ കണക്ഷനും അനുസരിച്ച് ക്രമീകരണങ്ങൾ ഇതിലൂടെ മാറാനും സാധ്യതയുണ്ട്: Match റൂളുകൾ; അതിനാൽ ഒരു പ്രത്യേക ഉപയോക്താവിനും വിലാസത്തിനുമുള്ള ക്രമീകരണം അവർ പരിശോധിക്കുന്നു:
sshd -T -C user=deploy,host=bastion.example.com,addr=203.0.113.10 | grep -i '^passwordauthentication'
ഘട്ടം 3: അക്കൗണ്ട് ഡാറ്റ പരിശോധിക്കുക
റൂട്ട് (root) ആയി റൺ ചെയ്യുമ്പോൾ, ഈ രണ്ട് കമാൻഡുകൾ അക്കൗണ്ട് പേരുകൾ മാത്രമേ പ്രിന്റ് ചെയ്യൂ, ഒരിക്കലും ഹാഷുകൾ പ്രിന്റ് ചെയ്യില്ല:
awk -F: '$2 == "*" {print "star: " $1}' /etc/shadow
awk -F: '$2 ~ /^\$[56]\$/ {print "hash: " $1}' /etc/shadow
രോഹിതിന് ലഭിച്ച ഫലം:
star: deploy
hash: backup-admin
അങ്ങനെ deployഎന്ന "key-only" അക്കൗണ്ടിന് ഉള്ളത് ഒരു * ഫീൽഡാണ്. കൂടാതെ backup-adminഎന്ന അക്കൗണ്ടിന് (കൺസോൾ ആക്സസിനായി കഴിഞ്ഞ വർഷം ഉണ്ടാക്കിയത്) യോഗ്യമായ ഒരു ഹാഷുമുണ്ട്. നാല് സാഹചര്യങ്ങളും ഇവിടെ ഒത്തുവന്നിരിക്കുന്നു. ഈ സെർവർ അപകടസാധ്യതയിലാണ്.
ഘട്ടം 4: ആദ്യം വാതിലടയ്ക്കുക, പിന്നീട് പാച്ച് ചെയ്യുക
രോഹിത് നിലവിലുള്ള സെഷൻ തുറന്നുതന്നെ വയ്ക്കുകയും രണ്ടാമതൊരു ടെർമിനലിൽ നിന്ന് തങ്ങളുടെ കീ (key) പ്രവർത്തിക്കുന്നുണ്ടെന്ന് ഉറപ്പുവരുത്തുകയും ചെയ്യുന്നു. ഇവിടെ സംഭവിക്കുന്ന ഒരു ചെറിയ തെറ്റ് എല്ലാവരെയും പുറത്താക്കിയേക്കാം (lockout), തുറന്നിരിക്കുന്ന സെഷനാണ് അവരുടെ സുരക്ഷാ മാർഗ്ഗം.
അവർ ക്രമീകരണം ഇതിലേക്ക് ചേർക്കുന്നു: /etc/ssh/sshd_config:
PasswordAuthentication no
ഒരു പ്രധാന ചതിക്കുഴി: മിക്ക ക്രമീകരണങ്ങൾക്കും OpenSSH ആദ്യം വായിക്കുന്ന മൂല്യമാണ് ഉപയോഗിക്കുന്നത്. ഫയലിന്റെ മുകൾഭാഗത്ത് ഒരു Include വരിയോ, അല്ലെങ്കിൽ താഴെയായി ഒരു Match ബ്ലോക്കോ ഉണ്ടെങ്കിൽ, പുതിയ വരിയായിരിക്കില്ല ബാധകമാകുന്നത്. അതുകൊണ്ടാണ് എഡിറ്റ് ചെയ്തയുടൻ തന്നെ പരിശോധന നടത്തുന്നത്:
sshd -t
sshd -T | grep -i '^passwordauthentication'
sshd -t എന്നത് കോൺഫിഗറേഷനിലെ പിശകുകൾ പരിശോധിക്കുന്നു. ഇത് പാസ്സായാൽ, അവർ പ്രസിദ്ധീകരിച്ച Alpine പരിഹാരം പ്രയോഗിക്കുന്നു. Alpine പതിപ്പുകളായ 3.21.10, 3.22.8, 3.23.8, 3.24.4 എന്നിവ പുറത്തിറക്കിയിട്ടുണ്ട്, കൂടാതെ OpenRC സിസ്റ്റങ്ങളിലെ പരിഹാരമാർഗ്ഗം ഇതാണ്:
apk upgrade -U -a
rc-service sshd restart
റീസ്റ്റാർട്ട് ചെയ്യുന്നത് നിർബന്ധമാണ്. ഒരു പാക്കേജ് ഇൻസ്റ്റാൾ ചെയ്തതുകൊണ്ട് മാത്രം മെമ്മറിയിൽ ഇതിനകം പ്രവർത്തിച്ചുകൊണ്ടിരിക്കുന്ന SSH സെർവർ മാറ്റിസ്ഥാപിക്കപ്പെടില്ല.
ഘട്ടം 5: പുറത്തുനിന്ന് ഇത് പരിശോധിച്ച് ഉറപ്പുവരുത്തുക
ഇനി ഒരു പുറത്തുനിന്നുള്ളയാൾ ചെയ്യുന്നതുപോലെ, മറ്റൊരു മെഷീനിൽ നിന്ന് രോഹിത് സ്വന്തം സെർവറിലേക്ക് പരിശോധന നടത്തുന്നു:
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password [email protected]
അവർ പ്രതീക്ഷിക്കുന്ന മറുപടി ഇതുപോലെയുള്ള ഒരു നിരസിക്കലാണ്: Permission denied (publickey). സെർവർ ഇനി പാസ്വേഡുകൾ നൽകില്ല എന്നാണ് ഇതിനർത്ഥം. ജീവനക്കാർക്ക് ഇപ്പോഴും പ്രവേശിക്കാൻ കഴിയുമെന്ന് ഉറപ്പാക്കാൻ അവർ ഒരു പുതിയ ടെർമിനലിൽ സാധാരണ കീ-അധിഷ്ഠിത സെഷൻ തുറക്കുന്നു.
ഘട്ടം 6: മുൻകാല ദുരുപയോഗങ്ങൾ ഉണ്ടോ എന്ന് പരിശോധിക്കുക
പാച്ചിംഗ് വാതിലുകൾ അടയ്ക്കുന്നുവെങ്കിലും, ഇതിനകം ആരെങ്കിലും അതിലൂടെ പ്രവേശിച്ചിട്ടുണ്ടോ എന്ന് അതുകൊണ്ട് അറിയാൻ കഴിയില്ല. ഈ കൃത്യമായ എൻട്രിക്കായി ലോഗുകൾ പരിശോധിക്കാൻ Alpine ശുപാർശ ചെയ്യുന്നു:
grep 'Accepted password for' /var/log/messages
ജീവനക്കാർ കീകൾ (keys) മാത്രം ഉപയോഗിക്കുന്ന ഒരു സെർവറിൽ, ഒരു പാസ്വേഡ് ലോഗിൻ വിജയിക്കുന്നത് ശ്രദ്ധിക്കേണ്ട വലിയൊരു മുന്നറിയിപ്പാണ്. ആവർത്തിച്ചുള്ള പരാജയങ്ങൾ മാത്രം നിരീക്ഷിക്കുന്ന സിസ്റ്റങ്ങൾക്ക് ഇത് പൂർണ്ണമായും നഷ്ടമായേക്കാം, കാരണം ഇവിടെ അറ്റാക്കറുടെ ശ്രമം ഒരു വിജയമായിട്ടാണ് കാണപ്പെടുന്നത്.
രോഹിതിന് അത്തരത്തിലുള്ളതൊന്നും കണ്ടെത്താൻ കഴിഞ്ഞില്ല. എന്നാൽ ഇതിനായി ഒരെണ്ണം കണ്ടെത്തിയിരുന്നെങ്കിൽ: deploy, അവരുടെ ജോലി കേവലം പാച്ചിംഗിൽ നിന്ന് ഇൻസിഡന്റ് റെസ്പോൺസിലേക്ക് (incident response) മാറുമായിരുന്നു. പ്രിവിലേജ് എസ്കലേഷൻ, പുതിയ ഉപയോക്താക്കൾ, പുതിയ ഫയലുകൾ, മാറ്റിമറിച്ച ഓതറൈസ്ഡ് കീകൾ എന്നിവ പരിശോധിക്കാനും, അനധികൃത ലോഗിൻ തള്ളിക്കളയാനാവില്ലെങ്കിൽ ഹോസ്റ്റ് അപഹരിക്കപ്പെട്ടതായി (compromised) കണക്കാക്കാനും Alpine നിർദ്ദേശിക്കുന്നു. സ്റ്റോർ ചെയ്ത ക്രെഡൻഷ്യലുകളും ഡിപ്ലോയ്മെന്റ് രഹസ്യങ്ങളും ഉൾപ്പെടെ ആ അക്കൗണ്ടിന് ലഭ്യമാകുന്ന എന്തും പുനരവലോകനം ചെയ്യുകയും മാറ്റുകയും ചെയ്യേണ്ടതുണ്ട്.
സംശയാസ്പദമായ ലോഗിൻ നടന്ന സമയത്ത് ആ അക്കൗണ്ട് എങ്ങനെയായിരുന്നുവെന്നും പരിശോധിക്കുക. അതിന്റെ ഇപ്പോഴത്തെ അവസ്ഥ പിൽക്കാലത്തുണ്ടായ മാറ്റങ്ങളെയാകാം പ്രതിഫലിപ്പിക്കുന്നത്.
ഘട്ടം 7: ഉൽപ്പന്നം മാത്രമല്ല, നിർമ്മാണ സ്രോതസ്സും (factory) ശരിയാക്കുക
സേവ് ചെയ്ത ഒരു ഇമേജിൽ നിന്നാണ് Acme സെർവറുകൾ നിർമ്മിക്കുന്നത്. രോഹിത് ഘട്ടം 6-ൽ അവസാനിപ്പിച്ചിരുന്നെങ്കിൽ, അടുത്ത റീബിൽഡ് അല്ലെങ്കിൽ ഓട്ടോസ്കെയിലിംഗ് സംഭവിക്കുമ്പോൾ പഴയ ക്രമീകരണങ്ങൾ തിരികെ വരുമായിരുന്നു. അവർ ടെംപ്ലേറ്റ് അപ്ഡേറ്റ് ചെയ്യുകയും അവിടെ PasswordAuthentication no എന്ന് ക്രമീകരിക്കുകയും, അതോടൊപ്പം backup-admin എന്ന അക്കൗണ്ടിന് എന്തിനാണ് പാസ്വേഡ് ആവശ്യമുള്ളത് എന്ന് ചോദിക്കുകയും ചെയ്യുന്നു.
സ്കാനർ ഫലങ്ങൾ എങ്ങനെ മനസ്സിലാക്കാം
ഈ ആഴ്ച ആശയക്കുഴപ്പമുണ്ടാക്കുന്ന ധാരാളം റിപ്പോർട്ടുകൾ പ്രതീക്ഷിക്കാം. രണ്ട് കാര്യങ്ങളെ വേർതിരിച്ചുതന്നെ കാണുക.
അപ്സ്ട്രീം പതിപ്പ് സ്ട്രിംഗും (version string) ഒരു ഡിസ്ട്രിബ്യൂഷന്റെ പാച്ച് നിലയും രണ്ട് വ്യത്യസ്ത തെളിവുകളാണ്. പ്രധാന പതിപ്പ് നമ്പർ മാറ്റാതെ തന്നെ വെണ്ടർമാർ ഒരു ഫിക്സ് ബാക്ക്പോർട്ട് ചെയ്തേക്കാം, അതിനാൽ നിങ്ങളുടെ ഡിസ്ട്രിബ്യൂഷന്റെ പാക്കേജ് മാർഗ്ഗനിർദ്ദേശങ്ങൾ പിന്തുടരുക. നിങ്ങൾ സ്വയം OpenSSH കമ്പൈൽ ചെയ്യുകയാണെങ്കിൽ, 10.6p2 റിലീസ് കുറിപ്പുകൾ ഉപയോഗിക്കുക.
ഓരോ സെർവറിനും നാല് വ്യത്യസ്ത കാര്യങ്ങൾ ട്രാക്ക് ചെയ്യുക: അപകടസാധ്യതയുള്ള പാക്കേജ് തിരിച്ചറിഞ്ഞു, പകരം പുതിയത് ഇൻസ്റ്റാൾ ചെയ്തു, സർവീസ് പുനരാരംഭിച്ചു (restarted), കോൺഫിഗറേഷൻ സ്ഥിരീകരിച്ചു. ഒരു ടിക്കറ്റിൽ "Patched" എന്ന് രേഖപ്പെടുത്തുന്നത് പലപ്പോഴും രണ്ടാമത്തെ കാര്യത്തെ മാത്രമാണ് സൂചിപ്പിക്കുന്നത്.
എന്തുകൊണ്ടാണ് ഇത്ര വേഗത്തിൽ പരിഹാരം എത്തിയത്
ഈ പ്രശ്നത്തിന് പരിഹാരമാർഗ്ഗം (workaround) പുറത്തിറക്കുന്നതിന് തലേദിവസമാണ് OpenSSH ടീം ഇതിനെക്കുറിച്ച് അറിഞ്ഞതെന്ന് Damien Miller പറഞ്ഞു. ഏതാനും മണിക്കൂറുകൾക്കുള്ളിൽ AI ഏജന്റുകൾ സ്വതന്ത്രമായി സുരക്ഷാ തകരാറുകൾ വീണ്ടും കണ്ടെത്തുന്ന സമീപകാല സംഭവങ്ങൾ ചൂണ്ടിക്കാണിച്ച അദ്ദേഹം, ദീർഘകാല ഉപരോധങ്ങൾ (embargoes) അറ്റാക്കർമാർക്ക് അനുകൂലമായേക്കാം എന്ന് വാദിച്ചു.
ഷെഡ്യൂൾ ചെയ്ത റിലീസുകൾക്കായി മാറ്റങ്ങൾ മാറ്റിവെയ്ക്കുന്നതിന് പകരം കൂടുതൽ തവണ ഫിക്സുകൾ നൽകുന്നതിലേക്കുള്ള മാറ്റത്തെക്കുറിച്ചും റിലീസ് കുറിപ്പുകൾ വിവരിക്കുന്നു. ഒപ്പം, പല AI-നിർമ്മിത റിപ്പോർട്ടുകളും പ്രായോഗികമായ യാതൊരു സുരക്ഷാ പ്രത്യാഘാതവും ഉണ്ടാക്കുന്നില്ലെന്നും മനുഷ്യന്റെ വിശകലനം ഇപ്പോഴും നിർണായകമാണെന്നും ഇതിൽ ഊന്നിപ്പറയുന്നുണ്ട്.
നമ്മിൽ ഭൂരിഭാഗം ആളുകൾക്കും ഇതിന്റെ പ്രായോഗിക ഫലം ലളിതമാണ്. നിർണായകമായ ഫിക്സുകൾ ഇപ്പോൾ നിങ്ങളുടെ സാധാരണ മെയിന്റനൻസ് സമയത്തിന് പുറത്തും എത്തിയേക്കാം. വെണ്ടർമാരുടെ പ്രഖ്യാപനങ്ങൾ നേരിട്ട് പിന്തുടരുക, ഒപ്പം അടിയന്തര മാറ്റങ്ങൾ വരുത്താൻ ആർക്കാണ് അനുമതിയുള്ളതെന്ന് മുൻകൂട്ടി തീരുമാനിക്കുക.
ഈ കാര്യങ്ങൾ അപകടസാധ്യതയെയും അതിനുള്ള വിവേകപൂർണ്ണമായ പ്രതികരണത്തെയുമാണ് വിവരിക്കുന്നത്. സ്ഥിരീകരിച്ച ഒരു ആക്രമണ നീക്കത്തിന്റെ തെളിവുകളല്ല ഇവ.
യഥാർത്ഥ പാഠം: ഒരേപോലെയല്ലാത്ത മൂന്ന് പ്രയോഗങ്ങൾ
"Uses SSH keys", "has no password set", "cannot authenticate with a password" എന്നിവ കേൾക്കാൻ ഒരുപോലെ തോന്നാമെങ്കിലും, അവ വ്യത്യസ്ത കാര്യങ്ങളെയാണ് വിവരിക്കുന്നത്. ആദ്യത്തേത് ഒരു ശീലമാണ്. രണ്ടാമത്തേത് ഡാറ്റയുടെ ഒരു അവസ്ഥയാണ്. മൂന്നാമത്തേത് മാത്രമാണ് നിർബന്ധമായും നടപ്പിലാക്കപ്പെട്ട ഒരു നിയന്ത്രണം (enforced control), നിലവിൽ പ്രവർത്തിക്കുന്ന സെർവർ പരിശോധിച്ച് മാത്രമേ നിങ്ങൾക്ക് ഇത് അറിയാൻ കഴിയൂ.
ഉപസംഹാരം
ഇത് വളരെ സങ്കീർണ്ണമായ പ്രത്യാഘാതങ്ങളുള്ള ഒരു ചെറിയ ബഗ്ഗ് ആണ്. മിക്ക Linux സിസ്റ്റങ്ങളും ഇതിന്റെ പരിധിക്ക് പുറത്താണ്, എന്നാൽ ഈ നാല് സാഹചര്യങ്ങളോടും പൊരുത്തപ്പെടുന്ന ഒരു musl-അധിഷ്ഠിത സെർവറിന്, ഒരിക്കലും പാസ്വേഡ് ആവശ്യമില്ലാത്ത ഒരു അക്കൗണ്ടിലേക്കുള്ള ലോഗിൻ സ്വീകരിക്കാൻ കഴിഞ്ഞേക്കാം. അപ്ഡേറ്റ് ചെയ്യുക, റീസ്റ്റാർട്ട് ചെയ്യുക, ഇത് സെറ്റ് ചെയ്യുക: PasswordAuthentication no, പുറത്തുനിന്ന് പരിശോധിച്ച് ഉറപ്പാക്കുക, നിങ്ങളുടെ ലോഗുകൾ പരിശോധിക്കുക, നിങ്ങളുടെ ടെംപ്ലേറ്റുകൾ ശരിയാക്കുക. തുടർന്ന് നിങ്ങളുടെ ഓർഗനൈസേഷനിൽ "key-only" എന്നാൽ എന്താണ് അർത്ഥമാക്കുന്നത് എന്ന് രേഖപ്പെടുത്തുകയും അത് പരിശോധിക്കുകയും ചെയ്യുക.
ഗുണങ്ങൾ
- അപകടസാധ്യത വളരെ നിർദ്ദിഷ്ടമായ സാഹചര്യങ്ങളിൽ മാത്രമുള്ളതാണ്, അതിനാൽ മിക്ക സിസ്റ്റങ്ങളെയും ടീമുകൾക്ക് വേഗത്തിൽ ഒഴിവാക്കാനാകും.
- പരിഹരിച്ച Alpine റിലീസുകളും ലളിതമായ ഒരു താൽക്കാലിക പരിഹാരമാർഗ്ഗവും ഇതിനകം ലഭ്യമാണ്.
- പരിശോധനകൾക്ക് സാധാരണ ടൂളുകൾ മാത്രമാണ് ഉപയോഗിക്കുന്നത്, കൂടാതെ ഒരു സെർവറിന് ഏതാനും മിനിറ്റുകൾ മാത്രമേ എടുക്കൂ.
- ലോഗിനുകളും അക്കൗണ്ട് ഡാറ്റയും അവലോകനം ചെയ്യുന്നത് ഈ ഒരു ബഗ്ഗിനപ്പുറത്തേക്ക് സിസ്റ്റം സുരക്ഷ മെച്ചപ്പെടുത്തുന്നു.
പോരായ്മകൾ
- "OpenSSH installed" എന്ന് മാത്രം കാണിക്കുന്ന അസറ്റ് ലിസ്റ്റുകൾക്ക് ഈ ചോദ്യത്തിന് ഉത്തരം നൽകാൻ കഴിയില്ല.
- പാസ്വേഡുള്ള ഒരു ഉപയോക്താവിനെ ചേർക്കുന്നത് പോലുള്ള ഒരു സാധാരണ മാറ്റം, സുരക്ഷിതമായ ഒരു മെഷീനെ അപകടസാധ്യതയിലാക്കാം.
- SSH ക്രമീകരണങ്ങളിലെ തെറ്റുകൾ അഡ്മിനിസ്ട്രേറ്റർമാരെ പുറത്താക്കാൻ (lockout) ഇടയാക്കിയേക്കാം.
- പാച്ചിംഗ് നടത്തിയത് കൊണ്ട് മുമ്പുണ്ടായ അനധികൃത പ്രവേശനങ്ങളെ കണ്ടെത്താനോ പഴയപടിയാക്കാനോ കഴിയില്ല.
മുന്നറിയിപ്പ്
ഈ ലേഖനം വിദ്യാഭ്യാസ ആവശ്യങ്ങൾക്കുള്ളതാണ്, മാത്രമല്ല ഇത് തയ്യാറാക്കുന്ന സമയത്ത് ലഭ്യമായ പ്രസിദ്ധീകരിച്ച ഉപദേശക കുറിപ്പുകളെയും റിപ്പോർട്ടുകളെയും അടിസ്ഥാനമാക്കിയുള്ളതാണ്. Acme, Rohit, deploy, backup-admin, ഹോസ്റ്റ്നെയിമും IP വിലാസവും സാങ്കൽപ്പിക പ്ലെയ്സ്ഹോൾഡറുകളാണ്, അതിനാൽ അവയ്ക്ക് പകരം നിങ്ങളുടെ സ്വന്തം മൂല്യങ്ങൾ നൽകുക. SSH ക്രമീകരണങ്ങൾ മാറ്റുമ്പോൾ ഒരു സജീവ സെഷൻ തുറന്നുതന്നെ വെയ്ക്കുക, നിങ്ങൾക്ക് പരിശോധിക്കാൻ അനുമതിയുള്ള സിസ്റ്റങ്ങൾ മാത്രം പരിശോധിക്കുക, അവയെ ആശ്രയിക്കുന്നതിന് മുൻപായി നിലവിലെ OpenSSH, Alpine മുന്നറിയിപ്പുകൾ അല്ലെങ്കിൽ നിങ്ങളുടെ സ്വന്തം വെണ്ടറുടെ മാർഗ്ഗനിർദ്ദേശങ്ങളുമായി വിവരങ്ങൾ ഒത്തുനോക്കി ഉറപ്പുവരുത്തുക.
പതിവായി ചോദിക്കുന്ന ചോദ്യങ്ങൾ
- എന്താണ് OpenSSH 10.6p2? — ചില musl-അധിഷ്ഠിത Linux സിസ്റ്റങ്ങളെ ബാധിക്കുന്ന ലോഗിൻ ബൈപാസിനുള്ള ഒരു പരിഹാരവുമായി 2026 നവംബർ 5-ന് പുറത്തിറക്കിയ ഒരു അടിയന്തര Portable OpenSSH റിലീസാണിത്.
- എല്ലാ Alpine Linux സിസ്റ്റങ്ങളും വൾനറബിൾ ആണോ? — അല്ല. ഒരു സിസ്റ്റത്തിന് ആവശ്യമുള്ളത് PAM ഇല്ലാതെ പാസ്വേഡുകൾ പരിശോധിക്കുന്ന റണ്ണിംഗ് ആയ ഒരു SSH സെർവർ, പാസ്വേഡ് ഓതന്റിക്കേഷൻ എനേബിൾ ചെയ്തിരിക്കൽ, ഒരു
*പാസ്വേഡ് ഫീൽഡുള്ള ഒരു ടാർഗറ്റ് അക്കൗണ്ട്, കൂടാതെ മറ്റൊരു ലോക്കൽ അക്കൗണ്ടിന് ഒരു$5$അല്ലെങ്കിൽ$6$ഹാഷ് എന്നിവയാണ്. - Ubuntu, Debian, മറ്റ് glibc സിസ്റ്റങ്ങൾ എന്നിവയെ ഇത് ബാധിക്കുമോ? — glibc ഉപയോഗിക്കുന്ന Linux സിസ്റ്റങ്ങൾ വ്യക്തമാക്കിയ പരിധിക്ക് പുറത്താണ്, അതുപോലെ തന്നെയാണ് Linux ഇതര പ്ലാറ്റ്ഫോമുകളും PAM വഴി പാസ്വേഡുകൾ പരിശോധിക്കുന്ന Linux സിസ്റ്റങ്ങളും.
- Alpine Docker കണ്ടെയ്നറുകൾ അപകടസാധ്യതയിലാണോ? — റണ്ണിംഗ് SSH സെർവർ ഇല്ലാത്ത കണ്ടെയ്നറുകൾ ഈ ആക്രമണ സാധ്യതയ്ക്ക് പുറത്താണ്, അതിനാൽ ഒരു കണ്ടെയ്നർ യഥാർത്ഥത്തിൽ sshd റൺ ചെയ്യുന്നുണ്ടോ എന്നതാണ് പ്രധാന ചോദ്യം.
- PermitRootLogin prohibit-password എന്നെ സംരക്ഷിക്കുമോ? — ഇത് root-ലേക്കുള്ള നേരിട്ടുള്ള പാസ്വേഡ് ലോഗിനുകൾ തടയുന്നു, എന്നാൽ ഒരു അറ്റാക്കർ മറ്റൊരു അക്കൗണ്ട് വഴി പ്രവേശിച്ച് പ്രിവിലേജ് ഉയർത്തുന്നത് (escalating) ഇത് തടയുന്നില്ല; tiny-cloud
alpineഅക്കൗണ്ട് സാഹചര്യത്തിലെന്നപോലെ. - പാക്കേജ് അപ്ഡേറ്റ് ചെയ്താൽ മാത്രം മതിയോ? — അല്ല. നിങ്ങൾ SSH സർവീസ് റീസ്റ്റാർട്ട് ചെയ്യുകയും വേണം, കാരണം നിങ്ങൾ അങ്ങനെ ചെയ്യുന്നതുവരെ പഴയ സെർവർ മെമ്മറിയിൽ പ്രവർത്തിച്ചുകൊണ്ടേയിരിക്കും.
- എനിക്ക് ഇന്ന് അപ്ഡേറ്റ് ചെയ്യാൻ കഴിയില്ലെങ്കിൽ ഞാൻ എന്താണ് ചെയ്യേണ്ടത്? — സെറ്റ് ചെയ്യുക
PasswordAuthentication no, പ്രാബല്യത്തിലുള്ള ക്രമീകരണം ഇതുപയോഗിച്ച് സ്ഥിരീകരിക്കുക:sshd -T, നിലവിലുള്ള ഒരു സെഷൻ തുറന്നുവെച്ചുകൊണ്ട് തന്നെ കീ ആക്സസ്സ് പരിശോധിക്കുകയും ചെയ്യുക. - ആരെങ്കിലും ഇത് ഇതിനകം ഉപയോഗിച്ചിട്ടുണ്ടോ എന്ന് എങ്ങനെ പരിശോധിക്കാം? — തിരയുക:
/var/log/messagesഎന്നതിൽ ഇതിനായി:Accepted password forഎന്ന എൻട്രികൾ (പാസ്വേഡുകൾ ഉപയോഗിക്കാൻ പാടില്ലാത്ത അക്കൗണ്ടുകളിൽ); അനധികൃത ലോഗിൻ സാധ്യത തള്ളിക്കളയാനാവില്ലെങ്കിൽ ഹോസ്റ്റ് അപഹരിക്കപ്പെട്ടതായി കണക്കാക്കുക.
ടാഗുകൾ
#OpenSSH #AlpineLinux #LinuxSecurity #SSH #AuthenticationBypass #Musl #DevSecOps #CloudSecurity #PatchManagement #IncidentResponse
Incident Response: First Hour
A calm, evidence-preserving checklist for establishing control, bounding impact, communicating clearly, and containing an incident safely.
Free. No spam — unsubscribe in one click.


Responses
Sign in to leave a response.