Kā tika izveidota hakeru spēles aizmugure par servera iznÄ«cināŔanu

Kā tika izveidota hakeru spēles aizmugure par servera iznÄ«cināŔanu
Mēs turpinām jums stāstÄ«t, kā tika organizēts mÅ«su lāzera kvests ar servera iznÄ«cināŔanu. Sāciet ar iepriekŔējo raksts par uzdevuma risināŔanu.

Kopumā spēles aizmugurē bija 6 arhitektÅ«ras vienÄ«bas, kuras mēs analizēsim Å”ajā rakstā:

  1. Spēļu entītiju aizmugure, kas bija atbildīgas par spēļu mehānismiem
  2. Aizmugursistēma un vietņu datu apmaiņas kopne VPS
  3. Tulkotājs no aizmugursistēmas pieprasījumiem (spēles elementiem) uz Arduino un aparatūru uz vietas
  4. Arduino, kas bija atbildīgs par releju vadību, saņēma komandas no tulka un veica faktisko darbu
  5. Faktiskās ierīces: ventilators, vītnes, stāvlampas utt.
  6. Frontend - pati Falcon vietne, no kuras spēlētāji kontrolēja ierīces

Iziesim cauri katram no tiem.

Spēļu entītiju aizmugure

Aizmugursistēma tika ieviesta kā pavasara sāknÄ“Å”anas lietojumprogramma: tai bija vairāki atpÅ«tas kontrolieri, tÄ«mekļa ligzdas galapunkts un pakalpojumi ar spēles loÄ£iku.

Bija tikai trīs kontrolieri:

  • Megatrons. PaÅ”reizējā Megatron lapa tika nosÅ«tÄ«ta, izmantojot GET pieprasÄ«jumus: pirms un pēc strāvas ieslēgÅ”anas. Lāzers izŔāva caur POST pieprasÄ«jumu.
  • Tildes lapu kartÄ“Å”ana, lai tās tiktu apkalpotas pēc lapas nosaukuma. Tilde eksportam ražo lapas nevis ar oriÄ£inālajiem nosaukumiem, bet gan ar iekŔējo ID un atbilstÄ«bas informāciju.
  • Captcha kontrolieris pseido-augstas slodzes servera captcha apkalpoÅ”anai.

Websocket galapunkts tika izmantots, lai kontrolētu sÄ«krÄ«kus: lampas, vÄ«tnes un burtus. Tika izvēlēts, lai visiem spēlētājiem sinhroni parādÄ«tu paÅ”reizējo ierÄ«ces statusu: vai tā ir ieslēgta vai izslēgta, aktÄ«va vai nē, kāda burta krāsa Å”obrÄ«d deg uz sienas. Lai nedaudz apgrÅ«tinātu lāzera ieslēgÅ”anas uzdevumu, vÄ«tnei un lāzeram pievienojām autorizāciju ar to paÅ”u pieteikumvārdu un paroli admin/admin.

Spēlētāji to varēja pārbaudÄ«t, ieslēdzot vÄ«tni, un atkārtot to paÅ”u ar lāzeru.

Izvēlējāmies tik triviālu pieteikÅ”anās-paroles pāri, lai nemocÄ«tu spēlētājus ar lieku atlasi.

Lai padarītu uzdevumu nedaudz interesantāku, kā ierīču identifikatori telpā tika izmantoti objektu ID no mongodb.

ObjectId satur laikspiedolu: divas nejauÅ”as vērtÄ«bas, no kurām viena tiek ņemta, pamatojoties uz ierÄ«ces identifikatoru, bet otra, pamatojoties uz procesa pid, kas to Ä£enerē, un skaitÄ«tāja vērtÄ«bu. Identifikatorus gribēju uztaisÄ«t ar regulāriem intervāliem un ar dažādiem pid procesiem, bet ar kopēju skaitÄ«tāju, lai lāzerierÄ«ces identifikatora izvēle bÅ«tu interesantāka. Tomēr beigās visi sāka ar identifikatoriem, kas atŔķīrās tikai ar skaitÄ«tāja vērtÄ«bu. Tas, iespējams, padarÄ«ja Å”o darbÄ«bu pārāk vienkārÅ”u un neprasa objekta ID struktÅ«ras analÄ«zi.

Tulkotājs no aizmugursistēmas pieprasījumiem

Python skripts, kurÅ” strādāja pie taimeriem un pārveidoja tos no spēļu abstrakcijām fiziskā modelÄ«. Piemēram, ā€œieslēgt stāvlampuā€ ā†’ ā€œieslēgt releju N2ā€.

Skripts ir savienots ar RabbitMQ rindu un pārsÅ«tÄ«ja pieprasÄ«jumus no rindas uz Arduino. Tajā tika Ä«stenota arÄ« paralēlās gaismas pārslēgÅ”anas loÄ£ika: kopā ar dažām ierÄ«cēm tika ieslēgta gaisma uz tām, piemēram, kad Megatron sākotnēji tika piegādāta strāva, tas tika izgaismots ar skatuves gaismu. Gaismas dizains visas ainas kinematogrāfijai ir atseviŔķs stāsts par mÅ«su projekta lÄ«dzproducenta un iestudējuma dizainera Iļjas Serova lielisko darbu, un par to pastāstÄ«sim atseviŔķā ierakstā.

Tulkotājs bija arÄ« atbildÄ«gs par smalcinātāja palaiÅ”anas loÄ£iku, izmantojot taimeri un attēla pārsÅ«tÄ«Å”anu uz televizoru: taimeris smalcinātāja palaiÅ”anai, kliedzoÅ”a kapibara, reklāma spēles beigās.

Kā tika strukturēta Megatron marÄ·iera Ä£enerÄ“Å”anas loÄ£ika

Pārbaudes Ŕāviens

Ik pēc 25 sekundēm tika ģenerēts jauns marķieris, un to varēja izmantot, lai ieslēgtu lāzeru uz 10 sekundēm ar jaudu 10/255. Saite uz github ar Megatron kodu.

Pēc tam lāzers atdzisa 1 minÅ«ti ā€“ Å”ajā laikā tas nebija pieejams un nepieņēma jaunus Ŕāvienu pieprasÄ«jumus.

Ar Å”o spēku nepietika, lai izdegtu cauri virvei, taču jebkurÅ” spēlētājs varēja izÅ”aut Megatronu un redzēt lāzera staru darbÄ«bā.

Lai Ä£enerētu marÄ·ieri, tika izmantots MD5 jaukÅ”anas algoritms. Un shēma izdevās MD5 no MD5 + skaitÄ«tājs + noslēpums par kaujas žetonu un bez noslēpuma par pārbaudes žetonu.

MD5 ir atsauce uz komerciālu projektu, ko paveica mÅ«su aizmugure Pāvels. Tikai pirms pāris gadiem Å”ajā projektā tika izmantots MD5, un, kad viņŔ projekta arhitektam teica, ka tas ir novecojis Å”ifrÄ“Å”anas algoritms, viņi sāka izmantot MD5 no MD5. Tā kā mēs nolēmām izveidot maksimāli noob projektu, viņŔ visu atcerējās un nolēma sniegt nelielu atsauci.

Kaujas Ŕāviens

Megatron kaujas režīms ir 100% lāzera jauda ar 3 vatiem. Tas ir pietiekami 2 minūtes, lai izdegtu cauri virvei, kas noturēja svaru, salauztu akvāriju un appludinātu serveri ar ūdeni.

Mēs atstājām dažus mājienus par projekta Github: proti, marÄ·iera Ä£enerÄ“Å”anas kodu, no kura varēja saprast, ka testa un kaujas marÄ·ieri tiek Ä£enerēti, pamatojoties uz vienu un to paÅ”u skaitÄ«tāja indikatoru. Kaujas žetona gadÄ«jumā papildus skaitÄ«tāja vērtÄ«bai tiek izmantota arÄ« sāls, kas gandrÄ«z pilnÄ«bā ir atstāta Ŕīs bÅ«tÄ«bas maiņas vēsturē, izņemot pēdējos divus varoņus.

Zinot Å”os datus, bija iespējams Ŕķirot pēdējos 2 sāls simbolus un faktiski uzzināt, ka tam tika izmantoti skaitļi no Lost, kas pārveidoti heksadecimālajā sistēmā.

Pēc tam spēlētājiem bija jānoÄ·er skaitÄ«tāja vērtÄ«ba (analizējot testa žetonu) un jāģenerē kaujas marÄ·ieris, izmantojot nākamo skaitÄ«tāja vērtÄ«bu un iepriekŔējā solÄ« atlasÄ«to sāli.

SkaitÄ«tājs vienkārÅ”i palielinājās ar katru testa Ŕāvienu un ik pēc 25 sekundēm. Mēs par to nekur nerakstÄ«jām, tam vajadzēja bÅ«t nelielam spēles pārsteigumam.

Captcha mijiedarbības pakalpojums

Spēļu pasaulē Ŕī bija tā pati captcha, kas bija jāielādē, lai ieslēgtu ventilatoru un atvērtu tāfeli ar mājienu. Blakus kamerai atradās portatÄ«vais dators ar slodzes uzraudzÄ«bu.

Kā tika izveidota hakeru spēles aizmugure par servera iznÄ«cināŔanu

ApkalpoÅ”ana Es aprēķināju, ko parādÄ«t uzraudzÄ«bā kā paÅ”reizējo slodzi: temperatÅ«ru un CPU ventilatoru. Metrika tika pārsÅ«tÄ«ta uz laika bāzes datu bāzi, un to izveidoja grafana.

Ja pēdējo 5 sekunžu laikā tika saņemti vairāk nekā 50 pieprasÄ«jumi parādÄ«t captcha, tad slodze palielinājās par fiksētu + nejauÅ”u soļu skaitu. Aprēķins bija tāds, ka 100% slodzi var sasniegt divās minÅ«tēs.

Patiesībā servisā bija vairāk loģikas, nekā tika parādīts pēdējā spēlē: novietojām monitoru tā, lai būtu redzama tikai CPU ventilatora rotācija.

Kvesta sākumā viņi vēlējās atstāt Grafan pieejamu no Falcon vietnes. Bet tajā bija arī atspēriena metrika no aizmugursistēmas lietojumprogrammas pārskata, kuru mums nebija laika notīrīt, tāpēc mēs nolēmām bloķēt piekļuvi tai. Un tas ir pareizi - pat kvesta sākumā daži spēlētāji uzminēja, ka lietojumprogramma ir rakstīta springboot ietvaros, un pat izraka dažu pakalpojumu nosaukumus.

Hostings un datu kopne

RÄ«ks informācijas pārsÅ«tÄ«Å”anai no aizmugursistēmas uz vietni, VPS serveri, kurā darbojās RabbitMQ.

Aizmugursistēma un datu kopne tika ieslēgta mÅ«su VPS. Tā jauda bija pielÄ«dzināma datoram, ko redzējāt ekrānā: 2 kodolu VPS ar diviem gigabaitiem RAM. Tarifs tika iekasēts par resursiem, jo ā€‹ā€‹maksimālā slodze bija plānota tikai dažas dienas - tā dara mÅ«su klienti, kuri plāno VPS ielādēt uz Ä«su laiku. Tad izrādÄ«jās, ka slodze ir lielāka, nekā gaidÄ«jām, un fiksēts tarifs bÅ«tu izdevÄ«gāk. Ja veicat uzdevumu, izvēlieties lÄ«nijas tarifus turbo.

Lai aizsargātu serveri no DDoSa, mēs izmantojām Cloudflare.

Ir vērts teikt, ka VPS visu izturēja godam.

Arduino, kas bija atbildīgs par releju vadību, saņēma komandas no tulka un veica faktisko darbu

Tas vairāk ir nākamā raksta tēma par projekta aparatÅ«ras daļu: aizmugursistēma vienkārÅ”i nosÅ«tÄ«ja pieprasÄ«jumus ieslēgt konkrētu releju. Tā notika, ka aizmugursistēma zināja gandrÄ«z visas entÄ«tijas, un tās pieprasÄ«jumi izskatÄ«jās kā ā€œieslēgt Å”o entÄ«tijuā€. Mēs to darÄ«jām vietnes agrÄ«nai pārbaudei (mēs vēl nebijām salikuÅ”i visus Arduino un relejus), beigās visu atstājām tā.

Frontend

Mēs ātri izveidojām vietni tildē, tas aizņēma vienu darba dienu un ietaupÄ«ja mÅ«su budžetā 30 tÅ«kstoÅ”us.

Sākotnēji mēs domājām vienkārÅ”i eksportēt vietni un pievienot trÅ«kstoŔās loÄ£ikas, taču mēs saskārāmies ar lietoÅ”anas noteikumiem, kas aizliedza to darÄ«t.

Mēs nebijām gatavi pārkāpt licenci, tāpēc bija divas iespējas: visu realizēt paÅ”iem vai sazināties tieÅ”i ar Tildi, runāt par projektu un lÅ«gt atļauju mainÄ«t kodu.

Izvēlējāmies otro variantu un viņi ne tikai pusceļā mūs sagaidīja, bet pat iedeva gada bezmaksas biznesa kontu, par ko esam viņiem ļoti pateicīgi. Bija ļoti neērti parādīt viņiem Sokol vietnes dizainu.

Rezultātā mēs pievienojām js loÄ£iku priekÅ”galam, lai nosÅ«tÄ«tu pieprasÄ«jumus uz elementārām ierÄ«cēm, un nedaudz mainÄ«jām pogu stilus spēļu elementu ieslēgÅ”anai un izslēgÅ”anai.

Mājas lapas dizains

Meklējumu vēsture, kas ir atseviŔķas nodaļas vērta.

Mēs vēlējāmies izveidot ne tikai vecmodÄ«gu vietni, bet arÄ« absolÅ«ti pretÄ«gu, kas pārkāpj visus dizaina pamatnoteikumus. Tajā paŔā laikā bija svarÄ«gi saglabāt ticamÄ«bu: tai nebija jāpārtrauc ENT stāsts, jādemonstrē autora pretenciozitāte, un spēlētājiem bija jātic, ka Ŕāda vietne varētu pastāvēt un pat piesaistÄ«t klientus. Un viņŔ to atnesa! Kamēr spēle norisinājās, ar mums divas reizes sazinājās, lai izveidotu tÄ«mekļa vietnes.

Sākumā dizainu veidoju pati, cenÅ”oties iekļaut vairāk gifu un spÄ«dÄ«gu elementu. Bet mans 10 gadus vecais dizaineris vÄ«rs paskatÄ«jās pār plecu un noraidÄ«ja to kā ā€œpārāk labuā€. Lai pārkāptu dizaina noteikumus, tie ir jāzina.

Kā tika izveidota hakeru spēles aizmugure par servera iznÄ«cināŔanu

Pastāv vairākas krāsu kombinācijas, kas izraisa ilgstoÅ”u riebuma sajÅ«tu: zaļā un sarkanā vienāda bagātÄ«ba, pelēka un rozā, zila plus brÅ«na. Beigās izŔķīrāmies par pamatkrāsu sarkano un zaļo kombināciju, pievienojām gifus ar kaÄ·i un no fonda fotoattēla atlasÄ«jām 3-4 paÅ”a Sokolova fotogrāfijas. Man bija tikai dažas prasÄ«bas: pusmūža vÄ«rietis, ģērbies pāris izmēru pārāk lielā uzvalkā un pozā ā€œprofesionālā studijas fotosesijāā€. Pārbaudē viņi to parādÄ«ja draugiem un jautāja: "Kā jums tas patÄ«k?"

Dizaina izstrādes procesā manam vÄ«ram ik pēc pusstundas bija jāiet apgulties, helikopters sāka lidot. Pasha mēģināja atvērt izstrādātāja konsoli lielākajai daļai ekrāna, kamēr viņŔ pabeidza priekÅ”pusi - lai aizsargātu acis.

Faktiskās ierīces

Ventilatori un gaismas tika montēti caur cietvielu relejiem, lai tie uzreiz neieslēgtos ar pilnu jaudu - lai jauda pieaugtu paralēli uzraudzībai.

Bet par to mēs runāsim nākamajā ierakstā, par spēles aparatūras daļu un vietnes faktisko uzbūvi.

Sekojiet līdzi!

Citi raksti par servera iznÄ«cināŔanas meklējumiem

Kā tika izveidota hakeru spēles aizmugure par servera iznÄ«cināŔanu

Avots: www.habr.com

Pievieno komentāru