Linux-palvelimet – Harjoitus 7

Osallistun Haaga-Helia ammattikorkeakoulussa Linux-palvelimet kurssille, jonka opettajana toimii Tero Karvinen. Kaikki tehtävät ovat hänen verkkosivuiltaan http://terokarvinen.com/.

Suoritan tehtävän pöytätietokoneellani, jossa pyörii Debian 9.8. Asetin toisaalta Virtual Boxiin Xubuntu 18.04 LTS -jakelun, koska tehtävissä tarvitsee muokata käyttäjiä, enkä halua sotkea oikeaa työasemaani. Lopulta Xubuntu levisi, niin oli otettava käyttöön Kali.

Tehtävänanto tähän viimeiseen harjoitukseen ennen luokassa suoritettavaa labraharjoitusta kuuluu seuraavasti:

a) Ratkaise valitsemasi vanha arvioitava laboratorioharjoitus tältä kurssilta. (Löytyy DuckDuckGolla tai Googlella sekä linkeistä tältä sivulta).
b) Kaikki tehtävät arvioitavaksi. Palauta linkki sivuun, josta löytyvät kaikki kotitehtäväraporttisi. Arviointi tehdään ensisijaisesti tästä linkistä. Linkki voi olla esimerkiksi blogin etusivu (jos blogissa on vain kotitehtävät) tai sivuun, jossa on linkki kuhunkin tehtävään. Kaikki tehtävät -linkin palautus Moodlessa kohtaan “Kaikki tehtävät arvioitavaksi”.
c) (vapaaehtoinen) Käytä Linuxia kurssin ulkopuolella.
d) (vapaaehtoinen) Varaa kalenteristasi viikon välein aikoja Linux-harjoitteluun kurssin jälkeen.

A.) Vanha labraharjoitus

Tarkoituksena oli tehdä aikaisemmilla kursseilla loppuharjoituksena toimiva labraharjoitus. Päädyin tähän harjoitukseen, koska se iski ensimmäisenä silmään. Sen tehtävänanto kuului seuraavasti:

NinjaTietokanta

Haluamme tehdä palvelun, jossa listataan ninjaliikkeitä makeuden, tyylisuunnan ja muiden keskeisten ominaisuuksien suhteen.
Kehittäjämme haluavat käyttää LAMP (Linux Apache MySQL PHP) -pinoa. Asenna tarvittavat ohjelmistot ja tee tietokantaa käyttävä esimerkkiohjelma.

Etätyötä

Haluamme työskennellä etäältä (kuin ninjat piiloistaan).

Käyttäjät

Työntekijämme ovat toimitusjohtaja Nakke Nertola, Håkan Värs, Einari Mikkonen, Einari Öljysaari ja Eija Vähäkäähkä. Tee kaikille käyttäjille esimerkkikotisivut.

Suuri muuri

Suojaa kone tulimuurilla.

WhoWhere

Tee kaikkien käyttäjien käyttöön komento, joka tulostaa Ninjamaisen tervehdyksen “Hello Ninja”, koneen IP-osoitteen ja komentoa ajavan käyttäjän nimen.
Etsitkö haasteita? Tähtäätkö huipputulokseen? Juuri sitä varten meillä on tarjolla:

SneakyGarden.Example.com

Virallinen ninjaliikesivumme tulee Eijan ylläpidettäväksi. Tee Eijalle valmis esimerkkisivu, jossa tietokannassa on seuraavat esimerkkiliikkeet vaikeustasoineen

  • Hyppykiertopotku 27
  • Kuperkeikka 3
  • Karjaisu 1

Sivun tulee olla Eijan muokattavissa ja ninjaliikkeiden näkyä osoitteessa http://SneakyGarden.Example.com. Nimipalvelun toimintaa voit simuloida hosts-tiedostolla.

Uusi ylläpitäjä

Uusi ylläpitäjä on Jussi Laitavalo. Tee hänelle käyttäjätunnus jussi ja anna hänen käyttöönsä täydet pääkäyttäjän oikeudet.

Lopuksi

Moodleen palautetaan neljä tiedostoa: Screenshot*.png, lab.txt, check.log ja lab.tar.gz.
1) Laita ruudulle testit jokaisesta asiasta, jota olet tehnyt. Ota täsmälleen yksi ruutukaappaus ja tallenna se oletusnimellä Screenshot*.png (PrintScrn, enter, enter. Tähti tarkoittaa nollaa tai useampaa mitä vain merkkiä. älä laita literaalia tähteä tiedostonnimeen).
2) Kirjoita seuraavalle ylläpitäjälle lab.txt, jossa on

  • Nimesi ja opiskelijanumerosi
  • Linkki sivuun, josta löytyvät kaikki kotitehtäväraporttisi
  • Lista toimivista, testatuista palveluista osoitteineen (URL tms)
  • Lista palveluista, jotka eivät vielä toimi
  • Kaikkien käyttäjien salasanat ja käyttäjätunnukset

3) Lataa labtest-ninja.py kotihakemistoosi ja aja se saadaksesi check.log:n

$ cd
$ wget wget http://terokarvinen.com/wp-content/uploads//2017/10/labtest-ninja.py_.jpg
$ sudo apt-get -y install curl
$ sudo python3 labtest-ninja.py_.jpg > check.log
$ sudo python3 labtest-ninja.py_.jpg -d >> check.log 2>&1

4) Tee tervapallo lab*.tar.gz tärkeimmistä tiedostoista

$ sudo tar --exclude .mozilla --exclude .cache --exclude lab-*.tar.gz --exclude /home/.ecryptfs -zcf lab-$(whoami)-$(date +%Y-%m-%d).tar.gz /etc/ /var/log/ /home/
$ sudo chown $(whoami) lab-*-*.tar.gz

 

Ensimmäisenä siis asennamme LAMP-stackin, eli Linuxin (on jo), Apachen, PHP:n ja MariaDB:n.

$ sudo apt update
$ sudo apt install apache2 mariadb-server mariadb-client php7.2

Kun halutut ohjelmat ovat asentuneet, niin voimme käydä vilkaisemassa localhostia, onko Apache toiminnassa:

Screenshot from 2019-03-10 16-21-29

Kuten näemme, Apache toimii ja on luonut localhostiin Apachen oletussivun. Seuraavaksi katsomme, miten PHP toimii, mutta sitä ennen otamme tuon oletussivun pois tuolta.

$ cd /var/www/html 
$ ls 
index.html
$ sudo echo moi > index.html.

Sitten katsotaan toimiko tuo:

Screenshot from 2019-03-10 16-29-01

Hyvin näyttää toimivan, joten voimme nyt asettaa hieman PHP:ta tuohon tiedostoon.

$ sudoedit index.html

Laitetaan sinne vaikka rivi <?php print(4+4) ?>. Sitten vielä $ sudo mv index.html index.php. Tämän jälkeen katsomme localhostin taas:

Screenshot from 2019-03-10 16-33-55

En odottanut tätä. Se toimii. Jos käyttäjille haluaa vielä PHP:n käyttöön, niin pitäisi editoida tiedostoa. Voimme sitäkin yrittää nyt.

$ cd 
$ mkdir public_html
$ echo moivaan > index.php

Tämän jälkeen käymme aktivoimassa käyttäjille omat sivut.

$ cd /etc/apache2
$ grep -ir user
$ a2enmod userdir 
$ sudo systemctl restart apache2

Tämän jälkeen käyttäjien omat sivut tulisi olla toiminnassa:

Screenshot from 2019-03-10 16-42-51.png

Se toimi! Nyt voimme viellä aktivoida PHP:n käyttäjien omille sivuille. Olemme siis edelleen /etc/apache2 hakemistossa.

$ grep -ir php 
$ cd /mods-available
$ sudoedit php7.2.conf

Sieltä teemme juuri kuten kommenteissa sanotaan, eli kommentoimme pois viimeiset rivit. Tämän jälkeen testaamme laittamalla $ echo “<?php print(16*16) ?>” > /home/santeri/public_html/index.php. Sitten vielä $ sudo systemctl restart apache2. Sitten voimme käydä katsomassa sivujen toimivuuden:

Screenshot from 2019-03-10 16-50-44.png

Sekin toimi! Nyt meillä toimii kokonaisuus jo tähän vaiheeseen. Vielä tulee lisätä MariaDB tähän kokonaisuuteen. Tähän käytin apuna Tero Karvisen ohjetta.

$ sudo mariadb
MariaDB [(none)]> create database ninja;
MariaDB [(none)]> use ninja;
MariaDB [(ninja)]> create user ninjamaster@localhost identified by 'pkZ7H/#%vBN';
MariaDB [(ninja)]> grant all on ninja.* to ninjamaster@localhost;
MariaDB [(ninja)]> create table moves (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), category VARCHAR(255), features VARCHAR(255), rating INT);
MariaDB [(ninja)]> insert into moves values(1, "Hyppykiertopotku", "Potkut", "Vaikea mutta tehokas", 27);
MariaDB [(ninja)]> insert into moves values(2, "Kuperkeikka", "Pyörähdykset", "Helppo aloittelijallekin", 3);
MariaDB [(ninja)]> insert into moves values(3, "Karjaisu", "Sekalaiset", "Kaikki osaavat halutessaan", 1);
MariaDB [(ninja)]> select * from moves;

Screenshot from 2019-03-10 17-21-42.png

Otin tähän arvoiksi valmiiksi myöhemmässä vaiheessa haluttuja arvoja.

Tämän jälkeen yritin ottaa tietokantayhteyttä, mutta jotenkin se ei vain onnistu ikinä minulla. Usean tunnin jälkeen päädyin tällaiseen tulokseen, joka perustuu Tero Karvisen esimerkkiin tällä sivulla.

<?php
$user='ninjamaster';
$password='pkZ7H/#%vBN';
$database='ninja';
$dsn="mysql:host=localhost;charset=UTF8;dbname=$database";
$pdo=new PDO($dsn, $user, $password);
$pdoStatement=$pdo->prepare('SELECT * FROM moves;');
$pdoStatement->execute();
$hits=$pdoStatement->fetchAll();
foreach($hits as $row) {
 echo "<p>".$row['id']." ".$row['name']." ".$row['features']." ".$row['category']." ".$row['rating']"</p>\n";
}
?>

Mutta yksinkertaisesti en vain saanut toimimaan. Katsoin vielä, että salasana, kysely, tunnus ja kanta toimivat ilman PHP:ta ja kyllä toimi, mutta sivulla näyttäminen ei vain toiminut. Virtuaalikoneessa pyörivä Xubuntuni alkoi antaa I/O erroria ja sanoo, että tila meinaa loppua, enkä voi asentaa, niin voi olla, että tämä tehtävä jää tähän, kun en saa kirjoitettua enää tiedostoihinkaan.

Loput on varmaan tehtävä virtuaalisella Kalilla, koska Xubuntu päätti levitä, enkä Debianiini haluaisi lisäillä turhia käyttäjiä.

Seuraavaksi halutaan “työskennellä etäältä”, eli SSH kuulostaa järkevimmältä vaihtoehdolta. $ sudo apt update ja sitten $ sudo apt install ssh. Noin sisään pääsee, kun tietää koneen IP-osoitteen/nimipalvelimen ja käyttäjätunnuksen jolle haluaa kirjautua.

Seuraavaksi halutaan uusia käyttäjiä. Henkilöt ovat Nakke Nertola, Håkan Värs, Einari Mikkonen, Einari Öljysaari ja Eija Vähäkäähkä. Todennäköisesti aion asettaa käyttjätunnuksiksi etunimen ensimmäisen kirjaimen ja sukunimestä niin paljon, kunnes on kahdeksan kirjainta täynnä.

Lisäsin käyttäjät komennolla $ sudo adduser<käyttäjänimi>. Tässä on lopputilanne /home-hakemistosta käyttäjistä. Laitoin koko nimeksi heidän oikean nimensä, mutta käyttäjät näyttivät tällaisilta:

Screenshot from 2019-03-10 21-35-35.png

Sitten olisi tarkoitus vielä asettaa kotisivut käyttäjille. Piti Kalilla vielä asettaa kotisivut normaalikäyttäjille komennolla $ a2enmod userdir. Sitten vielä $ systemctl restart apache2. Nyt testataan luoda yhdelle käyttäjälle kotisivut. Sitten valitaan joku noista käyttäjistä ja luodaan sinne public_html-kansio ja sinne jonkinlainen index.html-sivu.

$ cd emikkone 
$ mkdir public_html
$ cd public_html
$ echo Einari Mikkonen > index.html

Sitten sivut toimivat:

Screenshot from 2019-03-10 21-41-43.png

Tämä pitäisi käytännössä tehdä jokaiselle käyttäjälle, mutta aika meinaa olla nyt hieman lopussa, jos haluaa vielä tämän päivän aikana nukkumaan, niin en nyt ehdi tehdä muille.

Seuraavaksi pitäisi asettaa tulimuuri päälle. Kalissa ei ole UFW:tä, joten jouduin asentamaan sen $ sudo apt install ufw. Sitten asetetaan vain $ ufw enable. Noin, tulimuuri on päällä.

Tämän jälkeen olisi tarkoitus tehdä skripti, jota voi ajaa kaikki. Komennolla tulisi tulostua “Hello Ninja”, koneen IP-osoitteen ja komentoa ajavan käyttäjän nimen. $ nano hello. Siihen vain Shebang #!/bin/bash ja sitten komennot jokaiselle riville. Lopulta tulos näyttää tältä:

#!/bin/bash

echo Hello Ninja
hostname -I
whoami

Sitten tiedostolle ajo-oikeudet $ sudo chmod ugo+x hello. Lopuksi siirretään hakemistoon, jotta se voidaan ajaa ihan komentona. $ sudo mv hello /usr/local/bin/.

# hello
Hello Ninja 
10.0.2.15
root

Noin, sehän toimi!

Vielä pitäisi asettaa Eijalle tietokannasta tietyt tiedot sivulle, asettaa sivulle kustomoitu osoite osoittamaan hänen sivuaan ja sen pitää olla hänen kotihakemistossaan. Tietokantaa en tee, koska oli valmiiksi sen kanssa ongelmia, niin turhaa lähteä sitä enää säätämään.

Ensiksi teimme jonkin hakemiston Eijan kotihakemistoon. Tässä tilanteessa vedin roottina, ettei koko ajan tarvitsisi sudotella.

$ sudo su
# cd /home/evahakaa/
# mkdir sneakygarden
# cd sneakygarden
# echo toimispa tietokanta > index.html
# cd /etc
# nano hosts
Screenshot from 2019-03-10 22-23-57.png
# cd /etc/apache2/sites-available/
# nano example.conf
Screenshot from 2019-03-10 22-25-31.png
# a2ensite example.conf
# systemctl restart apache2

Tämän jälkeen lopputulos oli tämä:

Screenshot from 2019-03-10 22-19-36.png

Viimeisenä tehtävänä olisi vielä uuden ylläpitäjäkäyttäjän lisäys. Hänen nimensä on Jussi Laitavalo. Se on niin nopeaa, että ei tarvitse kuin tehdä nämä komennot:

$ sudo adduser jlaitava
$ sudo adduser jlaitava sudo 
$ sudo adduser jlaitava adm

Tämän jälkeen hänellä on oikeudet tehdä mitä lystääkään.

Lopetin tehtävän noin viiden tunnin jälkeen.

Linux-palvelimet – Harjoitus 6

Osallistun Haaga-Helia ammattikorkeakoulussa Linux-palvelimet kurssille, jonka opettajana toimii Tero Karvinen. Kaikki tehtävät ovat hänen verkkosivuiltaan http://terokarvinen.com/.

Suoritan tehtävän kannettavalla tietokoneellani, jossa pyörii Kali Linux 2019.1.

$ lsb_release -a
No LSB modules are available.
Distributor ID: Kali
Description: Kali GNU/Linux Rolling
Release: 2019.1
Codename: stretch

Suoritan tehtävän yhdessä Niko Tiittasen kanssa. Hänen bloginsa löytyy tästä linkistä: https://wordpress.com/view/nikotiittanen310038974.wordpress.com

Tehtävänanto kuuluu seuraavasti:

a) Kirjoita ja suorita “Hei maailma” kolmella kielellä. Asenna tarvittavat ympäristöt.
b) (vapaaehtoinen) Kirjoita kullakin kielellä yksinkertainen ohjelma, jolla on jokin käyttötarkoitus. Ideoita: hyödynnä kielen vahvuuksia. Ota käyttäjältä syöte, tee jokin lasku ja tulosta vastaus (input-processing-output).
c) Lisäksi saimme halutessamme tehdä vanhoja tehtäviä opettajamme nettisivuilta.

A.) Hello World!

Tehtävän tarkoituksena on kirjottaa kolmella eri kielellä Hello World, jonka tarkoitusena on testata ympäristön toimivuus. Aikeena oli tehdä Hello World C:llä, C++:lla ja Go’lla. Lopussa on vielä yksi ylimääräinen huvin vuoksi.

C

Olen aiemmin leikkinyt C-kielellä, joten tämä on suhteellisen helppo tehtävä minulle.

Aluksi teemme tiedoston $ nano hello.c -komennolla. Tämän jälkeen asetamme siihen header tiedoston #include <stdio.h>, joka on Standard Input Output, eli sisältää ulostuloon liittyviä komentoja.

Sitten vain:

int main(void) {

printf(“Hello World\n”);

}

Void tulee siksi, että se kertoo compiler-ohjelmalle, että tämä funktio ei palauta mitään arvoa. Jos ei kirjoittaisi void, niin olisi pakko laittaa loppuun vielä “return 0”. Printf on komento, joka löytyy tuosta stdio.h-header-tiedostosta. “\n” laitetaan vain, koska ulostulosta tulee kauniimman näköistä. Tuo siis vaihtaa riviä.

Lopuksi hello.c-tiedosto asetetaan GCC-compiler-ohjelmaan, joka on GNU:n C Compuler. Se asettaa C-tiedoston konekielelle ja tekee siitä ajettavan tiedoston. GCC toimii, niin että kirjoitetaan $ gcc <tiedostonimi> -o <ulostulotiedostonimi>. “-o” tuossa on vain sitä, että jos halutaan ulostulotiedostolle jokin tietty nimi. Oletusnimi on a.out. Tämän jälkeen sen voi ajaa kuin normaalin ajettava ohjelman.

$ ./a.out
Hello World

Noin, Hello World on nyt suoritettu C-kielellä.

C++

Olen myös jotain pelleillyt C++:lla, joten tämänkin pitäisi sujua suhteellisen kivuttomasti.

C++ toimii todella paljon samalla tavalla kuten C, mutta on pieniä eroavaisuuksia. Tehdään siis aluksi ihan kuin aiemmin, mutta nyt muodon vuoksi laitetaan .cpp-pääte tiedostoon. $ nano hello.cpp

#include <iostream>

int main(void) {

std::cout << “Hello World\n”

}

Tuossa stdio.h-header tiedoston korvaa iostream. Sitten taas normaalisti void, että kerrotaan compilerille, että tämä ei palauta mitään arvoa. “std::cout” tuossa tarkoittaa std-kirjastosta otettavaa C-out-metodia, jolla saadaan printattua arvo konsoliin. Syntaksi on hieman erilaista, mutta ei kauheasti kumminkaan eroa. C++ ohjelman voi koota GCC:llä, joka kuuluu samaan GNU compiler-kokoelmaan.

Lopuksi vielä kootaan ohjelma G++-compiler ohjelmalla. $ g++ hello.cpp -o helloworld

Sitten voidaan vaan testata $ ./helloworld
Hello World

Noin Hello World toimii C++-kielellä.

Go

Go ei ole minulle erityisen tuttu kieli. Tiedän etäisesti siitä ja olen kuullut, että se on todella hyvä kieli. En ole silti itse ikinä koskenutkaan Go’hun. Ymmärtääkseni Go on vahva kieli, melkein yhtä vahva kuin C. Go on koottava kieli Wikipedian mukaan, joten se toimii lähes samalla tavalla kuin C.

Ensiksi pitää asentaa Go’n paketti pakettihallinnasta. $ sudo apt install -y golang-go. Tämän jälkeen voimme tehdä Hello World -tiedoston.

Helloworld.go

package main
import “fmt”
func main() {
fmt.Println(“Hello World”)
}

Tämän löysin Go’n verkkosivuilta. Siinä ilmeisesti myös importataan samalla tavalla kirjasto, josta löytyy ulostulometodit. Tässä myös annetaan pakettinimi kuten vaikka Javassa. Lopulta tehdään funktio main(), jossa kutsutaan metdia Println kirjastosta fmt.

Lopulta voimme testata kokonaisuuden komennolla $ go run helloworld.go
Hello World

Chef

Lisäksi teimme Hello Worldin Chef-kielellä. Chef on muisti-stackiin perustuva kieli ja löysimme sille tulkin netistä, ja käytimme tätä.

Löysimme esimerkin netistä, kuinka saisimme Hello World’in toimimaan, mutta se ei aluksi toiminut. Piti lisätä vielä ylös “Hello World.”, joka toimii ilmeisesti ikään kuin tiedostonimenä. Loppuun piti myös lisätä “Serves 1.”. Siihen löytyi tällainen selitys: “Serves. Prints the contents of the corresponding number of baking dishes. The elements in each dish are printed from top of the stack to the bottom. “, toisin sanottuna, se printaa muistissa olevat arvot yhtenä pätkänä.

Löysimme Chef’lle webtulkin, jolla saimme koodin tulkattua. Tässä on esimerkki koodista:

Screenshot from 2019-03-02 19-31-09.png

Noin, Hello World Chef-kielellä.

B.) Pienet ohjelmat

C-ohjelma

Olen sen verran paljon pelleillyt C:llä, että loin pienen ohjelman, jossa annetaan käyttäjälle viisi yritystä arvata numero. Numero generoidaan srand()-funktiolla, joka ottaa nykyisen ajan ja käyttää sitä “seedinä” pseudo randomiin. Jos käyttäjä arvaa viisi kertaa väärin, niin hän häviää. Ohjelma toistaa kysymystä kunnes käyttäjä voittaa tai yritykset loppuvat. Tässä on ohjelman lähdekoodi:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
time_t t;
srand((unsigned) time(&t));

int randomNumber = rand() % 31;
int guess;
int tries = 1;
int triesLeft = 5;

while (tries < 6) {

printf("Try number %d!\n\n", tries);
printf("You have %d tries left.\nGuess a number: ", triesLeft);
scanf("%d", &guess);

if (guess == randomNumber) {
printf("Congratulations! You won! \n");
tries++;
triesLeft--;
break;
}

else if (guess != randomNumber && guess > 0 && guess <= 30) {

if (guess < randomNumber) {
printf("\nThe number is higher.\n\n");
}

else if (guess > randomNumber) {
printf("\nThe number is lower.\n\n");
}
tries++;
triesLeft--;
}

else {
printf("False input! Try again!\n");
continue;
}
}

if (guess != randomNumber) {
printf("You lost. :( ");
}
}

C++-ohjelma

Toiseksi ohjelmaksi tein sellaisen, joka looppaa itseään niin kauan, kunnes käyttäjä antaa syötteeksi “q”. Ohjelma toistaa tietyn kirjainjonon 19 kertaa. Ohjelman lähdekoodi näyttää tältä:

#include <iostream>

using namespace std;

int main(void) {

char option;
cout << "Submit q to quit" << endl;
while(option != 'q') {
for (int i = 0; i < 20; i++) {
cout << "Kalja on hyvää." << endl;
}
cin >> option;
}
return EXIT_SUCCESS;
}

Go-ohjelma

Viimeiseksi tein vielä ohjelman Go’lla. Sillä saa muunnettua nykyisen ajan Floridan ja Vladivostokin aikaan. Tähän ohjelmaan tarvitsin jopa hieman apua internetin uumenista, joten tässä on sivut joita käytin lähteinä: https://www.timeanddate.com/worldclock/usa/florida, https://www.timeanddate.com/worldclock/russia/vladivostok, https://stackoverflow.com/questions/26285735/subtracting-time-duration-from-time-in-go ja https://tour.golang.org/welcome/4.

Tässä on ohjelman lopullinen koodi:

package main

import (
"fmt"
"time"
)

func main() {
now := time.Now()
fmt.Println("The time in Finland is", now)

florida := now.Add(time.Duration(-7) * time.Hour)
fmt.Println("The time in Florida is", florida)

vladivostok := now.Add(time.Duration(8) * time.Hour)
fmt.Println("The time in Vladivostok is", vladivostok)
}

Nyt on tehty kaikki annetut tehtävät. Tehtäviin meni noin 4 tuntia.

 

Linux-palvelimet – Harjoitus 5

Osallistun Haaga-Helia ammattikorkeakoulussa Linux-palvelimet kurssille, jonka opettajana toimii Tero Karvinen. Kaikki tehtävät ovat hänen verkkosivuiltaan http://terokarvinen.com/.

Suoritan tehtävän pöytätietokoneellani, jossa pyörii Debian 9.7. ja samalla käytän Digital Oceanilta vuokrattua virtuaalipalvelinta, jossa pyörii Ubuntu 18.04.

Tehtävänanto kuuluu seuraavasti:

a) Asenna SSH-demoni
b) Suojaa kone tulimuurilla, mutta tee ensin reikä SSH:lle
c) Siirrä tiedostoja ssh:lla
d) Automatisoi kirjatuminen julkisen avaimen menetelmällä
j) Asenna ja konfiguroi ja käynnistä sysstat-paketti. Tarkista sar-komennolla, että se on päällä, esim. näyttää lokimerkinnän “Linux reboot…”. Anna sysstatin pyöriä päivä tai pari. Tutki kuormitushistoriaa sysstatin komennoilla sar, iostat, pidstat… Analysoi tulokset, eli selitä perusteellisesti mitä tulokset tarkoittavat.
i) (Ryhmä 7 tiistai varsinainen tehtävä, muille vapaaehtoinen): 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ä.
e) (vapaaehtoinen) Vaihda sshd:n portti
f) (vapaaehtoinen) Salli vain ryhmän sshers jäsenten kirjautuminen. Lisää itsesi tähän ryhmään.
g) (vapaaehtoinen) Liitä hakemisto sshfs:n avulla verkon yli.

A.) SSH:n asennus

Ensimmäisessä tehtävässä sanotaan vain, että tulee asentaa SSH-demoni. Kello on 12:11. Se asennettaan tuttuun tapaan komennolla $ sudo apt install ssh. Kun se on asennettu, niin sen voi vielä tarkistaa, katsomalla hakemiston /etc komennolla $ cd /etc/. Sitten voi joko etsiä manuaalisesti itse tai antaa komennon $ ls |grep ssh, jolloin pitäisi näkyä SSH-demonin hakemisto, jos se on asennettuna. Kello on 12:17.

B.) Tulimuuri ja SSH-reikä

Toisessa tehtävässä oli tarkoitus suojata kone tulimuurilla ja asettaa reikä SSH:lla. Kello on 12:30. Minulla on tulimuuri jo laitettu pystyyn ja siellä on HTTP- ja HTTPS-reiät laitettuna. Halusin statuksen tehtävää varten, joten etsin, kuinka voin näyttää tulimuurin nykyisen statuksen. Täältä löysin, että komento on $ sudo ufw status verbose. Kun annoin komennon, niin se sylkäisi tällaista:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere 
80/tcp ALLOW IN Anywhere 
443/tcp ALLOW IN Anywhere 
22/tcp (v6) ALLOW IN Anywhere (v6) 
80/tcp (v6) ALLOW IN Anywhere (v6) 
443/tcp (v6) ALLOW IN Anywhere (v6)

Siispä tästä voimme nähdä, että tulimuuri on aktiivinen ja vain portit 22, 80 ja 443 ovat avattuja.

Jos olisimme halunneet laittaa tulimuurin nollasta päälle, niin tämän ohjeen mukaan, se kävisi vain kahdella komennolla. $ sudo ufw allow 22/tcp ja sitten vaan $ sudo ufw enable. Näillä komennoilla tulimuurissa olisi tarvittavat vaatimukset eli päällä ja SSH-portti auki. Kello on 12:41.

C.) SSH-tiedostosiirto

Seuraavassa tehtävässä olisi tarkoitus siirtää tiedostoja SSH:lla. Toisin ilmaistuna SCP-menetelmällä tai Rsyncillä. Ei käytännössä ole niinkään väliä, kumpaa menetelmää käytän, sillä ajattelin siirtää vain yhden tiedoston demoa varten. Kello on 12:44.

Teen testitiedoston pöytäkoneelleni. $ nano foo.txt, jonka jälkeen laitan tiedostoon jotain pientä demotekstiä. Tämän jälkeen tallennan tekstitiedoston. Sitten yritän siirtää tämän tiedoston palvelimelleni vaikka tällä kertaa Rsyncillä. Sitten vaan komento $ rsync foo.txt santeri@santerisiirila.me: (Huom! Kaksoispiste komennossa on tärkeä, eikä toimi ilman!) Tämän jälkeen kävin katsomassa palvelimeltani, oliko se siirtynyt käyttäjäni kotihakemistoon.

Tadaa!

screenshot-from-2019-02-23-12-54-47.png

Halusin kokeilla vielä jotain isompaa, koska miksikäs ei?

Menin metsästämään pöytäkoneestani jotain paria kilotavua isompaa tiedostoa/hakemistoa. Tähän on hyvä käyttää $ ls -lh, mutta varmasti voisi find-komentoa myös hyödyntää. Itse etsin manuaalisesti tuolla aiemmin mainitsemalla komennolla. Löysin vanhan mobiiliohjelmointiprojektin ja siinähän on node-modules, joka tunnetusti vie tilaa ihan kiitettävästi. Siipä päätän siirtää tuon hakemiston.

$ rsync viskiprojekti santeri@santerisiirila.me: -r -v –progress

Löysin pienet ohjeet, jotta saan progressin ja kokonaisen kansion siirrettyä. Voit lukea lähteet täältä ja täältä. Näin sain rekursiivisesti siirrettyä koko hakemiston palvelimelle. Tältä näytti lopputulos:

Screenshot from 2019-02-23 13-20-02.png

Vielä käydään katsomassa palvelimelta, mitä sinne kuuluu:

Screenshot from 2019-02-23 13-22-45.png

Hyvältä näyttää! Kello on 13:23.

D.) Julkinen avain

Tässä tehtävässä halutaan automatisoida kirjautuminen palvelimelle julkisen avaimen menetelmällä. Kello on 13:25.

Olen tämän jo tehnyt, mutta se tapahtuisi siis siten, että luodaan aluksi paikalliselle koneelle SSH-keygenillä itselleen julkinen ja salainen avain. Siispä $ ssh-keygen. Tämän jälkeen ohjelma kysyy kysymyksiä, jotka voi läpäistä vain rämppäämällä enteriä, mutta kannattaa silti lukea ne läpi. Noin, sinulle on nyt generoitu avainpari. Tämän jälkeen tulee vain asettaa sinun julkinen avain palvelimelle ssh-copy-id-komennolla. Esimerkkinä:

$ ssh-copy-id -i .ssh/id_rsa.pub santeri@santerisiirila.me

Tämän jälkeen joudut vielä kirjoittamaan salasanan kerran etähallintakoneelle, mutta sitten avain on asetettu, etkä enää tule tarvitsemaan salasanaa paitsi mahdollisesti joskus sudo-komentoihin. Minä itse saan tästä varoituksen, koska olen jo asettanut avaimet palvelimelle. Tämän jälkeen kuitenkin, kaiken pitäisi olla valmista. Kello on 13:37.

J.) Sysstat

Tässä tehtävässä oli tarkoitus asentaa Sysstat-paketti ja katsoa sen toimivuus. Lopulta pitää antaa sen pyöriä vaikka noin päivän omin voimin, jonka jälkeen voi katsoa tuloksia. Kello on 13:50.

Asennetaan aluksi Sysstat komennolla $ sudo apt install sysstat. Kun Sysstat on asennettu, niin voidaan konfiguroida se oikein. Eli siis, tämän ohjeen mukaan, kun haluaa aloittaa datan keräyksen, niin vain mennään aluksi komennolla $ cd /etc/default konfiguroimaan Systatin oma tiedosto. Sitten voidaan $ sudoedit sysstat -komennolla muokata tiedostosta kohta ENABLED=”false” tähän: ENABLED=”true”. Tämän jälkeen vain käynnistetään Sysstat-demoni uudestaan komennolla $ sudo service sysstat restart. Sitten demonin pitäisi kertätä tietoa, mutta sen voi vielä tarkistaa vaikka komennolla $ sar -r.

Screenshot from 2019-02-23 14-02-41.png

Tadaa, se toimii! Huomenna tullaan tutkimaan tuota lisää, mutta nyt ei ole vielä tarpeeksi tietoa. Kello on 14:03.

I.) Scan of the Month 15

Seuraavaksi olisi tarkoitus suorittaa Scan of the Month 15 -haaste. Haaste on löydettävissä tältä sivulta: http://old.honeynet.org/scans/scan15/ Kello on 14:31.

Latasin aluksi linkistä, tar.gz-tiedoston, jonka sitten purin komennolla $ tar -xzf honeynet.tar.gz. Nyt samassa kansiossa on /honeynet-kansio. Siellä oli vain README- ja honeypot.hda8.dd (mount image) -tiedostot.

En tiennyt ollenkaan, miten tätä tehtävää tulisi lähteä selvittämään, joten otin yhden mallivastauksista ja tein hänen kirjoitelmansa mukaan kaikki vaiheet. Tässä linkki tämän henkilön kirjoitelmaan: http://old.honeynet.org/scans/scan15/proj/som32.txt. Hänen mukaansa tämä image-tiedosto tulisi mountata read only -moodissa turvallisuussyistä, joten tein juuri niin. $ sudo mount honeypot.hda8.dd /mnt/test -oloop,ro oli komento, jota käytin tähän.

Kun olin mountannut kyseisen imagen, putosin kärryiltä aivan täysin. Jopa vaikka luinkin mallivastauksia. En ymmärrä, miten asiat tässä tapahtuvat ja vaikka on komentoja kerrottu teksteissä, niin siltikään en ymmärrä mitä mikäkin komento tekee. En koe tästä olevan hyötyä, koska vaikka tekisin kaiken mitä ohjeessa sanotaan, niin en silti ymmärtäisi mitä tapahtuu. Jätän tämän tehtävän tähän. Kello on 15:23.

Tässä on tekstejä, mitä yritin hyödyntää:

http://old.honeynet.org/scans/scan15/som/som33.html
http://old.honeynet.org/scans/scan15/som/som6.txt
http://old.honeynet.org/scans/scan15/som/som19.txt

G.) SSHFS

Katkerana, kun en saanut edettyä tuossa edellisessä tehtävässä, niin päätin tehdä jotain, jonka olen jo tehnyt joskus. Tässä tehtävässä olisi tarkoitus siis käyttää SSHFS:ää ja siten mountata itselleen uusi asema, joka olisi vaikkapa palvelimella. Tarkoitukseni on siis mountata oman palvelimeni kotihakemisto pöytäkoneelleni. Kello on 15:40.

Ensiksi asennetaan SSHFS, $ sudo apt install sshfs. Sitten loin kotihakemistooni mnt-hakemiston, jota aion käyttää mount pointina /mnt-hakemiston sijaan. $ mkdir mnt $ cd mnt. Sitten olisikin tarkoitus mountata tämä palvelimeni tuohon hakemistoon. Käytän apunani opettajamme ohjetta.

$ cd
$ sshfs santeri@santerisiirila.me: mnt/
$ cd mnt/
$ ls
foo.txt  public_html  publicsites  viskiprojekti

Kuten tuosta voi päätellä, niin mount toimi oletetetusti. Testaan vielä lisätä vaikka jonkin tiedoston ja katsoa, että tuleeko se palvelimelle myös:

$ nano testi.txt
$ ls 
foo.txt  public_html  publicsites  testi.txt  viskiprojekti

Siirryin palvelimelleni:

santeri@ubuntu-s-1vcpu-2gb-fra1-01:~$ ls
foo.txt  public_html  publicsites  testi.txt  viskiprojekti

Se toimii, kuten toivottukin.

Nyt haluan vielä tehdä sen oikeasti oikeaoppisesti, eikä siten, että kaikki menee nyt sekaisin, jos yhteys menisikin poikki. Siispä unmountaan ensiksi komennolla $ fusermount -u /home/santeri/mnt. Sitten vaan oikeaoppinen mount vielä: $ mount sshfs -o reconnect,ServerAliveInterval=5,ServerAliveCountMax=3 santeri@santerisiirila.me: mnt/

Tämän jälkeen testasin vielä samalla tavalla kuin aiemmassakin esimerkissä ja kaikki edelleen toimi. Kello on 16:00.

Jatkoa Sysstatiin

Kello on 18:43 seuraavaa päivää, eli siitä on yli vuorokausi, kun asensimme Sysstat-paketin koneellemme ja laitoimme datan keräyksen aktiiviseksi. Nyt jos käytämme vaikkapa komentoa $ sar, niin saamme jo paljon mielenkiintoisempia tuloksia kuin viimeksi. Minulla tuo komento antoi tällaista:

Screenshot from 2019-02-24 18-46-08.png

Tässähän näkyy, että CPU:n käyttöaste on todella pieni järjestelmässäni. %Idle on koko ajan yli 99 %, eli toisin sanottuna järjestelmäni kaipaisi lisätekemistä yli 99 % ajasta. Ainakin tämän lähteen mukaan. No, ihan hyvä tietää, ettei tietokoneen CPU ainakaan ole ylikuormitettu.

$ iostat -komennolla saatiin taas tällaista outputia:

Screenshot from 2019-02-24 18-55-53.png

Tämän ohjeen mukaan, %user on käyttöaste käyttäjätasolla (ohjelmat), %nice on käyttäjätasolla oleva käyttöaste “nice”-prioriteetilla, %system on taas kernel-tasolla tapahtuva suoritinkäyttö, %iowait kertoo idle-ajasta kun järjestelmä on saanut suuren I/O-pyynnön levylle, %steal viittaa aikaan kun hypervisor on palvellut jotain toista virtuaaliprosessoria ja siten odotuttanut suoritinta ja viimeiseksi %idle on vain toimettomuuden käyttöaste – suorittimella ei ole ollut tekemistä tarpeeksi.

Tuo toinen osio kertoo laitteisiin kohdistuneet kirjoitukset ja lukemiset (I/O). TPS viittaa siirtoihin sekunnissa (transfers per second), kB_read/s on luettu data (kilotavua sekunnissa), kB_wrtn/s on laitteelle kirjoitetun datan määrä (kilotavua sekunnissa), kB_read on kokonainen määrä tavuja luettu ja kB_wrtn on kokonaismäärä tavuja kirjoitettu laitteelle. Näistä voi päätellä, että palvelimelleni on kirjoitettu noin 33 miljoonaa kilotavua kokonaisuudessaan ja sieltä on luettu noin 2 miljoonaa kilotavua.

Viimeiseksi vielä, komennolla $ pidstat, joka siis myös kuuluu tähän Sysstat-pakettiin, saadaan tällainen lista:

Screenshot from 2019-02-24 19-09-41.png

Tämä näyttää vahvasti samalta kuin aiemmat statistiikkaohjelmat, mutta tässä on lisätty itse demoni, joka sitä käyttää. Listalla näkyy esimerkiksi Apache, SSH ja MySQL (MariaDB). Kuten tästäkin voisi päätellä, suoritinkäyttö ei todellakaan ole katossa, mutta tuosta voi tarvittaessa katsoa, jos jokin tuntuu syövän tehoja. Tuosta saa myös kätevästi kunkin demonin PID-numeron (Process ID). Muuta ihmeellistä en löytänyt tästä. Kello on 19:14.

 

Linux-palvelimet – Harjoitus 4

Osallistun Haaga-Helia ammattikorkeakoulussa Linux-palvelimet kurssille, jonka opettajana toimii Tero Karvinen. Kaikki tehtävät ovat hänen verkkosivuiltaan http://terokarvinen.com/.

Suoritan tehtävän pöytätietokoneellani, jossa pyörii Debian 9.7. ja samalla käytän Digital Oceanilta vuokrattua virtuaalipalvelinta, jossa pyörii Ubuntu 18.04.

Tehtävänanto kuuluu seuraavasti:

a) Laita hankkimallesi virtuaalipalvelimelle mahdollisuus tehdä kotisivuja normaalin käyttäjän oikeuksin.
s) Laita hankkimallesi virtuaalipalvelimelle käyttäjän kotihakemistoon tallennettu sivu näkymään Apachen oletussivuna.
y) Etsi palvelimesi lokeista esimerkkejä murtautumisyrityksistä. Voit etsiä lisätietoa IP-osoitteista ottamatta niihin yhteyttä esimerkiksi komennoilla ipcalc, geoiplookup ja whois.
b) Tee weppisivuja paikallisella koneellasi ja kopioi ne palvelimelle scp-komennolla.
c) Laita palvelimellesi jokin yksinkertainen PHP-sivu. Voit esimerkiksi tulostaa käyttäjän IP-osoitteen$_SERVER[‘REMOTE_ADDR’] tms. Ole huolellinen, jos otat vastaan syötteitä lomakkeilla (forms).

Vapaaehtoisia tehtäviä
Vinkkejä: lue linkitetyt artikkelit aikataulusta yltä ennenkuin alat tehdä tehtäviä. Muista viitata kaikkiin lähteisiin. Käytä aina hyviä salasanoja, joka hetki ja joka paikassa.
r) Kokeile julkista virtuaalipalvelinta (VPS). Voit vuokrata palvelimen esimerkiksi Linodelta, Amazonilta, DigitalOceanilta, OVH:lta tai monista muista paikoista. Edullisinta on käyttää GitHub Education -paketista DigitalOceanin palveluita.
Vaihtoehto: jos et jostain syystä halua vuokrata virtuaalipalvelinta, voit kokeilla tehdä testipalvelimen vagrantilla, mutta tämä ei ole yhtä jännittävää.
x) Laita julkinen domain-nimi osoittamaan koneeseesi. NameCheap ja Gandi ovat tunnettuja nimien vuokraajia. GitHub Education -paketista saa NameCheapilta .me domainin ilmaiseksi vuodeksi.

v) Laita monta DNS-nimeä samaan IP-osoitteeseen. Apache Name Based Virtual Hosting.t) Asenna WordPress. Se on maailman suosituin sisällönhallintajärjestelmä (CMS). Samalla opit asentamaan kolmannen osapuolen valmiita PHP-ohjelmia. WordPress kannattaa asentaa wordpress.org:sta löytyvästä tervapallosta (.tar.gz).
u) Kokeile WordPressia kirjoittamalla esimerkkisisältöä.
WordPress vapaaehtoisia:
c) Ota järkevät URLit (permalinks) käyttöön
d) Vaihda teema
e) Varmuuskopioi sisältö
f) Palauta varmuuskopioitu sisältö puhtaaseen WordPress-asennukseen
g) Tee WordPressiin oma teema
h) Asenna WordPressiin plugin (esim Dofollow)
i) Tee WordPressiin oma plugin
j) Lisää kuvia WordPressiin (ja laita tämä toimimaan)
k) Laita WordPress nimipohjaiseen virtuaalipalvelimeen (http://thello.foo tms)
Muita vapaaehtoisia:
l) Asenna Drupal ja kokeile sitä
m) Asenna Joomla ja kokeile sitä
n) Hanki virallinen, selainten hyväksymä TLS-sertifikaatti Let’s Encryptistä
o) Vaikea: Tee esimerkkisivu Python Flaskilla
p) Vaikea: Tee esimerkkisivu Ruby on Rails (tuotantotyyppinen, ei pelkkä yhden käyttäjän testipalvelin)
q) Vaikea: Tee esimerkkisivu Python Django:lla (tuotantotyyppinen, ei pelkkä yhden käyttäjän testipalvelin)

A.) S.) Etusivu käyttäjän kotihakemistoon

Tarkoituksena olisi ensimmäisessä tehtävässä luoda virtuaalipalvelimen kotisivu käyttäjän kotihakemistoon. Siispä otamme ensiksi yhteyttä palvelimeen $ ssh santeri@santerisiirila.me. Kun olemme sisällä voimme aloittaa tekemisen. Kello on 14:41.

Ensiksi luomme uuden uuden kansion, johon haluamme asettaa DocumentRoot-polun lopulta: $ mkdir publicsites. Kansion nimi tosin voi olla mikä tahansa. Sitten voimme käydä säätämässä asetuksia. $ cd /etc/apache2/sites-available. Tänne voimme asettaa uuden ohjauksen. Luomme siis siihen uuden .conf-tiedoston, joka tulee kertomaan uuden polun Apachen sivulle. Näin ainakin muistelin, että se menisi. Loin $ sudo nano publicsite.conf -komennolla tiedoston, joka oli täytetty opettajamme Tero Karvisen mukaan hänen kotisivuiltaan: http://terokarvinen.com/2018/name-based-virtual-hosts-on-apache-multiple-websites-to-single-ip-address. Publicsite.conf näytti lopuksi tältä:

<VirtualHost *:80>
ServerName santerisiirila.me
ServerAlias www.santerisiirila.me
DocumentRoot /home/santeri/publicsites/
<Directory /home/santeri/publicsites/>
Require all granted
</Directory>
</VirtualHost>

Sitten enabloin sivun komennolla $ sudo a2ensite publicsite.conf. Sen jälkeen yritin potkaista demonia uudelleen käyntiin $ systemctl restart apache2, joka normaalisti kysyisi vain salasanaa, mutta nyt sain tällaisen ilmoituksen:

==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to restart 'apache2.service'.
Multiple identities can be used for authentication:
1. santeri,,, (santeri)
2. santeri,,, (santeri)
Choose identity to authenticate as (1-2):

Valitsin tähän “1”, jonka jälkeen kysyi salasanaa. Aloin kirjoittaa salasanaa, mutta sitten asiat menivät ihan sekaisin. Kesken salasanan kirjoitusta sain tällaisen:

Password: Failed to restart apache2.service: Connection timed out
See system logs and 'systemctl status apache2.service' for details.
santeri@ubuntu-s-1vcpu-2gb-fra1-01:/etc/apache2/sites-available$ polkit-agent-helper-1: pam_authenticate

Tämän jälkeen painoin Ctrl + C, että saan tapettua prosessin, mutta silti jokin oli hullusti. En nähnyt enää inputtiani ja kaikki olivat vähän “sekaisin”. Kun laittoi $ ls, niin listaus näytti todella sekavalta. Päätin vain antaa $ exit ja kirjautua jälleen uudestaan koneeseen. Tämän jälkeen kaikki vaikutti taas olevan normaalisti. Nyt sain käynnistettyä demonin normaalisti, mutta laitoin varmuudeksi ihan $ sudo systemctl restart apache2, aiemmin en laittanut sudoa, koska se yleensä kysyy salasanaa kumminkin.

Sitten menin takaisin kotihakemistoon: $ cd /home/santeri/publicsites. Siellä sitten vielä laitoin $ echo moikka kotihakemisto! > index.php. Tämän jälkeen menin Debianillani santerisiirila.me -sivulle. Tässä lopputulos:

Screenshot from 2019-02-09 15-16-02.png

Kaikki toimi kuten pitikin loppujenlopuksi. Kello on 15:16.

A.) Käyttäjien omat kotisivut

Tajusin vasta aiemman kohdan tehtyä, että haluttiinkin ainoastaan jokaiselle käyttäjälle oma kotisivu. Tein siis vahingossa myöhemmän tehtävän aiemmin. Teemme siis nyt ne käyttäjäkohtaiset kotisivut. Kello on 15:20.

Siispä etsin vähän tietoa, koska olen vähän unohtanut, kuinka ne asetukset saatiinkaan päälle. Etsin hakukoneesta “enable user directories apache”. Löysin tämän sivun: https://websiteforstudents.com/enable-userdir-apache2-nginx-ubuntu-17-04-17-10/. Siinä sanotaan, että antaa vain komennon $ sudo a2enmod userdir, jonka jälkeen Apache itse neuvoo käynnistämään demonin uudestaan $ sudo systemctl restart apache2 -komennolla. Tämän jälkeen kävin katsomassa santerisiirila.me-domainissa pyörivän palvelimeni /~santeri-polun. Siellä oli tällainen tilanne:

Screenshot from 2019-02-09 15-31-29.png

Minulla siis oli siellä valmiiksi index-sivu. PHP ei ole enabloitu käyttäjähakemistoissa siispä haluan vielä korjata nopeasti. Etsin taas hakukoneesta “enable php user apache”, josta löytyi tämä Stack Overflow -lanka: https://stackoverflow.com/questions/42654694/enable-php-apache2 Tein kuten langassa sanottiin, mutta php 5 sijasta kirjoitin php 7.2. Eli siis $ sudo a2enmod php7.2. Tuli tällainen ilmoitus:

santeri@ubuntu-s-1vcpu-2gb-fra1-01:/etc/apache2/sites-enabled$ sudo a2enmod php7.2
Considering dependency mpm_prefork for php7.2:
Considering conflict mpm_event for mpm_prefork:
Considering conflict mpm_worker for mpm_prefork:
Module mpm_prefork already enabled
Considering conflict php5 for php7.2:
Module php7.2 already enabled

Siispä menin katsomaan /etc/apache2/mods-available/-kansion. Sieltä etsin php7.2.conf-tiedoston, joka on modin konfiguraatiotiedosto. Katsoin sitä ja alimmat rivit olivat kommentoimatta, jossa juuri luki

# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
<IfModule mod_userdir.c>
<Directory /home/*/public_html>
php_admin_flag engine Off
</Directory>
</IfModule>

Siispä $ sudoedit php7.2.conf. Sieltä vain #-merkillä kommentoimaan viimeiset viisi riviä pois. Sitten vielä viimeiseksi $ sudo systemctl restart apache2, jonka jälkeen lopputulos oli tällainen:

Screenshot from 2019-02-09 15-40-14.png

Melkein ihmettelin, että miksi ei näkynyt lopputulosta PHP-osiosta, mutta sitten tajusin, etten edes tehnyt sitä print()-metodilla. Siispä siinä ainostaan syy. Kaikki toimii kuten pitääkin. Kello on 15:41.

Y.) Murtautumisyritysten tutkiminen

Seuraavassa tehtävässä olisi tarkoitus katsoa VPS-palvelimeni lokeja ja yrittää etsiä sieltä murtautumisyrityksiä. Niitä olisi tarkoitus myös vähän tutkia esimerkiksi geoiplookup-, whois- ja ipcalc-ohjelmilla.

Kirjoitin hakukoneeseen hakusanaksi “cheking breaking attempts linux”, joka antoi minulle tämän postauksen: https://serverfault.com/questions/260706/possible-break-in-attempt-in-var-log-secure-what-does-this-mean

Siinä käyttäjällä on CentOS, mutta varmaankin tapahtuu Ubuntussa lähes samalla tavalla ainakin. Eli hän oli katsonut lokia /var/log/secure. Menen siis itsekin etsimään jotain vastaavaa. $ cd /var/log, niin päästään lokitiedostojen äärelle. Siellä huomasin auth.log-tiedoston. Nimeltään vaikuttaisi oikealta tiedostolta. $ less auth.log. Selasin lokia ja yllätyksekseni sekä kauhukseni eri autentikaatioyritysten määrä oli järkyttävä. Esimerkiksi jos annoin komennon $ less auth.log |grep root, niin tässä oli esimerkkituloksia:

Feb 9 13:59:43 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13751]: PAM 5 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=122.194.229.45 user=root
Feb 9 13:59:47 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13753]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=122.194.229.45 user=root
Feb 9 13:59:50 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13753]: Failed password for root from 122.194.229.45 port 8786 ssh2
Feb 9 14:00:05 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13753]: message repeated 5 times: [ Failed password for root from 122.194.229.45 port 8786 ssh2]
Feb 9 14:00:05 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13753]: error: maximum authentication attempts exceeded for root from 122.194.229.45 port 8786 ssh2 [preauth]
Feb 9 14:00:05 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13753]: Disconnecting authenticating user root 122.194.229.45 port 8786: Too many authentication failures [preauth]
Feb 9 14:00:05 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13753]: PAM 5 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=122.194.229.45 user=root
Feb 9 14:00:10 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13755]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=122.194.229.45 user=root
Feb 9 14:00:12 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13755]: Failed password for root from 122.194.229.45 port 33968 ssh2
Feb 9 14:00:15 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13759]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=112.85.42.232 user=root
Feb 9 14:00:15 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13755]: Failed password for root from 122.194.229.45 port 33968 ssh2
Feb 9 14:00:17 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13759]: Failed password for root from 112.85.42.232 port 20172 ssh2

Nämä olivat vain esimerkkejä. Jos laittoi $ tail -F auth.log, niin tuloksia tuli lähes joka sekunti lisää.

Testataanpa tutkia hieman näitä kyseisiä IP-osoitteita. Ensiksi $ sudo apt install ipcalc. Sitten $ man ipcalc. Tämän jälkeen tiesin, että vain $ ipcalc <osoite>, joten tässä tulokset yhdeltä IP:ltä:

Screenshot from 2019-02-09 16-07-49.png

Nämä tulokset eivät kertoneet minulle pahemmin mitään. Jatketaan tutkimista. Testataan whois-ohjelmaa seuraavaksi. $ sudo apt install whois. $ whois 122.194.229.45. Tällä kertaa tulokset olivatkin mielenkiintoisempia:

Screenshot from 2019-02-09 16-13-20.png

Tällaista tuloksissa esimerkiksi luki. Nähtävästi kiinalaisia, mutta varmaankin käyttävät joten whois-hämäystä, mutta saattaa jotkin tiedoista pitävän paikkaansa.

Katsoin vielä huvikseni toisenkin IP:n, joka oli yrittänyt murtautua:

Screenshot from 2019-02-09 16-21-46.png

Nähtävästi hollantilainen. Voisi ehkä jopa pitää paikkaansa. Yritin vielä katsoa geolookupia, mutta en löytänyt. Vaikka etsin ihan $ apt-cache search lookup geo. Siltikään ei mitään sellaista ohjelmaa löytynyt paketinhallinnasta. Kello on 16:26.

B.) Sivujen tekeminen paikallisesti ja lähetys SCP:llä

Seuraavaksi olisi tarkoitus luoda tiedostot paikallisella koneella ja sitten siirtää ne palvelimelle SCP:llä (https://en.wikipedia.org/wiki/Secure_copy). Muistaakseni tähän tarvittiin SSH-avainpari, joten etsin hakukoneesta ohjeita, kuinka sellainen laitetaan. Tein paikallisella koneella aluksi kyllä SSH-keygenillä itselleni SSH-avaimen, mutta en vain tiennyt, kuinka se otetaan vastaan palvelimella ja tallennetaan. Tein sen siis sen avaimen näin:

$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/santeri/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/santeri/.ssh/id_rsa.
Your public key has been saved in /home/santeri/.ssh/id_rsa.pub.

Menin hakemaan avaimen näin: $ cat /home/santeri/.ssh/id_rsa.pub ja kopioin sen leikepöydälle. Nyt vain miettimään, että mihin se tulee laittaa. Etsin hakukoneesta “add ssh key pair” ja löysin tämän artikkelin https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys–2. Otin sieltä $ cat ~/.ssh/id_rsa.pub | ssh santeri@santerisiirila.me “mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys” komennon, joka ymmärtääkseni lisäsi SSH-avaimen onnistuneesti. Kun testasin kirjautua palvelimelle, niin sen sijaan, että kysyisi salasanaa tunnukseen, niin kysyikin salasanaa avaimeen, joka oli suojattu erillisellä salasanalla. Tämän asetettua pääsin sisälle palvelimelle ja tietääkseni sain SSH-avainparin toimimaan.

Seuraavaksi tein nopeasti, jonkin sivun, jonka voin sitten siirtää SCP:llä.

Näin pari tuntia myöhemmin, niin eihän se lopulta kauhean nopeasti sittenkään sujunut. Yritin väsertää sivua pari tuntia, vaikka halusin vain todella yksinkertaisen sellaisen. Kiitos IDE:n (WebStorm), niin asioiden arvailu oli edes hieman helpompaa.

Nyt olisi tarkoitus siirtää sivusto SCP:llä tuolle palvelimelle. Löysin heti hakukoneesta tällaisen sivun: https://linuxize.com/post/how-to-use-scp-command-to-securely-transfer-files/. Siinä kerrotaan, että siirtäminen tapahtuu ihan vain $ scp <tiedosto> <käyttäjänimi>@<palvelin>:/<hakemisto>. Vaikka minulla on vain yksi tiedosto, niin haluan tehdä niin kuin minulla olisi kokonainen hakemistollinen kopioitavaa. https://serverfault.com/questions/264595/can-scp-copy-directories-recursively Tämän sivun mukaan “-r” olisi avainsana. Yritin scp -r testisivu/ santeri@santerisiirila.me:/publicsites, mutta sain vain virheen: scp: /publicsites: Permission denied. Outoa, koska pääsen ihan ilman salasanaa SSH:lla palvelimelle, koska loin avainparin. Etsin siis tähän vastausta. Löysin vastauksen tältä sivulta https://askubuntu.com/questions/66492/scp-copy-over-ssh-doesnt-work-permission-denied-error-please. Syy oli, että kirjoitin /publicsite, joka tarkoittaisi sitä, että yrittäisin kopioida juurihakemistossa sijaitsevaan publicsites-kansioon tiedostoja. Siispä joko koko polku (/home/santeri/publicsites) tai vain hakemisto (publicsites) ilman juurihakemistoa (/). Loppuun kirjoitetaan tiedostonimi. Tässä siis lopputulos:

Screenshot from 2019-02-09 18-34-37.png

Poistin index.php-tiedoston komennolla $ rm index.php, etteivät nämä kaksi index-sivua mene ristiin.

Sitten vielä visiitti santerisiirila.me-sivulla:

Screenshot from 2019-02-09 18-36-51.png

Se toimii! Tehtävässä meni paljon kauemmin CSS:n kanssa säätämisen takia, joten siksi tässä tehtävässä meni noin 2,5 tuntia. Kello on 18:38.

C. Yksinkertainen PHP-sivu

Seuraavaksi piti vielä tehdä yksinkertainen PHP-sivu. Päätin tehdä tehtävässä ehdotetun IP-näyttäjän. Päätin hakea vähän apuja. Löysin tämän sivun: https://ccm.net/faq/1965-php-how-to-display-ip-address-of-a-visitor. Siinä näytettiin IP:n formaatti paremmin kuin opettajamme ohjeessa (http://terokarvinen.com/2018/aikataulu-linux-palvelimet-ict4tn021-3004-ti-alkukevat-2019-5-op).

Sain IP:n printattua siis näin:

<?php print("$_SERVER[REMOTE_ADDR]");?>

Muutin myös tiedostomuodon .html-muodosta .php-muotoon komennolla $ mv index.html index.php. Tämän jälkeen sivu näytti IP-osoitteen, mutta haluan vielä säätää fonttia suuremmaksi ja paremman näköiseksi. Siispä muokkasin hieman koodia ja lopputulos näytti koodin osalta tältä:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Coming soon...</title>
<style>
body {
background-color: #888888;
}
.main {
display: block;
margin-left: auto;
margin-right: auto;
width: 100%;
}
h1 {

color: #ffffff;
margin-top: 10%;
vertical-align: middle;
font-family: GentiumAlt;
align-items: center;
text-align: center;
}
.ip {
margin-top: 5%;
font-family: Courier;
font-size: 45pt;
text-align: center;
}
</style>
</head>
<body>
<h1>Coming soon... </h1> <img src="https://free-astro.org/images/0/04/Debian_logo.png"> </div> </body> </html>

Sivu toimi mallikkaasti ja näyttää ihan tyylikkäältä. Lopputulosta en viitsi näyttää, koska siinä lukee IP-osoitteeni, mutta voi käydä katsomassa sivulta http://santerisiirila.me/. Tässä tehtävässä meni paljon vähemmän kuin oletin, mutta kiva joskus näinkin päin. Kello on 18:56.

N.) TLS-sertifikaatti

Näissä tehtävissä meni tällä kertaa sen verran vähän aikaa, että päätin tehdä yhden lisätehtävän, jonka samalla koen hyödylliseksi. En välttämättä koe WordPressiä niin hyödyllisenä, vaikka voisi olla joskus ihan käytännöllinen.

Menin Let’s Encryptin sivuille https://letsencrypt.org/getting-started/. Sieltä minut ohjattiin Certbotiin (https://certbot.eff.org/), koska minulla on “Shell access”. Sieltä piti valita alusta (Apache) ja järjestelmä (Ubuntu 18.04 LTS). Tein asennuksen täysin tämän ohjeen mukaan: https://certbot.eff.org/lets-encrypt/ubuntubionic-apache. Eli siis:

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

 

 

Tämän jälkeen käynnistin Certbotin komennolla:

$ sudo certbot --apache

Tämän jälkeen sertifikaattien asennus alkoi. Tässä on terminaalini output ja vastaukset kysymyksiin. Lihavoitan omat vastaukseni erottuvuuden vuoksi. Vastaukset ovat vaikeasti nähtävissä, koska ne ovat yleensä vain kirjaimen tai numeron pituisia.

santeri@ubuntu-s-1vcpu-2gb-fra1-01:~/publicsites$ sudo certbot –apache
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter ‘c’ to
cancel): santeri.siirila@gmail.com

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
(A)gree/(C)ancel: a

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let’s Encrypt project and the non-profit
organization that develops Certbot? We’d like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
(Y)es/(N)o: n

Which names would you like to activate HTTPS for?
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
1: santerisiirila.me
2: http://www.santerisiirila.me
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter ‘c’ to cancel): 1, 2
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for santerisiirila.me
http-01 challenge for http://www.santerisiirila.me
Enabled Apache rewrite module
Waiting for verification…
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/publicsite-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate to VirtualHost /etc/apache2/sites-available/publicsite-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/publicsite-le-ssl.conf
Deploying Certificate to VirtualHost /etc/apache2/sites-available/publicsite-le-ssl.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
1: No redirect – Make no further changes to the webserver configuration.
2: Redirect – Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you’re confident your site works on HTTPS. You can undo this
change by editing your web server’s configuration.
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Select the appropriate number [1-2] then [enter] (press ‘c’ to cancel): 2
Enabled Apache rewrite module
Redirecting vhost in /etc/apache2/sites-enabled/publicsite.conf to ssl vhost in /etc/apache2/sites-available/publicsite-le-ssl.conf

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Congratulations! You have successfully enabled https://santerisiirila.me and
https://www.santerisiirila.me

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=santerisiirila.me
https://www.ssllabs.com/ssltest/analyze.html?d=www.santerisiirila.me

Kun asennus oli valmis, niin kävin katsomassa sivuni, mutta en saanut yhteyttä enää. Odotan jonkin aikaa, jos se olisi vain väliaikainen yhteysvirhe. Toivottavasti nyt jokin ei levinnyt aivan totaalisesti. Ping toimii hyvin, mutta selain ei vain saa yhteyttä. Veikkaan, että Certbot muutti konfiguraatioita niin, että yhteyttä ei voida muodostaa. Kello on paussin kohdalla 19:28.

Taukoa pidin noin 15 minuuttia ja mietitytti, että miksei asiat toimi. Ping toimi, mutta ei HTTP-requestit. Sitten se valkeni minulle. Kävin katsomassa /etc/apache2/sites-available/, jonne oli generoitu publicsite-le-ssl.conf-tiedosto. En tiennyt, että SSL vaatii TCP-porttia 443 auki toimiakseen. Siispä, kun en saanut yhteyttä, niin palvelimeltani vain annoin komennon $ sudo ufw allow 443/tcp, jolla saadaan avattua tuo kyseinen portti. Käynnistin demonin vielä uudestaan $ sudo systemctl restart apache2, jonka jälkeen tulos oli tällainen:

Screenshot from 2019-02-09 20-00-43

Tadaa! Sivuillani on nyt toimivat sertifikaatit.

Tehtävän lopetettua kello on 20:03.

Tehtäviin meni siis kokonaisuudessaan noin 6 tuntia.

Linux-palvelimet – Harjoitus 3

Osallistun Haaga-Helia ammattikorkeakoulussa Linux-palvelimet kurssille, jonka opettajana toimii Tero Karvinen. Kaikki tehtävät ovat hänen verkkosivuiltaan http://terokarvinen.com/.

Suoritan tehtävän pöytätietokoneellani, jossa pyörii Debian 9.7.

Tehtävänanto kuuluu seuraavasti:

Tee viisi vapaavalintaista kohtaa. Säädä vaikeustaso oikeaksi: jos olet ihan alussa ja tämä on haastavaa, tee helpoimmat a b c d i. Jos osaat jo perusteet, tee useampia tai vaikeampia kohtia. Tarkoitus on, että tehtävät tehtyäsi osaat enemmän kuin osasit ennen.
a) Asenna Apache, laita käyttäjien kotisivut (http://example.com/~tero) toimimaan. Testaa esimerkkikotisivulla.
b) Surffaa oman palvelimesi weppisivuja. Etsi Apachen lokista esimerkki onnistuneesta (200 ok) sivulatauksesta ja epäonnistuneesta (esim 404 not found) sivulatauksesta. Analysoi rivit.
c) Tee virhe weppipalvelimella ajettavaan koodiin (esim PHP tai Python), etsi se lokista ja analysoi tuo lokirivi
d) Tee virhe johonkin Apachen asetustiedostoon, etsi ja analysoi tuo rivi. Etsimiseen sopivat esimerkiksi Apachen omat lokit, syslog sekä ‘apache2ctl configtest’.
e) Asenna ja kokeile PhpMyAdmin:a tai jotain muuta valmista weppiliittymää tietokantojen hallinnointiin.
f) Tee palvelimella ajettava weppiohjelma, joka tekee käyttäjälle jonkin yksinkertaisen laskun (esim. painoindeksi BMI)
g) Tee palvelimella ajettava weppiohjelma, joka käyttää tietokantaa. Voit tehdä jonkin yksinkertaisen CRUD-ohjelman, esimerkiksi TODO-listan
h) Tee Apachelle uusi sivu, joka näkyy suoraan palvelimen pääsivulla, mutta jonka sivuja voi muokata normaalin käyttäjän oikeuksilla (name based virtual host, DocumentRoot käyttäjän kotihakemistoon).
i) Kuinka monta eri HTTP Status:ta (200, 404, 500…) saat aiheutettua lokeihin? Selitä, miten aiheutit tilanteet ja analysoi yksi rivi kustakin statuksesta.
j) Asenna LAMP (Linux, Apache, MySQL, PHP). Testaa kunkin komponentin toiminta. Testaa lopuksi kokonaisuus. (Voit aloittaa tilanteesta, jossa Linux-käyttöjärjestelmä on jo asennettu, mutta ei muita (AMP) osia.
k) Kokeile jotain Flaskin uutta ominaisuutta flask-testipalvelimessa. Voit kokeilla esim. muotteja (templates), tietokantaa tai syötteiden ottamista lomakkeilta (forms).
l) Asenna Python Flask + PostgreSQL + Apache mod WSGI. Testaa kunkin komponentin toiminta. Testaa lopuksi kokonaisuus. (vaikea)

 

Vaikka tehtävänannossa on tarkoitus tehdä vain viisi tehtävää, niin haluan silti yrittää tehdä kaikki. Tämä on kumminkin vain tavoite. Todennäköistä, että vain viisi tulee tehdyksi.

L.) Python Flask, PostgreSQL ja Apache mod WSGI

Tehtävän L oli tarkoitus ilmeisesti olla vaikein. Kyseisessä tehtävässä tulisi siis asentaa Python Flash, Postgre ja Apache mod WSGI sekä testata niiden kokonaisuus. Aloitin tehtävän noin klo 12:00

Etsiskelin hetken ja löysin ensimmäisen sivuston, joka varmaankin voisi auttaa tässä tehtävässä: https://www.digitalocean.com/community/tutorials/how-to-deploy-a-flask-application-on-an-ubuntu-vps. Sivulla olevan ohjeen mukaan, ensiksi tulisi asentaa apache2. Joten asensin sen komennolla $ sudo apt install apache2. Sen jälkeen piti ohjeen mukaan asentaa libapache2-mod-wsgi ja python-dev, joten terminaaliin tämä:
$ sudo apt install libapache2-mod-wsgi python-dev

Kaikki näytti toimivan aluksi hyvin, ei virheitä asennuksessa. Python-dev minulla olikin jo entuudestaan, joten sain vain tiedon, että se on viimeisimmässä versiossaan. Versio oli 2.7, joka vähän herätti epäilystä, sillä Python on versiossa 3.7 tällä hetkellä ja ohje oli vuodelta 2013, mutta katsotaan, miten tässä käy. Seuraavaksi tulisi enabloida mod_wsgi, joka tapahtuu ohjeen mukaan komennolla $ sudo a2enmod wsgi – tuli vain teksti “Module wsgi already enabled”.

Sitten olisikin kai tarkoitus tehdä Flask-applikaatio. Tulen tekemään sen ohjeiden mukaan, vaikka ovatkin hieman vanhat. Ohjeen mukaan pitää ensiksi mennä hakemistoon /var/www/, joten $ cd /var/www. Sen jälkeen vielä $ pwd, jotta saamme varmuuden olevamme oikeassa alihakemistossa: /var/www. Tämän jälkeen tehdään kaksi FlaskApp-hakemistoa, yksi /var/www-hakemistoon ja toinen FlaskApp-hakemiston sisälle. Sen jälkeen vielä siihen toiseen FlaskApp-hakemistoon luodaan kaksi hakemistoa static ja templates. Eli siis näin:

$ sudo mkdir FlaskApp 
$ cd FlaskApp/
$ sudo mkdir FlaskApp
$ cd FlaskApp/ 
$ sudo mkdir static templates
$ pwd
/var/www/FlaskApp/FlaskApp
$ ls
static template

Sitten luomme hakemistoon vielä __init__.py-tiedoston, joka siis tehdään vaikka näin: $ sudo nano __init__.py
Tämän jälkeen siihen tulisi laittaa tämä pätkä koodia ja sen jälkeen tallentaa:

from flask import Flask
app = Flask(__name__) 
@app.route("/") 
def hello():
    return "Hello, I love Digital Ocean!" 
if __name__ == "__main__": 
    app.run()

Näiden jälkeen asennamme pip-ohjelman, mutta minulla taitaa olla jo se. Testataan silti vielä: $ sudo apt install python-pip. Kyllä minulla se oli, mutta kannatti tarkistaa. Seuraavaksi piti asentaa virtualenv pip:llä, mutta kun annoin komennon $ sudo pip install virtualenv, niin mainittiin jälleen Python 2.7. Katsotaan miten käy lopputuloksen. Sitten luotiin virtuaaliympäristö komennolla $ sudo virtualenv venv, jossa “venv” on halutun ympäristön nimi. Sitten aktivoidaan ympäristö antamlla komento: $ source venv/bin/activate, jolloin terminaali näytti tältä: Screenshot from 2019-02-02 13-53-29
Sitten kun virtuaaliympäristö on käynnissä, niin annetaan Flaskin asennuskomento           $ sudo pip install Flask. Kaikki vaikutti asentuvan ongelmitta. Sitten testattiin toimintaa $ sudo python __init__.py, jonka jälkeen terminaali näytti tältä: Screenshot from 2019-02-02 13-57-45

Käydään katsomassa selaimella tuo http://127.0.0.1:5000.Screenshot from 2019-02-02 13-59-15.png

Sehän toimi! Sitten voidaan tappaa tuo CTRL + C -yhdistelmällä ja sitten voidaan deaktivoida tuo ympäristö komennolla deactivate. Nyt ollaan testattu, että kokonaisuus toimii edes jotenkin. Seuraavaksi pitäisi tehdä konfiguraatiotiedosto, mutta minusta tuntuu, että se on tarkoitettu vain sellaisille palvelimille, jotka on tarkoitettu tuotantoon, eikä ainoastaan pyöri localhostissa. Joten ohitamme ohjeesta kohdan neljä ja hyppäämme suoraan viidenteen.

Vielä olisi tarkoitus tehdä .wsgi-tiedosto /FlaskApp-kansioon, joten siis annetaan jälleen komentoa terminaaliin: $ cd /var/www/FlaskApp. Sitten vaikka nanolla uusi tiedosto, jonka nimi on flaskapp.wsgi. $ sudo nano flaskapp.wsgi. Laitoin tiedostoon juuri kuten ohjeessa sanotaan eli:

#!/usr/bin/python
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/FlaskApp/")

from FlaskApp import app as application
application.secret_key = 'Add your secret key

Sitten käynnistetään apache2 uudelleen komennolla $ sudo service apache2 restart. Katsotaan sitten vielä, miltä sivu näyttää. Näyttää edelleen samalta ja toimii. Apache2 mod WSGI ja Python Flask siis toimivat. Vielä jos saisi yhdistettyä PostgreSQL:n tähän kokonaisuuteen. Yritetään!

Ensiksi varmaankin pitäisi asentaa PostgreSQL, mutta minulla on se jo asennettu, sillä käytimme sitä Ohjelmistoprojekti 1 -kurssilla. Se asennettaisiin normaalisti $ sudo apt install postgresql -komennolla. Joten tehdään varmaan ensiksi tietokanta. Mennään siis Postgren kehotteeseen luomaan kanta. $ sudo -u postgres psql, niin saamme luotua kannan postgres-käyttäjällä. Annoin ‘CREATE DATABASE test’ -komennon, sen jälkeen yhdistin siihen komennolla: # \connect test, tämä postauksen ansiosta: https://stackoverflow.com/questions/3949876/how-to-switch-databases-in-psql. Sen jälkeen loin sinne pöydän: # create table animals (id serial primary key, name text); Kiitos tästä formaatista Tommi Santamaalle (https://tommioffinland.fi/) tästä luontiformaatista.Nyt enää testidataa pöytään ja sitten voi yrittää kokonaisuutta yhdessä. Tältä sivulta katsoin lisäysformaatin: https://www.postgresql.org/docs/9.5/sql-insert.html. Eli siis #insert into animals values (1, ‘Giraffe’), (2, ‘Hippo’), (3, Flamingo); Tämän jälkeen tarkistus komennolla select * from animals;

Screenshot from 2019-02-02 15-14-35

Kaikki on tältä osin kunnossa. Sitten testaamaan kokonaisuutta.

Löysin tällaisen sivun, missä neuvottiin, kuinka tietokantayhteys otetaan Flaskillä. http://blog.sahildiwan.com/posts/flask-and-postgresql-app-deployed-on-heroku/ Siinä käytetään Herokua, mutta kyllä varmaan toimii ilman Herokuakin. Käytin myös apuna tätä videoa https://www.youtube.com/watch?v=VQM4QcozoW4. Asensin SQL Alchemyn komennolla $ pip install flask_sqlalchemy. Nyt kannan yhdistäminen voidaan varmaankin aloittaa.

Muokkasin aiemmin tehtyä __init__.py-tiedostoa $ sudo nano __init__.py-komennolla. Muokkasin sitä tällaiseksi:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = 'postgresql://postgres:Ku1v4hk0123#"!@localhost:5432/test'
db = SQLAlchemy(app)
@app.route("/")
def hello():
return db.query("SELECT * FROM ANIMALS;")
if __name__ == "__main__":
app.run()

Tuo ei toiminut ja olen yrittänyt jo monia muitakin muotoja, mutta saan internal server erroria koodilla 500. Olen tehnyt tehtävää jo noin 4,5 tuntia, että ehkä nyt on aika tehdä muita tehtäviä, jos vaikka tajuaisin tuon tehtävän jossain välissä paremmin. Kello on 16:42.

K.) Flask-ominaisuuden testaus

Seuraavaksi oli tarkoitus testata jotain Flask-ominaisuutta. Äskeisen tehtävän takia olen jo asentanut Flaskin, joten seuraavaksi vain etsin “flask templates”, kuten mainittiin tehtävänannossa. Kello on 16:55.

Löysin tällaisen sivun: https://code-maven.com/using-templates-in-flask. Siinä yritetään hyödyntää juuri templateja, mutta en ymmärrä kauhean hyvin, että kuinka ne toimivat. Tein kolme erillistä tiedostoa juuri kuten tuolla sanottiin, mutta saan vain virheilmoituksia, joka kerta kun yritän ajaa ohjelmaa.

Tiedostoni näyttävät tältä:

__init.py__

from flask import Flask, request, render_template
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
@app.route("/")

def hello():
return render_template('echo.html')

@app.route("/echo", methods=['POST'])
def echo(): 
return "You said: " + request.form['text']

if __name__ == "__main__":
app.run()

echo.html

<form action="/echo" method="POST">
    <input name="text">
    <input type="submit" value="Echo">
    </form>

    {% if text %}
      You said: {{ text }}
    {% endif %}

echo_template.py

from flask import Flask, request, render_template
app = Flask(__name__)
 
@app.route("/")
def hello():
    return render_template('echo.html')
 
@app.route("/echo", methods=['POST'])
def echo(): 
    return render_template('echo.html', text=request.form['text'])
 
if __name__ == "__main__":
    app.run(debug=True)

Hetken aikaa pähkäiltyä ja etsiskeltyä apua, löysin tämän langan: https://stackoverflow.com/questions/23327293/flask-raises-templatenotfound-error-even-though-template-file-exists. Tässä kerrottiin, että .html-ekstension omaava tiedosto pitää sijoittaa templates-hakemistoon. Siispä siirsin echo.html-tiedoston komennolla mv echo.html /var/www/FlaskApp/FlaskApp/templates/echo.html.

Kun ajoin __init__.py-tiedoston uudelleen niin kappas, sehän aukesi:

Screenshot from 2019-02-02 17-37-53

Vielä pieni testi:

Näytti toimivan ihan hyvin. Tiedostorakenne näytti siis tältä lopuksi:

/var/www/FlaskApp/FlaskApp$ ls
echo_template.py __init__.py static templates venv

Ja templates-hakemisto vielä lisäksi:

santeri@debian:/var/www/FlaskApp/FlaskApp$ cd templates/
santeri@debian:/var/www/FlaskApp/FlaskApp/templates$ ls
echo.html

Kaikki vakutti toimivan, kuten juuri pitäisikin. Siis lopetin tehtävä tähän pisteeseen. Kello on 17:48.

J. LAMP-asennus

Seuraavaksi olisi tarkoitus asentaa LAMP, eli Linux, Apache, MariaDB/MySQL ja PHP. Linux minulla on jo, sillä teen tälläkin hetkellä Debian jakelulla näitä tehtäviä. Apache2 minulla on aiempien tehtävien ansiosta, mutta SQL-tietokanta puuttuu sekä PHP, joten asennan ne nyt. Kello on 17:55

$ sudo apt install mariadb-client mariadb-server php7.0

Sitten asetetaan toimintakuntoon. Tarkistetaan localhost, että onko siellä jo jotain odottelemassa. Screenshot from 2019-02-02 18-00-10.png

Apache vaikutti olevan toiminnassa, joten seuraavaksi katsotaan, jos saataisi PHP toimimaan localhostissa. Etsin hieman apuja hakukoneesta, sillä kaikkea en tahdo muistaa oppitunnilta. Siispä tämä sivu toimii toistaiseksi apuna: https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-16-04 Seuraavaksi olisi kummiskin tarkoitus käydä enabloimassa PHP apache2:sta. Joten mennään Apache2-demonin hakemistoon eli /etc/apache2. Siellä vaan komento $ grep -ir php, jotta tiedetään, että mistä saadaan PHP toimintaan. Löytyi /mods-available, jossa piti vain kommentoida alimmat rivit, jotta PHP toimisi. Nyt PHP:n pitäisi tavallaan olla toiminnassa. Siispä testaamme luomalla /public_html-hakemiston kotihakemistoon.

$ cd 
$ mkdir public_html 
$ cd public_html/

Loin nopeasti index.php-tiedoston, joka on mahdollisimman yksinkertainen. Sen lähdekoodi oli tällainen:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php print(4 + 4)?>
</body>
</html>

Testasin käynnistää sivua, mutta tuli 404 sivulla http://localhost/~santeri. Sitten muistin, että eihän käyttäjäsivuja ole asetettu apachesta. Siispä googlailin, että miten ne enabloidaan. Menin opettajamme sivuille ja löysin sieltä tämän ohjeen: http://terokarvinen.com/2008/install-apache-web-server-on-ubuntu-4. Siinä mainittiin, että pitää laittaa tämä:

$ sudo a2enmod userdir

Sen jälkeen terminaali ilmoitti, että pitää laittaa $ systemctl restart apache2. Tein sen ja Debian kysyi salasanani. Tämän jälkeen testasin uudelleen sivua ja se toimi:

Screenshot from 2019-02-02 18-25-59

Viimeisenä pitäisi vielä laittaa MariaDB toimimaan. Joten siis ensiksi $ sudo mariadb. Sitten CREATE DATABASE TEST; Sen jälkeen USE test; (https://stackoverflow.com/questions/4005409/error-1046-no-database-selected-how-to-resolve) CREATE TABLE animals(id int primary key, name varchar(255)); (https://www.techonthenet.com/mariadb/tables/create_table.php) Sitten INSERT INTO animals VALUES (1, “Giraffe”),(2, “Tiger”),(3, “Hippo”); Tietokanta on valmis testaukseen, joten seuraavaksi enää pitää yrittää saada tieto näkymään tietokannasta.

Kello on 20:15, olen yrittänyt kymmeniltä eri sivuilta metodeja, kuinka saisin tietokantayhteyden, mutta mikään ei vain tunnu toimivan. Nämä sivut muunmuassa: https://www.tutorialspoint.com/mariadb/mariadb_create_tables.htm, http://terokarvinen.com/2018/php-database-select-and-insert-example-php-pdo, http://terokarvinen.com/2016/read-mysql-database-with-php-php-pdo ja https://www.youtube.com/watch?v=hSS1Ml6YOt8. Nämä olivat vain viimeisimmät, mutta ratkaisua ei löydy. En saa tietokannasta näytettyä dataa. Kello on 20:36.

H.) Name based virtual host

Heti ensimmäisenä löysin lehtorimme sivun: http://terokarvinen.com/2018/name-based-virtual-hosts-on-apache-multiple-websites-to-single-ip-address, jossa kuvataan oikein hyvin tämä konsepti.

Apache2 oli jos asennettu, joten jäljelle jäi ainoastaan:

echo "Default"|sudo tee /var/www/html/index.html

Menin $ cd /var/www/html, jossa oli index.html, jossa oli ainoastaan teksti “Default”. Tein täysin Tero Karvisen ohjeiden mukaan, eli siis loin santeri.siirila.com.conf-tiedoston /etc/apache2/sites-available/santeri.siirila.com.conf, joka näytti tältä:

$ sudoedit /etc/apache2/sites-available/pyora.example.com.conf
$ cat /etc/apache2/sites-available/santeri.siirila.com.conf
<VirtualHost *:80>
 ServerName santeri.siirila.com
 ServerAlias www.santeri.siirila.com
 DocumentRoot /home/xubuntu/publicsites/santeri.siirila.com
 <Directory /home/xubuntu/publicsites/santeri.siirila.com>
   Require all granted
 </Directory>
</VirtualHost>
$ sudo a2ensite santeri.siirila.com
$ sudo systemctl restart apache2

Tein aluksi santeri.siirila.com-sivulle noita asetuksia, mutta kuinka sattuikaan, se oli viety, siispä kesken tehtävän aloin säätää kaikki .com-alkuiset asiat .fi-muotoon. Tämän jälkeen yritin mennä selaimella santeri.siirila.fi, niin tuli ainoastaan error 403 Forbidden. Eli minulla ei olisi tunnuksia. En tiedä, mistä johtuu, mutta selvitellään. Yritin muokata index.html-tiedostoa, mutta mitään ei tapahdu. Siispä, jossain muissa oikeuksissa on virhe. Yritin $ systemctl restart apache2, mutta se ei auttanut ollenkaan.

Olen yrittänyt useita kertoja sivua ‘santeri.siirila.fi’, mutta saan aina vain forbidden 403, virheen. Kun vedin ‘hostname -I’-komennon, niin sain IP-osoitteella yhteyden localhostiin, jossa lukee default. Minun index.html-sivua, jossa on <h1>moi</h1> ei kuitenkaan näy.

Screenshot from 2019-02-02 22-01-56

Testasin luoda index.html-tiedoston minun kotihakemiston public_html kansioon. Loin siihen index.html-tiedoston ja tässä on lopputulos:

Screenshot from 2019-02-02 22-09-52

Tavallaan siis name based virtual hosting toimi, mutta ei kumminkaan root-hakemistossa. Tämä ei ole pääsivulla kuten piti olla, mutta en saa ymmärrettyä, kuinka pitäisi tehdä, kello on 22:11. Lopetan tehtävän toistaiseksi.

F.) Pieni webbiohjelma

Tehtävät ovat enemmän aikaa vieviä kuin oletin, kello on nyt 22:36, joten valitsin tämän. Ehkä nämä lasketaan viideksi tehtäväksi.

Tässä tehtävässä piti tehdä pieni web-ohjelma, kuten vaikka BMI-laiskuri. Siispä etsin aluksi taustatietoa, kuinka tällaisen voisi toteuttaa.

Kopioin aluksi tältä sivulta https://stackoverflow.com/questions/37195181/form-using-function-calculate-bmi-and-display-different-comment-fatal-error-and kaiken index.php-tiedostoon, jonka jälkeen testasin kyseistä kokonaisuutta ja sain 404 Not Found -virhee. Tiedosto yritti uudelleenohjata test.php-tiedostoon, mutta minulla ei sitä ollut, joten piti hieman tutkailla, että mitä sellainen tiedosto edes tarvitsisi sisälleen.

Olen katsonut useita eri lankoja, forumeita ja videoita. Lopulta löysin tämän videon: https://youtu.be/ZdP0KM49IVk. Tämän videon ansiosta sain .php- ja .html-tiedoston oikeaan formaattiin:

bmi.php

<!DOCTYPE HTML> 
<html> 
<head> 
</head> 
<body>
	<?php 
		$weight = $_POST["weight"];
		$height = $_POST["height"];
		$BMI = $weight / ($height * $height);
		print("Your BMI is " + $BMI);
	?>
</body>
</html>

index.html

<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<form action="bmi.php" method="POST">
<table>
<tr><td>Height in meters</td><td><input type="text" name="height" maxlength="4"></td></tr>
<tr><td>Weight in kilograms</td><td><input type="text" name="weight" maxlength="3"></td></tr>
</table>
<input type="submit" value="Calculate"></input>
</form>
</body>
</html>

Nämä prittasivat sivulle oikeaa formaattia ja laskivat BMI:n oikein. Kello on tehtävän loputtua 0:40.

 

Hienosäätö, Name Based Virtual Host

Kello on 13:15 seuraavana päivänä. Aion yrittää hienosäätää tehtäviä vielä virkeämmällä mielellä. Aloitan DocumentRoot-tehtävästä, jossa piti saada sivu näkymään palvelimen etusivulle ja samalla pitää asettaa muokkausoikeudet normaalille käyttäjälle.

Etsin aluksi hakukoneella apuja ja päädyin tälle sivulle: https://www.dyclassroom.com/howto-ubuntu/how-to-change-document-root-of-apache-on-ubuntu. Tämän dokumentin ansiosta päädyin /etc/apache2-demonin hakemistoon, jossa taas tutkiskelin eilen tekemiäni asioita. Menin tutkimaan /etc/apache2/sites-enabled- ja /etc/apache2/sites-available-hakemistoja, joissa oli erilaisia konfiguraatiotiedostoja. Annoin komennon $ cat santeri.siirila.fi.conf, jotta näkisin, mitä tiedosto sisältää. Siellä luki DocumentRoot /home/santeri/publicsites/santeri.siirila.fi. Yritin antaa sekä hakemistolle, että index.html-tiedostolle oikeuksia komennolla $ chmod -R 777 <tiedosto/hakemisto>. Ei auttanut, sivu antaa edelleen 403 Forbidden -virheilmoitusta. Jatkoin apujen etsimistä ja tämän sivun mukaan https://www.virtualhelp.me/applications/54-web-servers/895-403-forbidden-after-changing-documentroot-directory minun pitäisi muuttaa /etc/apache2/apache2.conf-tiedostoa, joten siis tein niin ja lisäsin siihen rivin

<Directory /home/santeri/publicsites/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

Ei siltikään auttanut, vaikka tämän jälkeen käynnistin demonin uusiksi komennolla $ systemctl restart apache2.

Löysin tämän sivun https://stackoverflow.com/questions/6959189/apache-virtualhost-403-forbidden. Siinä neuvotaan laittamaan tällainen litania /etc/apache2/sites-available/santeri.siirila.fi.conf-tiedostoon:

<Directory /home/santeri/publicsites/santeri.siirila.fi>
Order allow, deny
Allow from all
Require all granted
</Directory>

Tämän jälkeen testasin taas uudelleenkäynnistää apache2-demonia, niin sain ilmoituksen

$ systemctl restart apache2
Job for apache2.service failed because the control process exited with error code.
See "systemctl status apache2.service" and "journalctl -xe" for details.

Tein ohjeen mukaan näin:

$ systemctl status apache2.service 
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sun 2019-02-03 14:17:42 EET; 3min 12s ago
Process: 7171 ExecStop=/usr/sbin/apachectl stop (code=exited, status=1/FAILURE)
Process: 7213 ExecStart=/usr/sbin/apachectl start (code=exited, status=1/FAILURE)
Main PID: 7139 (code=exited, status=0/SUCCESS)

Tähän ongelmaan auttoi, kun poistin muutokset /etc/apache2/sites-available/santeri.siirila.fi.conf-tiedostosta. Sitten Apache käynnistyi taas normaalisti.

Olen pähkäillyt pari tuntia tämän ongelman äärellä. Ainoaksi ratkaisuksi keksin tähän hätään /public_html-hakemiston. Siispä testaan nyt vaihtaa santeri.siirila.fi-konfiguraatiot siihen polkuun.

Testasin kaikkea, muutin polkuja kahteen eri paikkaan toinen kotihakemiston public_html-kansioon ja toisella kerralla /var/www/html/-hakemistoon. Mikään ei tunnu auttavan, aina saan Forbidden-virhettä. Tältä ihan viimeisimmillään näytti:Screenshot from 2019-02-03 15-40-14

Minun mielestäni tuossa ei ole mitään vikaa, mutta pakko siinä on olla sillä saan aina 403-errorin. Kello on 15:43.

Hienosäätö, LAMP

Menin kotihakemistoni /public_html-kansioon ja poistin kaiken komennolla $ rm -rf * Sen jälkeen tein nanolla nopeasti index.php tiedoston. Tarkoituksena on siis saada ainoastaan tietokanta vuorovaikuttamaan muun ympäristön kanssa. Kello on 15:56.

Olen yrittänyt pähkäillä tätä jo pitkään. Olen testannut muuttaa PHP-koodia ja olen yrittänyt muokata asioita tietokannassa, mutta mikään ei tunnu toimivan. PHP toimii itsessään, mutta en vain saa tietokantayhteyttä toimimaan. Kirjoittamani koodi on otettu lehtorin Tero Karvisen nettisivuilta (http://terokarvinen.com/2018/php-database-select-and-insert-example-php-pdo) ja sitä on muokattu hieman enemmän minulle tarkoituksenmukaiseen muotoon. Se näyttää yrityshetkellä tältä:

<!doctype html>
<html>
<head>
</head>
<body>
<h1>animals</h1>
<?php
$user='testi';
$password='Ku1v4hk0123#"!';
$database='test';
$dsn="mysql:host=localhost;charset=UTF8;dbname=test";
// Open Connection, create new object of PDO class
$pdo=new PDO($dsn, $user, $password);
// Perform SQL Query
$pdoStatement=$pdo->prepare('SELECT * FROM animals;');
$pdoStatement->execute();
$hits=$pdoStatement->fetchAll();
// Print the $hits Array
foreach($hits as $row) {
echo "<p>".$row['id']." ".$row['name']."\n";
}
?>
<h2>testi</h2>
</body>
</html>

Tietokannassa yritin antaa kommennon GRANT ALL PRIVILEGES ON test TO testi@localhost IDENTIFIED BY ‘Ku1v4hk0123#”!’, mutta sekään ei auttanut. Kun hain käyttäjät kannasta ja katsoin heidän oikeudet, niin näytti tältä:

Screenshot from 2019-02-03 21-08-13.png

Joko tämä ongelma on tietokantayhteydessä tai sitten se on käyttäjäoikeuksissa, mutta en vain saa keksittyä vastausta. Olen lukenut todella monia eri lähteitä läpi, mutta yksikään ei oikein tuntunut auttavan minua. Hiominen jää siis hieman huonoon asemaan. Aikaa meni noin kaksi tuntia.

Loppumietteet

Tehtävät olivat paljon haastavampia ja vievät käsittämättömän määrän aikaa. En viitsi edes yrittää enää Apache mod WSGI, PostgreSQL ja Python Flask -yhdistelmän hiomista, sillä siinäkin se ongelma oli juuri tietokantayhteydessä. Ehkä opin jatkossa yhdistämään kannan ja saisin jopa nämä tehtävät paremmin tehtyä. Tästä jatketaan kokemuksia rikkaampina. Kokonaisaika näihin tehtäviin on käytetty ollut noin 20 tuntia. Ehkä hieman alle.

Linux-palvelimet – Harjoitus 2

Osallistun Haaga-Helia ammattikorkeakoulussa Linux-palvelimet kurssille, jonka opettajana toimii Tero Karvinen. Kaikki tehtävät ovat hänen verkkosivuiltaan http://terokarvinen.com/.

Ensimmäisen tehtävän suoritin omalla pöytäkoneellani, jossa pyörii Debian 9.7. Tehtävänanto kuuluu seuraavasti:

a) Aiheuta lokiin kaksi eri tapahtumaa: yksi esimerkki onnistuneesta ja yksi esimerkki epäonnistuneesta tai kielletystä toimenpiteestä. Analysoi rivit yksityiskohtaisesti.
b) Vapaaehtoinen kohta, ei ole opetettu vielä: Asenna SSH-demoni. Kokeile omalla ssh-palvelimellasi jotain seuraavista: ssh-copy-id, sshfs, scp tai git. (Helpoin lienee scp: ‘scp foo.txt tero@example.com:’)
c) Tee unelmien apt-get -komento: yksi komentorivi, joka asentaa suosikkiohjelmasi.
d) Asenna komentokehotteen paketinhallinnasta kolme itsellesi uutta komentorivillä toimivaa ohjelmaa. Kokeile kutakin ohjelmaa sen pääasiallisessa käyttötarkoituksessa.
e) Opettele ulkoa ja harjoittele tärkeimmät komennot (tätä “opettele ulkoa” alakohtaa ei tarvitse raportoida):
http://terokarvinen.com/2009/command-line-basics-4
http://terokarvinen.com/2008/commands-for-admin-4 (Karvinen T. 2019.)

2. a. Lokitapahtumat

Tarkoituksena oli tarkkailla ja analysoida lokitietoja. Lokitiedot oli tarkoitus aiheuttaa tahallisesti. Avasin ihan aluksi tietokoneeni ja boottasin Debianiini. Kun järjestelmä oli käynnistynyt, avasin terminaalin, johon kirjoitin ‘cd ../../..’, jotta pääsin Root-hakemistoon. Sitten menin sieltä ‘/etc/log’, jossa sijaitsee lokitiedostot. Muistin, että komento ‘tail’ antaa mahdollisuuden tiedoston seuraamiseen. Siispä laitoin terminaaliin ‘man tail’. Manuaalissa kerrottiin, että ‘-F’ on seuraukseen tarkoituksenmukainen komento. kirjoitin ‘tail -F auth.log’, mutta sainkin ilmoituksen:

santeri@debian:/var/log$ tail -F auth.log
tail: cannot open ‘auth.log’ for reading: Permission denied

Nähtävästi Debianilla ei pääse lokeihin ilman Root-oikeuksia. Siispä ‘sudo !!’-komento, jotta saan ajettua edellisen komennon uudestaan superuserina. Sittenhän alkoihikin tulla outputia! Terminaali sylkäisi seuraavaa ulos:

Jan 26 19:45:01 debian CRON[6105]: pam_unix(cron:session): session closed for user root
Jan 26 19:55:01 debian CRON[6571]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 26 19:55:01 debian CRON[6571]: pam_unix(cron:session): session closed for user root
Jan 26 20:04:38 debian sudo: santeri : TTY=pts/1 ; PWD=/var/log ; USER=root ; COMMAND=/usr/bin/tail -F auth.log
Jan 26 20:04:38 debian sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jan 26 20:05:01 debian CRON[6660]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 26 20:05:01 debian CRON[6660]: pam_unix(cron:session): session closed for user root
Jan 26 20:06:38 debian sudo: pam_unix(sudo:session): session closed for user root
Jan 26 20:06:40 debian sudo: santeri : TTY=pts/1 ; PWD=/var/log ; USER=root ; COMMAND=/usr/bin/tail -F auth.log
Jan 26 20:06:40 debian sudo: pam_unix(sudo:session): session opened for user root by (uid=0)

Seuraavaksi halusin jotain, mihin tarvitsen sudoa, joten päätin asentaa Binwalkin pakettityökalulla (apt). Siispä seuraava komento oli sudo apt install binwalk. Terminaali kysyi salasanaa, joten aluksi, laitoin salasanan väärin tarkoituksella ja toisella kerralla oikein. Sen jälkeen tarkistin, mitä auth.log on syljeskellyt sillä aikaa.

Jan 26 20:13:37 debian sudo: pam_unix(sudo:auth): authentication failure; logname= uid=1000 euid=0 tty=/dev/pts/2 ruser=santeri rhost= user=santeri
Jan 26 20:13:43 debian sudo: santeri : TTY=pts/2 ; PWD=/home/santeri ; USER=root ; COMMAND=/usr/bin/apt install binwalk
Jan 26 20:13:43 debian sudo: pam_unix(sudo:session): session opened for user root by (uid=0)

Virheellisessä kirjauksessa kerrotaan useita tietoja kirjautujasta, kuten käyttäjänimi ja ID. Oikeanlaisessa kirjauksessa taas kerrotaan noihin myös lisäksi ‘working directory’ ja myös komento, mitä käyttäjä käytti Roottina.

2. b. SSH-yhteys

Seuraavaksi olisi tarkoitus asentaa SSH-deamon. Avasin selaimen ja kirjoitin hakukoneeseen ‘install ssh daemon’, josta heti ensimmäisenä tuloksena tuli https://help.ubuntu.com/lts/serverguide/openssh-server.html.en. Olin jo asentanut SSH-clientin, joten en kokenut tarpeelliseksi enää katsoa ohjetta, koska siellä oli lähinnä valinnaista asiaa enää. Siispä laitoin komennon ‘touch foo.txt’, jotta olisi jotain mitä lähettää. Seuraavaksi laitoin ‘scp foo.txt a1704466@proto366.haaga-helia.fi’. Palvelin oli Ubuntu-palvelin, jota käytetään toisella kurssilla. Kävin tarkistamassa sen jälkeen SSH:lla palvelimelta, että onko siellä jotain. Ei ollut. En tiennyt, miten kuuluisi tehdä, joten päätin suosiolla luovuttaa, koska oli silti valinnainen tehtävä kyseessä.

2. c. Asennusskripti

Seuraavaksi oli tarkoitus tehdä pieni apt-komento, joka asentaa kivoja ohjelmia itselle. Päätin tehdä siitä samalla Bash-skriptin, koska miksikäs ei? Avasin VIM-editorin komennolla ‘vim asennus.sh’, joka samalla luo tiedoston. Kirjoitin siihen aluksi sen helpon leipätekstin, joka kuului seuraavasti: sudo apt install python3 gcc git vim’. Sitten etsin, että miten saan siitä oikean Bash-skriptin, joten päätin hakea sitä hakukoneesta. Löysin tämän sivun: https://bash.cyberciti.biz/guide/Hello,_World!_Tutorial. Siinä sanottiin, että pitää laittaa ensimmäiseksi rivi, jossa lukee ‘#!/bin/bash’. Sitten olikin kaikki valmista. Testasin ajaa skriptin kirjoittamalla ./asennus.sh, mutta ihmettelin jo, ettei se täydentänyt automaattisesti. Tuli virhe, bash: ./asennus.sh: Permission denied. Ajattelin, että pitääpi siis laittaakin Roottina. sudo ./asennus.sh. Tuli uudestaan virhe: sudo: ./asennus.sh: command not found. Päädyinpä siis takaisin sivulle. Ahaa, sivulla luki, että tiedostolle pitää antaa executable-oikeudet komennolla ‘chmod -x asennus.sh’. Sen jälkeen jopa sain jotain uloskin! Terminaali sylkäisi tällaista:

Reading package lists… Done
Building dependency tree
Reading state information… Done
gcc is already the newest version (4:6.3.0-4).
gcc set to manually installed.
git is already the newest version (1:2.11.0-3+deb9u4).
python3 is already the newest version (3.5.3-1).
python3 set to manually installed.
vim is already the newest version (2:8.0.0197-4+deb9u1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Kaikki asennettavat ohjelmat olivatkin jo asennettu ja päivitetty, joten mitään sen kummempaa ei tapahtunut. Elämä jatkuu.

2. d. Komentoriviohjelmat

Tässä tehtävässä oli tarkoitus asentaa apt:sta kolme uutta komentorivillä toimivaa ohjelmaa. Minulla ei ollut kauheasti hajua, mistä lähtisin liikkelle, koska niitä on niin pilvin pimein. Siispä päädyin hakemaan sitä hakukoneesta, josta pääsin sivulle: https://www.linuxnov.com/35-terminal-text-based-application-for-linux/ Ajattelin, että tuollainen voisi olla hyvä tällaiselle aloittelevalle henkilölle. Ensimmäisenä päätin asentaa Sudokun, jonka sai komennolla ‘sudo apt install sudoku’. Avasin ohjelman kirjoittamalla vain sudoku.

screenshot from 2019-01-26 22-24-02

Sudoku vaikutti toimivat hyvin ja juuri kuten kuuluikin.

Seuraavaksi päätin asentaa verkkoliikennettä analysoiva terminaalissa toimiva ohjelma vnState. Se tapahtui komennolla ‘sudo apt install vnstat’. Laitoin komentoriville vnstat, jos vaikka ohjelma aukeutuisi. Tuli ilmoitus: enp3s0: Not enough data available yet. Yritin vähän aiheuttaa trafiikkia, jos vaikka komento toimisikin. Ei edelleenkään toiminut, joten yritän sit myöhemmin uudelleen.

Viimeisenä asensin ohjelman nimeltä hTop. Sen tarkotus on olla prosessitarkastelija ja tietokoneen resurssien tarkastaja. Asennus tapahtui komennolla ‘sudo apt install htop’. Avasin ohjelman komennolla htop ja sitten se näyttikin tältä: screenshot from 2019-01-26 22-34-21

Kaikki vaikutti toimivan asianmukaisesti ja eri statukset muuttuivat reaaliajassa kuten kuuluikin. Tämä on todella hyödyllinen ohjelma!

Tämän jälkeen  testasin vielä vnstatia ja sain jopa outputtia! Ohjelma tulosti seuraavaa:

screenshot from 2019-01-26 22-39-05

Tämä työkalu ei ollutkaan niin hyödyllinen kuin aluksi luulin sen olevan, mutta ihan hauska.

Kaikki ohjelmat toimivat kuten kuuluikin, eikä niiden kanssa ollut sen ihmeellisimpiä ongelmia.

Linux-palvelimet – Harjoitus 1

Osallistun Haaga-Helia ammattikorkeakoulussa Linux-palvelimet kurssille, jonka opettajana toimii Tero Karvinen. Kaikki tehtävät ovat hänen verkkosivuiltaan http://terokarvinen.com/.

Ensimmäisen tehtävän suoritin omalla pöytäkoneellani. Tehtävänanto kuuluu seuraavasti:

a) Tee oma Linux-livetikku. Kokeile sitä jossain muussa kuin koulun koneessa. Tämä kohta ei edellytä asentamista – jos kuitenkin asennat, ota ensin varmuuskopiot. Jos ehdit tehdä tikun jo tunnilla, voit poikkeuksellisesti raportoida muistin perusteella jälkikäteen, mutta muista silloin mainita muistinvaraisuudesta.

b) Listaa testaamasi koneen rauta (‘sudo lshw -short -sanitize’).

c) Asenna kolme itsellesi uutta ohjelmaa. Kokeile kutakin ohjelmaa sen pääasiallisessa käyttötarkoituksessa.

d) Mitä lisenssiä kukin näistä ohjelmista käyttää? Selitä lyhyesti, mitä oikeuksia ja velvolisuuksia tuosta lisenssistä seuraa.

e) Listaa käyttämäsi ohjelmat (esim. MS Word), kunkin ohjelman käyttötarkoitus (esim. Tekstinkäsittely) ja vastaava vapaa Linux-ohjelma (esim. LibreOffice Writer). Jos johonkin tarkoitukseen ei löydy vapaata Linux-ohjelmaa, listaa sekin. (Päivitetty: korjasin tämän kohdan tunnuskirjaimen d->e)

f) Vapaaehtoinen lisätehtävä: varmuuskopioi tiedostosi (voit käyttää esimerkiksi ulkoista USB-levyä) (Karvinen T. 2018.)

 

  1. a. Livetikku

Avasin selaimen, menin osoitteeseen https://xubuntu.org/download, latasin torrent-tiedoston ja käynnistin BitTorrentin. Ostin USB 3.0 -muistitikun, koska tarvitsin sitä tähän kyseiseen tehtävään. Menin osoitteeseen https://rufus.ie/ ja latasin sieltä Rufus 3.4 -Windows-ohjelman. Käynnistin Rufuksen heti ladattuani sen. Annoin oletusasetusten olla ja latasin ohjelmistoon Xubuntun ISO-tiedoston, jota ohjelma käyttää asentaakseen käyttöjärjestelmän tikulle.
Aloitin alustamisen ja bootattavan USB:n tekemisen. Sain ilmoituksen:
“Tämä kuva käyttää Syslinuxia 6.03/20171017, mutta tämä sovellus sisältää asennustiedostot vain Syslinuxille 6.03/2014-10-06.

Koska Syslinuxin uudet versiot eivät ole keskenään yhteensopivia, eikä Rufus voisi sisältää niitä kaikkia, on kaksi lisätiedostoa ladattava internetistä (‘ldlinux.sys’ ja ‘ldlinux.bss’):
– Valitse ‘Kyllä’ yhdistääksesi internetiin ja ladataksesi nämä tiedostot.
– Valitse ‘Ei’ peruaksesi toiminnon

Huomio: Tiedosto ladataan nykyiseen sovelluskansioon ja niitä käytetään automaattisesti uudelleen niiden löytyessä.”

Valitsin tähän ilmoitukseen kyllä, mutta sen jälkeen sain vielä toisen ilmoituksen:

“ISOHybrid-levykuva havaittu.

Valitsemasi levykuva on muotoa ‘ISOHybrid’. Tämä tarkoittaa, että se voidaan kirjoittaa joko ISO-kuvana (tiedostojen kopiointi) tai DD-kuvana (levykuva). Rufus suosittelee käyttämään ‘ISO-kuva’ -tilaa, jotta sinulla pysyy täysi pääsy asemaan kirjoittamisen jälkeen. Jos törmäät ongelmiin käynnistyksessä, voit yrittää kirjoittaa levykuvaa uudelleen ‘DD-kuva’ -tilassa.

Valitse tila, jota haluat käyttää levykuvan kirjoittamiseen:

[] Kirjoita ISO-kuvana (Suositellaan)
[] Kirjoita DD-kuvana”

Valitsin ISO-kuvan näistä kahdesta vaihtoehdosta.

Rufus antoi vielä varoitusilmoituksen:

“VAROITUS: KAIKKI TIEDOT LAITTEESSA ‘KINGSTON (G:) [128 GB]’ POISTETAAN.
Jatkaaksesi toimenpidettä valitse OK. Lopettaaksesi valitse PERUUTA.”

Valitsin OK.

Kun tikun asentaminen oli mennyt loppuun, suljin tietokoneeni, jossa pyöri silloin Windows 7 -käyttöjärjestelmä. Sitten käynnistin koneen uudestaan ja painoin F2-näppäintä, jolla avautuu minun UEFI/BIOS. Laitoin sieltä Boot options -valikosta Boot override -vaihtoehdoksi Kingston DataTraveler 3.0 PMAP (118368MB), joka oli juuri se tikku, jonka formatoin aiemmin. Xubuntu alkoi pyöriä ja avasi valikon, josta valitsin kieleksi englannin ja otin valinnan ‘Try Xubuntu’ asentamisen sijaan, koska pöytäkoneellani on jo Debian 9, enkä koe tarvitsevani – ainakaan vielä – kahta Linux-käyttöjärjestelmää. Molemmat näytöt toimivat heti “out of box”, eli ei vaatinut mitään ajureiden asentamista tai vastaavaa. Kaikki vaikutti olevan kunnossa.

  1. b. Laitelistaus

Seuraavaksi piti tehtävänannon mukaan listata koneessa oleva rauta käyttäen komentoa ‘sudo lshw -short -sanitize’. Googlasin, mikä olikaan hotkey terminaalin avaukselle, jonka jälkeen avasin terminaalin näppäinyhdistelmällä Ctrl + Alt + T (Lifewire 2018). Kirjoitin terminaaliin ‘sudo lshw -short -sanitize’, mutta tajusin näppäimistöni olevan eri järjestyksellä kuin pohjoismaiden näppäimistöt ja oli siksi hankaluuksia aluksi löytää miinusmerkki ( – ).

Terminaali sylkäisi seuraavanlaisen litanian:

H/W path Device Class Description
==============================================================
system System Product Name (SKU)
/0 bus Z170 PRO GAMING
/0/0 memory 64KiB BIOS
/0/45 memory 16GiB System Memory
/0/45/0 memory 8GiB DIMM DDR4 Synchronous 26
/0/45/1 memory [empty]
/0/45/2 memory 8GiB DIMM DDR4 Synchronous 26
/0/45/3 memory [empty]
/0/4b memory 256KiB L1 cache
/0/4c memory 1MiB L2 cache
/0/4d memory 6MiB L3 cache
/0/4e processor Intel(R) Core(TM) i5-6600K CP
/0/100 bridge Skylake Host Bridge/DRAM Regi
/0/100/1 bridge Skylake PCIe Controller (x16)
/0/100/1/0 display GM204 [GeForce GTX 970]
/0/100/1/0.1 multimedia GM204 High Definition Audio C
/0/100/14 bus Sunrise Point-H USB 3.0 xHCI
/0/100/14/0 usb1 bus xHCI Host Controller
/0/100/14/0/3 multimedia HyperX Virtual Surround Sound
/0/100/14/0/4 input SteelSeries Rival 700 Gaming
/0/100/14/0/6 input Corsair Gaming K70 LUX RGB Ke
/0/100/14/1 usb2 bus xHCI Host Controller
/0/100/14/1/2 scsi6 storage DataTraveler 3.0
/0/100/14/1/2/0.0.0 /dev/sdd disk 124GB DataTraveler 3.0
/0/100/14/1/2/0.0.0/0 /dev/sdd disk 124GB
/0/100/14/1/2/0.0.0/0/1 /dev/sdd1 volume 115GiB Windows FAT volume
/0/100/16 communication Sunrise Point-H CSME HECI #1
/0/100/17 storage Sunrise Point-H SATA controll
/0/100/1b bridge Sunrise Point-H PCI Root Port
/0/100/1b.2 bridge Sunrise Point-H PCI Root Port
/0/100/1b.2/0 enp3s0 network 82574L Gigabit Network Connec
/0/100/1c bridge Sunrise Point-H PCI Express R
/0/100/1c/0 bus ASM1142 USB 3.1 Host Controll
/0/100/1c/0/0 usb3 bus xHCI Host Controller
/0/100/1c/0/1 usb4 bus xHCI Host Controller
/0/100/1d bridge Sunrise Point-H PCI Express R
/0/100/1f bridge Sunrise Point-H LPC Controlle
/0/100/1f.2 memory Memory controller
/0/100/1f.3 multimedia Sunrise Point-H HD Audio
/0/100/1f.4 bus Sunrise Point-H SMBus
/0/100/1f.6 network Ethernet Connection (2) I219-
/0/1 scsi0 storage
/0/1/0.0.0 /dev/sda disk 250GB Samsung SSD 850
/0/1/0.0.0/1 /dev/sda1 volume 100MiB Windows NTFS volume
/0/1/0.0.0/2 /dev/sda2 volume 232GiB Windows NTFS volume
/0/2 scsi1 storage
/0/2/0.0.0 /dev/sdb disk 500GB WDC WDS500G2B0A-
/0/2/0.0.0/1 /dev/sdb1 volume 465GiB Windows NTFS volume
/0/3 scsi2 storage
/0/3/0.0.0 /dev/sdc disk 1TB ST31000524AS
/0/3/0.0.0/1 /dev/sdc1 volume 351GiB Windows NTFS volume
/0/3/0.0.0/2 /dev/sdc2 volume 482GiB Windows NTFS volume
/0/3/0.0.0/3 /dev/sdc3 volume 97GiB Extended partition
/0/3/0.0.0/3/5 /dev/sdc5 volume 4767MiB Linux swap volume
/0/3/0.0.0/3/6 /dev/sdc6 volume 92GiB EXT4 volume
/1 power To Be Filled By O.E.M.

Tehtävä oli käytännössä tehty, mutta halusin vielä saada näppäimistöni Nordic layout -järjestykseen, joten googlasin jälleen apua. Testasin tällaisia komentoja, jotka pohjautuivat googlauksieni tuloksiin, ennen kuin löysin vastauksen: xfce, setxkbmap -fi, setxkbmap -fin, setxkbmap, setxkbmap -print, setxkbmap -help, setxkbmap -keycodes ja setxkbmap -print -layout. (Reddit, 2017.) Lopulta tajusin formaatin ja sain vaihdettua näppäimistöni toimimaan normaalisti komennolla “setxkbmap -layout fi”.

  1. c. Ohjelma-asennukset

Seuraavaksi oli luvassa kolmen ohjelman asentaminen. Tähän tehtävänantoon valitsin Spotifyn, Discordin ja Braven. Tähän tehtävään oli vaikea valita ohjelmia, kun en tiennyt, että pitikö niiden olla ohjelmia, jotka ovat normaalisti käytössä, mutta ei tällä käyttöjärjestelmällä, joten päätin tehdä tavallaan jaotettuna eli Spotify ja Discord ovat normaalistikin minun Windowsillani, mutta Brave oli taas ainoastaan nimeltään tuttu.

Aloitin tehtävän avaamalla selaimen. Hain verkosta ‘spotify linux’, josta sain linkin Spotifyn omalle sivulle. Sivulla oli lista neljällä kohdalla, ja siinä asetettiin komentoja terminaaliin. Listaus oli seuraavanlainen:

# 1. Add the Spotify repository signing keys to be able to verify downloaded packages
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 931FF8E79F0876134EDDBDCCA87FF9DF48BF1C90

# 2. Add the Spotify repository
echo deb http://repository.spotify.com stable non-free | sudo tee /etc/apt/sources.list.d/spotify.list

# 3. Update list of available packages
sudo apt-get update

# 4. Install Spotify
sudo apt-get install spotify-client

Syötin jokaisen komennon listassa käyttämällä näppäinyhdistelmää Ctrl + Insert ja Shift + Insert, jotka ovat myös terminaalissa toimivia tekstinkopiointimenetelmiä. Kaikki asentui juuri kuin pitikin ja kun viimeinen vaihe oli suoritettu, kirjoitin terminaaliin ‘spotify’, joka avasi Spotify-ohjelman. Kaikki toimi kuin oli tarkoituskin ja kirjauduin sisään. (Spotify 2019.)

Seuraavaksi asensin Discordin. Aloitin asennuksen etsimällä taas verkosta hakusanoin ‘discord linux’. Sain sieltä itselleni Discordin sivut, josta piti ladata ohjelma manuaalisesti joko .deb- tai .taz-gz-tiedostona. Päätin ladata .tar-gz-tiedoston, koska ajattelin .deb-tiedostomuodon olevan Debianille. (Discord 2019.) Latauksen jälkeen terminaaliin ‘ls’, jotta näin, missä olin. Sitten cd Downloads/, jonka jälkeen yritin laittaa ‘dpkg -i Discord-0.0.8.tar.gz’. Ei toiminut, joten tietenkin laitoin ‘sudo apt install dpkg’, koska se ainakin toimi Debianilla pakettejen purkajana. Ei toiminut vieläkään purku, joten menin taas verkkoon etsimään vastauksia.

Etsin ‘tar.gz xubunu’ ja löysin foorumin, jossa mainittiin xvzf-komento (Ubuntu Forums 2019). Sain siten purettua paketin viimein, mutta en saanut asennettua. Alkoi ärsytys vallata, joten päätin hankkia Snap-työkalun. Laitoin sitä kummempia etsimättä ‘sudo apt install snap’, jolla sain Snapin ladattua. Sen jälkeen laitoin komennon ‘sudo snap install discord’. Asentaminen alkoi. Lopulta kun kaikki oli asentunut, niin laitoin terminaaliin vain ‘discord’, niin ohjelma avautui kirjautumisruudun kera. Kaikki tuntui toimivan hyvin.

Viimeiseksi oli tarkoitus asentaa Brave. Ajattelin testata ihan kummempia ihmettelemättä, että toimisiko komento ‘sudo apt install brave’. Se ei toiminut. Testasin sen jälkeen ‘sudo snap install brave’, sehän toimi kuin toimikin! Brave asentui nopeasti ja lopulta testasin vain laittamalla taas komennon ‘brave’ terminaaliin ja sitten selain aukesikin.

  1. d. Ohjelmalisenssit

Seuraavassa tehtävänannossa tuli selvittää kunkin ohjelmien lisenssit. Mitä kukin ohjelma pitää sisällään ja miten sisältöä saa käyttää.

Etsin jälleen hakukoneesta ‘spotify licence’, jolloin sain Spotifyn verkkosivuilla sijaitsevat käyttöehdot. Kohdassa neljä kerrottaan käyttäjän oikeuksista käyttää sovellusta. Lyhyesti sanottuna Spotify-ohjelman hallitsija saa rajoitetun, ei-yksinomaisen ja peruutettavissa olevan lisenssin Spotify-palvelun käyttöön sekä rajoitetun, ei-yksinomaisen ja peruutettavissa olevan lisenssin sisällön henkilökohtaiseen ja ei-kaupalliseen viihdekäyttöön. Kaikki Spotify-ohjelmistosovellukset ja sisältö lisensoidaan käyttäjälle – niitä ei myydä. (Spotify 2019.)

Seuraavaksi katsoin Discordin käyttöehdot. Discordin lisenssissä sanottiin, että ohjelma on ilmainen ja jokainen, joka omistaa sen, voi muokata, kopioida, käyttää, yhdistää, jakaa, alilisensoida ja myydä sitä. Discord on avoin ja vapaa ohjelmisto. (Discord 2019.)

Lopuksi katsoin Braven käyttöehdot. Heidän GitHub-sivulla oli lisenssitiedosto, jossa luki, että käyttäjällä on maailmanlaajuinen, tekijänoikeuskorvausvapaa ja ei-ekslusiivinen lisenssi. Immateriaalioikeuksien puitteissa voidaan käyttää, luoda uudelleen, asettaa saataville, muokata, näyttää, suorittaa, jakaa ja muuten käyttää hyväksi. Myös Brave on siis avoin ja vapaa ohjelma. (Github 2019.)

  1. e. Vapaat ohjelmat

Viimeiseksi tuli listata omia ohjelmia, joita käyttää normaalisti ja listata niille mahdollinen vapaa Linux-ohjelma. En itse käytä niin monia ohjelmia, että olisin keksinyt tähän paljon vaihtoehtoja, mutta yritin keksiä edes jotain.

Adobe Acrobat ja Atril Document Viewer – Näillä kahdella on sama käyttötarkoitus eli .pdf-tiedostojen lukeminen. Acrobat ei tuo muita ominaisuuksia joita edes haluaisin, joten tuo olisi helppo muutos.

MS Word ja LibreOffice Writer – Ajavat saman asian eli dokumenttien kirjoituksen.

MS Excel ja LibreOffice Calc – Ajavat ymmärtääkseni myös saman käyttötarkoituksen eli taulukot ja laskennan.

Jet Brains IDE:t ja VIM/Emacs – Ajavat tavallaan saman käyttötarkoituksen eli ohjelmoinnin/tekstieditoinnin, mutta olen varma, ettei samoja ominaisuuksia tule esimerkiksi Emacsissa kuin Jet Brainsin IDE:issä.

Spotify – Suljetun lähdekoodin ohjelmisto musiikin streamaukseen, eikä tavallaan ole samankaltaista ohjelmistoa vapaana ja ilmaisena, koska menisi muuten lähes laittomuuden puolelle.

Brave/Firefox – Molemmat ovat verkkoselaimia. Firefox löytyy valmiiksi Linuxista, niin sitä voi varsin hyvin käyttää, mutta Brave on myös ilmainen Linux-ohjelma, joten riippuu vähän mistä pitää.

Discord – VoIP- ja chat-ohjelma. Discord on jo valmiiksi avoin ja ilmainen ohjelma, myös Linuxille.

 

Lähteet

Lifewire 2018. Newell G. 5 Ways to Open a Terminal Console Window Using Ubuntu. Luettavissa: https://www.lifewire.com/ways-to-open-a-terminal-console-window-using-ubuntu-4075024 Luettu: 19.1.2019

Karvinen T. 2018. Aikataulu – Linux palvelimet ict4tn021-3004 ti – alkukevät 2019 – 5 op Luettavissa: http://terokarvinen.com/2018/aikataulu-linux-palvelimet-ict4tn021-3004-ti-alkukevat-2019-5-op Luettu: 19.1.2019

Reddit 2017. Xubuntu 16.04 always reverts keyboard layout to US english. Luettavissa: https://www.reddit.com/r/xubuntu/comments/65bd63/xubuntu_1604_always_reverts_keyboard_layout_to_us/ Luettu: 19.1.2019

Spotify 2019. Spotify for Linux. Luettavissa: https://www.spotify.com/fi/download/linux/ Luettu: 19.1.2019

Ubuntu Forums 2008. How to install .tar.gz and .tgz files. Luettavissa: https://ubuntuforums.org/showthread.php?t=1006587 Luettu: 19.1.2019

Github 2019. Brave. Luettavissa: https://github.com/brave/brave-browser/blob/master/LICENSE Luettu: 19.1.2019

Spotify 2019. Spotifyn käyttöehdot. Luettavissa: https://www.spotify.com/fi/legal/end-user-agreement/ Luettu: 19.1.2019

Discord 2019. Luettavissa: https://discordapp.com/download Luettu: 19.1.2019

Discord 2019. Acknowledgements. Luettavissa: https://discordapp.com/licenses Luettu: 19.1.2019

Rufus Luettavissa: https://rufus.ie/ Luettu: 19.1.2019