Kotitehtävä #7

a) Vanhan arvioitavan laboratorioharjoituksen ratkaiseminen.

Linkki tehtävänantoon: Tero Karvisen Linux palvelimet -kurssisivu. (Harjoitus 7)

Harjoitusta varten suoritan toimet “puhtaalta pöydältä”, eli Xubuntu 16.04.03 LTS -livetikulta.

Valitsemani harjoitus: Arvioitava laboratorioharjoitus – Linux palvelimet ict4tn021-2 (uusi OPS) alkukeväällä 2017 p1.

Puran harjoituksen tähän pala palalta ja selitän jokaisessa kohdassa tekemäni toimenpiteet.

Haluamme tehdä PHP-kotisivuja etäältä.

Työntekijöitämme ovat Jorma Mähkylä, Pekka Hurme, Ronaldo Smith, Håkan Petersson, Einari Mikkonen, Einari Vähäkäähkä, Eija Vähäkäähkä. Tee heille HTML5-esimerkkikotisivut siten, että kunkin testisivun otsikossa lukee omistajan käyttäjätunnus.Maija Virtanen jatkaa ylläpitoa, tee hänelle sudo-tunnus.

Maija haluaa käyttäjätunnuksen “maija”.

Kotisivuja on kätevä ajaa Apache-palvelimella, joten aloitan tehtävän käynnistämällä terminaalin ja ajamalla seuraavat komennot:

setxkbmap fi (saadaan ääkköset toimimaan)
sudo apt-get update (päivitetään pakettilistaus)
sudo apt-get -y install apache2 libapache2-mod-php (asennetaan apache2 ja php-modi siihen)

Asennuksen jälkeen kokeilin selaimella osoitetta http://localhost (tai http://127.0.0.1), josta saan varmistuksen “Apache2 Ubuntu default page” -sivun muodossa, että Apache2 on onnistuneesti asentunut.

Asennan samalla myös pwgen-ohjelman, jolla on helppo luoda turvallisia salasanoja, joita tulen tarvitsemaan kun luon käyttäjien salasanoja.

sudo apt-get -y install pwgen (pwgenin asennus)
pwgen -sC 12 8 > passut.txt (s-parametri tekee salasanoista täysin randomeja, C-parametri pistää ne kolumneihin, 12 = salasanan pituus, 8 = salasanojen määrä), > passut.txt tallettaa ne passut.txt-tiedostoon)

Nyt kun salasanat on tehty, voin aloittaa tunnuksien luomisen. Kirjaan tunnukset myös kyseiseen passut.txt-tiedostoon. Tunnukset aion tehdä muodossa: etunimen ensimmäinen kirjain + sukunimen 5 ensimmäistä kirjainta. Jos eteen tulee ääkkösiä tai jotain erikoisempia tapauksia, niin muutan ne “jenkkimäiseksi”, esim: ä -> a. Einari ja Eija Vähäkäähkän kohdalla päätin erottaa heidän tunnuksensa numerolla, Eija saa numeron kaksi tunnuksensa perään.

Tunnusten luonti:

sudo adduser jmahky (rinse and repeat kaikille muillekin tunnuksille, paitsi Maija Virtaselle ja Eija Vähäkäähkälle)

Maija tarvitsi sudo-oikeudet, joten hänen tunnuksen kohdalla tarvittiin vielä luonnin jälkeen:

sudo adduser maija sudo (lisää maijan sudo-ryhmään)

 

Kuva passut.txt-tiedostosta:

tunnus

Kuva passwd:stä:

tunnus2.png

Passut.txt-tiedostoa muokkasin vielä niin, että vain minulla on oikeus nähdä ja lukea sitä. Se onnistui komennolla:

sudo chmod go-rwx passut.txt (go = groups ja others, - = poistaa, rwx = read, write ja execute)

 

chmodpassut.png

Public_html-kansion luonti käyttäjille

Käyttäjät tarvitsivat public_html-kansion omaan kotihakemistoonsa, johon he voivat tallettaa tekemiään kotisivujaan. Tässä vaiheessa on hyvä kirjautua käyttäjän tunnuksilla sisään ja testata samalla salasanan toimivuus, sekä luoda kansio käyttäjänä itsenään, niin käyttöoikeusryhmätkin menevät oikein. Jos loisin kansiot roottina, niihin tulisi omistajaksi ja ryhmäksi “root”.

Esimerkki:

su jmahky (vaihdetaan tunnus pois xubuntusta)
cd (siirrytään kotihakemistoon)
pwd (varmistetaan polku)
mkdir public_html (luodaan kansio)

Sama toimenpide toistetaan muillekin tunnuksille.

Userdir ja PHP:n enablointi

Ennen kuin käyttäjät pääsevät säheltämään html:n ja php:n kanssa tulee vielä Apachen asetuksista sallia käyttäjähakemistot, sekä enabloida PHP:n suorittaminen käyttäjähakemistoissa.

Nämä saavutetaan vastaavasti:

sudo a2enmod userdir (käyttäjähakemistot sallitaan)
cd /etc/apache2 (mennään Apachen asetuksia koskevaan kansioon)
grep -ri php (etsitään hakusanalla PHP, -r = rekursiivisesti, -i = ei väliä onko iso vai pieni kirjain)
sudo nano mods-available/php7.0.conf (haku vahvasti viittasi, että täältä löytyy haluamani asetus)
kommentoidaan rivit ohjeiden mukaisesti, ctrl + x + y tallennus
sudo systemctl restart apache2.service (Apachen restarttaus)

Esimerkkisivut käyttäjille (ja php:n testaus)

Kun jokaisella käyttäjällä on public_html-kansio, niin sinne voidaan myös luoda index.php-tiedosto. Tein itse kuvan mukaisia tiedostoja, joihin vaihdoin <title> </title> -tagien sisään aina käyttäjän käyttäjätunnuksen.

jmahkyphp.png

Tiedoston sisältö ja testaus, kaikki näyttäisivät olevan ok!

Pekka Hurmeelle oma tietokanta

EDIT: Tein vahingossa kaiken Jorman tunnuksilla, mutta samat komennot pätisivät myös Pekan kohdalla (nimiä olisi varmasti hyvä vähän vaihtaa).

Jotta Pekka pääsisi sörkkimään tietokantoja, tulee minun asentaa ja conffata MySQL. Sitä lähdin suorittamaan näin:

Asennetaan MySQL ja php-lisäkilke.

sudo apt-get -y install mysql-client mysql-server php-mysql
sudo systemctl restart apache2.service (hyvä resetoida apache2 tässä välissä)

Jossain vaiheessa asennusta MySQL kysyy salasanaa rootille. Syötin tähän vahvan salasanan.

Kun asennus oli valmis kirjauduin sisään MySQL:ään roottina:

mysql --user=root --password
syötin asennusvaiheessa antamani salasanan -> sisällä ollaan

Luon databasen:

mysql > CREATE DATABASE jmahky CHARACTER SET utf8;

Annan jmahky-tunnukselle oikeudet ja salasanan:

mysql > GRANT ALL ON jmahky.* TO jmahky@localhost IDENTIFIED BY '887bRu3eSjkY';
exit

Nyt voin kirjautua MySQL:ään jmahkyn oikeuksin ja lisätä asioita tietokantaan:

mysql --user=jmahky --password (-> passun syöttö)
mysql> USE jmahky; (valitaan jmahky database)
mysql> CREATE TABLE makkarat(id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(1024)); (luodaan taulukko 'makkarat')
mysql> INSERT INTO makkarat(nimi) VALUES('juustomakkara'); (lisätään sinne asioita)
mysql> SELECT * from makkarat;

makkarat.png

Testausta varten minun tulee luoda .php-tiedosto, joka kutsuu tietueita. Omat php-taitoni ovat aika olemattomat, mutta onneksi Tero Karvisen sivuilta löytyy mainio pätkä, jota vähän muokkaamalla saadaan toimimaan tässä harjoituksessa:

makkarat2.png

Ok!

Jorman kotisivu osoitteeseen http://sleep.example.com

Koska aiemmassa kohdassa tein kaiken vahingossa Jorman tunnuksilla, niin teen tällä kertaa kaiken Pekan tunnuksilla.

  1. Nimipalvelun simulointi hosts-tiedostosta
sudo nano /etc/hosts/
lisätään rivi: 127.0.0.1 sleep.example.com

hosts.png

2. Luodaan uusi conf-tiedosto Apacheen

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

3. Lisätään luotuun tiedostoon seuraavat pätkät

<VirtualHost *:80>
 DocumentRoot /home/phurme/public_html/
 ServerName sleep.example.com
 ServerAlias www.sleep.example.com

<Directory /home/phurme/public_html/>
 Require all granted
 </Directory>
</VirtualHost>

4. Otetaan uusi conf-tiedosto käyttöön ja resetoidaan apache

sudo a2ensite phurme.conf
sudo systemctl restart apache2.service

5. Testataan toimivuus

sleepexample

 

Toimii!

Koneen suojaus tulimuurilla

Avataan muutamat tärkeät portit ja laitetaan tulimuuri päälle

sudo ufw allow 22/tcp (22 = ssh)
sudo ufw allow 80/tcp (80 = http)
sudo ufw allow 443/tcp (443 = encrypted https)
sudo ufw enable

ufw

 

Uusi komento “wowstats” – komento näyttää tietoja koneen tilasta

Päätin asentaa tietokoneelle sysstat-ohjelman.

sudo apt-get install -y sysstat

Sar-komentoa varten minun piti muokata sysstatin asetustiedostoa.

sudo nano /etc/default/sysstat
muokataan false -> true -> tallennus
sudo systemctl restart sysstat.service

Nyt voin luoda komennon wowstats:

nano wowstats

Lisäsin seuraavat rivit tiedostoon:

#!/bin/bash
whoami
pwd
sar

Annetaan kaikille oikeus suorittaa komento:

sudo chmod a+x wowstats

Kopioidaan wowstats /usr/local/bin-polkuun niin kaikki käyttäjät voivat käyttää sitä:

sudo cp wowstats /usr/local/bin

Varmistetaan toimivuus toisella käyttäjällä:

wowstats.png

Komento pelittää juuri niin kuin pitääkin!

 

b) (Vapaaehtoinen) Käytä Linuxia kurssin ulkopuolella

Tämä kohta täyttyikin hieman ennen kurssin alkua. Olin nimittäin asentanut Linux Mintin omalle läppärilleni juurikin siitä syystä, että halusin oppia käyttämään Linuxia paremmin. Aivan ongelmitta ei ole elämä linux-läppärin kanssa mennyt, mitä nyt wifi-verkkojen ja akkukulutuksen kanssa on muun muassa joutunut paljon Googlea käyttämään, mutta tämmöisetkin tilanteet miellän vain oppimistilanteina.

Kurssin aikana hommattu virtuaalipalvelin pääsi minulla heti “oikeaan” käyttöön. Asensin siihen aika nopeasti irssin, jota olen sittemmin aktiivisesti käyttänyt. Kaverin koulutehtävää varten tuli myös asennettua MTA-ohjelma ja sen jopa jollain ihmeellä sain toimimaan. (Google tosin antoi bannivasaraa kun kaikki sata testiviestiäni lähtivät samaan aikaan liikkeelle.)

On myös hyvin mahdollista,  että annan tulevaisuudessa kavereilleni tunnuksia palvelimelleni. Ennen sitä täytyy tosin selvittää mm. miten rajoitetaan käyttäjien kotihakemiston kokoa / tallennuskapasiteettia.

Lähteet:

Tero Karvinen – Install Apache Web Server on Ubuntu. URL: http://terokarvinen.com/2008/install-apache-web-server-on-ubuntu-4

Tero Karvinen – Read MySQL Database with PHP. URL: http://terokarvinen.com/2016/read-mysql-database-with-php-php-pdo

Tero Karvinen – New Default Website with Apache2. URL: http://terokarvinen.com/2016/new-default-website-with-apache2-show-your-homepage-at-top-of-example-com-no-tilde

Tero Karvinen – Instant Firewall. URL: http://terokarvinen.com/2016/instant-firewall-sudo-ufw-enable

Tero Karvinen – Shell Scripting. URL: http://terokarvinen.com/2007/shell-scripting-4

Digital Ocean – How to set up Apache Virtual Hosts on Ubuntu. URL: https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-14-04-lts

Crybit – Simple steps to install and configure sar (sysstat) on Ubuntu/Debian servers. URL: https://www.crybit.com/sysstat-sar-on-ubuntu-debian/

Advertisements

Kotitehtävä #6

A) Kirjoita ja suorita “Hei maailma” kolmella eri kielellä. Asenna tarvittavat ympäristöt.

Tehtävän suorittamisen aloitin ottamalla SSH-yhteyden virtuaalipalvelimelleni. Kolme kieltä joita aion tehtävässä kokeilla ovat Python, Java ja Ruby.

Python

Aloitin tarkastamalla, että onko Python jo asennettu palvelimelle. Tämän selvittäminen onnistui komennolla:

python3 --version

Tulokseksi sain että palvelimella on Python 3.5.2 asennettuna, joten ainakaan Pythonia varten minun ei tarvitse asentaa erillistä ympäristöä.

Pythonia pääsin suorittamaan komennolla:

python3 (huom: komento ilman numeroa 3 pistää Python-tulkin suorittamaan versiota 2.7.12.)

Avautuneeseen tulkkiin annoin koodin:

>>> print("Heippa maailma!")

Sekä kokeilin myös laskusuoritusta:

>>> (2+5) * 7

Molemmat tulostuivat terminaaliin onnistuneesti, kuten alla näkyy.

python

Java

Javaa varten tarvitsin Java Development Kitin, jonka asennus onnistui terminaalista seuraavasti:

sudo apt-get update
sudo apt-get install default-jdk

Tarkistetaan onnistuiko asennus:

javac -version

Kyllä, versio 1.8.0_151 löytyy nyt palvelimelta.

Tein Java-tiedostoja varten oman kansion mkdir-komennolla. Siirryin kansioon cd-komennolla, jonne loin hello.java-tiedoston. Tiedostoon annoin seuraavat pätkät koodia:

public class hello {
      public static void main(String[] args) {
         System.out.println("Moikka maailma!");
     }
}

Tallensin tiedoston ja ajoin sen compilerilla:

javac hello.java

Compiler loi uuden tiedoston hello.class, jota tarvitaan kooodin suorittamiseksi. Nyt puuttui enää tiedoston suorittaminen:

java hello

Näyttöön tulostui “Moikka maailma!”

java

Ruby

Asensin Rubyn apt-getillä:

sudo apt-get install ruby-full -y

Tein myös Rubylle oman kansion samalla tavalla kuin ylemmässä Java-osiossa. Loin tiedoston moikka.rb, johon laitoin seuraavan pätkän:

puts 'Moikka maailma!'

Poistuin tekstieditorista ja syötin komennon:

ruby moikka.rb

Terminaaliin tulostui iloisesti teksti “Moikka maailma!”. Todistusaineistona alla oleva kuva.

ruby

Lähteet & linkit:

Linkki tehtävänantoon. Tero Karvinen, Linux palvelimet -kurssi, harjoitus 7. URL: http://terokarvinen.com/2017/aikataulu-%e2%80%93-linux-palvelimet-ict4tn021-7-ti-ja-6-to-alkukevat-2018-5-op

Open Tech School, Using Python. URL: https://opentechschool.github.io/python-beginners/en/getting_started.html

Wikihow, First Java Program with Linux. URL: https://www.wikihow.com/Create-Your-First-Java-Program-on-Ubuntu-Linux

WikiBooks, Ruby Programming. URL: https://en.wikibooks.org/wiki/Ruby_Programming/Hello_world

Muutoshistoria:

9.3.2018 klo 10.45 edit: lisätty linkki kurssin kotisivulle.

Kotitehtävä #5

A) Asenna SSH-demoni

Tein tämän jo harjoituksessa kaksi, joten tässä sieltä kopioitu vastaus:

Asensin SSH-demonin koneelleni antamalla terminaliin komennon

sudo apt-get install openssh-server

Asennuksen alkuvaiheessa käyttäjältä kysytään, että saako asennus käyttää ylimääräistä kovalevytilaa, johon vastataan kyllä (y-kirjain + enter).

After this operation, 1 010 kB of additional disk space will be used.
Do you want to continue? [Y/n] y

b) Koneen suojaus palomuurilla

Kaksi simppeliä komentoa, joilla portti 22 avataan ja palomuuri laitetaan päälle:

sudo ufw allow 22/tcp
sudo ufw enable

c) Siirrä tiedostoja SSH:lla

Tiedoston palikka.txt siirtäminen onnistuu scp-komennolla. Komennon perusidea on:

scp siirrettävä_tiedosto_sijaintineen kohdeosoite

Minun kohdallani se meni siis näin:

scp palikka.txt bere@foliohattu.me:

Tiedosto sijaitsi samassa kansiossa kuin mistä komentoa ajettiin, joten sitä ei tarvinnut erikseen määritellä. Kaksoispite tarvittiin kohteen loppuun määrittelemään, että kyseessä on ulkoinen sijainti. Ilman kaksoispistettä komento kopioi tiedoston uudelleen nimellä “bere@foliohattu.me”

Kuva siirrosta:

siirto.png

Varmistin vielä kirjautumalla sisään virtuaalipalvelimelleni ja ajamalla ls-komennon. Palikka.txt oli onnistuneesti siirtynyt!

d) Automaattinen kirjautuminen julkisen avaimen kautta

Aloitetaan luomalla julkinen avain. Ohjelman esittämiin kysymyksiin voi antaa tyhjän vastauksen enterillä.

ssh-keygen

Onnistuneesta luonnista pitäisi tulla seuraavat rivit konsoliin:

Your identification has been saved in /home/käyttäjänimi/.ssh/id_rsa.
Your public key has been saved in /home/käyttäjänimi/.ssh/id_rsa.pub.
The key fingerprint is:

Tämän jälkeen voidaan kopioida luotu julkinen avain haluttuun kohteeseen käyttäen ssh-copy-id -toimintoa:

ssh-copy-id -i ~/.ssh/id_rsa bere@foliohattu.me:

I-parametri kertoo komennolle, että sen tulee tunnistaa tiedosto. Sitä seuraa osoite, jossa julkinen avain sijaitsee (~/.ssh/id_rsa) ja tämän jälkeen kohdeosoite.

copyid
Toimivuutta kokeilin kirjautumalla ssh-komennolla sisään ja toden totta, järjestelmä ei kysynyt salasanaa.

e) Sysstat

Sysstat asennus onnistui komennolla:

sudo apt-get install sysstat

Sar-komento antoi virheilmoituksen:

Cannot open /var/log/sysstat/sa27: No such file or directory
Please check if data collecting is enabled

Data collecting ei ollut päällä vaan sitä varten täytyisi muokata asetustiedostoa, joka sijaitsee /etc/default/sysstat -kohteessa. Editointi onnistui siis komennolla:

sudo nano /etc/default/sysstat

Tiedostosta tuli vaihtaa viimeinen rivi falsesta trueksi. Kuva muokatusta tiedostosta:

sysstat

Muokkausten tallentamisen jälkeen minun piti vielä käynnistää sysstat-palvelu uudelleen komennolla:

service sysstat restart

Tulosten tulkintaa

sar-komennolla saadaan statistiikkaa palvelimen nykytilasta. Alla esimerkki omalla virtuaalipalvelimellani ajetusta komennosta.

sysstat_sar.png

Tässä varmaan tärkeintä on tuijottaa tuota %idle-kohtaa, joka kertoo koko järjestelmän CPU:n rasituksesta. Minun tapauksessa se on erittäin epärasittunut, mutta jos tuo luku lähenisi nollaa, olisi varmaan korkea aika hankkia nopeampaa rautaa.

pidstat-komento antaa statistiikkaa järjestelmän prosesseista process ID:n perusteella.

pidstat

Yläpuolella esimerkki kahdesta palvelimella pyörivästä ohjelmasta. Tässä on hyvä kiinnittää huomiota  %CPU ja PID -kohtiin. Tällä hetkellä mainitut ohjelmat vievät yhteensä vain 0,05% palvelimen prosessointitehosta. PID kertoo juurikin tuon process ID:n, jota voi käyttää esimerkiksi ohjelman tappamiseen.

Lähteet:

Crybit, Simple steps to install and configure sar (sysstat) on Ubuntu/Debian servers. URL: https://www.crybit.com/sysstat-sar-on-ubuntu-debian/

The Geek Stuff, 10 useful Sar (Sysstat) Examples for Unix / Linux performance monitoring. URL: https://www.thegeekstuff.com/2011/03/sar-examples/

Digital Ocean, How to setup SSH keys. URL: https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys–2

Tehtävänanto, URL: http://terokarvinen.com/2017/aikataulu-%e2%80%93-linux-palvelimet-ict4tn021-7-ti-ja-6-to-alkukevat-2018-5-op

Muutoshistoria:

9.3.2018 klo 11.29 edit: lisätty tehtävänanto.

Kotitehtävä #4

a) Virtuaalipalvelimella oikeus tehdä kotisivuja normaalin käyttäjän oikeuksin.

Aloitin tämän tekemällä uuden käyttäjän palvelimelleni. Annoin komennon:

sudo adduser banaani

Luomisessa annoin käyttäjälle vahvan salasanan ja muut vaiheet rämpytin enterillä läpi. En lisännyt uutta käyttäjää mihinkään ryhmään.

 

Jotta saisin palvelimen käyttäjilleni omat kotisivuhakemistot, tarvitsin taas Apachea. Laitoin sen asentumaan komennolla:

sudo apt-get install -y apache2

Enabloidaan käyttäjähakemistot ja resetoidaan palvelu:

sudo a2enmod userdir
sudo systemctl restart apache2.service

Avataan pari porttia ja laitetaan palomuuri päälle, jotta sivut toimivat:

sudo ufw allow 22 /tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

Ollessani kirjautuneena normaalilla käyttäjällä (banaani) kokeilin luoda kotihakemistoon (/home/banaani) public_html-kansion ja sinne .html-sivun.

banaani1.png

Tein index-sivun vahingossa väärään paikkaan (kotihakemistoon), mutta siirto oikeaan paikkaan onnistui helposti komennolla:

mv index.html public_html/

Tämän jälkeen otin yhteyden Chromium-selaimella osoitteeseen http://www.foliohattu.me/~banaani/

banaani2

Toimii!

s) Käyttäjän kotisivu näkymään Apachen oletussivuna.

Kirjauduin ulos normaalilta käyttäjältä ja vaihdoin tunnukselle, joka kuuluu sudo-ryhmään.

Apachen oletussivu ja niihin liittyvät asetukset löytyvät kansiosta /etc/apache2/sites-available/, joten surffataan sinne:

cd /etc/apache2/sites-available/

Luodaan tänne uusi asetustiedosto, jota halutaan jatkossa käyttää oletuksena:

sudoedit banaani.conf

Napataan koodi Tero Karvisen sivuilta (New Default Website with Apache2) ja muokataan hakemistot omiin tarpeisiin sopivaksi:

## /etc/apache2/sites-enabled/banaani.conf
<VirtualHost *:80>
 DocumentRoot /home/banaani/public_html/

 <Directory /home/banaani/public_html/>
   Require all granted
 </Directory>
</VirtualHost>

Tämä tiedosto siis ohjaa aiemmin luodun käyttäjän kotihakemistoon. Tiedostossa oleva pätkä “Require all granted” kertoo Apachelle, että käyttäjä sallii kansion tiedostojen tarkastelun.

Tallennus ctrl + x + y.

Otetaan vanha asetus pois käytöstä:

sudo a2dissite 000-default.conf

Ja otetaan uusi asetus käyttöön:

sudo a2ensite banaani.conf

Viimeistellään asiat apachen uudelleenkäynnistyksellä:

sudo systemctl restart apache2.service

banaani3

Tämä myös toimii!

y) Murtautumisyrityksiä lokeista.

Lokeja lähdin tarkastelemaan komennolla:

less /var/log/auth.log | grep 'Failed password for'

Greppaamalla tuota lausetta sain karsittua hieman muita rivejä. Harjoitusta varten minua kiinnosti eniten, että mitä tunnusta oltiin yritetty käyttää sisäänkirjautumisessa, sekä mistä ip-osoitteesta tämä tuli. Näitä tulikin erittäin monta, mutta tässä muutama esimerkiksi:

Feb 11 18:09:13 foliohattu sshd[30570]: Failed password for invalid user admin from 184.176.151.214 port 47128 ssh2
Feb 11 18:09:16 foliohattu sshd[30570]: Failed password for invalid user admin from 184.176.151.214 port 47128 ssh2
Feb 11 18:17:32 foliohattu sshd[30602]: Failed password for invalid user git from 52.224.54.108 port 59648 ssh2
Feb 11 18:20:25 foliohattu sshd[30621]: Failed password for invalid user test from 52.224.54.108 port 43024 ssh2
Feb 11 18:32:51 foliohattu sshd[30654]: Failed password for invalid user django from 52.224.54.108 port 33240 ssh2
Feb 11 18:35:54 foliohattu sshd[30662]: Failed password for invalid user docker from 52.224.54.108 port 44744 ssh2
Feb 11 18:48:33 foliohattu sshd[30697]: Failed password for root from 52.224.54.108 port 35098 ssh2
Feb 11 18:51:34 foliohattu sshd[30703]: Failed password for invalid user candy from 52.224.54.108 port 46772 ssh2

Moni yritetyistä tunnuksista ei ollut edes olemassa, mutta näistä selvästi huomasi, että hyökkääjät kokeilivat ns. “perusvarmoja” tunnuksia, joita saattaisi olla serverillä kuin serverillä olemassa – ihmisten etunimet, tunnukset kuten “admin” ja “test”. Rootin kohdallahan tuo loki ei anna ilmoitusta “invalid userista”, koska semmoinen on toden totta olemassa, mutta onneksi Tero Karvisen sivuilta löytyvien ohjeiden (First steps on a New Virtual Private Server) mukaan lukittu.

Lokeista myös huomataan, että lähes aina yksi IP-osoite yrittää tunkeutumista useaan otteeseen. Kokeilin seuraavalla komennolla selvittää hieman enemmän yhdestä hyökkääjästä:

whois 184.176.151.214

Komento tarjosi paljon tietoja ip-osoitteesta, kuten:

OrgName: Cox Communications Inc.
OrgId: CXA
Address: 1400 Lake Hearn Dr.
City: Atlanta
StateProv: GA

Tiedoista löytyi myös heidän nettisivu, puhelinnumero, tietoa lakiasioista, yms. Kyseessä voi olla hyökkääjän palveluntarjoaja, mutta varmaan on myös mahdollista, että tässä on käytetty jotain proxya välissä. En kuitenkaan lähde lähettämään mitään vihasähköpostia heille vaan annan asian olla, sillä on helpompi varmaan vain bannata osoite omasta päästä jollain ohjelmalla, kuten fail2ban:illa.

b) Paikallisten web-sivujen kopiointi palvelimelle scp-komennolla

Kokeilin siirtää aiemmassa tehtävässä tehdyn php-tiedoston paikalliselta koneeltani virtuaalipalvelimelle. Siirto onnistui komennolla:

scp muunnin.php bere@foliohattu.me:/home/bere/public_html

Terminaalista sama näkymä:

scp

Tsekataan virtuaalipalvelimelta, että tiedosto varmasti siirtyi:

scp2

Selaimesta katsottuna tuo tiedosto näytti pelkästään lähdekoodin, joka johtuu siitä etten ollut ottanut Apachessa PHP:ta käyttöön. Tämä sopiikin hyvin seuraavaan tehtävään.

c) Yksinkertainen PHP-sivu palvelimella.

Saadakseni PHP:n toimimaan tuli minun asentaa php-lisäkilke apacheen komennolla:

sudo apt-get install -y libapache2-mod-php

Tämän jälkeen pääsen enabloimaan php:n muokkaamalla php7.0.conf-tiedostoa:

sudo nano /etc/apache2/mods-available/php7.0.conf
Risuaidat tiedoston ohjeiden mukaisesti
sudo systemctl restart apache2.service

Lisäsin myös huvikseni pätkän “echo $_SERVER[‘REMOTE_ADDR’]” koodiini. Lopputulos näytti tältä:

phptoimii.png

Hyvin näyttäisi skulaavan!

Tehtävänanto URL: http://terokarvinen.com/2017/aikataulu-%e2%80%93-linux-palvelimet-ict4tn021-7-ti-ja-6-to-alkukevat-2018-5-op

Muutoshistoria:

9.3.2018 klo 11.24 edit: korjattu tekstin linkit ja lisätty tehtävänanto.

Kotitehtävä #3

a) Asenna Apache ja laita käyttäjän kotisivut kuntoon.

Aloitin Apachen asennuksen terminaalista komennolla:

sudo apt-get install -y apache2

Jonka jälkeen  annoin vielä komennon:

sudo apt-get install -y libapache2-mod-php

Asennus oli nyt valmis ja seuraavaksi pystyinkin kokeilemaan, että toimiiko Apachen default-sivu selaimessa. Menin siis Chromium-selaimella koneen localhost-osoitteeseen (http://127.0.0.1 tai http://localhost) ja psädäm – It works!

apache_default_page

Kokeilin myös toisella koneella yhdistää Apache-koneen sisäiseen ipv4-osoitteeseen ja sama sivu näkyi onnistuneesti. Ulkoisella ipv4-osoitteella yhdistäminen ei toiminut, mutta tuo varmaan vaatisi jotain porttikonfigurointia.

Jotta käyttäjän kotisivut saataisiin toimimaan niin se vaatisi vielä muutaman toimenpiteen. Aloitin antamalla komennon:

sudo a2enmod userdir

Kyseinen komento enabloi moduulin, joka mahdollistaa käyttäjän kotisivut. Tehtävänanto vaati myös, että käyttäjä voi suorittaa php-koodia sivuillaan. Sitä varten piti muokata Apachen asetuksista löytyvää tiedostoa.

cd /etc/apache2/mods-available (vaihtaa hakemiston Apachen kansion sisälle, josta tarvittava tiedosto löytyy)

sudo nano php7.0.conf (muokataan tiedostoa ohjeiden mukaisesti)

sudo systemctl restart apache2.service (käynnistetään apache2-palvelu uudelleen)

php_enable.pngRisuaidat lisätty ja tallennettu ctrl + x + y + enter.

Näiden muutosten jälkeen voidaan luoda public_html-kansio, jossa käyttäjän Apache-palvelimen tiedostot näkyvät.

cd (paluu kotihakemistoon)

mkdir public_html (luodaan kansio)

nano index.php (luodaan kotisivu)

indexphpKuva index.php-tiedostosta nano-editorin kautta.

indexphpchromium

Samainen tiedosto Chromium-selaimesta avattuna. Toimii!

 

b) Apachen lokeista onnistunut ja epäonnistunut sivulataus

Sivustoon liittyvät ongelmat löytyvät logista access.log, johon pääsee kätevästi kiinni komennolla:

tail -f /var/log/apache2/access.log

Halutut tulokset löytyivät neljältä viimeiseltä riviltä:

error_log

Riveiltä selviää koneen IP-osoite (tässä tapauksessa localhost), päivämäärä ja kellonaika, sivusto jota yritettiin tavoittaa, HTTP-koodi, selain ja käyttöjärjestelmä. Ihmettelin tuota mainintaa Mozilla 5.0, mistäköhän mahtaa tulla? Nyt kuitenkin oli käytössä Chromium.

Mainitsin tuossa sivuston ja HTML-virhekoodin, jotka ovat tässä meitä eniten kiinnostavat asiat. Ottaessani onnistuneesti yhteyden index.php-osoitteeseen sain HTTP-koodin 200 sen merkiksi (success). Mietin myös asiaa niin, että käyttäjä olisi typottanut osoitteen (eli kirjoittanut index.php sijaan indeks.php) ja siitä seurasi nuo kaksi keskimmäistä riviä, eli error 404 page not found. Virheitä tuli kaksi sen takia, koska refreshasin sivun vielä ennen kuin korjasin osoitteen takaisin index.php-muotoon. Tästä seurasi taas onnistunut koodi (viimeinen rivi).

c) Virhe PHP- tai Python-koodissa. Virheen analysointi.

Loin virheen tehtävässä jo aiemmin käytetyn index.php:n koodiin.

error_koodi

Vaihdoin koodista print-funktion muotoon printtaa. Tuommoista funktiota ei ole olemassakaan, joten siitä pitäisi muodostua virhe lokeihin.

Lokeja menin katsomaan komennolla:

tail -f /var/log/apache2/error.log

Josta paljastuikin juuri tuo tekemäni virhe:

error_php

Riviä tutkimalla huomataan taas tuttuja asioita, kuten kellonaika ja päivämäärä. Näitä seuraa prosessin ID ja ip-osoite. Yksi tärkeimmistä asioista on PHP fatal error, joka jo itsessään kertoo paljon. Lukijan onneksi helpotusta tuo myös sitä seuraava teksti, jossa kerrotaan mikä meni pieleen (call to undefined function printtaa()), tiedosto jossa virhe sijaitsee (in /home/bere/public_html/index.php) ja rivinumero tiedoston sisällä, josta virhe tarkasti löytyy (on line 11).

d) Virhe apachen asetustiedostossa. Virheen analysointi.

Etsitään sopiva uhri vaihtamalla sijainti kansioon, joka sisältää Apachen asetustiedostot:

cd /etc/apache2

Muokataan vaikka apache2.conf-tiedostoa:

sudo nano apache2.conf

apacheconftest_error2

Ajetaan komento, joka testaa Apachen asetukset.

apache2ctl configtest

apache_error_results

Komennosta seuraa virheilmoitus, josta selviää mikä tiedosto on kyseessä, mistä vika kiikastaa ja millä rivillä se sijaitsee tiedostossa. Näiden tietojen avulla on jo hyvä lähteä korjaamaan virhettä.

f) Palvelimella ajettava weppiohjelma, joka toteuttaa yksinkertaisen laskun.

Päätin tehdä palvelimelleni erittäin yksinkertaisen muuntimen euron ja dollarin välille. Kirjoitushetkellä euron ja dollarin välinen kurssi oli noin 1 EUR = 1,23 USD, joten käytin sitä myös koodissani.

Tein nanolla tiedoston “muunnin.php” kansioon public_html. Tiedostossa oli seuraava koodi:

muunninphp
Huom: jokin aivopieru käynyt tätä kirjoittaessa. <?doctype html> kuuluisi olla huutomerkki kysymysmerkin sijaan, ja sitä kuuluisi seurata <html>-tagi.

Ohjelma ottaa käyttäjältä luvun vastaan, kertoo sen 1.23:lla ja tulostaa sen ruudulle. Simppeliä ja vaikutti toimivan!

Kuva lopputuloksesta:

muunninhtml

 

Lähteet:

HTTP -koodit katsottu osoitteesta https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Tero Karvinen, Install Apache Web Server on Ubuntu. URL: http://terokarvinen.com/2008/install-apache-web-server-on-ubuntu-4

Tero Karvinen, Read MySQL database with PHP. URL: http://terokarvinen.com/2016/read-mysql-database-with-php-php-pdo

Tehtävänanto URL: http://terokarvinen.com/2017/aikataulu-%e2%80%93-linux-palvelimet-ict4tn021-7-ti-ja-6-to-alkukevat-2018-5-op

Muutoshistoria:

9.3.2018 klo 11.09 edit: lisätty lähteitä.
9.3.2018 klo 11.03 edit: lisätty kuvateksti f-kohdan ensimmäisen kuvan alle.

Kotitehtävä #2

Aiemmasta tehtävästä poiketen, suoritan tämän tehtävän Linux Mint 4.10.0 -versiolla.

a) Aiheuta lokiin kaksi merkintää. Yksi onnistunut ja yksi epäonnistunut/kielletty.

Kielletty tapahtuma:

  • Jan 29 11:30:07 Minty sudo: pam_unix(sudo:auth): authentication failure; logname= uid=1000 euid=0 tty=/dev/pts/0 ruser=bere rhost= user=bere
    Jan 29 11:30:13 Minty sudo: pam_unix(sudo:auth): auth could not identify password for [bere]
    Jan 29 11:30:13 Minty sudo: bere : 1 incorrect password attempt ; TTY=pts/0 ; PWD=/home/bere ; USER=root ; COMMAND=/usr/sbin/adduser

Ensimmäisen lokitapahtuman aiheutin antamalla komennon “sudo adduser”, mutta kirjoittaen sudo-salasanan väärin. Lokia pääsin tarkastelemaan komennolla “tail -f auth.log”. (Tail-komento näyttää tiedoston 10 viimeistä riviä, f-paramateri laittaa järjestelmän lukemaan tiedostoa uudelleen ja uudelleen, käytännössä ottaen siis päivittämään sitä, joten muutokset lokissa näkyvät heti kun niitä tekee.)

Tapahtumasta selviää ensinnäkin mihin kellonaikaan virhe on syntynyt lokiin, ensimmäisellä rivillä syyksi ilmoitetaan “authentication failure”, joka tarkoittaa epäonnistumista tunnistautumisen suhteen. Samalta riviltä löytyy myös komennon antaneen käyttäjänimi. Seuraavalta riviltä selviää, että annettua salasanaa ei tunnistettu (eli salasana oli väärin). Kolmannelta riviltä selviää yritysten määrä (1 incorrect password attempt), sekä mitä komentoa oltiin antamassa (/usr/sbin/adduser).

Onnistunut tapahtuma:

 

  • Jan 29 12:21:52 Minty systemd[1]: Stopping OpenBSD Secure Shell server…
    Jan 29 12:21:52 Minty systemd[1]: Stopped OpenBSD Secure Shell server.
    Jan 29 12:21:52 Minty systemd[1]: Starting OpenBSD Secure Shell server…
    Jan 29 12:21:52 Minty systemd[1]: Started OpenBSD Secure Shell server.

Onnistuneen tapahtuman sain tällä kertaa luotua antamalla komennon “sudo service ssh restart”. Koska nämä ilmoitukset eivät tulostuneet auth.logiin vaan syslogiin, tuli aiemman kohdan komennosta vaihtaa kohde, eli komento oli nyt muodossa: “tail -f /var/log/syslog”.

Rivit ovatkin oikeastaan aika yksinkertaiset, järjestelmä pysäyttää ja käynnistää Secure Shell -serverin uudelleen.

b) Asenna SSH-demoni

Asensin SSH-demonin koneelleni antamalla terminaliin komennon “sudo apt-get install openssh-server”. Asennuksen alkuvaiheessa käyttäjältä kysytään, että saako asennus käyttää ylimääräistä kovalevytilaa, johon vastataan kyllä (y-kirjain + enter).

After this operation, 1 010 kB of additional disk space will be used.
Do you want to continue? [Y/n] y

Kokeilin toimivuutta seuraavasti:

  1. Kirjauduin sisään komennolla “ssh bere@Minty” (käyttäjätunnus@tietokone) ja syöttämällä oikean salasanan.
  2. Järjestelmä kysyy, että halutaanko kone tallettaa tunnettujen hostien listaan, vastataan kyllä.
  3. Tein nanolla tekstitiedoston (“nano foo.txt” -> tekstiä -> ctrl + x -> y -> enter)
  4. Syötin komennon “scp foo.txt bere@Minty:\Desktop”
  5. Terminaaliin ilmeni status bar siirrolle ja tiedosto löytyi työpöydältä. Alapuolella vielä kuva siirtoprosessista.

scp_komento

 

c) Unelmien apt-get -komento

Päätin tätä harjoitusta varten asentaa yhden eniten käytetyimmistä ohjelmistani, eli Steamin. Sitä ei myöskään entuudestaan koulukannettavaltani löytynyt, joten se oli tässäkin mielessä sopiva ohjelma tätä harjoitusta varten.

Aloitin googlettamalla ohjeet asennusta varten, josta selvisi että Steamin asentamiseen pitäisi riittää kaksi komentoa:

  1. sudo add-apt-repository multiverse
  2. sudo apt-get install steam

Kokeilin aluksi komentoa “sudo add-apt-repository multiverse && apt-get install steam -y”, josta seurasi seuraava virheilmoitus:

  • bere@Minty ~ $ sudo add-apt-repository multiverse && apt-get install steam -y
    /usr/lib/python2.7/dist-packages/gtk-2.0/gtk/__init__.py:57: GtkWarning: could not open display
    warnings.warn(str(e), _gtk.Warning)
    E: Could not open lock file /var/lib/dpkg/lock – open (13: Permission denied)
    E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

Virheilmoituksen perusteella ongelma oli käyttöoikeuksissa, joten kokeilin vielä muokata komentoa lisäämällä sudon myös &&-jälkeiseen osioon, jonka jälkeen komento siis näytti tältä:

  • sudo add-apt-repository multiverse && sudo apt-get install steam -y

Tällä komennolla alkoi Lyyti kirjoittamaan ja hetken päästä oltiinkin jo lukemassa Steamin käyttöehdoista. Heti käyttöehtojen hyväksymisen jälkeen pääsin erittäin tuttuun kirjautumisikkunaan.

steam

d) Kolme komentokehotteesta toimivaa ohjelmaa

Bastet-peli

Bastet on Tetris-klooni terminaalille. Asennus tapahtui komennolla “sudo apt-install bastet”, jonka jälkeen peliä pääsi pelaamalla komennolla “bastet”. Pelaaminen toimi sulavasti nuolinäppäimillä ja pelistä pääsi pois valitsemalla valikosta “quit” tai painamalla näppäinyhdistelmää ctrl + c.

Screenshot from 2018-01-29 12-57-08

Links-selain

En ollut ennen kuullutkaan terminal-selaimesta, joten Links oli minulle täysin uusi kokemus. Syötin komennon “sudo apt install links2”, jonka jälkeen käynnistin Linksin antamalla komennon “links2”. Terminaaliin avautui pelkästään tyhjiä rivejä, jonka jälkeen päätin kokeilla sitä uudelleen komennolla “links2 http://hhlp.info“. Tällä kertaa näytölle tulostui tuttu Haaga-Helian epävirallinen launchpad, josta pääsinkin selaamaan esim. päivän ruokalistaa!

links2

Kaikista käytännöllisin ohjelma nettiselailuun Links tuskin on, mutta se toimii kuten lupasikin.

Midnight Commander -file manager

Midnight Commander on terminaaliin tehty tekstipohjainen file manager. Asennus onnistui komennolla “sudo apt-get install mc” ja ohjelman käynnistys komennolla “mc”.

midnightcommander

Ohjelman käyttäminen vaatii vähän paneutumista, sillä itse jäin ainakin helposti valikoihin jumiin, eikä esim. quit-komento (10) tuntunut toimivan.

Tehtävänanto:

Tero Karvinen, Linux palvelimet -kurssi, harjoitus 2. URL: http://terokarvinen.com/2017/aikataulu-%e2%80%93-linux-palvelimet-ict4tn021-7-ti-ja-6-to-alkukevat-2018-5-op

Muutoshistoria:

9.3.2018 klo 10.58 edit: lisätty linkki kurssin kotisivulle.

Kotitehtävä #1

a) Livetikun luonti

Aloitin livetikun luomisen lataamalla Xubuntun 16.04.3 -levykuvan Xubuntun Ruotsi-mirrorista. Samalla kun levykuva latautui, kävin myös lataamassa Rufus-ohjelman, jota käytin levykuvan “polttamiseen” muistitikulle. Rufus-ohjelman käyttäminen oli erittäin helppoa: ensin valitaan haluttu levykuva(1), jonka jälkeen painetaan Start(2). Huom: Device-kohta on hyvä tarkistaa, että siinä on asennukseen tarkoitettu muistitikku.

linux1

Rufus saattaa vielä Start-painikkeen jälkeen kysyä pari lisäkysymystä, joihin valitsin “kyllä, saa ladata lisää tilpehööriä asennusta varten”, sekä “Write in ISO Image mode”.

Tämän jälkeen laitoin muistitikun läppäriini kiinni, käynnistin sen ja rämpytin F12-nappia, josta pääsin boottaamaan muistitikulle. Hetken päästä olinkin jo Xubuntun valikossa, josta livetikkua pääsi kokeilemaan. Positiivisena yllätyksenä jopa Wifi toimi ilman ajureiden kanssa temppuilua.

b) Koneen raudan listaus

Screenshot_2018-01-23_13-41-58

 

c) Kolmen ohjelman asennus ja testaus

  1. Geary-sähköpostiohjelmaKirjoitin terminaaliin komennon “sudo apt-get install geary” ja pian Geary olikin asentunut koneelleni. Kokeilin kirjautumista Haaga-Helian Outlook-tunnuksilla ja kaikki tuntui toimivan hyvin.geary
  2. Gimp-kuvankäsittelyohjelmaGimp asentui kivasti laittamalla komennon “sudo apt-get install gimp” terminaaliin. Myös tämän ohjelman kanssa asiat tuntuivat toimivan niin kuin pitää.gimp
  3. Chromium-selainChromium-selain asentui ajamalla komennot “sudo apt-get update” ja “sudo apt install chromium-browser”. Kokeilin selainta selaamalla muutamaa eri sivustoa ja katsomalla Youtubesta videon, ääni kuului ja kuva liikkui, joten lupaavalta vaikutti Chromiumin osalta!chromium

d) Ohjelmien lisenssit

Wikipedian mukaan Geary on toteutettu GNU LGPL v2.1 -lisenssillä. Tämä lisenssi antaa oikeuden kopioida, jakaa ja muokata ohjelmistoa, kunhan tehdyt muutokset merkitään kirjallisesti ja lisensoidaan samaisen LGPL 2.1:n alle. Lähde: https://tldrlegal.com/license/gnu-lesser-general-public-license-v2.1-(lgpl-2.1)#summary

Gimp käyttää GNU General Public License v3:sta. Lisenssi antaa täyden oikeuden muokata, kopioida ja jakaa ohjelmistoa. Muutokset täytyy merkitä ja jos ohjelmistoa jakaa, tulee sen yhä olla saman lisenssin alla. GPL estää myös ohjelmiston patentoimista.
Lähde: https://www.gimp.org/about/COPYING

Yritin selvitellä hieman GPL:n ja LGPL:n eroa ja suurin juju siinä taitaa olla, että LGPL sallii ei-GPL-lisenssien alla olevien ohjelmistojen hyödyntää LGPL-ohjelmiston softakirjastoa. Olipas tuo sekava selitys, enkä ole varma ymmärsinkö sitä täysin.

Chromium käyttää useampaa lisenssiä (ainakin Wikipedian mukaan): BSD, MIT, LGPL, MS-PL, MPL+GPL+LPGL. Selvittelin tuota BSD-lisenssiä ja se vaikutti olevan suhteellisen samanlainen kuin GPL, mutta isoin ero taitaa olla, että koodintekijä ei ota mitään vastuuta itselleen. Jos siis ongelmia esiintyy niin alkuperäisellä tekijällä ei ole mitään velvollusuuksia korjata niitä. Lähde: https://fosswire.com/post/2007/04/the-differences-between-the-gpl-lgpl-and-the-bsd/

 

e) Käytetyt ohjelmat

Rufus (ohjelmisto boottavan usb-tikun luontiin) / Linux-vastapari UNetbootin

Google Chrome -selain / Vastaava linuxissa Chromium

Adobe Photoshop -kuvanmuokkausohjelma / Vastaava Linuxilla GIMP

Mozilla Thunderbird / Linux-vastapari Geary

PowerShell, cmd (komentokehote) / Linuxin terminal

Linkki kurssin kotisivulle ja tehtävänantoon:
Tero Karvinen, Linux palvelimet -kurssi, harjoitus 1. URL: http://terokarvinen.com/2017/aikataulu-%e2%80%93-linux-palvelimet-ict4tn021-7-ti-ja-6-to-alkukevat-2018-5-op

Muutoshistoria:

9.3.2018 klo 10.53 edit: muokattu Xubuntun levykuvan hyperlinkki fiksummaksi. Vanha teksti: “tästä osoitteesta”.
9.3.2018 klo 10.50 edit: lisätty linkki kurssin kotisivulle.