Серверди жок кылуу жөнүндө хакердик оюндун бэкэнди кантип түзүлгөн

Серверди жок кылуу жөнүндө хакердик оюндун бэкэнди кантип түзүлгөн
Биз сизге серверди жок кылуу менен лазердик квестибиз кантип уюштурулганын айтып берүүнү улантабыз. Мурункудан баштаңыз издөөнү чечүү жөнүндө макала.

Жалпысынан, оюндун арткы бөлүгүндө 6 архитектуралык бирдик бар, биз аларды ушул макалада талдайбыз:

  1. Оюн механизмдери үчүн жооптуу болгон оюн объектилеринин арткы бөлүгү
  2. VPS боюнча Backend жана сайт маалымат алмашуу автобусу
  3. Ардуиного жана сайттагы жабдыктарга арткы суроо-талаптардан (оюн элементтеринен) котормочу
  4. Релелерди башкаруу үчүн жооптуу болгон Arduino котормочудан буйруктарды алып, иш жүзүндө аткарды.
  5. Иш жүзүндөгү түзүлүштөр: желдеткич, гирляндалар, пол лампалары ж.б.
  6. Frontend - оюнчулар түзмөктөрдү башкарган Falcon веб-сайтынын өзү

Келгиле, алардын ар бирин карап көрөлү.

Оюн объекттеринин арткы бөлүгү

Backend жазгы жүктөө тиркемеси катары ишке ашырылган: анын бир нече эс алуу контроллери, веб-сокеттин акыркы чекити жана оюн логикасы бар кызматтары болгон.

Болгону үч контролер болгон:

  • Megatron. Учурдагы Megatron барагы GET сурамдары аркылуу жөнөтүлгөн: электр энергиясын күйгүзгөндөн мурун жана кийин. Лазер POST өтүнүчү аркылуу атылды.
  • Тильде барактарын беттин аталышы менен тейлей тургандай кылып көрсөтүү. Tilde экспорттоо үчүн барактарды баштапкы аталыштары менен эмес, ички ID жана шайкештик маалыматы менен чыгарат.
  • Captcha контроллери псевдо-жогорку жүктөмдүү сервер каптчасын тейлөө үчүн.

Websocket акыркы чекити гаджеттерди башкаруу үчүн колдонулган: лампалар, гирляндалар жана тамгалар. Ал бардык оюнчуларга аппараттын учурдагы абалын синхрондуу түрдө көрсөтүү үчүн тандалган: ал күйгүзүлгөнбү же өчүрүлгөнбү, активдүү же жокпу, учурда дубалда тамганын кандай түсү күйүп турат. Лазерди күйгүзүү тапшырмасын бир аз кыйындатуу үчүн, гирляндага жана лазерге авторизацияны бир эле логин жана сырсөз менен коштук admin/admin.

Оюнчулар гирлянданы күйгүзүп, аны сынап, лазер менен дагы кайталай алышат.

Оюнчуларды керексиз тандоо менен кыйнабаш үчүн, биз ушундай арзыбаган логин-пароль жуптарын тандап алдык.

Тапшырманы бир аз кызыктуураак кылуу үчүн, mongodb объектинин ID'лери бөлмөдө түзмөк идентификаторлору катары колдонулган.

ObjectId убакыт белгисин камтыйт: эки кокустан маани, алардын бири түзмөк идентификаторунун негизинде алынат, экинчиси аны жаратуучу процесстин pidине жана эсептегичтин маанисине негизделген. Мен идентификаторлорду үзгүлтүксүз аралыкта жана ар кандай pid процесстери менен, бирок жалпы эсептегич менен жасагым келди, андыктан лазердик түзүлүштүн идентификаторун тандоо кызыктуураак болот. Бирок, акырында, бардыгы эсептегичтин мааниси боюнча гана айырмаланган идентификаторлордон башташты. Бул кадамды өтө жөнөкөй кылып, objectId түзүмүн талдоону талап кылбашы мүмкүн.

Backend сурамдарынан котормочу

Python скрипти, таймерлердин үстүндө иштеген жана аларды оюн абстракцияларынан физикалык моделге которгон. Мисалы, "пландагы лампаны күйгүзүү" → "N2 релесин күйгүзүү".

Скрипт RabbitMQ кезегине туташып, кезектеги сурамдарды Arduino'го өткөрүп берди. Ал ошондой эле жарыкты параллелдүү которуу логикасын ишке ашырган: кээ бир түзүлүштөр менен бирге алардагы жарык күйгүзүлгөн, мисалы, Мегатронго адегенде электр энергиясы берилгенде, ал сахна жарыгы менен жарыктандырылды. Бүткүл сахнанын кинематографиясы үчүн жарык дизайны - бул биздин долбоордун продюсер жана продюсер Илья Серовдун чоң эмгеги жөнүндө өзүнчө окуя жана бул тууралуу өзүнчө постто айтып беребиз.

Котормочу ошондой эле таймерди колдонуу менен майдалагычты ишке киргизүү жана сүрөттү сыналгыга берүү логикасына жооптуу болгон: майдалагычты ишке киргизүү үчүн таймер, кыйкырган капибара, оюндун аягындагы жарнама.

Megatron токенин түзүү логикасы кантип түзүлдү

Сыноо атуу

Ар бир 25 секунд сайын жаңы токен түзүлүп, лазерди 10/10 кубаттуулукта 255 секунда күйгүзүү үчүн колдонулушу мүмкүн. шилтемеси Megatron коду менен github.

Андан кийин лазер 1 мүнөткө муздайт - бул убакыттын ичинде ал жеткиликсиз болуп, жаңы атуу өтүнүчтөрүн кабыл алган жок.

Бул күч аркан аркылуу күйүп кетүү үчүн жетиштүү болгон жок, бирок каалаган оюнчу Megatron от алып, лазер нурунун аракетин көрө алган.

Токенди түзүү үчүн MD5 хэширлөө алгоритми колдонулган. Ошондо схема ишке ашты MD5 + эсептегич + сырдан MD5 согуштук жетон үчүн жана сыноо белгиси үчүн сыры жок.

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

Согуштук атуу

Мегатрондун согуштук режими 100 ваттда 3% лазердик күч. Бул салмакты кармап турган аркан аркылуу күйүп, аквариумду сындырып, серверди сууга толтурууга 2 мүнөт жетиштүү.

Биз долбоордун Github'уна бир нече ишараттарды калтырдык: тактап айтканда, тест жана согуштук токендер бир эле эсептегич индикатордун негизинде түзүлөөрүн түшүнө турган токендерди түзүү коду. Согуштук белгинин учурда, эсептегич мааниден тышкары, акыркы эки белгиден тышкары, бул негизги өзгөртүү тарыхында дээрлик толугу менен калган туз да колдонулат.

Бул маалыматтарды билүү менен, туздун акыркы 2 символун иреттеп, чындыгында ал үчүн он алтылык системага айландырылган Lost сандары колдонулганын билүүгө мүмкүн болду.

Андан кийин оюнчулар эсептегичтин маанисин кармап (сыноо белгисин талдоо менен) жана кийинки эсептегич маанини жана мурунку кадамда тандалган тузду колдонуу менен согуштук белгини жаратышы керек болчу.

Эсептегич жөн гана ар бир сыноо атуу менен жана ар бир 25 секундада көбөйөт. Биз бул тууралуу эч жерде жазган жокпуз, бул кичинекей оюн сюрприз болушу керек болчу.

Captcha өз ара аракеттенүү кызматы

Оюн дүйнөсүндө бул желдеткичти күйгүзүп, флипчартты кыйытма менен ачуу үчүн жүктөлүшү керек болгон ошол эле каптча болчу. Камеранын жанында жүктөм мониторинги бар ноутбук болгон.

Серверди жок кылуу жөнүндө хакердик оюндун бэкэнди кантип түзүлгөн

кызмат Мен учурдагы жүк катары мониторингде эмнени көрсөтүү керектигин эсептеп чыктым: температура жана CPU желдеткичи. Метрикалар убакыт базасына өткөрүлүп берилип, графана менен тартылган.

Эгерде акыркы 5 секунданын ичинде captcha көрсөтүүгө 50дөн ашык суроо-талаптар болсо, анда жүктөө кадамдардын белгиленген + кокустук санына көбөйгөн. Эсептөө боюнча, 100% жүктү эки мүнөттүн ичинде ишке ашырууга болот.

Чынында, кызматта акыркы оюнда көрсөтүлгөнгө караганда көбүрөөк логика бар болчу: биз мониторду CPU желдеткичинин айлануусу гана көрүнүп тургандай кылып койдук.

Квесттин башында алар Grafanды Falcon веб-сайтынан жеткиликтүү калтырууну каалашкан. Бирок анда ошондой эле backend тиркемесинин отчетундагы жазгы жүктөө көрсөткүчтөрү камтылган, биз аны тазалоого үлгүргөн жокпуз, ошондуктан биз ага кирүүнү бөгөттөөнү чечтик. Бул туура - тапшырманын башында да, кээ бир оюнчулар тиркеме Springboot алкагында жазылган деп ойлошкон жана ал тургай кээ бир кызматтардын атын казып алышкан.

Хостинг жана маалымат автобусу

РабитMQ иштеп жаткан VPS серверине серверден маалыматты өткөрүү куралы.

Backend жана маалымат автобусу күйгүзүлгөн биздин VPS. Анын күчү экранда көргөн компьютер менен салыштырууга болот: эки гигабайт оперативдик эс тутум менен 2 ядролуу VPS. Тариф ресурстар үчүн алынган, анткени жүктөмдүн чокусу бир нече күнгө пландаштырылган - VPSти кыска мөөнөткө жүктөөнү пландаган кардарларыбыз ушундай кылышат. Анан жүк биз күткөндөн жогору болуп, туруктуу тариф пайдалуураак экен. Эгерде сиз квест кылсаңыз, линия тарифтерин тандаңыз турбо.

Серверди DDoSaдан коргоо үчүн Cloudflare колдондук.

VPS баарына намыс менен туруштук берди деп айтууга болот.

Релелерди башкаруу үчүн жооптуу болгон Arduino котормочудан буйруктарды алып, иш жүзүндө аткарды.

Бул долбоордун аппараттык бөлүгү жөнүндө кийинки макаланын темасы: backend жөн гана белгилүү бир реледи күйгүзүү үчүн суроо-талаптарды жөнөттү. Ошентип, бэкэнд дээрлик бардык объекттерди билген жана андан келген суроо-талаптар "бул объектти күйгүзүү" сыяктуу көрүнгөн. Биз муну сайтты эрте сынап көрүү үчүн жасадык (биз бардык Arduino жана релелерди чогулта элек болчубуз), акырында баарын ушинтип калтырдык.

Frontend

Биз сайтты тез эле тилдеде түздүк, ал бир жумушчу күндү талап кылды жана бюджетибизге 30 миң үнөмдөлдү.

Башында биз жөн гана сайтты экспорттоо жана жетишпей жаткан логиканы кошууну ойлодук, бирок биз муну жасоого тыюу салган колдонуу шарттарына туш болдук.

Биз лицензияны бузууга даяр эмеспиз, андыктан эки жол бар болчу: бардыгын өзүбүз ишке ашыруу же Тильда менен түз байланышып, долбоор тууралуу сүйлөшүү жана кодду өзгөртүүгө уруксат суроо.

Биз экинчи вариантты тандап алдык жана алар бизди жарым жолдон тосуп тим болбостон, бизге бир жылдык акысыз бизнес эсебин да беришти, бул үчүн биз аларга абдан ыраазыбыз. Аларга Соколдун веб-сайтынын дизайнын көрсөтүү абдан ыңгайсыз болду.

Натыйжада, биз элементардык түзмөктөргө суроо-талаптарды жөнөтүү үчүн фронтко js логикасын тиркедик жана оюн элементтерин күйгүзүү жана өчүрүү үчүн баскычтардын стилдерин бир аз өзгөрттүк.

сайт дизайн

өзүнчө бөлүмгө арзырлык издөө тарыхы.

Биз жөн гана эски модада сайт эмес, дизайндын бардык негизги эрежелерин бузган таптакыр жийиркеничтүү сайтты түзгүбүз келди. Ошол эле учурда, бул ишеничтүүлүгүн сактап калуу үчүн абдан маанилүү болгон: ал ENT окуяны бузуп эмес, жазуучунун тентектигин көрсөтүп, жана оюнчулар мындай сайт бар, ал тургай, кардарларды алып келиши мүмкүн экенине ишениши керек болчу. Жана ал алып келди! Оюн жүрүп жатканда, веб-сайттарды түзүү үчүн биз менен эки жолу байланышты.

Алгач мен дизайнды өзүм жасадым, көбүрөөк gif жана жаркыраган элементтерди кошууга аракет кылдым. Бирок 10 жылдан бери дизайнерлик кылып жүргөн күйөөм анын ийнине карап, аны "өтө жакшы" деп четке какты. Дизайн эрежелерин бузуу үчүн, аларды билүү керек.

Серверди жок кылуу жөнүндө хакердик оюндун бэкэнди кантип түзүлгөн

Жийиркеничтин туруктуу сезимин туудурган бир нече түстөрдүн айкалышы бар: бирдей байлыктагы жашыл жана кызыл, боз жана кызгылт, көк плюс күрөң. Акыр-аягы, биз негизги түс катары кызыл жана жашыл түстөрдүн айкалышы боюнча чечтик, мышык менен gifтерди кошуп, Соколовдун өзүнүн 3-4 фотосүрөттөрүн сток сүрөтүнөн тандап алдык. Менде бир нече гана талаптар бар болчу: орто жаштагы адам, өтө чоң эки размерге туура келбеген костюм кийип, "профессионалдык студияда фотосессияда". Сыноо үчүн алар досторуна көрсөтүп, "кандай жагат?" деп сурашты.

Долбоорду иштеп чыгуу процессинде күйөөм ар бир жарым саат сайын тик учак уча баштады. Паша экрандын көпчүлүк бөлүгүнө иштеп чыгуучунун консолун ачууга аракет кылды, ал эми алдыңкы жагын бүтүрүп жатканда - көзүн коргоо үчүн.

Чыныгы түзмөктөр

Желдеткичтер жана жарыктар катуу абалдагы реле аркылуу орнотулган, алар дароо толук кубаттуулукта күйүп калбашы үчүн - кубат мониторинг менен параллелдүү көбөйөт.

Бирок биз бул тууралуу кийинки билдирүүдө, оюндун аппараттык бөлүгү жана сайттын иш жүзүндө курулушу жөнүндө сүйлөшөбүз.

Тууганичкаларым!

Серверди жок кылуу издөө жөнүндө башка макалалар

Серверди жок кылуу жөнүндө хакердик оюндун бэкэнди кантип түзүлгөн

Source: www.habr.com

Комментарий кошуу