18. heinäkuuta 2017

Cyber Security Base - F-Securen ja Helsingin yliopiston verkkokurssikokemuksia

F-Secure ja Helsingin yliopisto päättivät viime vuoden (2016) lopussa järjestää yhteistyössä tietoturvaan keskittyvät verkkokurssin, eli MOOCin (http://mooc.fi/courses/2016/cybersecurity/). Kun kuulin kurssista loppukesällä, päätin ilmoittautua mukaan, sillä tietoturvaan liittyvät asiat ovat kiinnostaneet jo pitkään.

Kurssi on jo päättynyt, mutta aineisto on edelleen luettavissa täällä: https://cybersecuritybase.github.io/

Kuvaus kurssista


Kurssi kesti n. seitsemän kuukautta, lokakuun puolivälistä toukokuun alkuun saakka. Alkupuoli (lokakuusta tammikuun alkuun) keskittyi nettipalveluiden tietoturvaan. Toisella puoliskolla käsiteltiin laajemmin verkkojen ja tietojärjestelmien tietoturvaa. Lopuksi järjestettiin Capture-The-Flag -kilpailu, jossa viikon aikana piti selvittää mahdollisimman monta 20:sta annetusta tehtävästä.

Kurssilla annettiin aineistoa ja tehtäviä kerran viikossa. Tehtävien tekoon oli aikaa useampi viikko, mutta pysyäkseen hyvin kurssin aikataulussa, kannatti tehtäviä tehdä viikottain. Aineisto koostui pääsiassa kurssin järjestäjän tuottamasta tekstistä, joskus aineistoa oli myös linkitetty ulkoisiin tutkimuksiin ja muihin julkaisuihin.
Tehtävät koostuivat monivalintakysymyksistä ja lyhyehköistä kirjoitelmista (yleensä minimissään n. 300 sanaa, nämä minimipituudet muistuttivat amerikkalaisesta tavasta mitata tekstien pituuksia). Monipuolisuutta tehtäviin toi myös koodaustehtävät, jotka ladattiin Helsingin yliopiston käyttämältä TestMyCode-alustalta. Ohjelmointikielenä käytettiin Javaa ja ohjelmointiympäristönä Netbeansia, mutta tehtävät sai tehdä myös toisella kielellä ja työkalulla. Koodaustehtävät keskittyivät aluksi Spring-frameworkin ja Thymeleafin esittelyyn, myöhemmin tehtävissä oli tarkoitus korjata em. työkaluilla toteutettuja pieniä nettipalveluita (palveluissa oli bugeja ja tietoturva-aukkoja joita käsiteltiin sen viikon muissa tehtävissä tai luentoaineistossa). Kun koodi oli opiskelijan mielestä valmis, se lähetettiin takaisin TestMyCode-palvelimelle, joka vielä testasi koodin toimivuuden ja hyväksyi tehtävän suoritetuksi.

Vuoden lopussa, ensimmäisen puoliskon päätteeksi, annettiin laajempi projekti jonka suorittamiseen oli aikaa kuukauden verran. Projektissa oli tarkoituksena toteuttaa pieni webbipalvelu, joka sisältäisi vähintään viisi erityyppistä tietoturvaongelmaa. Tämän jälkeen tehtävä jatkui n. 1000 sanan kirjoitelmalla, jossa tuli kuvata webbipalvelun viat, niiden hyödyntämistavat ja ratkaisut ongelmien korjaamiseksi. Lopuksi piti tarkistaa kahden muun oppilaan vastaavat projektit ja todeta heidän toteuttamansa webbipalvelu korjausohjeineen toimivaksi. Tehtävän sai suorittaa millä alustalla ja ohjelmointikielellä tahansa, mutta koska tehtävänannossa opiskelijoille annettu projektipohja ja muu kurssin aineisto oli toteutettu Javalla, oli luontaista toteuttaa projekti samalla kielellä.

Toinen puolikas tai "kevätlukukausi" jatkui hieman erilaisella tavalla. Tehtäviä tehtiin edelleen viikottain ja tehtävät sisälsivät monivalintatehtäviä, mutta koodaus jäi kokonaan pois. Luentoaineistona oli entistä usemmin jokin tutkimus tai muu ulkopuolisen tahon kirjoittama teksti. Tilalle tuli myös entistä useammin tehtävät, joissa naputeltiin 300 - 1000 sanan tekstejä ko. viikolla käsitellystä aiheesta. Samalla tuli tutuksi toisten oppilaiden vastaavien kirjoitelmien tarkistukset ja rakentavan palautteen anto.

Tämänkin "lukukauden" lopuksi annettiin taas tehtäväksi enemmän työta vaativa kokonaisuus. Tehtävänä oli murtautua tietoturvaltaan huonosti kofiguroituun palvelimeen käyttäen Metasploit-työkalua ja kirjoittaa löydetyistä haavoittuvuuksista 1000 sanan havaintoraportti. Haavoittuneita palvelimia ei kuitenkaan löydy noin vain, eikä sellaisia yleensä luoda opiskelijoita varten julkiseen internetiin, joten haavoittunut palvelin piti asentaa omalle koneelle virtuaalikoneeksi. Tähän tarkoitukseen on olemassa (ilmeisesti paljonkin käytetty) virtuaalikone nimeltään Metasploitable. Käytimme tehtävässä sen 3:tta versiota.
Kun Metasploitable-koneen oli saanut toimimaan oikein, siihen piti vielä asentaa verkkovalvontatyökalu nimeltään Snort. Snort valvoisi verkkoliikennettä hyökkäysten varalta ja tehtävänannossa kerrottiin, että Metasploit-työkalulla oli tarkoitus löytää kaksi hyökkäystapaa, joita verkkovalvontaohjelmisto ei havaitse ja kolme sellaista, jotka jäävän valvontaohjelmistoon näkyville.
Kaiken tämän jälkeen pääsi itse asiaan eli Metasploit-työkalun käyttöön ja tarkemmin ottaen sen käytön opiskeluun. Tehtävänannossa annettiin linkki Metaslpoitin viralliseen dokumentaatioon, mutta netistä löytyi tähän tarkoitukseen paljon parempaa aineistoa. Itse löysin Youtubesta useamman videon mittaisen esittelyn sen käytöstä Metasploitable-ympäristössä.
Aikaa tämän projektin tekemiseen oli hieman alle 1,5 kuukautta, itse käytin projektin tekemiseen hieman alle kuukauden verran, käytännössä pystyin keskittymään projektiin ainoastaan viikonloppuisin.

Kurssin päätteeksi järjestettiin Capture The Flag -kisa. Yleensä CTF-kisoissa on tarkoituksena ratkaista annettuja tehtäviä ja koota ratkaisuista vihjeitä seuraavaan tai seuraaviin tehtäviin. Kurssilla järjestetyssä CTF:ssä annettiin 20 tehtävää, jotka jaettiin kolmeen vaikeustasoon. Vaikeustasolta seuraavalle pääsi vasta sitten, kun kaikki edellisen tason tehtävät oli ratkaistu. Tehtäviä pystyi suorittamaan vaikeustason sisällä missä tahansa järjestyksessä, eli ratkaisuja ei tarvittu seuraavien tehtävien vihjeeksi. Jotkut tehtävät olivat kuitenkin teemaltaan hyvin samankaltaisia, joten toisen vastaavan tehtävän ratkaisu antoi tavallaan vihjeen seuraavaan tehtävään.
Helpoimman vaikeustason tehtäviä oli 9, keskitason tehtäviä 8 ja loput kolme olivat vaikeimman tason pähkinöitä.
Tehtävät olivat yllättävän monipuolisia. Ne koostuivat yksinkertaisimmillaan salatun tekstin kääntämisestä selkokieleksi arvaamalla salauksesssa käytetty salausalgoritmi. Muutamissa tehtävissä selvitettiin kuvatiedostoon tai binääritiedostoon sisällytettyä salasanaa, pari tehtävää keskittyi huonosti toteutettuun nettipankkisivustoon ja muutama tehtävä vaati hieman matemaattisia taitoja. Hankalimmat arvoitukset vaativat erillisten analysointi- ja testausohjelmistojen käyttöä. Kilpailu kesti ainoastaan 8 päivää ja jokaisen tehtävän nopein ratkaisija sai nimensä näkyviin tehtävän otsikon viereen, tämä loi tavallaan kilpailua osallistujien välille. Kurssin läpäisemiseksi vaadittiin, että opiskelija löytäisi ratkaisun 80%:iin CTF-kilpailun tehtävistä.

Omat kokemukseni


Lähdin kurssille mukaan ehkä liian korkein odotuksin. Oletin, että kurssi opettaisi minulle tärkeitä perusasioita ja jonkin verran myös tarkempia tietoja hyvän tietoturvan suunnittelussa, sekä ohjelmistokehityksessä että verkkoturvallisuudessa yleensä. Lisäksi halusin tietoa analysointi- ja tietoturvan testausohjelmistojen käytöstä. Kurssin loputtua saavutukset ja oppimieni asioiden määrä jäivät vähän vajaaksi.

Alkuosan (syksyn) tehtävät koostuivat pääasiassa ohjelmointitehtävistä. Nämä olivat mukavia verrattuna 1000 sanan essee-teksteihin, mutta ne eivät olleet täysin ongelmattomia. Tehtävissä käytetyistä frameworkeistä minulla ei ollut yhtään käytännön kokemusta, joten suurin osa tehtäviin käyttämästäni ajasta kului frameworkin ja työkalujen käytön opetteluun. Ensimmäiset ohjelmointitehtävät opettivat joitakin perusasioita, mutta ohjeet eivät riittäneet kovinkaan pitkälle. Ymmärrän toki, että uusien asioiden opiskelu vaatii opettelua myös aiheen ympäriltä, mutta välillä ohjelmointitehtävissä tuli sellainen olo, että opettelemmeko käyttämään Spring-frameworkia ja etsimään sen asetuksia vai opettelemmeko tietoturvaan liittyviä asioita (Springia käytetään tällä hetkellä varmasti aika paljon, mutta paljonko sen asetusten opiskelu edesauttaa jonkin toisen frameworkin tietoturvan suunnittelussa?). Tämä korostui omalla kohdallani varsinkin projektitehtävässä, jossa käytin paljon aikaa etsiessäni keinoja toteuttaa erilaisia tietoturvahaavoittuvuuksia annetuilla työkaluilla. Tämä ei tainnut olla tehtävän alkuperäinen tarkoitus.

Kevätkausi keskittyi enemmän luentoaineistojen läpikäyntiin, niihin liittyien tehtävien tekemiseen ja essee-vastausten kirjoittamiseen. Ohjelmointitehtäviä ei enää juurikaan ollut. Itselleni jäi hyvin hämäräksi tuottamiemme tekstien tarkistaminen, kuka niitä kävi läpi ja antoi niille lopullisen hyväksynnän. Jokaisen viikkotehtävän lopussa oli vaatimus tarkistaa kahden muun oppilaan tuottamat tekstit ja antaa niistä rakentavaa palautetta. Joskus toisten oppilaiden tekstit olivat hyvinkin lyhyitä tai ne keskittyivät epäolennaisiin asioihin tehtävänantoon verrattuna. Näihin oli hankalaa antaa rakentavaa palautetta. Joskus vihjasin tekstin lyhyydestä, mutta muilta osin jätin kommentoimatta, sillä useinmiten jäin miettimään, olinko itse ymmärtänyt tehtävänannon väärin. Täysin hämäräksi jäi myös se, lukiko kukaan antamaani palautetta ja vaikuttiko se mihinkään millään tavalla. Itsekin palasin hyvin harvoin katsomaan vanhoja tehtäviäni ja lukemaan saamaani palautetta, todennäköisesti kovin moni muukaan ei palautettaan seurannut. MOOC-alustassa oli myös bugi, jota hyödyntämällä näki mitä muut ovat tehtävänantoon kirjoittaneet ennenkuin kirjoitti itse mitään järkevää tekstiä. Tällöin oli mahdollista luntata toisten tekstejä omiin vastauksiin. Tekstien lyhyyteen oli ilmeisesti kiinnitetty jossain huomioita, sillä tehtäviin alkoi ilmestyä raja-arvo vastauksen minimipituudelle (aiemmin esim. 1000 sanaa saattoi tarkoittaa 800 - 1200 sanaa).

Kevätkauden projektitehtävä oli ennakkoon yksi mielenkiintoisimmista, mutta se aiheutti koko kurssin suurimman pettymyksen. Kevätkauden tehtävissä ei käsitelty projektissa tarvittavia taitoja juuri ollenkaan. Teoriaa käsiteltiin paljonkin, mutta käytännön tiedot tuli hankkia täysin itsenäisesti. Tehtävää lukiessani tuli olo, jossa minulle annettaisiin käyttööni jokin täysin uusi kone, vaikkapa torninosturi, jonka toiminnasta en tiedä ennakolta mitään. Käteeni annetaan nosturin avaimet ja tavoitteeksi annetaan siirtää kontteja ja tavaroita pitkin rakennustyömaata. Sitten taputellaan selälle ja tehtävä alkaa ilman sen kummempia selityksiä. Ohjeistusta ja opastusta olisi kaivannut huomattavasti annettua enemmän.

Aluksi ongelmia tuotti Metasploitable-virtuaalikoneen pystytys ja alustus. Tässä tuli käyttää apuna Vagrant-ohjelmistoa, jonka oli tarkoitus helpottaa ympäristön asennusta. Asennuksessa tuli kuitenkin vastaan erilaisia ongelmia, joista osan sai selville internetistä ja osan kokeilemalla. Tätä projektia varten avattiin erillinen IRC-kanava keskustelua varten, jossa pystyi kysymään toisilta oppilailta apua omiin ongelmiin ja kysymyksiin. IRC-kanavalla käydystä keskystelusta pystyi päättelemään, että osalla opiskelijoista oli suuria vaikeuksia saada virtuaalikonetta pystyyn. Itse taisin päästä asennusvaiheen yli aika vähällä. Asennukseeni jäi joitain virheitä, mutta kone kuitenkin toimi, joten en perehtynyt virheilmoituksiin sen enempää.
Toinen ongelma tuli vastaan verkkovalvontatyökalun asennuksessa. Tämäkään ei ollut ihan yksinkertaista Windows-maailmaan tottuneelle, eivätkä summittaiset asennusohjeetkaan auttaneet asiassa juurikaan. Snortille piti asennuksen jälkeen valita myös sääntökokoelma, jonka mukaan se osaisi valvoa liikennettä, mutta tältä osin jäi ainakin minulle epäselväksi, mitä kokoelmaa meidän olisi pitänyt käyttää (IRC-kanavalla asiaa pohdittiin opiskelijoiden kesken, mutta selkeää vastausta kysymykseen ei saatu).

Vasta näiden asennusten ja konfigurointien jälkeen pääsi suorittamaan itse tehtävää, eli etsimään Metasploitilla haavoittuvuuksia kohdejärjestelmästä. Suurin osa ajastani meni Metasploitin käytön opettelussa ja verkkovalvontatyökalun toiminnan ymmärtämisessä (en tiennyt, milloin valvontatyökalu oikeastaan "näki" hyökkäyksen ja milloin ei, se näytti reagoivan koko ajan kaikkeen mahdolliseen liikenteeseen). Kaiken kaikkiaan tämä projektitehtävä oli äärimmäisen turhauttava, varsinkin kun se ennakolta vaikutti kaikkein mielenkiintoisimmalta pähkinältä.

Kurssin päätteeksi järjestetty CTF-kilpailu oli pääosin mielenkiintoinen tapahtuma. En itse edes yrittänyt päästä ensimmäisten ratkaisijoiden mukaan kilpailemaan "kunniamaininnoista", sillä tiesin olevani tälläisten tehtävien ratkaisemisessa vielä täysin amatööri. Tehtävät olivat pääosin selkeitä mutta haastavia, jokaisessa kohdassa sai vaivata päätään oikein kunnolla. Muutaman tehtävän kohdalla olisi tekstissä voinut hieman tarkentaa, mitä kyseisessä arvoituksessa oli tarkoitus ratkaista ja missä muodossa vastaus pitäisi antaa. Yritin ratkaista erästä asymmetriseen salausmenetelmään liittyvää arvoitusta tavallaan liian "pitkälle" ja käytin turhaa aikaa vastauksen selvittämiseen vaikka olin jo saanutkin sen selville. Oletin, että edellisten tehtävien mukaisesti vastaus piti antaa purettuna selkotekstinä, mutta vastaukseksi riittikin matemaattisen kaavan mukainen salaamattoman tekstin numeraalinen arvo.

Tehtävistä käytiin keskustelua em. IRC-kanavalla ja välillä toiset opiskelijat antoivat toisilleen vihjeitä hankaliksi koettujen tehtävien ratkaisemiseen. CTF-kilpailun ajan käydessä vähiin päätin itsekin kysyä vinkkiä erääseen pulmaan. Kanavalla vastattiin kysymykseeni hyvinkin nopeasti, mutta en saanut toivomaani vastausta. Sain ainoastaan pyynnön olla kysymättä vihjeitä mihinkään tehtävään, että muut saisivat yrittää ratkoa tehtäviä rauhassa. En ollut vielä koko kurssin aikana käyttänyt IRC-kanavan keskustelumahdollisuutta, enkä tämän jälkeen enää palannutkaan kanavalle takaisin.

Lopuksi


Kurssi vaikutti ennakkoon erittäin mielenkiintoiselta ja mukavalta tavalta oppia uusia asioita tietoturvasta. Oletin saavani tietoa erilaisten työkalujen käytöstä ja tietoturvasta yleensä, miten se pitäisi huomioida eri tilanteessa. Ilmaiselta kurssilta ei voi vaatia paljoa, mutta olisin kuitenkin toivonut enemmän. Kaivelemaan jäivät erityisesti Metasploit-työkalun opettelu, johon oletin saavani kurssin järjestäjältä jonkinlaista opastusta. Nyt opettelu jäi täysin omiin käsiin, enkä saanut kovinkaan hyvää kuvaa Metasploitin toiminnasta ja käyttömahdollisuuksista. Ehkäpä sitä ei haluttukaan esitellä tämän enempää, mene ja tiedä. Verkkokurssiin kuuluu tietenkin olennaisena osana itsenäinen opiskelu, mutta on vaikeaa perustella tälläistä toimintatapaa. Itsenäisessä opiskelussa jää aina paljon asioita opettelematta. Opiskelija keskittyy ainoastaan itselleen mielenkiintoisiin asioihin, eikä kokonaisuuden kannalta olennaisia asioita tule edes ajatelleeksi.

Tehtävät jäivät yleisestikin hieman torsoksi. Niissä oli ideaa, mutta toteutus jäi puolitiehen. 1000 sanan essee-vastausten kirjoittamisen ja toisten opiskelijoiden kirjoitusten tarkistamisen jälkeen jäin useinmiten miettimään, mikä oli opettajan rooli koko kurssissa. Opettaja tai opettajat tuottivat  aineistoa ja ohjelmointitehtävät olivat täysin heidän omaa tuotantoaan, mutta opetukselliset seikat jäivät puuttumaan lähes kokonaan. Ehkäpä olisi pitänyt osallistua enemmänkin IRC-keskusteluun, jotta olisi päässyt sisään yhteisöön ja saanut sieltä enemmänkin tukea, mutta loppujen lopuksi siitäkin jäi hieman hapan maku suuhun.

Todennäköisesti vastaava kurssi tullaan toteuttamaan lähiaikoina uudestaankin. Osallistujia taisi olla yli sata, joten kiinnostusta löytyy varmasti seuraavallekin kurssille. Toteutusta kannattaisi kuitenkin vähän miettiä uudelleen, jotta voisi enemmän keskittyä itse aiheen opiskeluun eikä tarvitsisi käyttää niin paljon aikaa oheistoimintojen ymmärtämiseen. Samalla kurssille osallistujien tulisi ymmärtää verkko-opiskelun rajoitteet ja pitää odotukset maltillisena.