Linux palvelimet ICT4TN021-5
Takaisin juureen

Kotitehtävä h4
22.9.2017

  1. Julkinen virtuaalipalvelin
  2. Domain-nimi
  3. Apachen oletussivu
  4. Murtautumisyritykset lokeissa
  5. Monta DNS-nimeä samaan IP-osoitteeseen
  6. TLS-sertifikointi

1. Julkinen virtuaalipalvelin

tehtävä r)
klo 09:36 - 11:06
Tehtävään kului 1h 30min

Virtuaalikoneen luonti

Ensimmäisenä tehtävänä oli kokeilla julkista virtuaalipalvelinta, VPS:ää. Oppitunnilla olimme kokeilleet Digital Oceania, joten halusin kokeilla jotain toista. Valitsin palveluntarjoajaksi Microsoft Azuren.

Azureen saa ilmaisen kuukauden kokeilun, ja 200 dollaria rahaa käytettäväksi Azuren palveluihin. Azure tarjoaa monenlaista palvelua, joista yksi on virtuaalikone jota tässä tehtävässä hyödynsin.

Aloitusnäkymä

Heti alkuun oli selvää, että Azure ei ole yhtä yksinkertainen käyttää kuin Digital Ocean. Aloitusnäkymässä oli kyllä linkki "Linux Virtual Machines"-tutoriaaleihin, jota intuitiivisesti klikkasin, mutta se vei tosiaan vain tutoriaalivideoon. Miksi katsoa tutoriaali, sillä virtuaalikoneen luonti pitäisi olla lasten leikkiä? Kärsimättömyyttäni en tietysti tutoriaalia katsonut, vaan palasin edelliseen näkymään. Vasemman reunan valikoista löysin vihreän plus-merkin "New", josta päästiin resurssin luontiin.

Azuren puolustukseksi sanottakoon, että palvelun monimutkaisuus johtuu ehkä sen monipuolisuudesta. Sillä on paljon tarjottavaa, mutta tällä hetkellä minua kiinnostaa vain virtuaalikoneet.

Tuotteen valinta

Seuraava näkymä olikin sitten intuitiivisempi. Kuvassa on Azuren Marketplaceksi kutsuma näkymä, jossa palvelu ehdottaakin suosittuna Ubuntu Server 16.04 LTS:ää, jonka klikkasin itselleni.

Basic configuration

Seuraavana vuorossa oli basic konfiguraatioiden asetus. Syötettävät tiedot ovat aika itsestäänselvyyksiä, paitsi että virtuaalikone piti määritellä resurssiryhmään (Resource Group). Minulla ei ollut sellaista ennalta luotuna, joten kirjoitin siihen esimerkin omaisesti group1. Resurssiryhmät on tarkoitettu kokoamaan yhteen samaan projektiin liittyvät resurssit, kuten verkot, virtuaalikoneet, tietokannat, jne jne. Koneeni nimeksi annoin taikapapu, ja käyttäjätunnukseksi etunimeni.

Koon valinta

Seuraavaksi valittiin virtuaalikoneen koko. Halvin hinta minkä sain asetuksia muuttamalla, oli 41,41 euroa kuukaudessa. Tämä on noin 10-kertainen Digital Oceanin halvimpaan, viiden dollarin (eli kirjoitushetkellä 4,20 euron) kuukausiveloitukseen. Hintaero on valtava, enkä osaa sanoa mistä tämä johtuu. Valitsin tämän halvimman vaihtoehdon esimerkkiin.

Tarjouksen hyväksyntä

Neljäs vaihe on tarjouksen hyväksyntä. Sivulla on koottu yhteen VM:än tiedot, sekä sopimusehdot. Klikkasin "purchase". Mainittakoon tässä, että seuraavana arkipäivänä tilauksen tekemisestä sain Azuren asiakaspalvelusta puhelun, jossa tiedusteltiin mikäli tarvitsen apua Azuren kanssa. Kerroin, että käytän Azurea nyt vain opiskelutarkoitukseen. Olivat innokkaita auttamaan, mikäli olen käyttämässä Azurea kaupallisiin tarkoituksiin. Kysyin asiakaspalvelijalta miksi virtuaalikoneen hinta on kymmenkertainen Digital Oceaniin verrattuna, mutta asiakaspalvelija ei oikein osannut antaa vastausta. Kertoivat yhdeksi eduksi, että Microsoft panostaa tietoturvaan. Mitä se sitten käytännössä tarkoittaakaan.

Luomisprosessi

Seuraavaksi palvelu raksuttaa hetken, ja ruudulle ilmestyy laatikko jossa kerrotaan, että virtuaalikonetta luodaan. Hetken odottelun jälkeen, kone on valmis.

Overview

Kun kone oli luotu, surffasin Dashboard-linkin kautta juuri luomani taikapapu-virtuaalikoneen Overviewiin. Tämä näkymä näyttää oleelliset tiedot koneesta, kuten sen IP-osoitteen. Kopioin IP:n, ja otin siihen SSH-yhteyden PuTTYllä.

SSH-yhteys

Käytin Basic Configuration -vaiheessa luotuja tunnuksia, ja pääsin kirjautumaan virtuaalikoneeseen. Kone näyttäisi siis toimivan!

Palomuuri ja Apache

Heti alkuun halusin laittaa palomuurin kuntoon, jotta koneen tietoturva olisi vähän parempi. Tämä tapahtui seuraavin komennoin:

$ sudo ufw allow 22/tcp#Sallitaan TCP-liikenne porttiin 22, jotta SSH-yhteys ei katkea
$ sudo ufw allow 80/tcp#Sallitaan HTTP-liikenne portin 80 kautta
$ sudo ufw enable#Laitetaan palomuuri päälle
Palomuuri päällä, nyt oli lupa hengähtää.

Seuraavaksi asensin apachen:

$ sudo apt-get install -y apache2

Tarkistin IP-osoitteeni:

$ hostname -I
10.0.0.4

Mielenkiintoista, olen lähiverkossa, siis NATin takana? Julkinen IP:ni oli kuitenkin aiemmin todettu 52.170.97.156

No, oli miten oli, oli aika kokeilla toimiiko Apache. Syötin julkisen IP:ni Firefoxin osoiteriville, mutta vastausta ei kuulunut. Miksi? Oletin, että ongelma on Azuren asetuksissa, sillä linux-serverilläni pitäisi kaiken olla jo toimintakunnossa. Menin Azuressa taikapavun Overwiev-sivulta välilehdelle Networking, josta löytyi porttiohjausasetukset.

Porttiohjaukset

Klikkasin oikeassa reunassa olevaa "Add inbound rule"-nappulaa, josta pääsin lisäämään portin HTTP-liikenteelle. Se löytyikin kätevästi valmiiksi alasvetovalikosta, valinnalla HTTP.

Add inbound rule

Porttiohjauksen jälkeen Apachen oletussivu vastasi julkisesta IP:stäni.

Tämän jälkeen korvasin Apachen oletusetusivun omallani:

$ cd /var/www/html
$ echo 'moi! Tervetuloa internettiin!' | sudo tee index.html

2. Domain-nimi

tehtävä x)
klo 11:17 - 12:01
Tehtävään kului 46min

Github education packagesta voi opiskelija saada ilmaisen .me-tunnuksen ilmaiseksi vuodeksi. Painoin sivulta linkkiä Namecheappiin, joka vei rekisteröintisivuille. Syötin tietoni, ja rekisteröin itselleni raisanen.me -domainin.

Advanced DNS

Rekisteröinnin jälkeen navigoin Namecheapissa raisanen.me -domainin Advanced DNS settings sivulle. Poistin siellä olleet Host Recordit, ja lisäsin kaksi kuvan mukaista recordia osoittamaan Linux-koneeni IP:hen.

Näin oli uudelleenohjaus asetettu. Navigoimalla raisanen.me URLiin, päästiin kuitenkin edelleen Namecheapin oletusnäkymään, sillä välissä olevat DNS-palvelimet saavat tiedon uudelleenohjauksesta viiveellä.

Nopeutin antamalla taikapapu-serverilläni komennon:

$ host raisanen.me dns1.registrar-servers.com

Komennolla käsketään käyttöjärjestelmää hakemaan raisanen.me:n IP-osoite viimeisenä ilmoitetulta DNS-palvelimelta.

Varmistukseksi vielä flushasin oman Win10-työasemani DNS-asetukset.

Kokeilin seuraavaksi navigoida Firefoxilla raisanen.me:hen, mutta se antoi edelleen Namecheapin oletussivun. Olin ilmeisesti tyrinyt jotain, varmaan kun kokeilin URLia aikaisemmin. Testasin seuraavaksi Chromea, ja se vei oikeaan osoitteeseen, eli taikapapu-serverin Apachen index.html:ään

Domain-nimi toiminnassa

Olettaisin, että URLi lähtee Firefoxillakin toimimaan, tuon DNS-propagaation 72 tunnin aikaikkunan puitteissa.

HUOM! Jos lähdet itse kokeilemaan raisanen.me:n tai taikapavun IP:n toimivuutta, niin ne eivät välttämättä toimi, sillä olen luultavasti ajanut Azuren virtuaalikoneen alas jo silloin.

3. Apachen oletussivu

tehtävä s)
klo 14:12 - 14:35
Tehtävään kului 23 minuuttia

Seuraava tehtävä oli laittaa käyttäjän kotihakemistoon tallennettu sivu näkymään Apachen oletussivuna. Tehtävänannossa oli linkki ohjeeseen, jota seurasin:

Aluksi loin uuden VirtualHostin.

$ sudoedit /etc/apache2/sites-available/oma.conf

Tiedostoon kirjoitin:

## /etc/apache2/sites-enabled/oma.conf
<VirtualHost *:80>
DocumentRoot /home/matias/public_html/
<Directory /home/matias/public_html/>
Require all granted
</Directory>
</VirtualHost>

Seuraavaksi poistin oletussivun käytöstä, ja korvasin sen omallani:

$ sudo a2dissite 000-default.conf
$ sudo a2ensite oma.conf

Ja käynnistin Apachen uudestaan:

$ sudo service apache2 restart

Seuraavaksi tein index.html:n käyttäjän kotihakemistoon:

$ cd
$ cd public_html
$ nano index.html

Ja kirjoitin sinne lyhyen HTML-sivun koodipätkän:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">>
<title>Kotisivuni</title>
</head>
<body>
Tämä tulee käyttäjän kotihakemistosta </body>
</html>

VirtualHosti toiminnassa

Testasin, ja kuten kuvasta näkyy, oletussivu on muuttunut!

4. Murtautumisyritykset lokeissa

tehtävä y)
14:59 - 16.01
Tehtävään kului 1h 2min

Seuraava tehtävä oli etsiä palvelimen lokeista esimerkkejä murtautumisyrityksistä, ja etsiä lisätietoa murtautujien IP:n perusteella.

Luin Apachen access-logit komennolla:

$ sudo cat /var/log/apache2/access.log

Loki kertoi, että 22.9. klo 08:41:13 ja 08:41:36 välisenä aikana palvelimelle oli yritetty ottaa yhteyttä yhteensä 103 kertaa, IP-osoitteesta 118.140.252.50. Alla esimerkkinä 10 ensimmäistä lokimerkintää kyseisestä IP:stä.

5 118.140.252.50 - - [22/Sep/2017:08:41:13 +0000] "HEAD http://52.170.97.156:80/mysql/admin/ HTTP/1.1" 404 196 "-" "Mozilla/5.0 Jorgee"
6 118.140.252.50 - - [22/Sep/2017:08:41:13 +0000] "HEAD http://52.170.97.156:80/mysql/dbadmin/ HTTP/1.1" 404 195 "-" "Mozilla/5.0 Jorgee"
7 118.140.252.50 - - [22/Sep/2017:08:41:13 +0000] "HEAD http://52.170.97.156:80/mysql/sqlmanager/ HTTP/1.1" 404 195 "-" "Mozilla/5.0 Jorgee"
8 118.140.252.50 - - [22/Sep/2017:08:41:14 +0000] "HEAD http://52.170.97.156:80/mysql/mysqlmanager/ HTTP/1.1" 404 195 "-" "Mozilla/5.0 Jorgee"
9 118.140.252.50 - - [22/Sep/2017:08:41:14 +0000] "HEAD http://52.170.97.156:80/phpmyadmin/ HTTP/1.1" 404 195 "-" "Mozilla/5.0 Jorgee"
10 118.140.252.50 - - [22/Sep/2017:08:41:14 +0000] "HEAD http://52.170.97.156:80/phpMyadmin/ HTTP/1.1" 404 195 "-" "Mozilla/5.0 Jorgee"
11 118.140.252.50 - - [22/Sep/2017:08:41:14 +0000] "HEAD http://52.170.97.156:80/phpMyAdmin/ HTTP/1.1" 404 195 "-" "Mozilla/5.0 Jorgee"
12 118.140.252.50 - - [22/Sep/2017:08:41:14 +0000] "HEAD http://52.170.97.156:80/phpmyAdmin/ HTTP/1.1" 404 195 "-" "Mozilla/5.0 Jorgee"
13 118.140.252.50 - - [22/Sep/2017:08:41:15 +0000] "HEAD http://52.170.97.156:80/phpmyadmin2/ HTTP/1.1" 404 195 "-" "Mozilla/5.0 Jorgee"
14 118.140.252.50 - - [22/Sep/2017:08:41:15 +0000] "HEAD http://52.170.97.156:80/phpmyadmin3/ HTTP/1.1" 404 195 "-" "Mozilla/5.0 Jorgee"
15 118.140.252.50 - - [22/Sep/2017:08:41:15 +0000] "HEAD http://52.170.97.156:80/phpmyadmin4/ HTTP/1.1" 404 195 "-" "Mozilla/5.0 Jorgee"

Analysoidaan rivi 5

Lokimerkintä

  1. Rivinumero lokissa
  2. IP-osoite, josta yhdistetty
  3. RFC 1413 -tunnistetieto. Tieto puuttuu, joten paikalla viiva.
  4. Aikaleima serverin paikallista aikaa, GMT +0000
  5. HTTP:n HEAD-pyyntö, joka pyytää lokin URLin takaa löytyvät otsikot, eli headerit
  6. HTTP statuskoodi 404 / Not Found, sekä vastauksen koko tavuina 196
  7. Suosittelija, referer. Kertoo, jos käyttäjä on tullut saitille linkin kautta. Tässä tyhjä.
  8. User agent, kertoo käyttäjän käyttävän Mozilla 5.0:aa, sekä Jorgee haavoittuvuusskanneria

Selitykset lokitiedoille löysin täältä.

Tästä voimme päätellä, että kyseisen IP:n takana oleva kone käy systemaattisesti läpi 103 mahdollista haavoittuvuutta palvelimelta. Se yrittää löytää mm. MySQL ja PHP adminkansioita, ja mitä se sitten tekisi jos löytäisi, luultavasti lataisi niiden sisällön itselleen ja käyttäisi niitä ilkivaltaisiin tarkoituksiinsa.

Seuraavaksi selvitin mitä saan irti hyökkääjästä whoisillä:

$ sudo apt-get install -y whois
$ whois -H 18.140.252.50
(-H tägi siivoaa tulostetta poistamalla legal disclaimereja)

Jaahas, kaveri näyttäisi olevan Hong Kongista.

Halusin saada vähän graafisemman feedbackin, joten menin win10-työasemallani osoitteeseen www.ip-tracker.org

Tuloste näytti seuraavalta:

Siellä siis ilmeisesti joku Hong Kongilainen "liikemies" koittaa ansaita elantoaan minun kustannuksella...

Muista IP-osoitteista palvelimelleni ei olekaan yritetty murtautua, vielä.

5. Monta DNS-nimeä samaan IP-osoitteeseen

Tehtävä v)
tehtävään kului noin tunti.

Mielenkiintoisena lisätehtävänä oli laittaa Apache palvelemaan samasta IP:stä useampaa Domain-nimeä. Googlasin hakusanalla "Apache Name Based Virtual Hosting" ja löysin tämän ohjeen.

Usean domainin tukeminen tapahtui siis editoimalla aikasemmin luomaani oma.conffia ja luomalla sinne uusi VirtualHosti:

$ sudoedit /etc/apache2/sites-available/oma.conf

Lisäsin sinne toisen virtual hostin:

<VirtualHost *:80>
ServerName matias.raisanen.me
DocumentRoot /home/matias/public_html/site2/
</VirtualHost>

Varmuuden vuoksi apachen restartti:

$ sudo service apache2 restart

Loin määrittelemääni kansioon uuden index.html:n:

$ cd /home/matias/public_html/site2/
$ nano index.html

Tiedostoon kirjoitin lyhyen HTML-sivun, ja liitin kuvan.

Seuraavaksi lisäsin Namecheapin Advanced DNS-settingeissä uuden A Recordin:

Kokeilin surffata Firefoxilla matias.raisanen.me, mutta sain virheilmoituksen, Forbidden. Etsin vastausta Apachen error.logista:

$sudo cat /var/log/apache2/error.log

Viimeiset kaksi riviä näytti tältä:

[Sun Sep 24 16:21:35.261242 2017] [authz_core:error] [pid 120477:tid 140581340681984] [client 89.27.65.90:51935] AH01630: client denied by server configuration: /home/matias/public_html/site2/
[Sun Sep 24 16:21:35.431169 2017] [authz_core:error] [pid 120477:tid 140581349074688] [client 89.27.65.90:51935] AH01630: client denied by server configuration: /home/matias/public_html/site2/favicon.ico

Päättelin kohdasta "client denied by server configuration", että osoite toimii Namecheapin puolesta, mutta Apache ei anna näyttää sivua. Kohta [authz_core:error] voisi viitata authorisaatioon, käyttöoikeuksiin. Tajusin, että en ole vielä sallinut käyttöoikeuksia käyttäjähakemistoihin (userdir). Mielenkiintoista, että hakemistossa /home/matias/public_html oleva index.html toimi, kuten tehtävässä 3 oli todettu, mutta hakemiston /home/matias/public_html/site2 alla oleva index.html ei toiminut.

Seuraavaksi sallin sivujen tarjoamisen käyttäjän kotihakemistoista:

$ sudo a2enmod userdir
$ sudo service apache2 restart

Kokeilin URLia uudestaan, ja tällä kerralla matias.raisanen.me antoi oikean sivun:

6. TLS-sertifikointi

tehtävä n)
tehtävän kesto noin 1h 30min

Seuraavaksi halusin siirtää sivustoni HTTPS-maailmaan, ja tehtävänä oli hankkia TLS-sertifikaatti Let's Encryptistä. Klikkasin etusivulta "Get Started", jonka jälkeen ohjeet suosittelivat käyttämään Certbottia, sillä minulla on shell-yhteys palvelimelleni.

Certbotin asennus oli yksinkertaista, valitsin etusivulla alasvetovalikoista "Apache" ja "Ubuntu 16.04", joka vei minut asennusohjeeseen.

Seuraavaksi ajoin ohjeen komennot:

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-apache

HUOMAA, että antaessasi komennon "sudo add-apt-repository ppa:certbot/certbot" luot uuden luottamussuhteen, jossa annat certbotille luvan ladata ohjelmia tietokoneellesi.

Tähän asti kaikki meni hyvin. Seuraava vaihe oli certbotin ajaminen, jossa törmäsin ongelmaan. Suorittaakseni certbotin, ajoin komennon:

$ sudo certbot --apache

Seuraavaksi tuli valita, mille domainille haluan sertifikaatin. Valitsin "raisanen.me", jonka jälkeen certbot pyöri hetken, mutta jäi miettimään kohtaan "Waiting for verification...". Hetken päästä, ohjelma antoi seuraavan virheen:

Domain: raisanen.me
Type: connection
Detail: Timeout

Googlailin ongelmaa hakusanalla certbot timeout ja törmäsin tähän ohjeeseen. Ohjeessa kerrottiin, että HTTPS-liikenteelle täytyy ensiksi avata portti 443. Tätä ei kerrottu missään vaiheessa certbotin asennusohjeessa. Avasin portin ensiksi taikapapu-serveriltäni komennolla:

$ sudo ufw allow 443/tcp

Seuraavaksi avasin saman portin vielä Azuren Network asetuksista, samalla tavalla kuin tehtävässä yksi, kohdassa porttiohjaukset.

Tämän jälkeen kokeilin ajaa uudestaan komennon:

$ sudo certbot --apache

Porttien avaaminen ratkaisi ongelman, sillä pääsin certbotissa eteenpäin. Seuraavaksi tuli valita, että ohjaanko kaiken HTTP-liikenteen käyttämään HTTPS:ää. Valitsin varmuuden vuoksi että liikennettä ei uudelleenohtaja, jottai testailu on helpompaa. Tämän jälkeen certbotti onnitteli minua sertifikaatin luonnista.

Seuraavaksi kokeilin navigoida Chromella osoitteeseen https://raisanen.me

Salattu yhteys näyttäisi toimivan!