Серверді жою туралы хакер ойынының сервері қалай жасалған

Серверді жою туралы хакер ойынының сервері қалай жасалған
Біз сізге серверді жоюға арналған лазерлік квест қалай ұйымдастырылғанын айтуды жалғастырамыз. Алдыңғыдан бастаңыз квест шешу туралы мақала.

Барлығы ойынның артқы жағында 6 архитектуралық бірлік болды, біз осы мақалада талдаймыз:

  1. Ойын механизмдеріне жауапты ойын нысандарының артқы жағы
  2. VPS жүйесінде серверлік және сайт деректерімен алмасу шинасы
  3. Ардуиноға сервер сұрауларынан (ойын элементтерінен) және сайттағы аппараттық құралдарға аудармашы
  4. Релелерді басқаруға жауапты Arduino аудармашыдан командалар алып, нақты жұмысты орындады.
  5. Нақты құрылғылар: желдеткіш, гирляндтар, еден лампалары және т.б.
  6. Frontend - ойыншылар құрылғыларды басқаратын Falcon веб-сайтының өзі

Олардың әрқайсысына тоқталайық.

Ойын нысандарының артқы жағы

Backend көктемгі жүктеу қосымшасы ретінде жүзеге асырылды: оның бірнеше демалыс контроллері, веб-сокеттің соңғы нүктесі және ойын логикасы бар қызметтері болды.

Тек үш контроллер болды:

  • Мегатрон. Ағымдағы Megatron беті GET сұраулары арқылы жіберілді: қуатты қосқанға дейін және кейін. Лазер POST сұрауы арқылы атылды.
  • Тильде беттерін бет атымен көрсетілетін етіп салыстыру. Tilde экспортқа арналған беттерді түпнұсқа атауларымен емес, ішкі идентификаторы мен сәйкестік ақпаратымен шығарады.
  • Captcha контроллері псевдожоғары жүктелген сервердің каптчасына қызмет етеді.

Websocket соңғы нүктесі гаджеттерді басқару үшін пайдаланылды: шамдар, гирляндалар және әріптер. Ол барлық ойыншыларға құрылғының ағымдағы күйін синхронды түрде көрсету үшін таңдалды: ол қосулы немесе өшірулі, белсенді немесе жоқ, қазіргі уақытта қабырғада әріптің қандай түсі жанып тұрғанын. Лазерді қосу тапсырмасын біршама қиындату үшін біз гирляндияға және лазерге бірдей логин мен құпия сөз admin/admin авторизациясын қостық.

Ойыншылар гирлянданы қосу арқылы оны тексеріп, лазермен қайталай алады.

Біз ойыншыларды қажетсіз таңдаумен қинамас үшін осындай тривиальды логин-пароль жұбын таңдадық.

Тапсырманы біршама қызықты ету үшін mongodb нысанының идентификаторлары бөлмедегі құрылғы идентификаторлары ретінде пайдаланылды.

ObjectId уақыт белгісін қамтиды: екі кездейсоқ мән, олардың біреуі құрылғы идентификаторы негізінде қабылданады, екіншісі оны жасайтын процестің pid және санауыш мәніне негізделген. Мен идентификаторларды тұрақты аралықта және әртүрлі pid процестерімен, бірақ жалпы есептегішпен жасауды қаладым, осылайша лазерлік құрылғы идентификаторын таңдау қызықтырақ болады. Дегенмен, соңында бәрі тек санауыш мәнімен ерекшеленетін идентификаторлардан бастады. Бұл қадамды тым қарапайым етіп және objectId құрылымын талдауды қажет етпеуі мүмкін.

Сервер сұрауларынан аудармашы

Python сценарийі, таймерлерде жұмыс істеген және оларды ойын абстракцияларынан физикалық модельге аударған. Мысалы, «еден шамын қосу» → «N2 релесін қосу».

Сценарий RabbitMQ кезегіне қосылды және кезектен сұрауларды Arduino-ға жіберді. Ол сонымен қатар жарықтың параллельді ауысу логикасын жүзеге асырды: кейбір құрылғылармен бірге олардағы жарық қосылды, мысалы, Megatron-ға бастапқыда қуат берілгенде, ол сахна жарығымен жарықтандырылды. Бүкіл сахнаның кинематографиясы үшін жарықтандыру дизайны - бұл жобамыздың бірлескен продюсері және қоюшы-дизайнері Илья Серовтың үлкен жұмысы туралы бөлек әңгіме және біз бұл туралы бөлек постта айтамыз.

Аудармашы сонымен қатар таймердің көмегімен ұсақтағышты іске қосу және кескінді теледидарға жіберу логикасына жауап берді: ұсақтағышты іске қосу таймері, айқайлаған капибара, ойын соңында жарнама.

Megatron таңбалауышын генерациялау логикасы қалай құрылымдалған

Сынақ түсірілімі

Әрбір 25 секунд сайын жаңа белгі жасалды және лазерді 10/10 қуатта 255 секундқа қосу үшін пайдалануға болады. сілтемесі Megatron коды бар github.

Содан кейін лазер 1 минутқа суыды - осы уақыт ішінде ол қолжетімсіз болды және жаңа түсіру сұрауларын қабылдамады.

Бұл қуат арқан арқылы жану үшін жеткіліксіз болды, бірақ кез келген ойыншы Мегатронды атып, лазер сәулесінің әрекетін көре алады.

Токенді жасау үшін MD5 хэштеу алгоритмі пайдаланылды. Және схема орындалды MD5-тен MD5 + санауыш + құпия жауынгерлік жетон үшін және сынақ белгісі үшін құпиясыз.

MD5 - біздің қолдаушы Павел жасаған коммерциялық жобаға сілтеме. Бір-екі жыл бұрын бұл жобада MD5 қолданылған және ол жоба архитекторына оның ескірген шифрлау алгоритмі екенін айтқан кезде, олар MD5-тен MD5 пайдалана бастады. Біз ең керемет жобаны жасауға шешім қабылдағандықтан, ол бәрін есіне түсіріп, шағын анықтама беруді шешті.

Жауынгерлік ату

Мегатронның жауынгерлік режимі 100 ватт 3% лазерлік қуат. Бұл салмақты ұстап тұрған арқанды жағуға, аквариумды бұзуға және серверді суға толтыруға 2 минут жеткілікті.

Біз жобаның Github-ында бірнеше кеңестер қалдырдық: атап айтқанда, сынақ және жауынгерлік токендердің бір есептегіш индикатор негізінде жасалғанын түсінуге болатын таңбалауыш генерациялау коды. Жауынгерлік белгі жағдайында, есептегіш мәннен басқа, соңғы екі таңбаны қоспағанда, осы түйінді өзгерту тарихында толығымен дерлік қалған тұз да қолданылады.

Бұл деректерді біле отырып, тұздың соңғы 2 таңбасын сұрыптауға және ол үшін он алтылық жүйеге түрлендірілген Lost сандары қолданылғанын білуге ​​болады.

Содан кейін ойыншылар санауыш мәнін (сынақ таңбалауышын талдау арқылы) ұстап алып, келесі есептегіш мәнді және алдыңғы қадамда таңдалған тұзды пайдаланып жауынгерлік таңбалауышты құруы керек болды.

Есептегіш әрбір сынақ түсірілімімен және әрбір 25 секунд сайын артады. Біз бұл туралы еш жерде жазған жоқпыз, бұл шағын ойын тосын сыйы болуы керек еді.

Captcha өзара әрекеттесу қызметі

Ойын әлемінде бұл желдеткішті қосу және флипчартты тұсқағазбен ашу үшін жүктеуге тура келетін дәл сол каптча болды. Камераның жанында жүктемені бақылайтын ноутбук болды.

Серверді жою туралы хакер ойынының сервері қалай жасалған

қызмет көрсету Мен мониторингте ағымдағы жүктеме ретінде не көрсету керектігін есептедім: температура және CPU желдеткіші. Көрсеткіштер уақыт базасының дерекқорына тасымалданып, графана арқылы сызылған.

Егер соңғы 5 секундта captcha-ны көрсетуге 50-ден астам сұраныс болса, жүктеме бекітілген + кездейсоқ қадамдар санына өсті. Есептеу екі минутта 100% жүктемеге қол жеткізуге болатын еді.

Шын мәнінде, қызметте соңғы ойында көрсетілгеннен гөрі логика көп болды: біз мониторды тек CPU желдеткішінің айналуы көрінетін етіп орналастырдық.

Квест басында олар Grafan-ды Falcon веб-сайтынан қол жетімді етіп қалдырғысы келді. Бірақ ол сонымен қатар серверлік қолданба есебіндегі көктемгі жүктеу көрсеткіштерін қамтиды, оларды тазалауға уақытымыз болмады, сондықтан біз оған кіруді блоктауды шештік. Бұл дұрыс - тіпті квесттің басында кейбір ойыншылар қосымшаның көктемгі жүйеде жазылғанын болжап, тіпті кейбір қызметтердің атауларын қазып алды.

Хостинг және деректер шинасы

Ақпаратты серверден сайтқа, RabbitMQ іске қосылған VPS серверіне тасымалдауға арналған құрал.

Бейне және деректер шинасы қосулы болды біздің VPS. Оның қуаты экранда көрген компьютермен салыстыруға болатын: екі гигабайт жедел жады бар 2 ядролы VPS. Тариф ресурстар үшін есептелді, өйткені ең жоғары жүктеме бірнеше күнге жоспарланған - VPS-ті қысқа мерзімге жүктеуді жоспарлаған біздің клиенттер осылай жасайды. Сонда жүктеме біз күткеннен жоғары болып, бекітілген тариф тиімдірек екені белгілі болды. Егер сіз квест жасасаңыз, желілік тарифтерді таңдаңыз турбо.

Серверді DDoSa-дан қорғау үшін біз Cloudflare қолдандық.

VPS бәріне абыроймен төтеп бергенін айту керек.

Релелерді басқаруға жауапты Arduino аудармашыдан командалар алып, нақты жұмысты орындады.

Бұл жобаның аппараттық бөлігі туралы келесі мақаланың тақырыбы: сервер нақты релені қосу үшін жай ғана сұраулар жіберді. Осылайша, сервер барлық дерлік нысандарды білетін және одан сұраулар «осы нысанды қосу» сияқты көрінді. Біз мұны сайтты ерте сынау үшін жасадық (біз барлық Arduino мен релелерді әлі жинаған жоқпыз), соңында бәрін осылай қалдырдық.

Алғы жақ

Біз сайтты tilde бойынша тез жасадық, ол бір жұмыс күнін алды және бюджетімізге 30 мың үнемдеді.

Бастапқыда біз жай ғана сайтты экспорттауды және жетіспейтін логиканы қосуды ойладық, бірақ біз мұны істеуге тыйым салатын пайдалану шарттарына тап болдық.

Біз лицензияны бұзуға дайын емес едік, сондықтан екі нұсқа болды: барлығын өзіміз жүзеге асыру немесе Тильдамен тікелей байланысу, жоба туралы сөйлесу және кодты өзгертуге рұқсат сұрау.

Біз екінші нұсқаны таңдадық және олар бізді жарты жолда кездестіріп қана қоймай, тіпті бізге бір жыл тегін бизнес-шот берді, бұл үшін біз оларға өте ризамыз. Сокол сайтының дизайнын көрсету өте ыңғайсыз болды.

Нәтижесінде біз қарапайым құрылғыларға сұраулар жіберу үшін алдыңғы бөлікке js логикасын тіркедік және ойын элементтерін қосу және өшіру түймелерінің мәнерлерін сәл өзгерттік.

Сайттың дизайны

Іздеу тарихы, ол бөлек тарауға тұрарлық.

Біз ескі сайтты ғана емес, дизайнның барлық негізгі ережелерін бұзатын мүлдем жиіркенішті сайтты жасағымыз келді. Сонымен қатар, сенімділікті сақтау маңызды болды: ол ЛОР оқиғасын бұзбауы керек, автордың сыпайылығын көрсетуі керек және ойыншылар мұндай сайттың бар екеніне және тіпті клиенттерді әкелетініне сенуі керек еді. Және ол әкелді! Ойын жүріп жатқанда, веб-сайттарды жасау үшін бізге екі рет хабарласты.

Бастапқыда мен дизайнды өзім жасадым, көбірек GIF және жылтыр элементтерді қосуға тырыстым. Бірақ менің 10 жыл дизайнерлік күйеуім оның иығына қарап, оны «тым жақсы» деп қабылдамады. Дизайн ережелерін бұзу үшін сіз оларды білуіңіз керек.

Серверді жою туралы хакер ойынының сервері қалай жасалған

Ұзақ жиіркеніш сезімін тудыратын бірнеше түс комбинациясы бар: жасыл және бірдей байлықтағы қызыл, сұр және қызғылт, көк және қоңыр. Соңында біз негізгі түстер ретінде қызыл және жасыл комбинацияны таңдадық, мысықпен GIF қостық және сток фотосуретінен Соколовтың 3-4 фотосуретін таңдадық. Маған бірнеше талаптар болды: тым үлкен екі өлшемді жарамсыз костюм киген және «кәсіби студияда фотосессияда» тұрған орта жастағы ер адам. Сынақ үшін олар достарына көрсетіп, «бұл сізге қалай ұнайды?» Деп сұрады.

Дизайн әзірлеу кезінде күйеуім әр жарты сағат сайын жатуға мәжбүр болды, тікұшақ ұшып кетті. Паша экранның көп бөлігіне әзірлеуші ​​консолін ашуға тырысты, ол алдыңғы жағын аяқтап, көздерін қорғау үшін.

Нақты құрылғылар

Желдеткіштер мен шамдар толық қуатта бірден қосылмауы үшін қатты күй релелері арқылы орнатылды - осылайша қуат бақылаумен қатар өседі.

Бірақ біз бұл туралы келесі постта, ойынның аппараттық бөлігі және сайттың нақты құрылысы туралы айтатын боламыз.

Бізбен бірге қалыңыз!

Серверді жою іздеу туралы басқа мақалалар

Серверді жою туралы хакер ойынының сервері қалай жасалған

Ақпарат көзі: www.habr.com

пікір қалдыру