Linux-Palvelimet, harjoitus 3

Tehtävät tehty Tero Karvisen “Linux-Palvelimet”-kurssille.

Nämä tehtävät tein ottamalla SSH-yhteyden Amazonin Lightsail-serverille. Toisin kuin esim. AWS:n EC2-palvelussa, Lightsailia laskutetaan valitun serverin perusteella kiinteä kuukausihinta. Muita vastaavia palveluita tarjoavat esimerkiksi Linode ja Digital Ocean. Tässä tapauksessa virtuaalipalvelimella pyörii Ubuntu, johon otin etäyhteyden käyttämällä private keytä. Ennen harjoitusten tekemistä myös konfiguroin firewallin komennoilla
sudo ufw allow ssh
sudo ufw allow http
sudo ufw enable
.


a) Asenna Apache, laita käyttäjien kotisivut (http://example.com/~tero) toimimaan. Testaa esimerkkikotisivulla. Tämä a-kohta on vaihdettu.

Ensimmäiseksi ajoin normaalisti komennot sudo apt install update ja sudo apt install upgrade päivittääkseni ohjelmistot ja listan paketeista. Tämän jälkeen asensin apache2:n sudo apt install apache2, ja otin käyttöön käyttäjähakemistot komennolla sudo a2enmod userdir. Tämän jälkeen menin luomaan käyttäjän kotihakemistoon public_html-kansion ja sinne index.html-tiedoston.

 

Lopuksi testasin vielä avata sivun…

…ja kaikki toimii.

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

Koska palvelimellani on julkinen IP, 404-erroreja alkoi ilmestymään lokiin välittömästi. Kyseessä oli “Jorgee“, tunnettu haavoittuvaisuusskanneri.

Kuten kuvasta näkyy, skanneri yrittää järjestelmällisesti löytää mahdollisuuksia päästä sisään serverille erinäisten hallintatyökalujen kautta (esim. phpMyAdmin, jolla hallitaan tietokantoja). Näillä riveillä selviää mistä IP-osoitteesta request on tullut, mitä sivua on pyydetty, protokolla jolla pyyntö tapahtui, status (404, koska kyseistä sivua ei ole) ja user agent, josta normaalisti selviää käyttäjän käyttämä selain. Tässä tapauksessa skannerin tekijä on ystävällisesti antanut user agentiksi “Mozilla/5.0 Jorgee”, joten sen estäminen onkin suhteellisen yksinkertaista.

Samasta lokitiedostosta (var/log/apache2/access.log) löytyy myös onnistuineita requesteja:

Samoin kuin edellisessä esimerkissä, tässä luetellaan requestin status (200, eli onnistunut) user agent (käyttämäni Opera antaa pitkän user agent-stringin) ja lisäksi HTTP-metodin (GET, eli se jolla internetsivut normaalisti pyydetään ja toimitetaan). Koska tein requestin tutulta ja “turvalliselta” Windows-koneelta, user agentista selviää jopa että käytin 64-bittistä Windows 10:tä tietokoneella jonka prosessori on x64-arkkitehtuuria (“Windows NT 10.0; Win64; x64).

k) Kokeile jotain Flaskin uutta ominaisuutta flask-testipalvelimessa. Voit kokeilla esim. muotteja (templates), tietokantaa tai syötteiden ottamista lomakkeilta (forms).

Päätin kokeilla Jinja2-templateja, koska minulla oli jo kokemusta hyvin yksinkertaisen API:n kirjoittamisesta Flaskilla. Aloitin työt lukemalla osia Flaskin virallisesta tutoriaalista, ja etenkin “Rendering Templates“-osiota.

Kun koin olevani valmis aloittamaan, asensin virtuaalipalvelimelleni tarvittavat resurssit (python3, pip3, virtualenv ja itse flask). Näiden alkuaskeleiden jälkeen kirjoitin itse “apin”.

app.py:

templates/hello.html:

En tietenkään kirjoittanut näitä suorilta käsin suoraan näin monimutkaisiksi tai täysin toimiviksi – aloitin kirjoittamalla ensin apin joka vain palauttaa tekstin “Hello!”. Kun en saanut mitenkään yhteyttä tähän, tajusin unohtaneeni yhden yksityiskohdan: vaikka olinkin avannut ufw:n portin 5000, Amazonilla on vielä oma firewallinsa josta kyseinen portti piti käydä avaamassa.

Tämän jälkeen pääsinkin ottamaan yhteyden sivuuni, kun ajoin sen komennolla flask run --host=0.0.0.0 ollessani apin kansiossa. Ilman hostin määrittämistä tällä tavalla serveri ei ole näkyvillä oman tietokoneen ulkopuolelle.

Lopputulos on sivu, joka tulostaa parametrinä annetun määrän palloja. (Selaimeni ei näytä urlin lopussa olevaa pätkää ?i=42)

Jos palvelin sattuu olemaan päällä, app löytyy osoitteesta http://52.57.134.38:5000/?i=42