Projekt hardver: hogyan építettünk egy szobát egy hacker küldetéssel
Pár héttel ezelőtt töltöttünk online keresés a hackerek számára: építettek egy szobát, amit megtöltöttek okoseszközökkel és YouTube adást indítottak belőle. A játékosok a játék webhelyéről irányíthatják az IoT-eszközöket; A cél az volt, hogy megtaláljanak egy, a szobában elrejtett fegyvert (erős lézermutató), feltörjék és rövidzárlatot okozzanak a szobában.
Az akcióhoz még egy iratmegsemmisítőt helyeztünk el a helyiségben, amibe 200 000 rubelt raktunk: az aprítógép óránként egy számlát evett. A játék megnyerése után leállíthatod az iratmegsemmisítőt, és elviheted az összes maradék pénzt.
Rengeteg kérés érkezett, hogy mutassuk meg a szobatisztítás pillanatát – megmutatjuk, hogyan szedjük szét
Hardver architektúra: Szobavezérlés
A hardveres megoldás tervezését akkor kezdtük el, amikor már nagyjából megértettük a forgatókönyvet, elkészült a háttérrendszer, és volt egy üres helyiségünk a berendezés telepítésére.
Emlékezve a régi viccre „Az S az IoT-ben a biztonságot jelenti” („Az S betű az IoT rövidítésében a biztonságot jelenti”) úgy döntöttünk, hogy a játék forgatókönyvében szereplő játékosok ezúttal csak a front-end és a back-end játékkal lépnek kapcsolatba. az oldalról, de nem kap lehetőséget arra, hogy közvetlenül a vasaláshoz jusson.
Ezt a biztonság és a képernyőn történtek látványossága miatt tették: ha a játékosok közvetlenül hozzáférnek a hardverhez, sokkal nehezebb lenne elkülöníteni a biztonságos és potenciálisan veszélyes műveleteket, például az aprítógép gyors görgetését vagy vezérlését. pirotechnika.
A tervezés megkezdése előtt több alapelvet is megfogalmaztunk a játékeszközök vezérlésére, amelyek a tervezés alapját képezték:
Ne használjon vezeték nélküli megoldásokat
A teljes játéktér egy keretben van, melynek minden sarka elérhető. Nem volt igazán szükség vezeték nélküli kapcsolatokra, és egyszerűen csak egy újabb hibapont lesz.
Ne használjon semmilyen speciális intelligens otthoni eszközt
Főleg a testreszabási rugalmasság kedvéért. Nyilvánvaló, hogy az okosotthon rendszerek számos dobozos változatát testre szabhatjuk kész adminisztrátorral és vezérlőkkel a feladatunkhoz, de a munkaerőköltség összemérhető egy saját egyszerű megoldás létrehozásával.
Ezen kívül olyan eszközöket kellett kitalálni, amelyek egyértelműen mutatják, hogy a játékosok változtatták az állapotát: be-/kikapcsolták, vagy konkrét lámpát raktak a FALCON betűkre.
A nyilvánosan elérhető hardverekből összegyűjtöttük az összes olyan elemet, amely a hagyományos rádióalkatrész-üzletekben megvásárolható: a pizza és a diétás kóla szállítása között folyamatosan érkeztek a helyszínre Chip and Dip és Leroy futárok.
Az a választás, hogy mindent magunk szerelünk össze, leegyszerűsítette a hibakeresést, a méretezhetőséget, azonban nagyobb odafigyelést igényelt a telepítés során.
Az összes relé és arudin ne legyen látható a keretben
Úgy döntöttünk, hogy az összes vezérelhető elemet egy helyre hozzuk, és a színfalak mögé rejtjük, hogy nyomon tudjuk követni a teljesítményüket, és szükség esetén óvatosan kimászva a kamera látóköréből, és kicseréljük a meghibásodott egységet.
Végül mindent az asztal alá rejtettek, a kamerát pedig úgy szerelték be, hogy az asztal alatt semmi se látszódjon. Ez volt a „vakfotunk”, hogy a mérnök felkúszott
Ennek eredményeként tulajdonképpen egy okoseszközt kaptunk: az egyes részeinek állapotát megkapta a háttérrendszertől, és a megfelelő paranccsal megváltoztatta.
Hardveres megvalósítási szempontból ez az eszköz 6 elemet vezérelt:
Több asztali lámpa, be/ki állapotúak és a játékosok vezérlik
Betűk a falon, a játékosok parancsára megváltoztathatják a színüket
Rajongók, akik pörögnek és kinyitják a flipchartot, amikor a szerver terhelés alatt áll
Lézeres vezérlés PWM-en keresztül
Iratmegsemmisítő, aki menetrend szerint evett pénzt
Egy füstgép, amely minden lézerlövés előtt kialudt
Füstgép tesztelése lézerrel
Később hozzáadtak egy színpadi lámpát, ami a keret mögött állt, és pontosan úgy volt vezérelve, mint az 1. pontból származó lámpák. A színpadi lámpa két esetben működött: megvilágította a lézert, amikor rákapcsolták az áramot, és megvilágította a súlyt, mielőtt a lézert harci módban indították el.
Mi volt ez az okoseszköz?
Yura, a hardveres srácunk végig igyekezett nem bonyolítani a dolgokat, és a lehető legegyszerűbb, minimalista megoldást találta ki.
Azt feltételezték, hogy a VPS egyszerűen futtat egy szkriptet, amely megkapja a json-t az eszközök állapotával, és elküldi az USB-n keresztül csatlakoztatott Arduino-nak.
Csatlakozva a portokhoz:
16 normál relé (ők adták azt a csattanó hangot, ami a videóban is hallható. Elsősorban ezért a hang miatt választottuk őket)
4 félvezető relé a PWM csatornák, például ventilátorok vezérléséhez,
külön PWM kimenet a lézerhez
kimenet, amely jelet generál a LED-szalaghoz
Íme egy példa egy json parancsra, amely a kiszolgálóról érkezett a közvetítőhöz
Hogy nyomon kövessük azt a pillanatot, amikor a lézer végre átég a kötélen, és a súly az akváriumba repül, készítettünk egy kis gombot, amely a súly leesésekor aktiválódott és jelet adott a rendszernek.
Gomb a súly mozgásának figyelésére
Erre a jelzésre a ping-pong labdákból készült füstbombáknak kellett volna kigyulladniuk. Közvetlenül a szerverházba tettünk 4 füstfáklyát és nikróm menettel összekötöttük, aminek úgy kellett felmelegednie és gyújtóként működnie.
Ház füstbombákkal és kínai füzérrel
Arduino
Az eredeti terv szerint két akció történt az Arduinón.
Először is, amikor új kérés érkezett, a kérést az ArduinoJson könyvtár segítségével elemezte. Ezután minden felügyelt eszközt összehasonlítottunk két tulajdonságával:
táp állapot "be" vagy "ki" (normál állapot)
az az időtartam, ameddig az eszköz be van kapcsolva - az idő mikroszekundumban a tábla kezdetétől számítva, amikor ideje kikapcsolni, vagyis az állapotot szabványosra állítani
Legutóbb a megfelelő paraméter fogadásakor volt beállítva JSON-ban, de nem lehetett továbbítani, akkor az értéket 0-ra állítottuk, és nem történt visszaállítás.
A második művelet, amelyet az Arduino minden ciklusban végrehajtott, az állapotfrissítés volt, vagyis annak ellenőrzése, hogy kell-e valamit bekapcsolni, vagy ideje lenne kikapcsolni bármely eszközt.
Lézermutató - ugyanaz a Megatron 3000
Ez egy hagyományos LSMVR450-3000MF 3000mW 450nm kézi fókuszú lézervágó és jelölő modul.
Letters Falcon
Nagyon egyszerűen készültek - egyszerűen lemásoltuk a logó betűit, kivágtuk kartonból, majd letakartuk LED szalaggal. Ebben az esetben össze kellett forrasztanom a szalagdarabokat, minden varraton 4 érintkezőt, de az eredmény megérte. A hátvédünk pasa ügyességi csodákat mutatott be, alig néhány óra alatt.
Az iot eszköz első tesztjei és befejezése
Megcsináltuk az első teszteket és ezzel egy időben újabb feladatok is érkeztek hozzánk. A helyzet az, hogy a folyamat közepén egy igazi filmproducer és operatőr a VGIK-től, Ilya Serov csatlakozott a csapathoz - megépítette a keretet, további mozivilágítást adott hozzá, és kissé megváltoztatta a játék forgatókönyvét, hogy érzelmesebb legyen a cselekmény, és a kép drámaibb és teátrálisabb.
Ez jelentősen javította a minőséget, de megjelentek olyan elemek, amelyeket szintén a reléhez kellett kötni és az előírt működési algoritmust.
A másik probléma a lézer volt: számos kísérletet végeztünk különböző típusú kötélekkel és különböző teljesítményű lézerekkel. A teszthez egyszerűen felakasztottunk egy súlyt függőlegesen egy kötélre.
Tesztjelzővel való futásnál a PWM-en keresztül szabályozott teljesítmény 10% alatti volt, és hosszú expozíció mellett sem károsította a kötelet.
Harci módban a lézert körülbelül 10 mm átmérőjű pontra defókuszáltuk, és körülbelül egy méteres távolságból magabiztosan égett át egy kötélen.
Tehát a lézer tökéletesen működött a teszteken
Amikor elkezdtünk mindent tesztelni a szobában egy felfüggesztett súlyon, kiderült, hogy a lézer biztonságos rögzítése nem is olyan egyszerű. Aztán amikor a kötél ég, megolvad, megnyúlik és kimozdul eredeti fókuszából.
De ez már nem így működött: a kötél elmozdult
Ilja a lézert a kötéllel szemközti terem végébe mozgatta, hogy a lézersugár áthaladjon az egész színpadon, és gyönyörűen nézzen ki a keretben, ami megduplázta a távolságot.
Miután több kísérletet is elvégeztünk a kötél égetésével már a csatában, úgy döntöttünk, hogy nem kínozzuk a sorsot, és nikrómhuzallal biztosítjuk a kötél elvágását. 120 másodperccel azután, hogy a lézert harci módban bekapcsolta, elpusztította a fonalat. Úgy döntöttünk, hogy ezt, valamint a vezeték leválasztását és a füstbombák gyújtását az elválasztó érintkező kioldásakor közvetlenül a mikrokontroller hardverébe kódoljuk.
A szál, amely végül átégett a kötelen a képernyőn kívül
Így megjelent egy harmadik feladat is, amelyet az Arduino megoldott - hogy kidolgozza a parancsok végrehajtásához kapcsolódó szekvenciákat.
Azt is elhatároztuk, hogy az Arduino-nak szüksége lesz arra, hogy pénzt számoljon a TV-n, és működtesse az iratmegsemmisítőt. Kezdetben azt feltételezték, hogy ezt a backend fogja megtenni, és az aktuális egyenleg látható lesz a weboldalon, a TV-n pedig további interaktív elemként megjelenítjük a YouTube-ról érkező kommenteket, amelyek azt mondják a nézőknek, hogy a teremben zajló események a valóságban zajlanak. idő.
Ám a próbaüzem során Ilja megnézte a jelenetet, és azt javasolta, hogy a játékegyenleget mutassák a legnagyobb képernyőn: mennyi pénz maradt még, mennyit evett meg, és a visszaszámlálás az aprítógép következő indításához.
Az Arduinót az aktuális időhöz kötöttük: minden teljes órán elindult az aprítógép. A kép a TV-n Rasberry segítségével jelent meg, amely abban a pillanatban már kapott kéréseket a szervertől, és elküldte azokat az arduinónak végrehajtásra. A monetáris mutatókkal ellátott képeket a fim konzol segédprogramnak valami ilyesminek nevezve rajzoltuk
image = subprocess.Popen(["fim", "-q", "-r", "1920×1080", fim_str]), где fim_str
És a szükséges mennyiség vagy idő alapján alakult.
A képeket előre legeneráltuk: egyszerűen készítettünk egy kész videót időzítővel és exportáltunk 200 képet.
Ez az a mechanika, amelyet a keresztbe programoztak. Mire az utolsó visszaszámlálás elkezdődött, mindannyian a helyszínre mentünk, felfegyverkeztünk tűzoltó készülékekkel és leültünk várni a tüzet (ami még csak javában volt a viszályban)
Hogyan készítsünk egy hétig működő adást: kameraválasztás
A küldetéshez 7 napig folyamatos közvetítésre volt szükségünk a YouTube-on – pontosan ezt állítottuk be a játék maximális időtartamának. Két dolog akadályozhatott meg minket:
A kamera túlmelegedése folyamatos működés miatt
Internet kimaradás
A kamerának legalább Full HD képet kellett biztosítania, hogy kényelmes legyen a játék és a szoba nézése.
Kezdetben a streamerekhez készült webkamerák felé néztünk. Csökkentettük a költségvetésünket, így nem akartunk fényképezőgépet venni, de mint kiderült, nem bérelnek. Ugyanabban a pillanatban csodával határos módon találtunk a házamban egy Xbox Kinect kamerát, felszereltük a szobámba, és elindítottunk egy hétig tartó tesztadást.
A fényképezőgép jól működött, és nem melegedett túl, de Ilya szinte azonnal észrevette, hogy hiányoznak a beállítások, különösen az expozíciót nem lehet beállítani.
Ilja arra törekedett, hogy a közvetítés típusát közelebb hozza a film- és videógyártás színvonalához: dinamikusan változó fényjelenetet közvetítsen erős fényforrásokkal, elsötétített háttérrel és a keretben lévő tárgyakkal. Ugyanakkor szerettem volna megőrizni a kép kidolgozottságát fény- és árnyékban is, minimális digitális zaj mellett.
Ezért, bár a Kinect megbízhatónak bizonyult a teszteken, és nem igényelt videorögzítő kártyát (egy másik hibapont), úgy döntöttünk, hogy elhagyjuk. Három napos különféle kamerák tesztelése után Ilya a Sony FDR-AX53-at választotta - egy kicsi, megbízható kamerát, amelyet olcsón bérelhet, ugyanakkor kellő megbízhatósággal és vizuális jellemzőkkel rendelkezik.
Béreltünk egy kamerát, egy hétre bekapcsoltuk a videórögzítő kártyával együtt, és rájöttünk, hogy ezzel a küldetés teljes ideje alatt folyamatos adásra számíthatunk.
Filmkészítés: színpad és világítás
A világításon való munka bizonyos kecsességet igényelt, minimális eszközökkel kellett világítási partitúrát készítenünk:
1. Tárgyak megvilágítása, amikor a játékosok megtalálják őket (lézer, súly), valamint állandó fény az iratmegsemmisítőn. Itt a dedolight 150-et használtuk - megbízható és kompakt filmes világítóeszközök alacsony feszültségű halogén lámpákkal, amelyek lehetővé teszik a fénysugár egy adott tárgyra történő fókuszálását anélkül, hogy a háttér és más tárgyak befolyásolnák.
2. Praktikus játékfény - asztali lámpa, állólámpa, csillag, füzér. A keretben minden praktikus fény harmonikusan eloszlott, hogy megvilágítsa a képterületet, belül 3200K színhőmérsékletű LED lámpák voltak, az állólámpában lévő lámpát piros Rosco fóliaszűrő borította, hogy szokatlan színárnyalatot keltsen.
Mérnök vagyok az anyámnál, vagy holnap lesz a bemutató
Hogyan foglaltuk le az internetet és az áramot
Szinte úgy közelítették meg a hibatűrés kérdését, mint egy adatközpontban: úgy döntöttek, nem térnek el az alapelvektől, és a megszokott N+1 séma szerint foglaltak.
Ha a YouTube-on leáll a közvetítés, ez azt jelenti, hogy nem lehet újracsatlakozni ugyanazon a linken és folytatni a streamet. Kritikus pillanat volt, és a szoba egy rendes irodában volt.
Ehhez egy OpenWRT-alapú útválasztót és az mwan3 csomagot használtuk. 5 másodpercenként automatikusan tesztelte a csatorna elérhetőségét, és szünet esetén a Yotával átváltott a tartalék modemre. Ennek eredményeként a tartalék csatornára való váltás kevesebb mint egy perc alatt megtörtént.
Ugyanilyen fontos volt az áramkimaradások kiküszöbölése is, mert még egy rövid távú áramkimaradás is az összes számítógép újraindítását okozza.
Ezért vettünk egy ippon innova g2 3000 szünetmentes tápegységet, amely az összes játékeszközt menti: rendszerünk teljes fogyasztása 300 Watt körül alakult. 75 percig tartana, a mi céljainknak elég.
Úgy döntöttünk, hogy feláldozzuk a kiegészítő világítást arra az esetre, ha a helyiségben kialszik az áram – nem volt csatlakoztatva szünetmentes tápegységhez.
Köszönetnyilvánítás
Az egész csapatnak RUVDS, aki kitalálta és megvalósította a játékot.
Külön-külön a RUVDS rendszergazdáknak, a szerverek munkájának figyelésére a terhelés elfogadható volt, és minden a megszokott módon működött.
A legjobb főnöknek ntsaplin amiért a felhívásra: „Van egy ötletem: veszünk egy szervert, rakunk rá egy akváriumot, és akasztunk fölé egy súlyt, bumm, bumm, mindent elönt a víz, rövidzárlat, tűz !” mindig magabiztosan mondja: „Csináld!”
Köszönöm Tilda Kiadó és külön Mikhail Karpovnak, amiért nemcsak félúton találkozott, és megengedte, hogy megszegjük a használati feltételeket, de még egy évre üzleti fiókot is adott nekünk, amikor a projektről beszéltünk.
Ilja Szerov S_ILya a projekthez való csatlakozásért és társproducerré válásért, készen arra, hogy fél éjszakát mászkáljunk, LED szalagot ragasztunk, műszaki megoldásokat keresünk és mindent megteszünk, hogy igazi filmet kapjunk.
zhovner mert mindig készen álltak arra, hogy megmentsék azt a helyzetet, amikor mások feldobják a kezüket, borscsot, erkölcsi támogatást és reggelig beszélgetéseket.
samat amiért összeköt minket az ország legjobb pentesterével, aki tanácsot adott és segített a feladatokban.
És a legnagyobb hála a játékosoknak illeti mindazokat az érzelmeket, amelyeket átéltünk, miközben két napig rohamoztátok a küldetést alvás és még a munka halogatása nélkül is.
További cikkek a szerver megsemmisítésének küldetéséről