ICT4TN021-3010 - Kurssiraportit

Linux palvelimet -kurssin tehtyjen tehtävien tehtäväsivu tehtävien tarkastajalle ja muille uteliaille.
- Juho Hakala

Pikalinkit:
H1
H2
H3
H4
H5
H6
H7
H8

Harjoitus 1

Takaisin ylös

a) Tee oma Linux-livetikku. Kokeile sitä jossain muussa kuin koulun koneessa. Tämä kohta ei edellytä asentamista – jos kuitenkin asennat, ota ensin varmuuskopiot. Jos ehdit tehdä tikun jo tunnilla, voit poikkeuksellisesti raportoida muistin perusteella jälkikäteen, mutta muista silloin mainita muistinvaraisuudesta.

Tarvittavat asiat livetikun luomiseen:
Xubuntu: https://xubuntu.org/download
Rufus: https://rufus.ie/
USB 3.0 -muistitikku: esimerkiksi käyttämäni SanDisk Ultra USB 3.0 32GB

Latasin Xubuntu 18.04.3 AMD64 ISO -tiedoston Xubuntun nettisivuilta mirrorin kautta sekä Rufus-ohjelman. Avasin Rufuksen, tarkistin asennuksen kohdelaitteen olevan oikea (USB-tikkuni oli oletuksena valittu), painoin Boot Selection -otsikon alla olevaa SELECT-nappia ja valitsin äsken lataamani ISO-tiedoston. Annoin muiden asetusten olla oletusarvoisina ja painoin START-nappia. Parin minuutin jälkeen livetikku oli valmis.

Jotta pöytäkoneeni kykenisi käynnistämään USB-tikulta, BIOS kaipasi muutamia muutoksia.

Asuksen tukisivuilta löysin, että pitäisi kytkeä päälle (enable) CSM (Compatibility Support Module) sekä kytkeä pois päältä (disable) Secure Boot state. CSM:n kytkeminen päälle tapahtui helposti ohjeiden mukaisesti (Avataan BIOS -> Boot-välilehti -> CSM(Compatibility Support Module)-nappi -> Launch CSM -> Valitaan dropdown-menusta Enabled), mutta Secure Bootin pois kytkeminen tapahtuu uudemmassa BIOS-versiossa hieman eri tavalla.

Niinpä etsin käsiini toisen ohjeen, joka kertoi miten kyseinen toimenpide suoritetaan (Avataan BIOS -> Boot-välilehti -> Secure Boot -nappi -> OS Type -> Valitaan dropdown-menusta Other OS, sen jälkeen painetaan Key Management -nappia -> Save all Secure Boot variables -> Valitaan käytettävä USB-tikku valikosta -> Ok -> PK Management-nappi -> Delete Key -> Ok).

Tämän jälkeen voidaan avata BIOS -> Boot-välilehti -> Boot Override -otsikon alta löydetään nyt kaikki boottaus vaihtoehdot, käytettävä USB-tikku mukaan lukien.

Aloitin ISO-tiedoston ja Rufusin latailun 10:00. Livetikun tekemisen ja edellä eriteltyjen BIOS-seikkailujen jälkeen kello oli 10:40.

Käynnistys: BIOS:in kautta siis suoritin käynnistyksen ja homma lähti liikkeelle. Ensimmäisessä valikossa kyseltiin kokeilun ja asennuksen väliltä. Klikkasin Try Xubuntu -nappia. Hetken odottelun jälkeen työpöydän tuastakuva ilmestyi ruudulle, mutta ei muuta (kuvakkeita tai palkkeja). Hetken ihmeteltyäni tajusin käynnistää myös toisen koneeseen liitetyn näytön ja kas kummaa, sieltä se varsinainen työpöytä löytyikin. Hiiri liikkui näytöllä ja näppäimistökin toimi. Ääkkösetkin saatiin peliin setxkbmap fi -komennolla

b) Listaa testaamasi koneen rauta (‘sudo lshw -short -sanitize’).

c) Asenna kolme itsellesi uutta ohjelmaa. Kokeile kutakin ohjelmaa sen pääasiallisessa käyttötarkoituksessa.

1. Inkscape
Vektorigrafiikkatyökalu
sudo apt-get install inkscape
Ensimmäisellä yrityksellä error-viesti kertoi päivittämään ja työtä käskettyä ajoin komennon sudo apt-get update. Tämän jälkeen toisella yrityksellä inkscapen asennuskomento meni läpi ilman ongelmia.

"

2. Planner
Projektin hallintaohjelma
sudo apt-get install planner
Asennus meni läpi ilman ongelmia.



3. Calibre
E-kirjojen hallintaohjelma
Kokeilin ohjelman asennusta Software-ohjelman kautta ilman terminaalia. Hakupalkkiin kirjasin haluamani ohjelman ja sen sivulla klikkasin Install-nappia. Ohjelman asennettua itsensä se aukeni ilman ongelmia.



d) Mitä lisenssiä kukin näistä ohjelmista käyttää? Selitä lyhyesti, mitä oikeuksia ja velvolisuuksia tuosta lisenssistä seuraa.

Kaikki kolme käyttä GNU GPL -lisenssiä. Inkscape: v2, Planner: v2 or later, Calibre: v3.
GNU GPL -lisenssi antaa jokaiselle oikeuden käyttää, muokata, kopioida ja jakaa koodia eteenpäin, mutta velvoittaa jokaista julkaisemaan mahdolliset uudet tuotokset samaa lisenssiä käyttäen.

Lähteet lisensseille:
https://inkscape.org/about/license/
https://directory.fsf.org/wiki/Planner#tab=Details
https://github.com/kovidgoyal/calibre/blob/master/LICENSE

e) Listaa käyttämäsi ohjelmat (esim. MS Word), kunkin ohjelman käyttötarkoitus (esim. Tekstinkäsittely) ja vastaava vapaa Linux-ohjelma (esim. LibreOffice Writer). Jos johonkin tarkoitukseen ei löydy vapaata Linux-ohjelmaa, listaa sekin. (Päivitetty: korjasin tämän kohdan tunnuskirjaimen d->e)

Windows Kuvaus Linux
Microsoft Office Tekstinkäsittely, esitysten ja taulukkojen teko LibreOffice
Paint.net Kuvankäsittely, piirtotyökalu GIMP
Firefox, Chrome Selain Firefox
VS Code Koodieditori VS Code
Steam Pelaaminen Steam

Lähteet (osa lähteistä ripoteltu raporttiin, mutta tässä listattuna kaikki kootusti):
http://terokarvinen.com/2020/aikataulu-linux-palvelimet-ict4tn021-3010-torstai-aamu-alkukevat-2020-5-op
https://xubuntu.org/download
https://rufus.ie/
https://www.asus.com/support/FAQ/1013017/
https://www.techjunkie.com/disable-secure-boot-asus/
https://www.gnu.org/licenses/licenses.html
https://inkscape.org/
https://inkscape.org/about/license/
https://wiki.gnome.org/Apps/Planner
https://directory.fsf.org/wiki/Planner#tab=Details
https://calibre-ebook.com/
https://github.com/kovidgoyal/calibre/blob/master/LICENSE

Harjoitus 2

Takaisin ylös

a) Aiheuta lokiin kaksi eri tapahtumaa: yksi esimerkki onnistuneesta ja yksi esimerkki epäonnistuneesta tai kielletystä toimenpiteestä. Analysoi rivit yksityiskohtaisesti.

Lokitiedostot löydetään "/var/log/"-hakemistosta. Käytetään komentoa "cd /var/log/", tarkistetaan sijaintimme komennolla "pwd", ja komennolla "ls" nähdään kaikki kansiosta löytyvä sisältö (tiedostot, kansiot, muut).



Komennolla "tail -f syslog" voidaan tarkastella syslogin kymmentä viimeistä riviä ja nähdään tulevat muutokset reaaliaikaisesti.



Sain tehtyä syslogiin onnistuneen tapahtuman katkaisemalla ja yhdistämällä takaisin internettiin. Tämä toimenpide loi pitkän pätkän rivejä syslogiin ja lopputuloksena kone pääsi takaisin kiinni verkkoon.



Epäonnistunut tapahtuma voidaan saada aikaan esimerkiksi yrittämällä kirjautua SSH-yhteyden kautta väärillä tunnuksilla. Niinpä siis asennan SSH:n ensin päivittämällä pakettilistat "sudo apt-get update"-komennolla ja sitten "sudo apt-get -y install ssh". Seuraavaksi käyttämäni SSH-komennot löysin täältä. Jotta yhdistämäminen onnistuu, tulee tietää yhdistettävältä koneelta käyttäjänimi ja osoite (IP). "whoami"-komento kertoo käyttäjänimemme olevan xubuntu ja "hostname -I"-komento kertoo IP-osoitteeksemme 192.168.0.9. Nämä mielessä pitäen yritetään ottaa yhteyttä oikeaan osoitteeseen, mutta väärällä käyttäjänimellä. Komennolla "ssh pekka@192.168.0.9" yritetään ottaa yhteyttä ja vastaan tulee salasanan kyselijä. Painetaan Enter-nappia jokaiseen kyselyyn ja kolmannen kerran jälkeen yhteys katkeaa. Nyt voidaan mennä tarkastelemaan "auth.log"-tiedostoa, johon epäonnistunut kirjautumisyrityksemme pitäisi olla tallentunut. Ja niin se on sinne tallentunutkin, "Failed password for invalid user".

b) Vapaaehtoinen kohta, ei ole opetettu vielä: Asenna SSH-demoni. Kokeile omalla ssh-palvelimellasi jotain seuraavista: ssh-copy-id, sshfs, scp tai git. (Helpoin lienee scp: ‘scp foo.txt tero@example.com:’)

SSH asennettiin jo edellisessä kohdassa, joten sitä ei tarvitse uudestaan tehdä. Niinpä voidaankin suoraan yrittää ottaa yhteyttä oikeasti tällä kertaa. Ennen tätä tulee luoda käyttäjällemme oma salanana, joka voidaan tehdä komennolla "sudo passwd xubuntu".

Navigoidaan työpöydälle komennolla "cd Desktop" ja luodaan Desktop-hakemistoon nanolla testitarkoituksessa "teksti.txt"-tiedosto, joka sen jälkeen kopioidaan scp-komennolla. "scp teksti.txt xubuntu@192.168.0.9:/home/xubuntu/Desktop"-komento tekee tekstitiedostosta kopion määriteltyyn kohteeseen (sama kone).

c) Tee unelmien apt-get -komento: yksi komentorivi, joka asentaa suosikkiohjelmasi.

Komennolla "sudo apt-get -y install firefox" voi asentaa itselleen internet-selaimen, jolla voi selata internettiä.

d) Asenna komentokehotteen paketinhallinnasta kolme itsellesi uutta komentorivillä toimivaa ohjelmaa. Kokeile kutakin ohjelmaa sen pääasiallisessa käyttötarkoituksessa.

"apt-cache search"-komennolla on helppo etsiä ohjelmia erilaisiin käyttötarkoituksiin.

1. Nsnake
sudo apt-get -y -install nsnake
Komentorivillä toimiva snake-peli.



2. Genius
sudo apt-get -y -install genius
Yleishyödyllinen laskin



3. Pyjoke
sudo apt-get -y -install pyjoke
Ohjelma satunnaisesti kertoo ohjelmointiin liittyviä vitsejä.

Lähteet:
http://terokarvinen.com/2020/linux-palvelimet-2020-alkukevat-kurssi-ict4tn021-3010/
https://www.ssh.com/ssh/command
https://www.ssh.com/ssh/scp

Harjoitus 3

Takaisin ylös

Tehtävät löytyvät täältä.

a) Asenna Apache, laita käyttäjien kotisivut (http://example.com/~tero) toimimaan. Testaa esimerkkikotisivulla.

Jos Apachea ei ole vielä asennettuna ja selaimella mennään osoitteeseen localhost, tulee vastaan seuraavanlainen ilmoitus:



Ja koska haluamme saada jotain katseltavaa tälle sivulle, asennamme Apache web-palvelimen, joka onnistuu komennolla "sudo apt-get install -y apache2". Asennuksen jälkeen äskeinen localhost-sivu näyttää Apachen oletussivun:



Jotta voisimme luoda käyttäjäkohtaisen kotisivun (localhost/~xubuntu), luomme ensin kotihakemistoon (/home/xubuntu) "public_html"-kansion, jonka sisälle tehdään yksinkertainen demosivu nimeltään "index.html".



Tämän jälkeen otamme käyttöön userdir-moduulin komennolla "sudo a2enmod userdir", mutta muutokset tulevat voimaan vasta, kun käynnistämme Apachen uudelleen komennolla "sudo systemctl restart apache2". Nyt osoitteessa localhost/~xubuntu (mikäli käyttäjänimesi ei ole xubuntu, korvaa se oikealla) komeilee yksinkertainen testisivumme.



Koska käytössä on potentiaalisesti kaikelle maailmalle esiteltävä sivusto, otetaan myös palomuuri käyttöön komennolla "sudo ufw enable" ja avataan yksi portti mahdolliselle liikenteelle komennolla "sudo ufw allow 80/tcp".

b) Surffaa oman palvelimesi weppisivuja. Etsi Apachen lokista esimerkki onnistuneesta (200 ok) sivulatauksesta ja epäonnistuneesta (esim 404 not found) sivulatauksesta. Analysoi rivit.

Apachen lokitiedostot sijaitsevat "/var/log/apache2"-kansiossa, joista "access.log"-tiedosto pitää sisällään tiedon erilaisista Apachen saamista pyynnöistä.



Esimerkki onnistuneesta sivulatauksesta. Tarkat tiedot rivin sisällöstä löytyy Apachen sivuilta.

127.0.0.1 - - [11/Feb/2020:18:06:02 +0000] "GET /~xubuntu/ HTTP/1.1" 200 491 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"

Riviltä käy ilmi:
pyynnön lähettäjän IP-osoite,
"RFC 1413" -identiteetti (Apachen sivuilta käy ilmi, että tämä tieto oletusarvoisesti jätetään selvittämättä ja siksi se näkyy pelkkänä viivana),
pyynnön lähettäjän "userid" (koska testisivu ei ole salasanasuojattu, näkyy lokissa pelkkä viiva),
kellonaika ja aikavyöhyke,
pyynnön tyyppi (GET),
pyydetty asia (/~xubuntu/),
käytetty protokolla (HTTP/1.1),
palvelimen lähettämä status (200 eli onnistunut),
palvelimen palauttaman asian koko, miltä sivun kautta pyyntö lähetetty (näyttää viivaa, sillä ei tultu toiselta sivulta),
tietoja käyttäjästä: käytetty selain, käyttöjärjestelmä, selainmoottori (Gecko), selain versio.

Esimerkki epäonnistuneesta sivulatauksesta:

127.0.0.1 - - [11/Feb/2020:18:09:23 +0000] "GET /~kubuntu/ HTTP/1.1" 404 488 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"

Lokirivi sisältää samat asiat kuin onnistunut pyyntö, mutta koska pyydettyä asiaa ("/~kubuntu/") ei ole olemassa, palvelin palauttaa statuskoodin 404 (Not Found).

d) Tee virhe johonkin Apachen asetustiedostoon, etsi ja analysoi tuo rivi. Etsimiseen sopivat esimerkiksi Apachen omat lokit, syslog sekä ‘apache2ctl configtest’.

Apachen asetustiedostot löytyvät kansiosta "/etc/apache". Avataan "apache2.conf"-tiedosto komennolla "sudoedit apache2.conf" ja testimielessä pyritään aiheuttamaan virhe. Poistetaan ensimmäisen rivin kommenttimerkintä "#", jolloin ensimmäisen rivin tekstistä tulee osa ajettavia asetuksia. Tallennetaan muutokset ja yritetään käynnistää Apache uudelleen komennolla "sudo systemctl restart apache2".



"Job for apache2.service failed because the control process exited with error code" -virheilmoitus ei vielä hirveästi kerro tapahtumasta, joten katsotaan muualta. Komento "sudo apache2ctl configtest" paljastaa ongelman olevan juuri muokkaamamme "apache2.conf"-tiedoston ensimmäisellä rivillä.



Vaikka komento osasikin jo kertoa, että rivillä yksi "This" ei ole pätevä komento ja tiedämme, missä vika on, katsetaan vielä mitä eri lokit sanovat. Viimeisellä rivillä ehdotetaan katsomaan Apachen error-lokia, joten tehdään näin. "/var/log/apache2"-kansiosta löytyy "error.log"-tiedosto, josta löytyy yhden rivin verran tietoa:

[Tue Feb 11 19:00:26.924448 2020] [mpm_event:notice] [pid 6410:tid 139639274970048] AH00491: caught SIGTERM, shutting down

Apachen sivut kertovat, että ensimmäinen osa rivistä kertoo tapahtuma-ajan, toinen viestin tuottava moduuli (mpm_event) ja sen taso (notice), kolmas osa kertoo prosessin (process) ja langan (thread) ID:t ja viimeisenä tulee itse virheilmoitus, joka tässä tapauksessa kertoo, että Apache sai SIGTERM-signaalin ja sulkee itsensä. Ei hirveästi kerro asiasta. Seuraavaksi katsotaan, mitä "syslog" tietää asiasta.



Syslog kertoo saman asian kuin aiemmin tehty "configtest", mutta näyttää paljon tarkemmin vaiheet, joiden kautta Apache on sulkeutunut. Virhettä on pukannut niin sammuttaessa, että uudelleen käynnistäessä.

Näiden tietojen jälkeen voidaan käydä korjaamassa tekemämme testivirhe ja komennon "sudo systemctl restart apache2" jälkeen Apache toimii taas normaalisti.

i) Kuinka monta eri HTTP Status:ta (200, 404, 500…) saat aiheutettua lokeihin? Selitä, miten aiheutit tilanteet ja analysoi yksi rivi kustakin statuksesta.

HTTP-statuskoodit

127.0.0.1 - - [11/Feb/2020:18:05:27 +0000] "GET /~xubuntu/ HTTP/1.1" 200 489 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"

Onnistunut haku (200, OK), onnistuu hakemalla olemassaolevaa sivua, josta palautuu onnistuneesti tieto.

127.0.0.1 - - [11/Feb/2020:18:09:23 +0000] "GET /~kubuntu/ HTTP/1.1" 404 488 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"

Epäonnistunut haku (404, Not Found), onnistuu hakemalla sivua, jota ei ole olemassa. Tällöin takaisin tulee virhe 404.

127.0.0.1 - - [11/Feb/2020:18:05:27 +0000] "GET /~xubuntu HTTP/1.1" 301 572 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0" 127.0.0.1 - - [11/Feb/2020:18:05:27 +0000] "GET /~xubuntu/ HTTP/1.1" 200 489 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"

Uudelleenohjautunut haku (301, Moved Permanently), hakemalla osoitetta, joka on pysyvästi muutettu. Vastauksena tulee uusi osoite. Tässä tapauksessa "/~xubuntu"-haku palauttaa oikean osoitteen, "/~xubuntu/".

127.0.0.1 - - [11/Feb/2020:18:55:16 +0000] "GET /icons/ubuntu-logo.png HTTP/1.1" 304 180 "http://localhost/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"

Palautuva vastaus (304, Not Modified) kertoo, että haettu kohde ei ole muuttunut, joten käyttäjä voi jatkaa aiemmin ladattua versiota välimuistista. Kyseinen logo-kuva löytyi jo välimuistista, joten sitä ei tarvinnut ladata uudelleen.

m) Vaihda Apachen oletussivu. Eli laita palvelimen etusivulla (ilman tildeä) näkyvä sivu niin, että alkuperäinen on jonkun käyttäjän kotihakemistossa ja voit muokata sitä ilman pääkäyttäjän oikeuksia.

Muuttaaksemme Apachen oletussivua, navigoidaan kansioon "/etc/apache/sites-available", johon luodaan uusi ".conf"-tiedosto kotihakemistossa (/home/xubuntu/public_html) olevalle sivustollemme. Komennolla "sudoedit testisivu.abc.conf" (korvaa "testisivu.abc" haluamallasi osoitteella) luodaan seuraavanlainen tiedosto:



Tämän jälkeen luotu asetustiedosto pitää ottaa käyttöön komennolla "sudo a2ensite testisivu.abc.conf" ja samalla poistetaan oletussivu pois käytöstä komennolla "sudo a2dissite 000-default.conf". Muutosten voimaan astumiseksi Apache tulee käynnistää uudelleen komennolla "sudo systemctl restart apache2". Tämän myötä osoitteella localhost, pääsemme katselemaan kotihakemistossa sijaitsevaa sivustoa.

n) Laita kaksi nimeä samaan IP-osoitteeseen. Voit simuloida nimipalvelun toimintaa /etc/hosts -tiedoston avulla. Eli niin, että samalla palvelimella osoitteella teronlenkkisivu.com tulee eri sisältö kuin osoitteella opipentest.com.

Luodaan a-kohdan ohjeiden mukaisesti kotihakemistoon (/home/xubuntu) toinen kansio ja siihen sivun sisältävä HTML-tiedosto sekä luodaan sille m-kohdan tavoin ".conf"-tiedosto seuraavanlaisesti:



Komennolla "sudo a2ensite toinentestisivu.abc.conf" lisäämme toisen testisivumme käytettävien sivujen joukkoon. Selvitetään oma IP-osoitteemme komennolla "hostname -I" ja sen jälkeen avaamme komennolla "sudoedit /etc/hosts", jonka avulla voimme ohjata tiettyä hostnamea hakevan haluamaamme IP-osoitteeseen eli tässä tapauksessa omaamme.



Tämän jälkeen komennolla "sudo systemctl restart apache2" käynnistetään Apache uudelleen ja sen jälkeen testisivumme avautuvat omilla osoitteillaan.

Lähteet:
http://terokarvinen.com/2020/linux-palvelimet-2020-alkukevat-kurssi-ict4tn021-3010/
https://httpd.apache.org/docs/2.4/logs.html
https://developer.mozilla.org/en-US/docs/Mozilla/Gecko
https://en.wikipedia.org/wiki/Signal_(IPC)#SIGTERM
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status

Harjoitus 4

Takaisin ylös

a) Tee alusta lähtien oma julkinen palvelin Internetiin.

Teen virtuaalipalvelimen DigitalOceaniin, mutta saman kykenee tekemään monella muullakin vaihtoehdolla. Domainin hankin Namecheapin kautta.

Aloitetaan luomalla DigitalOceanissa uusi Droplet. Klikataan vihreää "Create"-nappulaa ja valikosta valitaan "Droplets"-vaihtoehto. DigitalOcean tarjoaa oletuksena "Ubuntu 18.04.03 (LTS) x64"-distron, joka minun oli tarkoitus ottaakin. "Choose a plan"-kohdassa valitaan "Standard"-valint, jota mainostetaankin "Starter"-vaihtoehtona. En tiedä riittävästi muiden vaihtoehtojen hyvistä tai huonoista puolista, joten mennään tällä. Seuraavaksi voi valita haluamansa hintaluokan. Jostain syystä halvimman, 5e/kk, paketin saa näkyville vasta painamalla "Show all plans"-nappia. Valitaan se. Datakeskuksen sijainniksi valitsen Saksan, sillä se sijaitsee EU-alueella Suomen tavoin. Alankomaat saattaisi olla myös hyvä vaihtoehto samasta syystä. "Authentication"-kohdassa valitsen "One-time password"-vaihtoehdon. Hostnamen kohdalla annan nimeksi "aliHarjoitus". Jätän myös ylimääräisten palveluiden, kuten varmuuskopioiden, väliin ja klikkaan vihreää "Create Droplet"-nappia.

Hetken odotuksen jälkeen Droplet on valmis käytettäväksi. Ennen sitä, otan Dropletin IP-osoitteen talteen ja suuntaan Namecheapin sivulle, jossa teen siihen ohjaavan alidomainin. Namecheapissa hallintatyökalun avulla valitaan "Domain List"-valikko, jossa halutun domainin kohdalta klikataan "Manage"-nappia. Tämä avaa kyseisen domainin hallintapaneelin, jossa suuntaamme "Advanced DNS"-välilehdelle. Klikataan "Add new record"-nappia ja valitaan tyypiksi "A Record", hostiksi kirjataan haluttu alidomain, omassa tapauksessani "alidomain", valueksi pistetään juuri luodun Dropletin IP-osoite. TTL-arvon annan olla "Automatic"-vaihtoehdolla, sillä se toimi hyvin aiemmalla kerralla.

Seuraavaksi kirjaudutaan SSH-yhteyden avulla luodulle Dropletilla. Käytän itse tässä harjoituksessa PuTTY-ohjelmaa Windowsilla, mutta saman kykenee tekemään Linuxilla ssh-paketin avulla (sudo apt-get install ssh). Ensimmäisellä kirjautumisella kirjaudutaan root-käyttäjällä, sillä muita käyttäjiä ei vielä ole. Kirjautuessa luodaan rootille uusi salasana. Tämän jälkeen luodaan uusi käyttäjä komennolla "sudo adduser [käyttäjänimi]", sille annetaan salasana, joka tässä tapauksessa voi olla sama kuin rootille annettu, sillä root tullaan kohta lukitsemaan pois käytöstä. Komennolla "sudo adduser [käyttäjänimi] sudo" lisätään uusi käyttäjä sudo-ryhmään, jotta se pystyy myöhemmin käyttämään sudo-komentoja.



Uuden käyttäjän ollessa valmis, kirjaudun rootilla ulos ja kirjaudun takaisin sisään juuri luodulla käyttäjällä. Koska äsken jäi palomuuri ottamatta käyttöön, teen sen nyt sallimalla ensiksi SSH-yhteyden komennolla "sudo ufw allow 22/tcp" ja vasta tämän aktivoimalla sen komennolla "sudo ufw enable". Tämän jälkeen jatketaan lukitsemalla root-käyttäjä komennolla "sudo usermod --lock root". Poistetaan root-kirjautuminen myös kokonaan muokkaamalla komennolla "sudoedit /etc/ssh/sshd_config" ja muuttamalla "PermitRootLogin"-kohdan "yes"-arvo "no"-arvoksi. Käynnistetään SSH uudelleen komennolla "sudo service ssh restart". Nyt jos kokeilee kirjautua root-käyttäjä, pääsy evätään vaikka salasana olisi oikein.

Jotta saataisiin internettiin jotain katseltavaa, asennetaan Apache (tarkemmat ohjeet harjoituksesta 3), tehdään kotihakemistoon "public_html"-kansio ja sen sisälle yksinkertainen testisivu. Komennolla "sudo a2enmod userdir" otetaan käyttöön kotihakemiston käyttö nettisivua varten. Sen jälkeen "/etc/apache2/sites-available"-kansiossa luodaan uusi ".conf"-tiedosto ja lisätään kotihakemiston "public_html"-kansio siihen (tarkempi tiedoston rakenne harjoitus 3:ssa). Komennolla "sudo a2ensite alidomain.jomhak.com.conf" ja "sudo a2dissite 000-default.conf" vaihdetaan oletussivu. "sudo systemctl restart apache2"-komennolla käynnistetään Apache uudelleen ja "sudo ufw enable 80/tcp"-komento mahdollistaa vielä sisääntulevan liikenteen nettisivulle. Lopputulos näyttää seuraavanlaiselta.

Lähteet:
http://terokarvinen.com/2020/linux-palvelimet-2020-alkukevat-kurssi-ict4tn021-3010/

Harjoitus 5

Takaisin ylös

a) Hello Flask! Tee Python Flask hei maailma kehitysympäristössä. Voit siis käyttää tuotantoon sopimatonta app.run(debug=True) ajoa.

Aloitetaan asentamalla Python Flask. Ajetaan tavanomaisesti ensin "sudo apt-get update" ja sen jälkeen "sudo apt-get install -y python3-flask". Luodaan tämän jälkeen käyttäjän kotihakemistoon tyhjä kansio testailua varten. Luodaan tähän kansioon "hello.py"-tiedosto, johon tehdään mallin mukainen ohjelma.

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
return "Sivulla näkyvää tekstiä"

app.run(debug=True)
Tämän jälkeen ajetaan ohjelma komennolla "python3 hello.py". Jos virheilmoituksia ei näy, selaimella mentäessä osoitteeseen "localhost:5000", testisivumme näyttää määritellyn merkkijonon asian. Näppäinyhdistelmällä "Control + C", ohjelma suljetaan.

b) Tuotanto-Flask. Tee tuotantotyyppinen asennus Flaskista käyttäen Apachen WSGI-moduulia. Kokeile, että pystyt muokkaamaan koodia ilman sudoa ja saat uuden version käyttöön käynnistämättä Apachea uudelleen. ('touch foo.wsgi').

Näitä ohjeita seuraten, aloitetaan Apachen asennuksella. "sudo apt-get install -y apache2" ja localhost-sivulle ilmestyy Apachen oletussivu. Muutetaan sivu näyttämään yksinkertainen merkkijono komennolla "echo "Onnistunut sivunlataus"|sudo tee /var/www/html/index.html". Nyt localhost-osoite näyttää määritellyn merkkijonon.

Jatketaan luomalla uusi käyttäjä, jota käytetään tässä tehtävässä tuotanto-flaskin yhteiseen hallinnointiin, komennolla "sudo adduser batmanwsgi". Adduser-komento luo samalla myös samannimisen ryhmän, johon kohta lisäämme itsemme. Ensiksi kuitenkin lukitaan vastaluotu käyttäjä komennolla "sudo usermod --lock batmanwsgi" ja sen jälkeen lisätään itsemme kyseiseen ryhmään komennolla "sudo adduser $(whoami) batmanwsgi". "$(whoami)"-kohta säästää vaivan muistaa oman käyttäjänimen. Uudelleenkirjautuminen koneelle aktivoi uuden ryhmän. "groups"-komennolla voidaan varmistua, että käyttäjä kuuluu haluttuun ryhmään.

Seuraavaksi voidaan luoda "name based virtual host" tulevalle sivulle. Komennolla "sudoedit /etc/apache2/sites-available/batmanwsgi.conf" luodaan uusi conf-tiedosto ja sen sisään kirjoitetaan seuraava.

<VirtualHost *:80>
ServerName batman.example.com

 WSGIDaemonProcess batmanwsgi user=batmanwsgi group=batmanwsgi threads=5
 WSGIScriptAlias / /home/batmanwsgi/public_wsgi/batman.wsgi

 <Directory /home/batmanwsgi/public_wsgi/>
  WSGIScriptReloading On
  WSGIProcessGroup batmanwsgi
  WSGIApplicationGroup %{GLOBAL}
  Require all granted
 </Directory>
</VirtualHost>
Jotta conf-tiedostossa moneen kertaan mainittu WSGI toimisi, tulee ladata itse Apache-moduulikin. Tämä tehdään komennolla "sudo apt-get install -y libapache2-mod-wsgi-py3". Käynnistetään vielä Apache uudelleen, jotta muutokset saadaan voimaan komennolla "sudo systemctl restart apache2". Tämän jälkeen komennon "apache2ctl configtest" tulisi sanoa "Syntax OK".

Seuraavaksi luodaan conf-tiedostossa mainittu tiedostopolku, jota ei vielä ole olemassa. "sudo mkdir /home/batmanwsgi/public_wsgi" luo kansion lukitun käyttäjän kotihakemistoon. Komento "sudo chown batmanwsgi:batmanwsgi /home/batmanwsgi/public_wsgi" antaa kaikille batmanwsgi-ryhmän jäsenille oikeudet kyseiseen kansioon, jotta sudoa ei tarvitse enää käyttää sen sisällä. Komento "sudo chmod g=rwxs /home/batmanwsgi/public_wsgi" taas antaa kaikille ryhmän jäsenille oikeudet muokata kansion sisältöä. Tämän lähteen mukaan rwxs-kohta kirjainkohtaisesti antaa luku- (r), kirjoitus- (w) ja suoritusoikeudet (x), sekä viimeinen s tarkoittaa, että kaikki uudet tiedostot saavat oletuksena saman ryhmän kuin hakemistolla on. Luodaan vielä myös itse "batman.wsgi"-tiedosto: "nano /home/batmanwsgi/public_wsgi/batman.wsgi".
import sys
assert sys.version_info.major >= 3, "Python version too old in batman.wsgi!"

sys.path.insert(0, '/home/batmanwsgi/public_wsgi/')
from hello import app as application
Sekä komennolla "nano /home/batmanwsgi/public_wsgi/hello.py", luodaan varsinainen ohjelma.
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
return "Onnistunut Flask-asennus"

# Removed the app.run line
Tämän jälkeen localhost-osoitteessa näkyy juuri tehty sivu.

c) Lisää tuotanto-Flaskiin muotit (templates).

Muokataan äsken luotua "hello.py"-tiedostoa näitä ohjeita mukaillen seuraavaan muotoon:

#!/usr/bin/python3
"Return HTML templated page"

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def hello():
return render_template("base.html", viesti="Hieno template")
Luodaan public_wsgi-kansioon templates-kansio ja sen sisälle edeltävässä koodissa mainittu "base.html"-tiedosto. Base.html:
<!DOCTYPE html>
<html>
<head>
<title>Template-otsikko</title>
<meta charset="UTF-8">
</head>
<body>
<p>Salainen viesti: {{ viesti }}</p>
</body>
</html>
Lopuksi komennolla "touch batman.wsgi" päivitämme selaimessa näkyvän osion ja uusi viesti näkyy:

d) Sun IP. Tee Flask-sivu, jolla näkyy tietoja käyttäjästä. Esimerkiksi request.user_agent.string, request.remote_addr. Muista "from flask import request".

Lisätään "hello.py"-tiedostoon uusi funktio:

#!/usr/bin/python3
"Return HTML templated page"

from flask import Flask, render_template, request

app = Flask(__name__)

@app.route("/")
def hello():
return render_template("base.html", viesti="Hieno template")

@app.route("/ipsivu")
def showIP():
ipAddress = request.remote_addr
return "IP-osoite: " + ipAddress
Komennolla "touch batman.wsgi" saadaan muutokset käyntiin ja osoitteessa "localhost/ipsivu" käyttäjä näkee oman IP-osoitteensa.

Lähteet:
http://terokarvinen.com/2020/linux-palvelimet-2020-alkukevat-kurssi-ict4tn021-3010/
http://terokarvinen.com/2020/hello-flask-python-web-app/
http://terokarvinen.com/2020/flask-templates/
http://terokarvinen.com/2020/deploy-python-flask-to-production/ https://www.linux.fi/wiki/Tiedoston_oikeudet

Harjoitus 6

Takaisin ylös

a) Tietokanta wepissä. Tee oma yksinkertainen, tietokantaa käyttävä ohjelma. Ohjelmalla tulee olla jokin käyttötarkoitus

Toteutetaan Python Flaskilla tietokantasovellus, jota voidaan käyttää selaimen avulla.

Aloitetaan asentamalla Python komennot "sudo apt-get update" ja "sudo apt-get install -y python3-flask". Luodaan kotihakemistoon uusi kansio projektille ja sen sisälle luodaan tätä valmista pohjaa mukaillen oma tietokantaa käyttävä ohjelma.

autoformed.py:

#!/usr/bin/python3
"RSVP autoform"
# Copyright 2020 Tero Karvinen http://TeroKarvinen.com

from flask import Flask, render_template, flash, redirect
from flask_sqlalchemy import SQLAlchemy
from wtforms.ext.sqlalchemy.orm import model_form
from flask_wtf import FlaskForm
import wtforms

app = Flask(__name__)
db = SQLAlchemy(app)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///autoformed.db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SECRET_KEY"] = "dUCF)mtd9MAoZ?;R|8*iB^.+TCV//0"

class Reply(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=True)
desc = db.Column(db.String, nullable=True)

ReplyForm = model_form(model=Reply, base_class=FlaskForm, db_session=db.session)

@app.before_first_request
def beforeFirstRequest():
db.create_all()

@app.route("/", methods=["GET", "POST"])
def index():
form = ReplyForm()

if form.validate_on_submit():
reply = Reply()
form.populate_obj(reply)
db.session.add(reply)
db.session.commit()
flash("Your note has been added. Welcome!")
return redirect("/")
replies = db.session.query(Reply)
return render_template("replies.html", form=form, replies=replies)

def main():
app.run(debug=True)

if __name__ == "__main__":
main()


base.html:
<!doctype html>
<html lang=en>
<head>
<title>Write notes</title>
<meta charset="utf-8">
<style>
table, td, th {
border: 1px solid black;
}
table {
border-collapse: collapse;
}
td, th {
padding: 5px;
}
</style>
</head>
<body>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class=flashes>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}

{% block body %}

{% endblock %}

</body>

</html>


replies.html:
{% extends "base.html" %}
{% block body %}
<h1>Notes</h1>
<form method=post action="/">
{{ form.csrf_token }}
{% for field in form if not field.name in ["csrf_token"] %}
<p>{{ field.label }}: {{ field }} <b>{{ " ".join(field.errors) }}</b></p>
{% endfor %}
<input type="submit">
</form>

<h2>Note</h2>
<table>
<tr>
<th>Name</th>
<th>Note</th>
</tr>

{% for reply in replies %}

<tr>
<td>{{ reply.name }}</td>
<td>{{ reply.desc }}</td>
</tr>
{% endfor %}

</table>

{% endblock %}
Jos nyt yrittää ajaa ohjelmaa komennolla "python3 autoformed.py", virheilmoitus valittaa SQLAlchemyn puuttumisesta. Se voidaan ladata komennolla "sudo apt-get install -y python3-flask-sqlalchemy". Tämän jälkeen ohjelmaa ajettaessa virheilmoitus valittaa wtformsin puuttumisesta. Se puolestaan ladataan komennolla "sudo apt-get install -y python3-flaskext.wtf". Tämän jälkeen sovellus lähtee käyntiin ja lopputulosta voi ihailla osoitteessa "localhost:5000".

b) Laita tietokantaohjelmasi toimimaan mod_wsgi:n kanssa.

Seurataan seuraavia ohjeita.
Tarkemmat ohjeet edellisestä tehtävästä alkuunpääsemiseksi.
Tämä tehtävä edellyttää, että on tehty samat asiat kuin 5. harjoituksen b-kohdassa. Oletetaan siis, että projektia varten on luotu uusi käyttäjäryhmä, jolla on oikeudet muokata projektin tiedostoja projektikäyttäjän kotihakemistossa ilman sudo-oikeuksia. Myös Apache ja mod-wsgi on asennettu oikein. Jos et ole tai et osaa tehdä edellämainittuja asioita, katso tehtävää 5b.

Kopioidaan a-kohdassa tehty sovellus tuotantokäytössä käytettävään public_wsgi-kansioon. Navigoidaan kansioon ja käyttämällä komentoa "cp -r * /home/batmanwsgi/public_wsgi" kopioidaan kyseisestä kansiosta kaikki kohdekansioon. Public_wsgi-kansiossa muokataan batman.wsgi-tiedostoa ja importoidaan "hello"-tiedoston sijasta "autoformed", joka viittaa tehtyyn autoformed.py-tiedostoon. Lisäksi autoformed.py-tiedostossa poistetaan tai muutetaan kommentiksi "def main(): app.run(debug=True)", sillä tuotantoversiossa ei debug-tilalle ole käyttöä. Komennolla "touch batman.wsgi" päivitetään selaimessa näkyvä ja tämän jälkeen selaimessa näyttää seuraavalta.

Lähteet:
http://terokarvinen.com/2020/flask-automatic-forms/
http://terokarvinen.com/2020/deploy-python-flask-to-production/

Harjoitus 7

Takaisin ylös

a) Ratkaise valitsemasi vanha arvioitava laboratorioharjoitus tältä kurssilta.

Valitsin 2018 keväällä järjestetyn labraharjoituksen. Ohjeet ovat seuraavanlaiset:

## LAMP
Asenna LAMP (Linux, Apache, MySQL, PHP) ja testaa sen toiminta.
## Kuormitusta
Kerää kuormitustietoja koneelta koko harjoituksen ajalta. Analysoi tiedot tiiviisti aivan harjoituksen lopuksi.
## Sorkka ja Rauta Oy:n CRM
Tarvitsemme asiakastietokannan. Tee tietokanta, jossa on seuraavat asiakkaat:
- Kulta ja Kaivos ky
- Piilosana ry
- MetalliMake
Tee PHP-ohjelma, joka lukee nämä tietueet. Laita tämä sivu näkyviin osoitteessa http://sorkkacrm.example.com
Voit simuloida nimipalvelun toimintaa hosts-tiedoston avulla. Tässä harjoituksessa sivulle pääsyä ei tarvitse rajoittaa salasanalla, vaan sen tule näkyä kaikkialle nettiin.
## Rosvoja porteilla
Onko koneellemme yritetty murtautua? (Kyllä). Etsi omalta paikalliselta koneeltasi todisteet tapauksesta, jossa koneellesi on yritetty murtatua. Analysoi tiiviisti tähän liittyvät tiedot.
## Sorkan sivut
Tee staattinen HTML5 weppisivu, jonka otsikkona (molemmat title ja h1) on "Sorkka ja Rauta Oy".
Laita sivu näkyviin osoitteeseen http://rauta.example.com/ . Voit simuloida nimipalvelun toimintaa hosts-tiedoston avulla.
## Einarin esimerkki
Einari Vähä-aho ryhtyy koodaamaan. Tee einarille käyttäjä 'einari'.
Tee einarille esimerkkikotisivu PHP:lla ja laita se näkymään osoitteessa http://localhost/~einari/.
Esimerkkisivun pitää tulostaa "Einari" käyttäen PHP:n print-funktiota.
[Ohje päivittyi harjoituksen edetessä]


Aloitetaan päivittämällä käyttöjärjestelmä komennoilla "sudo apt-get update" ja "sudo apt-get upgrade". Otetaan myös palomuuri käyttöön heti alussa, mutta lisätään siihen ensin kaksi reikää HTTP- ja SSH-liikennettä varten komennoilla: "sudo ufw allow 80/tcp", "sudo ufw allow 22/tcp", "sudo ufw enable".

Kerää kuormitustietoja koneelta koko harjoituksen ajalta.

Käytän tähän tarkoitukseen oppitunnilla mainittua Muninia. Komento "sudo apt-get install -y munin" asentaa sen ja se kerää tietoja järjestelmän kuormituksesta hakemistoon "/var/cache/munin/www". Tästä kansiosta esimerkiksi "system-day.html" näyttää kuormitustietoja meneillään olevalta päivältä.

Asenna LAMP (Linux, Apache, MySQL, PHP) ja testaa sen toiminta.

Linux on jo käytettävissä livetikulta, joten jatketaan Apachella. "sudo apt-get install -y apache2"-komento ja localhost-osoitteessa komeilee Apachen oletussivu. Korvataan tämä oletussivu vapaavalintaisella, mutta asiallisella sisällöllä: "echo 'Tekstisivu'|sudo tee /var/www/html/index.html".

Seuraan tulevissa vaiheissa OSTechNixin julkaisemaa ohjetta LAMPin asennukseen, jossa MySQL:n sijaan käytetään MariaDB:tä.
Jatketaan tietokannan asennuksella. Asennetaan MariaDB komennolla "sudo apt-get install -y mariadb-server mariadb-client". Sen jälkeen testataan sen toiminta komennolla "sudo systemctl status mysql". Komennon tuottaa seuraavanlaisen näkymän. Ei virheilmoituksia eli homma luultavimmin toimii.



Äsken mainittu ohje, jota seuraan, ohjeistaa tekemään seuraavaa ennen "mysql_secure_installation"-komentoa virheilmoitusten välttämiseksi: "sudo mysql -u root", "use mysql;", "update user set plugin='' where User='root';", "flush privileges;", "\q". Tämän jälkeen voidaan ajaa "mysql_secure_installation"-komento. Seuraan ohjeita ja painan enteriä jokaiseen asennuksessa tulevaan kysymykseen. MariaDB on nyt asennettu.

Seuraavaksi asennetaan PHP, PHP-mod Apachea varten sekä tietokantakyselyitä varten "php-mysql"-paketti komennolla "sudo apt-get install -y php libapache2-mod-php php-mysql". Testataan. Luodaan kotihakemistoon "phptesti"-kansio, johon luodaan seuraavanlainen "index.php"-tiedosto:



Tämän jälkeen kansiossa "/etc/apache/sites-available" luodaan sudoeditillä "phptesti.example.com.conf"-tiedosto, joka puolestaan näyttää tältä:



Ajetaan "sudo a2ensite h7_phptesti.example.com.conf", "sudo a2dissite 000-default.conf" ja käynnistetään Apache uudelleen komennolla "sudo systemctl restart apache2". Tämän jälkeen localhost-osoitteessa näkyvällä sivulla voi ihailla testisivua.

Tarvitsemme asiakastietokannan. Tee tietokanta, jossa on seuraavat asiakkaat:
- Kulta ja Kaivos ky
- Piilosana ry
- MetalliMake
Tee PHP-ohjelma, joka lukee nämä tietueet. Laita tämä sivu näkyviin osoitteessa
http://sorkkacrm.example.com
Voit simuloida nimipalvelun toimintaa hosts-tiedoston avulla.


Seuraan tässä vaiheessa Tero Karvisen ohjeita tietokantaa käyttävän PHP-sivun tekoon.
Kirjaudutaan MariaDB-tietokantaa komennolla "mysql -u root -p" ja annetaan salasana. Luodaan uusi tietokanta ja käyttäjä komennoilla "CREATE DATABASE asiakas;" ja asettamalla asiakas-käyttäjälle oikeudet tähän tietokantaan "GRANT ALL ON asiakas.* TO asiakas@localhost IDENTIFIED BY 'tähän salasana';". Kirjaudutaan ulos "exit"-komennolla ja kirjaudutaan nyt asiakas-käyttäjällä sisään: "mysql -u asiakas -p". "USE asiakas"-komennolla valitaan haluttu tietokanta. Luodaan yksinkertainen taulu komennolla "CREATE TABLE asiakkaat (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(300));". Lisätään halutut asiakkaat tauluun komennolla "INSERT INTO asiakkaat(name) VALUES ('Kulta ja Kaivo ky');", "INSERT INTO asiakkaat(name) VALUES ('Piilasana ry');", "INSERT INTO asiakkaat(name) VALUES ('MetalliMake');". Komennolla "SELECT * FROM asiakkaat" voidaan tarkistaa, että taulusta löytyy kaikki halutut asiakasnimet.

Luodaan Apachen "sites-available"-kansioon uusi conf-tiedosto sivua varten. Sudoeditillä luodaan seuraavanlainen "sorkkacrm.example.com.conf"-tiedosto:



Luodaan conf-tiedostossa mainittu sorkkacrm-kansio kotihakemistoon ja luodaan sen sisälle "index.php"-tiedosto, joka näyttää seuraavanlaiselta ja on suoraan kopioitu yllä mainitusta ohjeesta.



Käynnistetään Apache uudelleen "sudo systemctl restart apache2". Lisätään myös "/etc/hosts"-tiedostoon "127.0.0.1 sorkkacrm.example.com"-rivi, jotta haluttu osoite tulee toimimaan. Näiden toimenpiteiden jälkeen lopputuloksen tulisi näyttää seuraavalta:

Onko koneellemme yritetty murtautua?

"/var/log/apache2/access.log" kertoo, että kaikki tapahtuneet yhteydenotot ovat tapahtuneet osoitteesta 127.0.0.1 eli localhost eli omalta koneeltani. Mutta sillä sekunnilla, kun koneen paljastaisi vapaalle verkolle, alkaisi yhteydenottoja ja murtoyrityksiä ilmestymään ties miltä puolelta maailmaa.

Tee staattinen HTML5 weppisivu, jonka otsikkona (molemmat title ja h1) on "Sorkka ja Rauta Oy".
Laita sivu näkyviin osoitteeseen http://rauta.example.com/. Voit simuloida nimipalvelun toimintaa hosts-tiedoston avulla.


Luodaan kotihakemistoon uusi kansio, sen sisään "index.html"-tiedosto, johon sisällöksi:



Luodaan "/etc/apache2/sites-available"-kansioon "rauta.example.com.conf"-tiedosto:



Komento "sudo a2ensite rauta.example.com.conf" lisää sen. Ja "sudo systemctl restart apache2" käynnistää Apachen uudelleen. "/etc/hosts"-tiedostoon lisätään "rauta.example.com":



Ja lopullinen sivu näyttää seuraavalta:

Einari Vähä-aho ryhtyy koodaamaan. Tee einarille käyttäjä 'einari'.
Tee einarille esimerkkikotisivu PHP:lla ja laita se näkymään osoitteessa http://localhost/~einari/.
Esimerkkisivun pitää tulostaa "Einari" käyttäen PHP:n print-funktiota.


Aloitetaan "sudoedit /etc/apache2/mods-available/php7.2.conf"-komennolla ja kommentoidaan tiedostosta "IfModule"-tagi, jotta PHP toimii userdir-modin kanssa. "sudo a2enmod userdir" ottaa kyseisen userdir-modin käyttöön jotta "~"-liite saadaan osoitteeseen. Ja käynnistetään Apache uudelleen "sudo systemctl restart apache2".

Luodaan uusi käyttäjä Einarille "sudo adduser einari". Luodaan einari-käyttäjän kotihakemistoon "public_html"-kansio "sudo mkdir /home/einari/public_html" ja luodaan "index.php"-tiedosto sen sisään "sudo nano /home/einari/public_html". "Index.php" näyttää seuraavalta:



Jotta Einarikin voisi näitä tiedostoja muokata, käytetään komentoa "sudo chown einari:einari -R /home/einari/public_html" ja nyt Einari tai einari-ryhmään kuuluvat voivat kansion sisältöä muokata. Lopputulos osoitteessa "localhost/~einari" näyttää seuraavalta:

Munin

Harjoituksen lopuksi katselin, minkälaista tietoa Munin oli onnistunut tallentamaan.
"system-day.html" näytti seuraavalta:





Ensikertaa tällaisia tuijottelevana näistä ei kyllä hirveästi saa irti, mutta vaikuttaisi siltä, että ainakaan mitään kovin erikoista ei ole päässyt tapahtumaan. Suurimpana syynä tietysti, että olen itse ollut palvelimen ainoa käyttäjä eikä kerätty data siksi kerro hirveästi mitään varsinaisesti kuormituksesta. Parempaa dataa varmasti saisi, jos pistäisi Muninin käymään julkisella palvelimella, jolle lähetetään pyyntöjä jatkuvammalla tahdilla.

Lähteet:
http://terokarvinen.com/2020/linux-palvelimet-2020-alkukevat-kurssi-ict4tn021-3010/
http://terokarvinen.com/2018/arvioitava-laboratorioharjoitus-linux-palvelimet-ict4tn021-6-torstai-alkukevat-2018-5-op
https://www.ostechnix.com/install-apache-mariadb-php-lamp-stack-ubuntu-16-04/
http://munin-monitoring.org/

Harjoitus 8

Takaisin ylös

a) Kuormitusta yli ajan. Tietysti palvelin hidastelee juuri silloin, kun olet nukkumassa. Seuraisipa joku kuormitusta tuolloin. Asenna heti aluksi jokin ohjelma seuraamaan kuormitusta, jotta voit tarkastella sitä koko tehtävän ajalta. Sopivia ohjelmia ovat esimerkiksi 'munin' ja sysstat ('sar').

Jotta palvelimen kuormitusta voidaan mitata, tarvitaan ensin palvelin. Niinpä ajetaan komennot "sudo apt-get update" ja "sudo apt-get install -y apache2" ja asennetaan palvelin. "localhost"-osoite palauttaa Apachen oletussivun, joten asennus on onnistunut. Koska tehdään töitä webpalvelimen kanssa, otetaan käyttöön palomuuri ja tehdään siihen reikä HTTP-liikennettä varten komennoilla "sudo ufw allow 80/tcp" ja "sudo ufw enable".

Valitsin kuormituksen seuraamiseen tehtävänannon suosituksen ja edellisen harjoituksen tuoman pienen kokemuksen takia Muninin. Komento "sudo apt-get install -y munin" asentaa Muninin ja muutaman minuutin odotuksen jälkeen voi selaimen osoitekenttään kirjoittamalla "file:///var/cache/munin/www/system-day.html" katsella kuormitustietoja tämän hetkiseltä päivältä.

b) Kuormita järjestelmän eri osa-alueita. Esim. 'stress'. Etsi prosessi toisesta ikkunasta 'top' tai 'htop', järjestystä voi vaihtaa "P" ja "M".

Käytin stressin käytössä seuraava ohjetta sekä "man stress"-komentoa apunani.

"top"-komento näyttää alkutilanteessa seuraavalta:



Asennetaan stress komennolla "sudo apt-get install -y stress" sekä edellä mainittua ohjetta ja man-sivua seuraten käytin komentoa "stress --cpu 4 --vm 3 --timeout 15s". Komennossa "--cpu" viittaa kuormitettavien prosessoriytimien määrään, "--vm" viittaa RAM-kuormitukseen ja numero kertoo kuormitusprosessien määrän, "--timeout" sulkee kuormituksen määritellyn ajan jälkeen, jonka lisäsin varmistamaan kuormituksen loppumisen. Ensimmäinen yritys jäädytti koneen kokonaan sillä hetkellä, kun yritin ottaa ruutukaappausta tuloksista ja lopputuloksena päätin aloittaa alusta. Uudella yrittämällä muutin varmuuden vuoksi komennon "--cpu"-kohdan arvon neljästä kahteen ja tulos näytti seuraavalta:

Kokeile käytännössä, selitä ja analysoi. Muista selittää, mitä komennolla halutaan selvittää ja tulkitse kokeilusi tulokset. Aiheuta tarvittaessa kuormaa tai muuta työkalulla näkyvää tulkittavaa.
c) iotop; iotop -oa

Käytin iotopin käytössä seuraavaa ohjetta sekä komennon man-sivua.

Iotop listaa, kuinka paljon eri prosessit kirjoittavat tai lukevat tieoa. Asensin iotopin komennolla "sudo apt-get install -y iotop". Tämän jälkeen ajoin ohjelman komennolla "iotop", mutta ohjelma ilmoitti sen vaativan sudon käyttöä. "sudo iotop" puolestaan toimi ja aukaisi seuraavan näkymän:



"sudo iotop -oa"-komento käyttää "o" ja "a" parametrejä. "o" tarkoittaa "only" ja se näyttää vain parhaillaan kirjoitus- ja lukutehtäviä tekevät prosessit. "a" eli "accumulated" näyttää normaalin iotop-näkymän prosenttimäärien sijaan määrällisesti, kuinka paljon kirjoitus- ja lukutehtäviä prosessit ovat tehneet.

d) dstat

Käytin dstatin käytössä seuraavaa ohjetta.

"sudo apt-get install -y dstat" asentaa dstatin. Tällä ohjelmalla voi ajantasaisesti seurata koneen prosessorin (total-cpu-usage), kovalevyn (dsk/total), verkon (net/total), sivutuksen (paging) ja järjestelmän(system) kuormituksen tasoa. Seuraavassa kuvassa näkyy dstatin tulokset. Ensimmäisen puolikkaan aikana hyppelin selaimessa tiuhaan tahtiin sivulta toiselle, mikä näkyy merkittävästi prosessorin, verkon ja järjestelmän kuormituksessa. Jälkimmäisellä puoliskolla en tehnyt koneella mitään, jolloin kuormitus on huomattavasti pienempää.

e) ss --listening --tcp --numeric; ss --listening --tcp; ss --tcp; ss --listening --udp; ss --listening --udp;

Käytin ss-komennon man-sivua lähteenä.

Komentoketju listaa kuunneltavat tcp-portit numeroittain, tcp-portit nimillä, tcp-portit, kuunneltavat udp-portit (kahteen kertaan(?)). Tulostus seuraavanlainen:

f) grep -i error /var/log/syslog; grep -ir error /var/log/

Ensimmäinen grep-komento listaa syslogista kaikki rivit, joissa mainitaan "error"-sana ("-i" takia isoilla tai pienillä kirjaimilla ei ole väliä). Toinen komento listaa kaikki "/var/log"-hakemiston alla sijaitsevissa tiedostoissa mainitut errorit ("i" ei välitä pienistä tai suurista kirjaimista ja "r" tekee komennon kaikilla "/var/log"-hakemiston alaisille tiedostoille).



Suuri osa virheilmoituksista on syntynyt muninin toimesta, mutta koska olen todennut muninin toimivan, en usko näiden virheiden olevan katastrofaalisia. Alempana näkyvät errorit johtunevat kenties vanhojen conf-tiedostojen tuottamista ongelmista.

g) Load average näkyy esim 'uptime', 'top', 'htop'. Prosessoriydinten määrä näkyy 'nproc'. Miten load average tulkitaan? Miksi prosessoriydinten määrä on tässä kiinnostava? Vapaaehtoisena bonuksena voit miettiä, mitä hyötyä on kuormituslukemasta, joka voi mennä yli yhden eli yli 100%.

Käytin uptime-komennon man-sivua lähteenä.

Uptime-komento listaa senhetkisen ajan, koneen käynnissäolon ajan, kirjautuneiden käyttäjien määrän ja keskimääräisen kuormituksen 1, 5 ja 15 minuutin ajalta. Keskimäärä ei ota huomioon prosessoriydinten määrää vaan kuormituksen määrä tulee laskea kaavalla: keskimäärä/prosessoriytimet. Tässä tapauksessa alla olevan kuvan mukaisesti oma 1 minuutin keskimääräinen prosessorinkäyttö olisi stressin käytön jälkeen 2.15/6, joka tuottaisi vastaukseksi noin 36% käytön. Huolestua kannattaisi vasta, kun keskimäärän arvo alkaisi lähestyä prosessoriytimien määrää. Tästä tiedosta voisi olla hyötyä, jos esimerkiksi selvitettäisiin tyhjänä käyvän prosessorikapasiteetin määrää.

h) Analysoi lopuksi koko ajalta keräämäsi kuormitustiedot. Löydätkö esimerkiksi aiheuttamasi kuormituspiikin?





Kuvaajasta näkyy selkeitä piikkejä, joista suurimpana näkyy kohdassa g) tekemäni kuormitustesti. Aiemmankin tehtävän aiheuttama piikki olisi näkynyt suurempana, jos olisin silloin käyttänyt useamman prosessoriytimen kuormitusta. Kuvaaja selkeästi osoittaa, että käytettävissä olisi vielä suuri määrä prosessorikapasitettiä.



Vapaaan tilan tasainen väheneminen johtuu harjoituksen aikana tehdyistä komennoista ja asennuksista. Koska livetikku käyttää RAM-muistia elinympäristönään, sen hidas täyttyminen on luonnollista. Jos harjoituksen tekisi oikealla asennuksella, käyrä ei varmastikaan olisi samaan tapaan jatkuvasti ylöspäin suuntaava, koska kaikkea ei tarvitsisi tallettaa RAM-muistiin.

Lähteet:
http://terokarvinen.com/2020/linux-palvelimet-2020-alkukevat-kurssi-ict4tn021-3010/
https://www.hecticgeek.com/2012/11/stress-test-your-ubuntu-computer-with-stress/
https://www.tecmint.com/iotop-monitor-linux-disk-io-activity-per-process/
https://www.tecmint.com/dstat-monitor-linux-server-performance-process-memory-network/
https://askubuntu.com/questions/1058750/new-alert-keeps-showing-up-server-returned-error-nxdomain-mitigating-potential