Ne paslaptis, kad internetas yra labai priešiška aplinka. Kai tik pakeliate serverį, jis akimirksniu patiria didžiulius atakas ir kelis kartus nuskaito. Pavyzdžiui
Tarpit yra gaudyklės prievadas, naudojamas įeinantiems ryšiams sulėtinti. Jei prie šio prievado prisijungs trečiosios šalies sistema, negalėsite greitai uždaryti ryšio. Ji turės eikvoti savo sistemos išteklius ir laukti, kol baigsis ryšio laikas, arba jį nutraukti rankiniu būdu.
Dažniausiai apsaugai naudojami tarpitai. Ši technika pirmą kartą buvo sukurta apsaugoti nuo kompiuterių kirminų. Ir dabar jis gali būti naudojamas sugadinti šiukšlių siuntėjų ir tyrėjų gyvenimus, kurie plačiai nuskaito visus IP adresus iš eilės (pavyzdžiai apie Habré:
Vienas iš sistemos administratorių, vardu Chrisas Wellonsas, matyt, pavargo žiūrėti šią gėdą – ir jis parašė nedidelę programą.
Priemonės diegimas:
$ make
$ ./endlessh &
$ ssh -p2222 localhost
Tinkamai įdiegtas tarpitas atims daugiau išteklių iš užpuoliko nei iš jūsų. Bet tai net ne išteklių klausimas. Autorius
Veikimo režimu Endlessh serverį reikia įdiegti į įprastą 22 prievadą, kur masiškai beldžiasi chuliganai. Standartinės saugos rekomendacijos visada pataria perkelti SSH į kitą prievadą, o tai iškart sumažina žurnalų dydį.
Chrisas Wellonsas sako, kad jo programa naudoja vieną specifikacijos pastraipą SSH-
.
Kaip tik tai daro Endlessh programa: tai siunčia begalinis atsitiktinai sugeneruotų duomenų srautas, kurie atitinka RFC 4253, ty siunčiami prieš autentifikavimą ir kiekviena eilutė prasideda SSH-
ir neviršija 255 simbolių, įskaitant eilutės pabaigos simbolį. Apskritai viskas pagal standartą.
Pagal numatytuosius nustatymus programa laukia 10 sekundžių tarp paketų siuntimo. Tai apsaugo nuo kliento laiko pabaigos, todėl klientas bus įstrigęs amžinai.
Kadangi duomenys siunčiami prieš taikant kriptografiją, programa itin paprasta. Jai nereikia įdiegti jokių šifrų ir jis palaiko kelis protokolus.
Autorius stengėsi užtikrinti, kad komunalinė programa sunaudotų kuo mažiau išteklių ir mašinoje veiktų visiškai nepastebimai. Skirtingai nuo šiuolaikinių antivirusinių ir kitų „saugos sistemų“, ji neturėtų sulėtinti kompiuterio. Dėl šiek tiek gudresnio programinės įrangos diegimo jam pavyko sumažinti srautą ir atminties suvartojimą. Jei jis tiesiog pradėtų atskirą naujo ryšio procesą, potencialūs užpuolikai galėtų pradėti DDoS ataką atidarydami kelias jungtis, kad išnaudotų įrenginio išteklius. Viena gija vienai jungtis taip pat nėra geriausias pasirinkimas, nes branduolys eikvoja išteklius tvarkydamas gijas.
Štai kodėl Chrisas Wellonsas pasirinko lengviausią „Endlessh“ parinktį: vienos gijos serverį poll(2)
, kur spąstuose esantys klientai praktiškai nenaudoja papildomų resursų, neskaičiuojant branduolyje esančio lizdo objekto ir dar 78 baitų sekimui Endlessh. Kad nereikėtų skirti priėmimo ir siuntimo buferių kiekvienam klientui, Endlessh atidaro tiesioginės prieigos lizdą ir tiesiogiai verčia TCP paketus, apeinant beveik visą operacinės sistemos TCP/IP steką. Įeinančio buferio visai nereikia, nes gaunami duomenys mums neįdomūs.
Autorius sako, kad savo programos metu
import asyncio
import random
async def handler(_reader, writer):
try:
while True:
await asyncio.sleep(10)
writer.write(b'%xrn' % random.randint(0, 2**32))
await writer.drain()
except ConnectionResetError:
pass
async def main():
server = await asyncio.start_server(handler, '0.0.0.0', 2222)
async with server:
await server.serve_forever()
asyncio.run(main())
Asyncio idealiai tinka rašyti tarpitus. Pavyzdžiui, šis kabliukas užšaldys „Firefox“, „Chrome“ ar bet kurį kitą klientą, kuris daug valandų bando prisijungti prie jūsų HTTP serverio:
import asyncio
import random
async def handler(_reader, writer):
writer.write(b'HTTP/1.1 200 OKrn')
try:
while True:
await asyncio.sleep(5)
header = random.randint(0, 2**32)
value = random.randint(0, 2**32)
writer.write(b'X-%x: %xrn' % (header, value))
await writer.drain()
except ConnectionResetError:
pass
async def main():
server = await asyncio.start_server(handler, '0.0.0.0', 8080)
async with server:
await server.serve_forever()
asyncio.run(main())
Tarpit yra puiki priemonė bausti už interneto patyčias. Tiesa, yra tam tikra rizika, priešingai, atkreipti jų dėmesį į neįprastą konkretaus serverio elgesį. kas nors
Stebulės:
Python, Informacijos sauga, Programinė įranga, Sistemų administravimas
Žymos:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Trap (tarpit) įeinantiems SSH ryšiams
Ne paslaptis, kad internetas yra labai priešiška aplinka. Kai tik pakeliate serverį, jis akimirksniu patiria didžiulius atakas ir kelis kartus nuskaito. Pavyzdžiui
Tarpit yra gaudyklės prievadas, naudojamas įeinantiems ryšiams sulėtinti. Jei prie šio prievado prisijungs trečiosios šalies sistema, negalėsite greitai uždaryti ryšio. Ji turės eikvoti savo sistemos išteklius ir laukti, kol baigsis ryšio laikas, arba jį nutraukti rankiniu būdu.
Dažniausiai apsaugai naudojami tarpitai. Ši technika pirmą kartą buvo sukurta apsaugoti nuo kompiuterių kirminų. Ir dabar jis gali būti naudojamas sugadinti šiukšlių siuntėjų ir tyrėjų gyvenimus, kurie plačiai nuskaito visus IP adresus iš eilės (pavyzdžiai apie Habré:
Vienas iš sistemos administratorių, vardu Chrisas Wellonsas, matyt, pavargo žiūrėti šią gėdą – ir jis parašė nedidelę programą.
Priemonės diegimas:
$ make
$ ./endlessh &
$ ssh -p2222 localhost
Tinkamai įdiegtas tarpitas atims daugiau išteklių iš užpuoliko nei iš jūsų. Bet tai net ne išteklių klausimas. Autorius
Veikimo režimu Endlessh serverį reikia įdiegti į įprastą 22 prievadą, kur masiškai beldžiasi chuliganai. Standartinės saugos rekomendacijos visada pataria perkelti SSH į kitą prievadą, o tai iškart sumažina žurnalų dydį.
Chrisas Wellonsas sako, kad jo programa naudoja vieną specifikacijos pastraipą SSH-
.
Kaip tik tai daro Endlessh programa: tai siunčia begalinis atsitiktinai sugeneruotų duomenų srautas, kurie atitinka RFC 4253, ty siunčiami prieš autentifikavimą ir kiekviena eilutė prasideda SSH-
ir neviršija 255 simbolių, įskaitant eilutės pabaigos simbolį. Apskritai viskas pagal standartą.
Pagal numatytuosius nustatymus programa laukia 10 sekundžių tarp paketų siuntimo. Tai apsaugo nuo kliento laiko pabaigos, todėl klientas bus įstrigęs amžinai.
Kadangi duomenys siunčiami prieš taikant kriptografiją, programa itin paprasta. Jai nereikia įdiegti jokių šifrų ir jis palaiko kelis protokolus.
Autorius stengėsi užtikrinti, kad komunalinė programa sunaudotų kuo mažiau išteklių ir mašinoje veiktų visiškai nepastebimai. Skirtingai nuo šiuolaikinių antivirusinių ir kitų „saugos sistemų“, ji neturėtų sulėtinti kompiuterio. Dėl šiek tiek gudresnio programinės įrangos diegimo jam pavyko sumažinti srautą ir atminties suvartojimą. Jei jis tiesiog pradėtų atskirą naujo ryšio procesą, potencialūs užpuolikai galėtų pradėti DDoS ataką atidarydami kelias jungtis, kad išnaudotų įrenginio išteklius. Viena gija vienai jungtis taip pat nėra geriausias pasirinkimas, nes branduolys eikvoja išteklius tvarkydamas gijas.
Štai kodėl Chrisas Wellonsas pasirinko lengviausią „Endlessh“ parinktį: vienos gijos serverį poll(2)
, kur spąstuose esantys klientai praktiškai nenaudoja papildomų resursų, neskaičiuojant branduolyje esančio lizdo objekto ir dar 78 baitų sekimui Endlessh. Kad nereikėtų skirti priėmimo ir siuntimo buferių kiekvienam klientui, Endlessh atidaro tiesioginės prieigos lizdą ir tiesiogiai verčia TCP paketus, apeinant beveik visą operacinės sistemos TCP/IP steką. Įeinančio buferio visai nereikia, nes gaunami duomenys mums neįdomūs.
Autorius sako, kad savo programos metu
import asyncio
import random
async def handler(_reader, writer):
try:
while True:
await asyncio.sleep(10)
writer.write(b'%xrn' % random.randint(0, 2**32))
await writer.drain()
except ConnectionResetError:
pass
async def main():
server = await asyncio.start_server(handler, '0.0.0.0', 2222)
async with server:
await server.serve_forever()
asyncio.run(main())
Asyncio idealiai tinka rašyti tarpitus. Pavyzdžiui, šis kabliukas užšaldys „Firefox“, „Chrome“ ar bet kurį kitą klientą, kuris daug valandų bando prisijungti prie jūsų HTTP serverio:
import asyncio
import random
async def handler(_reader, writer):
writer.write(b'HTTP/1.1 200 OKrn')
try:
while True:
await asyncio.sleep(5)
header = random.randint(0, 2**32)
value = random.randint(0, 2**32)
writer.write(b'X-%x: %xrn' % (header, value))
await writer.drain()
except ConnectionResetError:
pass
async def main():
server = await asyncio.start_server(handler, '0.0.0.0', 8080)
async with server:
await server.serve_forever()
asyncio.run(main())
Tarpit yra puiki priemonė bausti už interneto patyčias. Tiesa, yra tam tikra rizika, priešingai, atkreipti jų dėmesį į neįprastą konkretaus serverio elgesį. kas nors
Šaltinis: www.habr.com