2. Package-File-Service

Palvelimien, ohjelmien ja tiedostojen hallintaa saltilla. Tämä raportti on osa Tero Karvisen k2020 palvelinten hallinta-kurssia. Raportti on kirjoitettu uudelleen selkeämmäksi ja parannetuilla esimerkeillä 11.5.2020.

a) Demonin asennus ja asetukset

Tehtävänä automatisoida Apache2-palvelimen asennus ja asetukset saltilla

Loin uuden kansion sudo mkdir /srv/salt/apache/

Kansioon loin tiedoston sudoedit init.sls

Lisäsin tiedostoon asetukset Tero Karvisen ohjeiden mukaan

Loin samaan kansioon lähdetiedoston, johon luotu sls-tiedosto viittaa sudoedit default-index.html. Muutin Apachen oletussivua kirjoittamalla tiedostoon Hello Apache! This is salt.

Ajoin tilan sudo salt '*' state.apply apache

Katsoin tuloksen selaimella localhostista

b) Uusi ohjelma ja find-komento

Kokeilin asentuuko Spotify saltilla. Asensin ensin käsin Spotifyn ohjeilla.

Seuraavaksi kokeilin saltia. Loin uuden kansion sekä sls-tiedoston mkdir /srv/salt/spotify ja sudoedit /srv/salt/spotify/init-sls

Ajoin tilan sudo salt '*' state.apply spotify

Asennus onnistui ja ohjelma toimii. Katsotaan vielä muutoksia find-komennolla find /etc/ -printf '%T+ %p\n'|sort

Find-komento raportoi tarkan ajankohdan jokaiselle muutokselle. Huomasin ettei Spotifylla ole omaa asennuskansiota /etc/-hakemistossa. whereis spotify kertoo missä tiedostoja sijaitsee.

c) Tilan ajo paikallisesti

Ajoin vielä apache-tilan paikallisesti sudo salt-call --local state.apply apache --state-output terse ja katsoin tulostetta

Komento tulosti yhteenvedon kohteista (esim. apache2), funktioista (esim.pkg.installed) sekä tuloksista (esim. Clean started) ja myös ajasta (Duration). Kaikki 4 moduulia ajettiin paikallisesti onnistuneesti ilman muutoksia.


Lähteet:

http://terokarvinen.com/2020/configuration-managment-systems-palvelinten-hallinta-ict4tn022-spring-2020/

http://terokarvinen.com/2018/apache-user-homepages-automatically-salt-package-file-service-example

http://terokarvinen.com/2018/pkg-file-service-control-daemons-with-salt-change-ssh-server-port

https://docs.saltstack.com/en/master/topics/tutorials/starting_states.html

https://www.spotify.com/fi/download/linux/

Advertisement

2. HackTheBox

a) OpenVPN-yhteyden avaus ja yhteydenotto kohdeverkkoon

Ensiksi avasin OpenVPN-yhteyden lataamalla ja ajamalla .ovpn-tiedoston HackTheBoxin sivuilta (vaatii kirjautumisen). Tarkistin, että kohdeverkko on yksityinen ja vastaa yhteydenottoihin.

b) Kohdeverkon skannaus ja tarkastelu

Tein yksinkertaisen porttiskannauksen nmap-komennolla kohdeverkkoon 10.10.10.167.

Komento tulosti avonaiset portit sekä verkkoprotokollat ja versiot. Kaikki portit käyttävät tcp-yhteyttä. Portin 80 http-protokolla siirtää tietoa www-palvelimien ja selainten välillä. Portit 135, 49666 ja 49667 käyttävät msrpc-protokollaa (Microsoft Remote Procedure Call), joka antaa eri koneiden ohjelmien pyytää palvelua toisiltaan tietämättä toistensa verkkoja. Portti 3306 käyttää mysql-protokollaa, jota käytetään MySQL clientin sekä MySQL serverin välillä.


Lähteet:

http://terokarvinen.com/2020/tunkeutumistestaus-kurssi-pentest-course-ict4tn027-3003/

https://www.extrahop.com/resources/protocols/msrpc/

https://dev.mysql.com/doc/dev/mysql-server/8.0.11/PAGE_PROTOCOL.html

1. Hei maailma, verkon yli ja idempotenssi

Tero Karvisen Palvelinten hallinta-kurssi keväällä 2020 alkoi salt stack master ja salt slave-tekniikalla.

Käyttöympäristönä Ubuntu 18.04 ajettuna VirtualBoxilla.

Asensin salt masterin sekä katsoin IP-osoitteen. Tämän jälkeen asensin minionin.

sudo apt-get -y install salt-master
hostname -I
sudo apt-get -y install salt-minion

Säädin minionin asetukset tottelemaan oikeaa herraa (oma ip-osoite)

sudoedit /etc/salt/minion

Tämän jälkeen slave uudelleenkäynnistetään

sudo systemctl restart salt-minion.service
Hyväksytään minion
Minion kuuntelee ja ajaa komentoja

sudo mkdir -p /srv/salt/
sudoedit /srv/salt/hello.sls

sudoedit /srv/salt/heimaailma.txt

Loin sls. sekä txt.-pohjaiset tiedostot käyttäen Tero Karvisen tiedostoja pohjana. Seuraavaksi tiedosto ajetaan:

Minion ajoi tiedoston onnistuneesti!

Loin top.sls tiedoston ja käynnistin. Nyt salt kontrolloi minioneita itsenäisesti. sudo salt '*' grains.items

Sain tietoja virtuaalikoneesta kuten IP-osoitteen, muistin ja prosessoreiden määrän sekä käyttöjärjestelmän.

Viimeisenä koitin toista funktiota saltilla. Testasin Vim-ohjelman lataamista pkg.install-funktiolla.


Lähteet: http://terokarvinen.com/2020/configuration-managment-systems-palvelinten-hallinta-ict4tn022-spring-2020/

http://terokarvinen.com/2018/salt-quickstart-salt-stack-master-and-slave-on-ubuntu-linux

http://terokarvinen.com/2018/salt-states-i-want-my-computers-like-this

1. WebGoat

Tero Karvisen kevään 2020 tunkeutumistestauskurssi alkoi WebGoat-harjoituksilla. Itsenäisen työskentelyn tehtävänanto:

Ratkaise WebGoatista 5-10 tehtävää lisää. (Hyppää yli niistä, jotka eivät toimi tässä versiossa, esim “Developer version only” tai tuki haavoittuvuus muokkaamalla WebGoatin sorsia).

Onnistuneen WebGoat-asennuksen ja kirjautumisen jälkeinen näkymä

Stage 1: Bypass Business Layer Access Control

Käytin Inspect element-toimintoa ViewProfile-painikkeessa ja muutin value=ViewProfile -> DeleteProfile. Painoin painiketta ja tehtävä oli suoritettu.

Stage 3: Breaking Data Layer Access Control.

Tutkin Inspect-toiminnolla tunnuslistaa ja employee id-arvoja. Tarvitsin managerin oikeudet joten poimin employee-id-listasta arvon 107, joka kuului David Giambille.

Kirjauduin käyttäjälle Tom Cat salasanalla tom. Muutin Tomin employee id:n arvoksi 107, joka antoi manageri-statuksen. Painoin ViewProfile ja tehtävä suoritettu.

LAB: Client Side Filtering

Tavoitteena selvittää toimitusjohtajan piilotettu palkka. Tutkin koodia ja löysin ilmeisen taulun “hiddenEmployeeRecords”, josta löytyi “piilotettuja” id-arvoja. Yksi näistä kuului itse toimitusjohtajalle, jonka palkka-luku näkyy kuvassa. Tehtävään kuului myös toinen vaihe, johon tarvitsee Firebug-ohjelmaa. Jätin toiseen vaiheen toistaiseksi tekemättä.

DOM Injection

Tehtävänä ohittaa Activate-painike, joka estää pääsyn. Poistin koodista disabled=””-rivin ja painoin Activate. Tehtävä suoritettu.

XML Injection

Lisää palkintolistaasi loput palkinnot saataviksi.

Muokkasin taulun koodia, jossa listattiin saadut palkinnot. Kopioin ja monistin palkintojen koodirivit ja lisäsin loput palkinnot listan jatkoksi. Painoin submit ja tehtävä suoritettu.

JSON Injection

Muokkaa kalliimmasta $600 lennosta halvempi.

Etsin priceID:n koodista ja muutin arvoksi 300. Submit ja tehtävä suoritettu.

Kuuntele jokin murto Darknet Diaries -podcastista. Analysoi tätä murtoa Cyber Kill Chain (Hutchins et al 2011) ja Mitre ATT&CK -mallien avulla. Kirjoita siten, että analyysisi auttaa käytännön hyökkäyksissä.

Kuuntelin Darknet Podcastin EP 55: NoirNet.

Jakso kertoo tunkeutumistestaajasta, joka palkataan murtotestauskeikalle joulupyhien aikaan, kun tietoturvatasot ovat oletettavasti suhteellisen alhaalla. Tämän opetus tietoturvahenkilöille on, että turvatasoa täytyy pitää tasaisesti yllä riippumatta ajasta, paikasta tai sesongista. Hakkerit ja murtautujat voivat tarkoituksellisesti ajoittaa hyökkäyksensä, kun töissä on oletettavasti vähemmän ihmisiä.

Murtotestaaja kertoo klassisiksi menetelmiksi tunnuslätkien väärentämisen. Ihmiset kantavat tunnuksiaan epäsäännöllisesti ja epämääräisesti ja jos hymyilee nätisti, ihmiset saattavat avata ovia jokatapauksessa. Usein murto tapahtuu arkisissa tilanteissa jokapäiväisessä ympäristössä. Valtuudet tulisi aina tarkistaa systemaattisesti varsinkin, kun kyseessä on pääsy kriittisiin tietoihin. Murtautujan tulee välttää ylimääräistä liikkumista kohdetiloissa välttääkseen epäilyt. Sulautuakseen joukkoon vaikutettava määrätietoiselta.

Murtautuja sai kiinnitettyä Raspberry Pi-laitteen tilan laitteeseen käyttämällä tilapäistä tekosyytä istua lähelle paikallista tietokonetta ja huijaamalla kiinnittävänsä oman läppärinsä virtapistokkeeseen. Laite oli pienempi kuin luottokortti ja vaikea huomata yleisissä tiloissa. Yhteystestien ja nopean verkkoskannauksen jälkeen murtautuja jätti R-Pi:n kiinni paikalliseen koneeseen ja poistui tiloista jatkaen tietomurtoa etänä. Niin kauan kuin laite pysyi huomaamattomana kiinni tilojen koneessa, hakkeri pystyi jatkamaan tietomurtoaan.

Cyber Kill Chain-mallin mukaan tämö murto aloitettiin kohteen todentamisesta ja suunnittelusta (reconnaissance). Ajaksi valittiin joulupyhät ja oletettavasti turvataso oli matalammalla. Työkaluna oli Raspberry-Pi-laite, joka sisälsi kirjon murto-ohjelmia (weaponization). Tämän jälkeen tapahtui laitteen toimitus (delivery), kun hakkeri saapui paikan päälle paljastumatta. Murtotyökalu kiinnitettiin suoraan paikalliseen laitteeseen ja testattiin ohjelmien toimivuus (exploitation) sekä etäyhteys hakkerin omasta laitteesta (installation). Hakkeri oli saanut käsiinsä jatkuvan yhteyden tilojen tietoverkkoon (command & control). Nyt hakkeri voi jatkaa toimintaansa keskeytymättömänä (actions on objective).

8. Prosessinhallinta ja kuormitus

a) Kuormitusta seuraava ohjelma

Tero Karvisen 2020 kevään Linux-kurssin viimeinen suoritus aloitetaan asentamalla ohjelma, joka seuraa järjestelmän kuormitusta. Suosituksesta päätin koittaa sysstat-ohjelmaa, johon löysin asennus- ja käyttöohjeet.

Asennus: $ sudo apt-get install sysstat

$ sudoedit /etc/default/sysstat

Monitorointi täytyy laittaa päälle muuttamalla kohdetiedoston oletus “false” -> “true”.

b) Kuormita järjestelmän eri osa-alueita

Järjestelmän tila ennen kuormittamista:

Kuormittavia prosesseja: Xorg, Spotify, Firefox sekä screenshot-toiminto, jota käytin kuvan ottoon.

Asensin kuormittamista varten siihen soveltuvan ohjelman: $sudo apt install stress

Komento ‘stress’ antoi kuormitussuosituksia. Ajoin komennon: $ stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 20s

Järjestelmän tila kuormituksen alla:

Suurin muutos tapahtui prosessorissa, jonka prosentuaalinen käyttö moninkertaistui kuormituksen alla kuvan hetkellä jopa 96% asti.

c) iotop; iotop -oa

Asennus:$ sudo apt install iotop. iotop kerää dataa verkon siirtonopeuksista.

$ sudo iotop

Tila kuormituksen alla:

Kuormittaessa siirtinopeuden (IO>) prosentti kasvoi nollasta noin 50-prosentin huippuun. Suuri muutos, mutta pienempi kuormitus kuin prosessorilla.

d) dstat

$ sudo apt install dstat. dstat kerää tiiviisti tietoa monesta järjestelmän osasta; cpu, levytila, siirtonopeus…

Kuormituksen alla:

Raportista näkee nopeasti kuormituksen hetkellisen vaikutuksen ennen paluuta normaalitilaan. idl=idle=käyttämätön prosessorikapasiteetti loppui lähes välittömästi, kun usr=käyttäjä varasi suurimman osan ja sys= Linux kernel loput. Verkkoliikenne hyppäsi hetkessä nollasta useaan megatavuun.

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

Kyseinen komentosarja raportoi tilapäisesti kuunneltavat portit, niiden ip-osoitteet, verkkoprotokollat (tcp, udp, http…) sekä paikalliset portit

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

Kyseinen grep-komento raportoi lokit sanahaulla ‘error’. Tämä on tehokas työkalu vikaetsinnässä ja ongelmanratkonnassa. Suuri osa omista virheilmoituksistani on tullut nimipalvelurikkeistä.

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%.

$ uptime

Raportista voi tulkita kellonajan sekä uptimen eli koneen viimeisimmän yhtäjaksoisen käyntiajan. Nykyinen sessio on kestänyt jo 13 tuntia, 36 minuuttia. Load average laskee kuormituksen keskiarvon per viimeiset 1, 5 ja 15 minuuttia. Ajoin seuraavaksi kuormiksen ja mittasin uudelleen:

Kuormitin järjestelmää tällä kertaa 30 sekuntia. Kaikki keskiarvot nousivat -viimeisimmän minuutin keskiarvo yli kymmenenkertaiseksi.

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

sar-komento raportoi prosessoriresurssien jakautumisen viiden minuutin välein. Kuvassa käyttäjän kuormituskeskiarvo viimeiseltä kahdelta tunnilta oli 6,05%. Suurin piikki keskiarvosta 11,27% tapahtui ajalla 02.45.01. Samaan aikaan system% oli 4,13, joka on lähes kaksinkertainen lasketusta keskiarvosta (2,23).

%idle-kolumni näyttää, että ylikuormitukseen ei olla vielä ylletty, keskiarvon ollessa 91,69% ja alimmillaan 84,48%.

Lähteet:

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

7. Labraharjoitus

Tehtävä osana Tero Karvisen kevään 2020 Linux-palvelimet-kurssia. Tavoitteena on tehdä vanha arvioitava labraharjoitus edeltäneiltä kursseilta.

Etsin labratehtävän keväältä 2018. Tehtävän kulku tapahtuu portaittain. Samalla seuraan palvelimen kuormitusta, josta teen yhteenvedon raportin lopussa.

Suoritusympäristönä oma sylikone Lenovo Ideapad 320s käynnistettynä Live-tikulta, josta ajetaan Linux-pohjainen käyttöympäristö Ubuntu 18.04.3.

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

Aloitin asennukset Apache 2:sta: $ sudo apt-get update ja sudo apt-get install apache2. Avasin palomuurin Apachelle: $ sudo ufw allow apache. Avasin selaimesta localhost-sivun, jolla näkyi Apache2-oletussivu. Korvasin oletussivun: $ echo ”Markuksen testisivu”|sudo tee /var/www/html/index.html.

Seuraavaksi MySQL/MariaDB asennus ja testaus. Ensin suojasin tulevan tietokannan palomuurilla: $ sudo ufw allow 22/tcp. Hain jälleen tottumuksesta päivitykset, jonka jälkeen asensin MariaDB:n: $ sudo apt-get -y install mariadb-client mariadb-server. Lopuksi ajoin komennon $ sudo mysql_secure_installation, johon tein tarvittavat asetukset kuten root-salasanan sekä tietokanta-asetukset. Nyt tietokanta on valmis luotavaksi.

MariaDB [(none)]> create database asiakkaat;

MariaDB [(none)]> show databases;

Annoin asiakkaat-käyttäjälle käyttöoikeudet tietokantaan: MariaDB [(none)]> grant all on asiakkaat.* to asiakkaat@localhost identified by '*omasalasana*!';. Tämän jälkeen exit.

Kirjauduin tietokantaan asiakkaat-käyttäjänä: mariadb -u asiakkaat -p. Pääsin sisään antamalla root-salasanan. Loin taulun Asiakkaat:

MariaDB [(none)]> USE asiakkaat;
MariaDB [asiakkaat]> CREATE TABLE Asiakkaat (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(1024), price FLOAT);
MariaDB [(asiakkaat)]> show tables;

Lisäsin Asiakkaat-tauluun kolme nimeä komentomuodolla MariaDB [asiakkaat]> insert into asiakkaat(name) values ("*Yrityksen nimi*"); :

Exit

Seuraavaksi PHP:n asennus ja testaus. Aloitin asennuksilla: $sudo apt-get install libapache2-mod-php, $sudo apt-get install php-mysql.

Laitoin käyttöoikeudet toimimaan:

$ sudo a2enmod userdir
$ sudoedit /etc/apache2/mods-available/php7.0.conf

Loin kotihakemistoon public_html-kansion, jonne lisäsin index.php-tiedoston, johon lisäsin Tero Karvisen testikoodin:

echo '<?php print(2+2+"\n\n"); ?>'> index.php

Testasin ohjelmaa selaimella osoitteessa localhost/~markus/. Sivu valitettavasti näytti tyhjää. Ohjelma näkyi lähdekoodissa:

Siirryn tehtävässä eteenpäin ja testaan toistuuko ongelma.

Testasin toimisiko onnistuisiko php-ohjelma lukemaan tekemääni asiakkaat-tietokantaa. Syötin index.php-tiedostoon Tero Karvisen koodin, johon lisäsin oman tietokantani tiedot. Koitin selaimella uudestaan:

Hmm, sama virhe yhä. Jostain syystä en saa ohjelmaa ajettua PHP:lla. Koitan korjata tilanteen.

Tehtävänantoa seuraten etsin seuraavaksi lokeista todisteita palvelimen murtoyrityksistä:

Ilmeisiä murtoyrityksiä ei näkynyt lokeissa. Tämä tosin ei ollutkaan koetilanne.

"Tee staattinen HTML5 weppisivu, jonka otsikkona (molemmat title ja h1) on "Sorkka ja Rauta Oy".
Laita sivu näkyviin osoitteeseen http://rauta.example.com/"

Loin käyttäjän kotihakemistoon kansion ‘examplesite’, jonne loin uuden index.html-tiedoston. Täydensin koodin Tero Karvisen HTML5-koodin pohjalta:

Seuraavaksi loin conf-tiedoston apache2/sites-available -kansioon:

Käynnistys: $ sudo a2ensite rauta.example.com.conf,

$ sudo systemctl restart apache2

Lisäsin rauta.example.com-sivun hosts-tiedostoon:

Sivu toimi selaimessa

Seuraavaksi loin Einarille oman käyttäjän sekä php-pohjaisen kotisivun:

$ sudo adduser einari. Tämän jälkeen loin einari-käyttäjän kotihakemistoon public_html-kansion ja index.php-tiedoston:

Kokeilin tulosta selaimessa:

Valitettavasti Einarikaan ei välttynyt samalta php-ongelmalta. Ratkaisu ei ole vielä käsissäni.

Katsotaan kuormituksia. Tein kuormitustestit asennusten välissä sekä lopuksi.

Apachen asennuksen jälkeen
MariaDB asennuksen jälkeen
php-asennuksen jälkeen
Virtualhostin luomisen jälkeen
Lopuksi

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

http://terokarvinen.com/2016/read-mysql-database-with-php-php-pdo

http://terokarvinen.com/2012/short-html5-page

https://stackoverflow.com/questions/35928184/php-in-userdir-not-working

6. Tietokannat

Tehtävä: Luo yksinkertainen tietokantaohjelma palvelimelle. Tämän jälkeen laita ohjelma toimimaan wsgi-moduulin kanssa. Tehtävä on osana Tero Karvisen kevään 2020 Linux-palvelimet-kurssia. Kaikki ohjeet, lähteet sekä valmiit koodit tehtävään luettavissa sivulta terokarvinen.com.

Edellisessä harjoituksessani loin Python-flaskin tuotantoympäristöön, johon lisäsin templatet. Käytän harjoituksen tuloksia kuten kansioita, tiedostoja sekä ohjelmia pohjana tälle tehtävälle.

Loin nano-komennolla uudet tiedostot ‘autoformed.py’ sekä ‘base.html’ ja ‘replies.html’ templates-alakansioon. Ohjelmien pohjakoodina käytin Tero Karvisen koodeja. Santtu Hyvärinen kommentoi kyseisellä sivulla, että ohjelman ajamiseen tarvitsee SQL-alchemy sekä wtforms -ohjelmat. Asensin ohjelmat komennoilla sudo apt-get install -y python3-flask-sqlalchemy ja sudo apt-get install python3-flaskext.wtf.

Lisäsin ‘autoformed.py’ sekä ‘replies-html’ -tiedostoihin address-rivin:

Testasin ajaa ohjelman komennolla python3 autoformed.py

Sivu toimii localhostissa onnistuneesti tietokannan päällä.

5. Python Flask ja tuotantoympäristö

Seuraavana tavoitteena on luoda ensin Python Web App kehitysympäristössä, jonka jälkeen luodaan Flask tuotantoympäristössä käyttäen wsgi-moduulia. Kaikki oppimateriaalit sekä ohjeet tehtävään sivulta terokarvinen.com.

Aloitin asennuksilla käyttäen komentoja

$ sudo apt-get update
$ sudo apt-get -y install python3-flask

Python3-flaskin asennuttua onnistuneesti loin tiedoston komennolla

$ nano hello.py

Tiedostoon täydensin koodin:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
	return "Flask by Markus Mikael Saikkonen!"

app.run(debug=True)

flask ajetaan komennolla $ python3 hello.py

Testasin luotua nettisivua osoitteessa http://localhost:5000.

Seuraavaksi asennan Python Flaskin tuotantoympäristöön. Ensin asensin ja testasin Apache2-palvelimen toiminnan.

$ sudo apt-get update
$ sudo apt-get -y install apache2

Testaus onnistui kirjoittamalla ‘localhost/’ selainriville.

Tietoturvan kannalta loin uuden käyttäjän markuswsgi, jolle annoin uuden salasanan sekä käyttäjätiedot (koko nimi, loput sivuutetaan). Tämän jälkeen lukitsin käyttäjän ja lisäsin itseni uuteen ryhmään markuswsgi. Komentoina tämä vaihe näytti:

$ sudo adduser markuswsgi
$ sudo usermod --lock markuswsgi
$ sudo adduser $(whoami) markuswsgi

Loin seuraavaksi uuden virtual hostin palvelimelle, johon täydensin edellä luodut tiedot. Komentorivillä tämä vaihe näytti seuraavalta:

$ sudoedit /etc/apache2/sites-available/markuswsgi.conf
<VirtualHost *:80>
        ServerName markus.saikkonen.com

        WSGIDaemonProcess markuswsgi user=markuswsgi group=markuswsgi threads=5
        WSGIScriptAlias / /home/markuswsgi/public_wsgi/markus.wsgi
        <Directory /home/markuswsgi/public_wsgi/>
                WSGIScriptReloading On
                WSGIProcessGroup markuswsgi
                WSGIApplicationGroup %{GLOBAL}
                Require all granted
        </Directory>
</VirtualHost>
$ sudo a2ensite markuswsgi.conf
$ sudo a2dissite 000-default.conf

Asensin WSGI-moduulin, jonka jälkeen uudelleenkäynnistin Apachen ja testasin konfiguraation:

$ sudo apt-get -y install libapache2-mod-wsgi-py3
$ sudo systemctl restart apache2 
$ apache2ctl configtest

Syntax ok

Loin ‘public_wsgi’-kansion ‘markuswsgi’-kansion sisälle. Tämän jälkeen annoin yleiset käyttö- ja muokkausoikeudet:

Loin ‘markus.wsgi’ -tiedoston kyseiseen kansioon komennolla ~$ nano /home/markuswsgi/public_wsgi/markus.wsgi

Loin samaan kansioon ‘hello.py’-tiedoston komennolla ~$ nano /home/markuswsgi/public_wsgi/hello.py

Ajoin ohjelman komennolla $ python3 hello.py

Seuraavaksi tein ‘templates-flask.py’ public_wsgi-kansioon ja ‘base.html’ -tiedoston omaan templates-kansioon public_wsgi-kansion sisälle nano-komennolla.

Ajoin templates-flask.py-ohjelman:

~$ python3 templates-flask.py

Testasin tuloksia osoitteessa http://localhost:5000:

4. Digital Ocean ja virtuaalipalvelimen luonti

Tavoitteena uuden julkisen palvelimen luominen internetiin.

Hallitsen jo palvelinta markusmikaelsaikkonen.me, jonka loin Digital Oceanin kautta. Koska minulla on jo tunnukset valmiina, pääsen heti luomaan uutta palvelinta.

Omat Create Droplets-alkuasetukseni: Ubuntu, Plan: standard, $5/mo, ei block storagea, Datakeskukseksi Frankfurt, ei muita lisävaihtoehtoja, hostname: saikkonenmarkusmikael. Digital Ocean luo palvelimen asetusten mukaan. Valitsin myös Digital Oceanin lähettämään sähköpostiin kertakäyttöisen salasanan.

Seuraavaksi tarvitsen Domain nimen. DNS-nimiä voi ostaa sivulta Namecheap.com, jonne myös tarvitsee luoda tunnukset. Opiskelijana voit saada kerran ilmaiseksi .me-päätteisen nimen. Tällä kertaa hankin itselleni uuden nimen saikkonenmarkusmikael.tech hintaan $0.48. Oston jälkeen liitin nimen uuteen palvelimeen saikkonenmarkus Digital Oceanin kautta.

Digital Ocean oli lähettänyt palvelimeni ip-osoitteen, käyttäjänimen (root) sekä salasanan sähköpostiin. Seuraavaksi otin konsolilla ssh-yhteyden uuteen palvelimeeni komennolla ssh root@207.154.225.189. Tämän jälkeen root salasana tulee vaihtaa.

Tämän jälkeen sain ssh-yhteyden palvelimeeni

3. Apache2 asennusta ja web-palvelimen toimintaa

Päivän teemana on asentaa Apache 2 web-palvelin omalle kotikoneelle ja pystyttää sen päälle oma kotisivu. Tämän jälkeen tarkastellaan palvelimen lokia.

Päivän teemaan löytyi kattavat ohjeet mainiosti nimetyltä sivulta VITUX.

Aloitin päivittämällä järjestelmän. Tämän jälkeen hain ja asensin Apache 2-palvelimen. Onnistuneen asennuksen jälkeen tarkistin version.

$ sudo apt update
$ sudo apt install apache2
$ apache2 -version

Seuraavaksi katsoin tulimuurista listan sovelluksista ja sallin liikenteen Apachelle.

$ sudo ufw app list
$ sudo ufw allow 'Apache'

Nyt palvelinta voi konfiguroida. Ensin varmistin, että palvelin on päällä ja toimii.

$ sudo systemctl status apache2

Palvelin on päällä, joten siirryin IP-osoitteeseen:

$ hostname -I

Kopioin palvelimen IP-osoitteen web-selaimeen ja pääsin onnistuneesti Apache 2-oletussivulle.

Aika laittaa pystyyn virtual host sekä nimetä domain. Käytin seuraavia komentoja luodakseni directoryn domainille uudella nimellä vantablackfinland.com ja saadakseni käyttöoikeudet domainiin.

$ sudo mkdir -p /var/www/vantablackfinland.com/html

$ sudo chown -R $USER:$USER /var/www/vantablackfinland.com/html

$ sudo chmod -R 755 /var/www/vantablackfinland.com/html

Loin html-tiedoston palvelimelle sekä kirjoitin tervehdystekstin:

$ nano /var/www/vantablackfinland.com/html/index.html

Konfiguroin virtualhostin palvelimelle:

 sudo nano /etc/apache2/sites-available/vantablackfinland.conf

Yritin käynnistää konfigruraatio-tiedoston, ja uudelleenladata Apachen, mutta virhe:

journalctl -xe

Control processista on poistuttu, jonka yhteydessä on tullut virhekoodi. Tällä hetkellä sivuni on alhaalla. Yritän ratkaista.

Päivitys 13.2.2020:

Työskentelyä Labrakoneelta:

Virtualhost-nimeni päästä puuttui ‘.com’-pääte. Muutin sivuani siirtämällä sen hakemistoa komennolla:

sudo mv /etc/apache2/sites-available/vantablackfinland.conf /etc/apache2/sites-available/vantablackfinland.com.conf 

Muutin myös Virtualhostin konfiguraatiota http://terokarvinen.com ohjeiden mukaisiksi

$ apache2ctl configtest
$ sudo systemctl restart apache2