Blogi

Hopeakettu muistelee, osa 2: Koodarin yökkäys

pekkis Teknologia Yrityskulttuuri

Vuosi 2004 sai kannaltani jännittävän lopun. Joulunpyhät kolkuttelivat ovella, mutta oloni oli kaikkea muuta kuin juhlava. Olin ensimmäisessä työpaikassani ajautunut kahden kuukauden jälkeen tilanteeseen, jossa vastasin yksin kolmesta ohjelmistosta ja kolmestakymmenestä palvelimesta. Tilanne oli tukala, mutta pahempaa oli tulossa.

Viisiosaisten muistelmieni ensimmäisessä jaksossa kerroin, kuinka sain ensimmäisen työpaikkani iMedia-nimisessä yrityksessä, millaiseksi työ osoittautui, ja mitä sitten tapahtui. Roistomaiset kollegani Oiva ja Busse (nimet muutettu) suorittivat häikäilemättömän kuprun ja veivät jäsenrekisteriohjelma El Miembron mennessään. Surkeiden sattumusten sarja jätti minut yksin vastuuseen kaikesta teknologiasta.

El Miembron lisäksi iMedialla oli kaksi muuta tuotetta. El Contento oli julkaisujärjestelmä, joka ei suostunut pysymään pystyssä. Se kaatui pala kerrallaan, ainutlaatuisella tavalla jota en ymmärtänyt. Viimeisenä muttei vähäisimpänä oli El Documento, dokumentinhallintaohjelmisto. Sen pinta näytti kohtalokkaan alkutalven myrskyissä lohdullisen tyyneltä.

Olin lohduton, yksinäinen ja pelottavassa paikassa. Koeaikani oli vielä kesken, joten olisin voinut tintata irtisanoutumisilmoitukseni tiskille ja kävellä ulos vapaana miehenä. Maalaisin itsestäni turhan sankarillisen kuvan, jos väittäisin ettei tämä lopputulema ollut lähellä.

Syteen tai saveen, rohkaisin mieleni ja päätin jäädä. Olin ehtinyt kiintyä uusiin työkavereihini, enkä pidä ihmisten jättämisestä pulaan.

Palvelinhuoneen salaisuus

Kukaan ei tiennyt mitään mistään. Se oli ongelmiemme kova ydin. Busse vei kaiken teknisen tiedon mennessään. Kun hän ryöstöä seuraavana päivänä palasi rikospaikalle hakemaan tavaroitaan, “pakotimme” hänet kirjaamaan minut sisään parille palvelimelle joiden salasanoja meillä ei ollut. Nuoren miehen ivallinen katse ja hänen ylenkatseinen käytöksensä ovat syöpyneet mieleeni pysyvästi.

Meillä oli iso sotku selvitettävänä. Ensimmäinen kohta agendassani oli selättää salaperäinen palvelinhuoneemme. Asukkien pääluku, noin kolmekymmentä, kuulosti hurjalta. Webbipalvelimia, joilla julkaisujärjestelmä El Contento asiakkaineen asui, oli viisi. Suurimmalla asiakkaallamme oli kolme tai neljä omaa purnukkaa. Helsinkiläisellä huvipuistolla oli yksi sille omistettu masiina. Mitä kaikki muut koneet tekivät?

Mielikuvitustani oli pitkään kutkutellut helsinkiläisen jääkiekkojoukkueen kotisivujen mysteeri. Kun iMedian toimistolta yritti mennä seuran sivuille, päätyi kummitussaitille. Tiesin, että seura oli epäonnisesti käväissyt iMedian asiakkaana, joten laskin 1+1 yhteen. Jossain oli palvelin, joka tarjoili meille suosikkijoukkueemme haamusivuja. En vain ollut löytänyt sitä vielä!

Dokumentoin huolellisesti jokikisen tietokoneen palvelinhuoneessa. Kirjauduin sisään jokaiseen serveriin, siististi etäyhteydellä jos mahdollista, väkivaltaisemmin jos en muuten sisään päässyt. Kirjasin ylös niin palvelinten fyysiset sijainnit kuin sen, mitä koneet olivat syöneet.

Jälkikäteen ajateltuna olin satumaisen onnekas. Buuttasin kaikki palvelimet, jotka eivät välittömästi suostuneet yhteistyöhön. Uudelleenkäynnistetyksi joutuneiden joukossa oli koneita, jotka olivat meille tärkeitä, palvelimia, jotka palvelivat ydinliiketoimintaamme. Kaikki alhaalla käyttämäni koneet nousivat kiltisti pystyyn. Kuten tulemme huomaamaan, niin ei todellakaan olisi pitänyt käydä!

Lopulta löysin yhden tuulessa hellästi huojuvan hyllyn kulmalta palvelimen, jolle kukaan ei ollut kirjautunut miesmuistiin. Bingo! Siellähän ne kauan kaipaamani urheiluseuran julkaisemattomat kotisivut hyrskyttelivät kuin herran kukkarossa!

Palvelin oli urheiluseuran oma, ihana kaksisuorittiminen tehopakkaus, nopeampi ja hienompi kuin suurin osa omista värkeistämme. Konerukka oli ollut vuosia päällä toimettomana ja unohdettuna.

Koska serverin oikea omistaja ei tuntunut pikkuistansa kaipaavan ja meillä oli pula keskusyksiköistä, emme lähteneet löydöstä ehdoin tahdoin huutelemaan. Tein koneesta testipalvelimen, ja sellaisena se palveli uskollisesti hamaan loppuun asti. Lähtiessäni olisin kovasti halunnut masiinan nostalgiasyistä mukaani, mutta suunnitelma ei toteutunut. Kurjaa, koska pömpelillä oli minulle jostain syystä paljon tunnearvoa.

Alaston totuus

En yllättynyt löytäessäni yhden tyhjän palvelimen. Yllätyin vasta, kun löysin kokonaisen rivillisen samanmoisia. Tai no, tyhjillään on subjektiivinen käsite, sillä näissä löytämissäni pontevissa palvelinveljeksissä asui vaihtelevan valmiita pornosaittien aihioita.

Yllättynyt oli myös toimitusjohtajamme Akseli, entinen jääkiekkomaajoukkueen luottopuolustaja, mutta ei siitä että servereiltämme löytyi pornoa. Supermyyntimies Oivalla oli jossain vaiheessa ollut seksikäs kausi, jonka aikana hän oli erikoistunut myymään aikuisviihdettä tukkuerissä. Tämän ajanjakson perintönä iMedialla oli vieläkin muutamia alan asiakkaita.

Osa pornotyypeistä oli ihan harmittomia, ja yhdelle kivalle painettiin myöhemminkin hommia ihan vakavissaan. Voin kertoa, että kun croppaat isoa kikkeliä irti taustasta, olet päässyt leiskantaittourasi huipulle!

Akseli oli yllättynyt siitä, että yhtiön kassavaroja oli haaskattu. Oiva oli jatkuvasti mäkättänyt kasvavista palvelintarpeista, ja näihin kuviteltuihin tarpeisiin oli totta kai mahdollisuuksien mukaan mukaan vastattu. Muistakaa, että tuon ajan palvelimet eivät olleet nykyajan puoli-ilmaisia vuokravehkeitä, vaan ikiomaksi ostettuja jyhkeitä ja kalliita mahtimuhkuja. Vanhassa serveriraudassa oli omat standardit kiintolevyille ja muille kilkkeille, eivätkä nämä oheislaitteet olleet kilotavaraa.

Oivan mahtidiilit

Pornogate raapaisi vain pintaa. Oivan taaksensa jättämät myyntikeikat olivat lahja, joka ei koskaan lakannut antamasta. Kokonaisia palvelimia oli pyhitetty projekteille, joita ei ollut koskaan viety maaliin. Projekteja, jotka oli viety maaliin, ei koskaan ollut laskutettu. Projekteja, joista oli jo tekovaiheessa laskutettu liian vähän, ei voinut laskuttaa ylläpidosta. Oiva oli tehnyt paljon kauppaa, mutta kaikki diilit olivat umpisurkeita. Niistä koitui meille enemmän haittaa kuin hyötyä.

Kun supermyyjä oli haihtunut kuin pieru Saharaan, löysimme hänen muistiinpanonsa. Niistä ei ottanut tolkkua kukaan tuntemani ihminen. Voin vannoa, että kirjoitus ei ollut mitään tunnettua luonnollista kieltä. Mustien vihkosten saatanalliset raapustukset olivat kuin suoraan kauhukertomuksista.

Emme päässeet Oivan keikoista ja niiden seuraamuksista minun aikanani eroon, mutta opimme porukalla nauramaan niille. Hyvästä huumorista on pahoina aikoina paljon iloa.

Kirjoitin ensimmäisessä osassa Makesta, toisesta myyntimiehestämme joka ei koskaan puhunut mitään. Kuprun jälkeen hänestä kuoriutui oikein suulas ja hauska kaveri. Oivan ja Bussen pyörittämä sirkus oli vain lannistanut miesparan.

Ylipäätäänkin meillä oli puhdistuksen jälkeen pitkään, ylitsepääsemättömiltä tuntuvista vaikeuksistamme huolimatta, tosi hyvä henki ja tekemisen meininki.

Jähmettävä kauhu

Sitä mukaa kun kaivoin palvelinhuoneessa syvemmälle, yllätykseni ja harmitukseni muuttui peloksi. Kaikkien palvelinten Red Hat-käyttöjärjestelmä oli pahasti vanhentunut. Onneksi sillä ei ollut mitään väliä, koska ohjelmistojen lisenssit olivat menneet umpeen kauan sitten. Yhdellekään palvelimelle ei ollut ajettu vuosiin tietoturva- tai muita päivityksiä, ja varmuuskopiot… syvä huokaus. Arvatkaapa kaksi kertaa, oliko varmuuskopioita?

Typerryin rikollisesta välinpitämättömättömyydestä, jolla iMedian palvelimia oli Bussen vahtivuorolla ylläpidetty. Ei tarvitse olla rakettitiedemies tai hopeakettu ymmärtääkseen, kuinka katastrofaaliset seuraukset sellaisella tietoturvan säädyttömällä laiminlylömisellä voi pahimmillaan olla.

Minulle kävi harvinaisen äkkiä harvinaisen selväksi, että olimme rankasti aliarvioineet ahdinkomme syvyyden. Selviytymisemme oli ohuenohuen langan varassa. Tarvitsimme tyypin, joka laittaisi palvelimet kuntoon, ja tarvitsimme sellaisen nopeasti!

Sisällönhallinnan pioneerit

Se tyyppi en mitenkään voinut olla minä. Oli niin paljon muutakin tehtävää, enkä olisi osannutkaan. Perattuani palvelinhuoneen minun oli suunnattava tarmoni ohjelmistoihin. Julkaisujärjestelmämme El Contento tuotti leijonanosan liikevaihdostamme ja aiheutti valtaosan ongelmistamme, joten oli luonnollista että se valikoitui ensimmäiseksi kohteeksi.

El Contento oli epävakain koskaan näkemäni webbisofta. Jos ohjelmistojen epävakautta mitattaisiin maanjäristysten asteikolla, El Contento olisi tärissyt ainakin kymmenellä Richterillä. En liioittele yhtään. El Contento ei kerta kaikkiaan suostunut pysymään pystyssä.

Sisällönhallintaohjelmistomme juuret olivat Karkkilan kauniissa kesäkaupungissa. El Contentoa oli alunperin kehitetty Euroopan Unionin rahoilla, ja tuen ehtona oli ollut koodin tuottaminen maakunnissa. Älä kysy. En tiedä enempää.

El Contenton alkuperäisiä kehittäjiä, joista ei ollut remmiin astuessani jäljellä kuin haju, yrityksemme johto kutsui “karkkilalaisiksi sähkömiehiksi”. Koodarit olivat olleet itseoppineita, ja itseoppineena arvostan tätä. Tavanomaisesta poiketen veijarit olivat valitettavasti jossain kohden alkaneet oppia väärään suuntaan.

Kun tulin kuvioihin mukaan, El Contento eli kolmatta sukupolvea. Ensimmäinen versio oli vuosituhannen alussa ollut ihan oikeasti edelläkävijätuote, joka oli tuonut verkkosisällön hallintaa massoille. Kaksituhatluvun alussa ei ollut ollut itsestäänselvää, että maallikot pystyivät päivittämään yritysten kotisivuja ilman koodarien apua.

Yksi asiakkaistamme käytti sinnikkäästi pilottiversiota, eikä suostunut päivittämään edes myöhemmin kun tarjouduimme tekemään sen ilmaiseksi. Tästä jäärästä ei koskaan koitunut harmia.

Toinen versio oli ollut lyhytikäinen. Sen käyttöönotossa oli kohdattu ylitsepääsemättömiä ongelmia. Ohjelma oli sekoittanut asiakkaiden tietoja keskenään, ja viattomat sisällöt olivat satunnaisesti vaihtuneet kovaan pornoon. En koskaan todistanut ilmiötä omin silmin, mutta veikkaan että tilanne on voinut ollut vähän kuumottava!

Yritin löytää legendaarisen kakkosversion koodit tutkiakseni asiaa puhtaan akateemisen kiinnostuksen kannalta. Pengoin bittejä vanhoilta pölyttyneiltä nauha-asemilta, mutta epäonnistuin. Lähdemateriaali oli kadonnut iäksi.

Päiviemme valo, iltojemme ilo

El Contenton hurja epävakaus oli selvinnyt minulle heti aloitettuani. Kun otin asian puheeksi Bussen kanssa ja ehdotin ratkaisuksi El Contenton kirjoittamista uudelleen PHP:llä, Busse tyrmäsi minut yksinkantaan ja totesi sen mahdottomaksi. Keskustelu oli silloin jäänyt siihen, mutta olin haudutellut asiaa mielessäni. Kun Busse oli poissa, mikään ei estänyt minua tarttumasta hampaillani tähän ilmestyskirjan petoon.

Kuvitelkaa tilanne, jossa mikä tahansa aloittamanne koodaustyö keskeytyy parhaimmillaankin useamman kerran tunnissa siihen kun asiakas soittaa ja kertoo palveluidensa olevan nurin. Ensin tutkit, millä palvelimella asiakas asuu, ja otat sinne etäyhteyden. Sitten tapat palveluita aina tietokantaa ja HTTP-palvelinta myöten, useammin pahalla kuin hyvällä, ja lopulta käynnistät ne uudelleen.

Kun olet ehtinyt tarkistaa että asiakkaan sivut jälleen toimivat, sama rumba alkaa uudelleen toisella palvelimella ja toisella asiakkaalla. Koska kaikki aikamme ja energiamme meni El Contenton jatkuvaan sydänhierontaan, saimme tehtyä hirmu vähän “oikeita” töitä. Touhu oli raskasta, turhauttavaa ja ihan täysin mielipuolista.

Tuntematonta karkkilalaista, joka oli tajunnut säätää kaikki El Contenton käyttämät palvelut käynnistymään itsestään uudelleen vartin välein kaikilla palvelimilla, palvottiin sankarina. Ennen tätä muutosta soittelu- ja uudelleenkäynnistysrumba oli ollut vielä paljon kauheampaa.

Ylivoimaisesti suurin asiakkaamme oli mahtava kansallinen puolue. Yrityksemme oli aikanaan onnistunut nappaamaan sen, koska puolue halusi kumppanikseen pajan jolle se olisi aina kaikkein tärkein asiakas. Huvittavaa kyllä, El Contenton epävakaus oli ollut pilata puolueen edellisen puoluekokouksen. Vaikka koodarit olivat päivystäneet ympäri vuorokauden ja rynkytelleet palveluita pystyyn sarjatulella, saitti oli ollut nurin puolet ajasta.

Ainutlaatuista arkkitehtuuria

Kahden aika konservatiivisen ohjelmistoversion jälkeen karkkilalaiset olivat kolmannella kierroksella päästäneet mielikuvituksensa valloilleen.

El Contento koostui komentosarjasta, jonka tehtävä oli ottaa käyttäjiltä tulevat HTTP-pyynnöt vastaan. Skripti teki itsessään tosi vähän: se lähinnä tulkitsi mitä pyydetty sivu piti sisällään ja välitti eteenpäin tukun uusia, sisäisiä HTTP-kutsuja.

Kaikki El Contenton sisäiset HTTP-kutsut ohjattiin silmämääräisesti täysin satunnaisiin portteihin samalla palvelimella. Näitä satunnaisia portteja kuuntelivat sekalaiset Perlillä ja Kylixillä toteutetut palvelut, jotka palauttivat pääskriptille tekstimuotoista sisältöä. Palautuneet tekstinpätkät ajettiin saman tulkin läpi, ja muutettiin uusiksi sisäisiksi HTTP-kutsuiksi. Tätä epäpyhää jumalsilmukkaa kierrettiin, kunnes mitään sisäiseksi palvelukutsuksi tulkittavaa ei enää löytynyt.

Näen, mitä ajattelet. Mieleesi juolahtaa hyvä perustelu. Aikaansa edellä olevat ohjelmoijathan olivat ilmiselvästi suunnitelleet tosi hienon mikropalveluarkkitehtuurin jota oli helppo skaalata! Paitsi kuten jo mainitsin, kaikki HTTP-pyynnöt ohjattiin aina tismalleen samalle palvelimelle. Jokaisella palvelimella oli poikkeuksetta oma tietokantansa ja omat resurssinsa. Ne olivat täysin itsenäisiä yksiköitä.

Olen kuluttanut monta iltaa miettimällä El Contenton alkuperäistä arkkitehtuuria, ja tullut joka kerta samaan johtopäätökseen. Se ei syntynyt millään käsitettävissä olevalla järjellä tai logiikalla.

Kuningaskosahdus

Summa summarum: yksi El Contentoon sisään tuleva julkinen HTTP-pyyntö monistui useaksi kymmeneksi järjestelmän sisäiseksi HTTP-pyynnöksi. Sisäiset palvelut eivät jakaneet resursseja, vaan muodostivat surutta esimerkiksi uusia tietokantayhteyksiä. Kun palvelimelle eksyi enemmän kuin yksi samanaikainen käyttäjä, El Contento alkoi hidastua. Vähänkin suuremmalla kuormalla palvelut alkoivat ensin jumittaa, ja kuorman edelleen kasvaessa jokin yksittäinen palvelu kaatui ja lakkasi vastaamasta.

Kun yksittäinen palvelu, vaikkapa uutiset, kaatui, uutisten kohdalle alkoi piirtyä tyhjää. Asiakas sai pyytämänsä sivun hitaammin, koska kaatunutta palvelua silti pollattiin. Alkoi ketjureaktio, jossa hidastuvat ja kaatuvat mikropalvelut alkoivat viedä toisiaan mukanaan hautaan, mikä johti entistä pahempiin hidastumisiin ja kaatumisiin. Lopulta sekä Apache (HTTP-palvelin) että MySQL (tietokantapalvelin) hirttivät itsensä, eikä kukaan saanut palvelimesta irti minkäänlaisia sivuja.

Versionhallintaa ei iMedialla tunnettu, joten jokaisella sisällönhallintaan valjastetulla palvelimella asui aivan omanlaisensa versio El Contentosta. Vanhoilta palvelimilta löysin enemmän Kylixiä, uudemmilla Perl oli vallannut alaa. Erot palvelinten välillä olivat mittavat, joten kaatumisongelmia ei voinut ratkaista tai edes debugata yleisellä tasolla.

Riippumatta ohjelmointitekniikasta hitaus ja epävarmuus olivat El Contentoa määrittelevät perimmäiset ominaisuudet. Yksi palvelin ei kyennyt palvelemaan kovin montaa asiakasta, joten palvelimia oli monta. En tiedä, millaisilla lupauksilla mainostoimistot oli aikanaan huijattu jälleenmyymään El Contentoa, mutta niin ne vain olivat tehneet. Kumppaniemme palvelimista ja asiakkaista olimme pitäneet – jos edes mahdollista – vielä huonompaa huolta kuin omistamme.

Synkkä ja myrskyinen yö

Eräänä myöhäisenä talvi-iltana, ei kovin kauan Oivan ja Bussen lähdön jälkeen, Make soitti minulle. Kaikkien asiakkaidemme kaikki järjestelmät olivat nurin.

Emme olleet vielä ehtineet palkata lähtijöiden tilalle uutta väkeä, joten ketään muuta kuin me ei ollut saatavilla. Eipä siinä tilanteessa oikein muuta voinut kuin lähteä katsomaan, oliko toimitilamme kenties palanut maan tasalle. No, ainakin loimotus lämmittäisi ja kuivaisi kyyneleeni.

Matkattuani läpi öisen ja pimeän Helsingin saavuin toimistolle, jonne Make oli jo ehtinyt. Talo oli vielä paikallaan. Aikamme tilannetta ihmeteltyämme huomasimme, että kaikki palvelimet olivat pystyssä mutta verkko oli täysin tukossa. En muista, miten tulin tähän johtopäätökseen, mutta joka tapauksessa onnistuin päättelemään että kyseessä oli palvelunestohyökkäys.

Tiesin, että palvelimemme olivat surullisessa jamassa, joten oli luonnollista epäillä vilunkipeliä. Meillä ei ollut mitään työkaluja asian tutkimiseen, ei ainakaan sellaisia joita olisin osannut käyttää, joten toimimme suoraviivaisesti. Minä revin verkkopiuhoja irti palvelimista yksi kerrallaan, ja Make tarkkaili samaan aikaan läppärillänsä verkon toimintaa.

Lopulta paikansimme palvelimen, joka oli syypää ongelmiin. Verkko rauhoittui ja kaikki muut palvelut alkoivat vastata normaalisti. Valitettavasti serveri, jonka olimme juuri irroittaneet verkosta, oli yksi tärkeimmistä, koska sillä asui useita kymmeniä asiakassivustoja. Konetta ei voinut mitenkään jättää nurin. Odotimme vähän aikaa ja kytkimme palvelimen takaisin verkkoon. Mitään ei tapahtunut. Akuutti kriisi oli ohi, ja lähdimme kotiin.

Seuraavana aamuna tutkin palvelinta tarkemmin. Löysin outoja kansioita, tiedostoja ja prosesseja. Homma oli selvä kuin pläkki. Ainakin yksi palvelimistamme oli hakkeroitu.

Seuraavien viikkojen aikana hyökkäykset toistuivat ja kiihtyivät. Palvelin toisensa jälkeen ryhtyi hämärähommiin, ja ravasin toimistolla katkomassa piuhoja ja tappamassa pahoja prosesseja niin kuin taisin. Karu totuus paljastui. Niin uskomattomalta kuin se kuulostaakin, melkein kaikki palvelimemme olivat vihamielisten voimien hallussa.

Lopulta pahuuden tielle eksyi kolmos-webbipalvelimemme, vanha kehäraakki joka oli pullollaan tärkeitä asiakkaita. Tykitettyään menemään koko aamuyön palvelin henkäisi syvään, totesi saaneensa hulluudesta tarpeekseen, ja kuoli syliini.

Vaikka kuinka yritin, en saanut palvelinta heräämään henkiin. Tähänkö tämä nyt päättyi?

Game over man, game over! Pekkis yritti parhaansa, mutta se ei riittänyt. Sankarimme on kohdannut voittamattomalta tuntuvat vaikeudet pystypäin, ja löytänyt aina tien eteenpäin! Voiko hänen onnensa vielä jatkua, vai sammuttaako viimeinen nyt valot iMedian toimistolta? Tarina jatkuu ensi maanantaina! Sama aika! Sama Fraktion blogi!