Arvioitava labraharjoitus


Päivän agendana on tehdä vanha laboratorioharjoitus. Aloitan tehtävät klo 22:00.

## LAMP Asenna LAMP (Linux, Apache, MySQL, PHP) ja testaa sen toiminta. 
## Kuormitusta Kerää kuormitustietoja koneelta koko harjoituksen ajalta. Analysoi tiedot tiiviisti aivan harjoituksen lopuksi.
## Sorkka ja Rauta Oy:n CRM Tarvitsemme asiakastietokannan. Tee tietokanta, jossa on seuraavat asiakkaat: - Kulta ja Kaivos ky - Piilosana ry - MetalliMake Tee PHP-ohjelma, joka lukee nämä tietueet. Laita tämä sivu näkyviin osoitteessa http://sorkkacrm.example.com Voit simuloida nimipalvelun toimintaa hosts-tiedoston avulla. Tässä harjoituksessa sivulle pääsyä ei tarvitse rajoittaa salasanalla, vaan sen tule näkyä kaikkialle nettiin.
## Rosvoja porteilla Onko koneellemme yritetty murtautua? (Kyllä). Etsi omalta paikalliselta koneeltasi todisteet tapauksesta, jossa koneellesi on yritetty murtatua. Analysoi tiiviisti tähän liittyvät tiedot.
## Sorkan sivut Tee staattinen HTML5 weppisivu, jonka otsikkona (molemmat title ja h1) on "Sorkka ja Rauta Oy". Laita sivu näkyviin osoitteeseen http://rauta.example.com/ . Voit simuloida nimipalvelun toimintaa hosts-tiedoston avulla.
## Einarin esimerkki Einari Vähä-aho ryhtyy koodaamaan. Tee einarille käyttäjä 'einari'. Tee einarille esimerkkikotisivu PHP:lla ja laita se näkymään osoitteessa http://localhost/~einari/ . Esimerkkisivun pitää tulostaa "Einari" käyttäen PHP:n print-funktiota.


Aloitetin kuormitustietojen keräämisestä. Sudo apt-get upgrade/update aluksi.

Asensin sudo apt install sysstatilla kuormitusta seuraavat softat.

/etc/default/ sudo nano sysstat -filesta kävin laittamassa monitoroinnin päälle.

Sudo service sysstat restartilla käynnistin palvelun uudelleen ja ajoin sar-komennon. Homma pelittää!

Seuraavaksi asensin LAMP-pinon.

Sudo apt install apache2
Ja laitoin localhostiin filen oletusnäkymän tilalle.
echo testsite|sudo tee /var/www/html/index.html

Ajoin sudo a2enmod userdir käyttöön einari-käyttäjää ajatellen. Boottasin apache2 tämän jälkeen.

Seuraavaksi asensin mariadb:n.
sudo apt install mariadb-server mariadb-client. Tein uuden tietokannan sorkkacrm.

CREATE DATABASE sorkkacrm CHARSET utf8;
Query OK, 1 row affected (0.00 sec)

CREATE USER ‘sorkkacrm’@’localhost’ IDENTIFIED BY ‘****************’;

GRANT ALL ON sorkkacrm.Asiakkaat to ‘sorkkacrm’@’localhost’;

Seuraavaksi tein taulun ja lisäsin sinne esimerkkitietueet:

Ja näin minulla oli toimiva mariadb!

Ei ole LAMP stackia ilman P:ta, eli lähdetään asentamaan PHPta.

sudo apt-get install libapache2-mod-php7.2
sudo apt-get install php-mysql

Editoin vielä conffitiedostoa komennolla
sudoedit /etc/apache2/mods-available/php7.2.conf

Käynnistin vielä apassin uudelleen muutoksien jälkeen sudo systemctl restart apache2 -komennolla.

Seuraavaksi testasin PHP:n toimivuuden. Tein uuden käyttäjän “einari” sudo adduser einari -komennolla. Tein einarin hakemistoon sudo mkdir public_html -komennolla kansion ja lisäsin sinne index.php -filen jossa printataan yksinkertaisesti einari

<?php print(“einari”) ?>

Tein xubuntu -käyttäjälle public_html -kansion ja sinne index.php -filen. Lainasin Tero Karvinen.comin SQL/PHP -scriptia jolla haetaan tietokannasta tietueita.

   <?php
// (c) 2016 Tero Karvinen http://terokarvinen.com
//connect
$user='sorkkacrm';
$password='XXXXXXXXXXXXXXXXX';
$database=$user;
$dsn="mysql:host=localhost;dbname=$database";
$pdo= new PDO($dsn, $user, $password);
//list
$pdoStm=$pdo->prepare('SELECT * FROM Asiakkaat;');
$pdoStm->execute();
$hits=$pdoStm->fetchAll();
foreach($hits as $row) {
echo "
"." ".$row['name']."
\n";
}
?>
Ja homma toimii kuin häkä!

Seuraavaksi tein virtualhostin ja muutoksia host-tiedostoon, jotta saadaan sorkkacrm -listaus oikean osoitteen taakse.

sudo nano /etc/apache2/sites-available/sorkkacrm.example.com.conf

<VirtualHost *:80> 
ServerName sorkkacrm.example.com
ServerAlias www.sorkkacrm.example.com

DocumentRoot /home/xubuntu/public_html/sorkkacrm.example.com

<Directory /home/xubuntu/public_html/sorkkacrm.example.com> Require all granted </Directory>
</VirtualHost>

Mainitsin apachelle myös conffitiedostosta komennolla sudo a2ensite sorkkacrm.example.com.conf -komennolla.

sudoedit /etc/hosts -komennolla kävin lisäämässä oman nimipalvelun sorkkacrm:lle

127.0.0.1 sorkkacrm.example.com

mkdirilla tein filen xubuntun public_html -kansioon sorkkacrm.example.com, jonne kopioin cp -komennolla aikaisemmin käyttämäni php/SQL -scriptin.

Systemctl reload apache2 -komennolla boottasin apachen ja huomasin että saitti lähti toimimaan oikeassa osoitteessa. (Unohdan tämän kohdan aina ja ihmettelen miksi saitti ei pyöri!)

Sorkat ilmaan! Weppisaitti pyörii oikeassa osoitteessa nyt.

Vielä tarvitaan toinen saitti, ei auta kun tehdä uusi kansio xubuntun public_html -hakemistoon.
sudo mkdir rauta.example.com

Tein sudo nanolla uuden index.html -tiedoston:

sudo nano /etc/apache2/sites-available/rauta.example.com.conf -komennolla viritetään virtualhosti

sudo a2ensite rauta.example.com.confilla enabloin saitin. Lisäsin sen myös /etc/hosts -tiedostoon

Käynnistin apachen uudelleen sudo systemctl reload apache2.

HTML-sarsivukin lähti pelittämään oikeassa osoitteessa!

Kävin penkomassa var/log/auth.logia, mutta huomasin että ainoa hyökkääjä livetikullani olin minä itse.

sar -q|less -komennolla katsoin järjestelmän keskiarvoiset käyttöasteet eri aikaväleillä, ja näyttäisi siltä että linux ei harjoituksen aikana käyttänyt keskimäärin edes yhtä prosenttia prosessorin tehoista

Harjoitus tehty 01:30. Livetikulla Linuxin ajaminen on kuin tyhjä taulu, jota maalataan ja siitä voi tulla jotain suurenmoista. Surun saattelemana irroitan kohta livetikun, sillä tänään asentamani ohjelmistot toimivat hyvin ja tuntui muutenkin hyvältä kun konffaukset tomivat.

Muutaman minuutin päästä tikulla kuitenkin on vain tyhjä Linux.

Lähteet:

SQL:

https://kyup.com/tutorials/create-new-user-grant-permissions-mysql/

http://terokarvinen.com/2016/read-mysql-database-with-php-php-pdo

Apache: http://terokarvinen.com/2018/name-based-virtual-hosts-on-apache-multiple-websites-to-single-ip-address

Aikaisemmat harjoitukset auttoivat käyttäjähakemiston perustamisessa saitin osalta https://ossiilmari.wordpress.com/2019/02/06/virtuaalisen-weppipalvelimen-konffaus/

Tehtävät http://terokarvinen.com/2018/arvioitava-laboratorioharjoitus-linux-palvelimet-ict4tn021-6-torstai-alkukevat-2018-5-op

Advertisements

Ohjelmointi Linuxilla

Viikon 6 tehtävät:

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).

Aloitan työt klo 22:31, 3.3.2019, suoritan komennot DigitalOceanin virtuaalipalvelimella.

Lähdetään Pythonista liikkeelle.

Ajoin komennon sudo apt install python3, joka palautti minulle terminaalissa, että uusin versio python3:sta on jo asennettu.

Lähdetään liikkeelle tekemällä uusi tekstitiedosto nanolla. Komento on siis nano helloworld.py.

Tiedostossa tein print-komennon sisältäen hello worldin


Tallensin filen ctrl +x -> y -> enter -komennoilla. Ajoin tiedoston sisältöineen laittamalla python3 + tiedostonimi

Ja sehän toimi!

Jatkoin Linuxille käytännöllisellä Bashilla.

Koitin asentaa Bashin, mutta sekin oli jo asennettu. Piru vieköön.

“bash is already the newest version (4.4.18-2ubuntu1).”

Tehdään kotihakemistoon uusi tiedosto nano helloworld.sh -komennolla.

echo -komento jonka kirjoitin tiedostoon

Ajoin komennolla bash helloworld.sh, joka palautti oikean lopputuloksen.

Seuraavaksi kokeilin Javaa.

Kokeilin googlen etusivulla löytyvää ohjetta, jonka mukaan komento
sudo apt-get install openjdk-7-jdk asentaa javaympäristön koneelle. Tieto oli kuitenkin virheellistä ja pakettia ei ollut jaossa enää. Kokeilin sudo apt-cache search openjdk, ja tuloksista otin version 8.

Paketti asentui. Seuraavaksi tein helloworld -tiedoston nano helloworld.java -komennolla.

Javan helloworld on turhan pitkä, sillä kääntäjä tarvitsee main -metodin jotta tietää mitä pitää ajaa.

Käänsin tiedoston ensin komennolla javac helloworld.java.
Tämän jälkeen koitin ajaa tiedoston java helloworld.java

Googlettelun ja ihmettelyn jälkeen huomasin olleeni idiootti.

Ajokomennossa ei käytetä .java -päätettä, koska sellaista luokkaakaan ei ole.

java helloworld palautti oikean lopputuloksen:

Viimein terminaali tervehtii maailmaa myös javalla!

Tehtävät sain tehtyä 23:11 03.03.2019.

Lähteet:

Java: https://askubuntu.com/questions/145748/how-to-compile-a-java-file-on-ubuntu

https://superuser.com/questions/1090396/error-could-not-find-or-load-main-class-with-openjdk-and-oracle-java-on-centos

Tehtävät: http://terokarvinen.com/2018/aikataulu-linux-palvelimet-ict4tn021-3004-ti-alkukevat-2019-5-op

SSH ja tulimuuri

Päivän tehtäviin kuuluvat seuraavat toimenpiteet:

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

Aloitetaan SSH-clientin asennuksella. Käynnistän Linuxin 13:08. Teen kaksi ensimmäistä tehtävää livetikulla, koska virtuaalipalvelimelleni toimenpiteet ovat jo tehtynä.

Tehtävä A. SSH asennetaan komennolla sudo apt install openssh-client. Ajetaan komento terminaalissa ja vastataan yes kun kysytään.

Tehtävä B. SSH käyttää porttia 22 oletuksena. ajetaan komento sudo ufw allow 22/tcp. Tämän jälkeen laitetaan tulimuuri päälle sudo ufw enable -komennolla.

Tehtävä D ja C. Lähdin siirtämään tiedostoja SSH:lla. Tämän tähtävän tekemiseksi käytin kahta omaa virtuaalipalvelintani digitaloceanilla.

Toimenpiteiden helpottamiseksi ja nopeuttamiseksi loin julkisen avaimen kirjautumisen kahden koneen välille. Ajoin ensin ssh-keygen .komennon ja annoin hyvän salasanan, koska voin. “En koskaan anna huonoa salasanaa, edes vähäksi aikaa”.

Kopioin saamani julkisen avaimen toiselle palvelimelle, jonne välitin tiedostoja myöhemmin. Kopioiminen tapahtui ssh-copy-id käyttäjä@ipv4 -komennolla.

Kirjauduin ssh -komennolla kohdepalvelimelle, jonne hain tiedostoja. Tein kotihakemistoon kansion turhaaskeidaa, jonne ajoin ns. tiedostonsiirtomenetelmien rälläkällä, eli rsyncilla toiselta koneelta tiedostoja. Tässä tapauksessa kyseessä oli hautaustoimiston nettisivut jotka olin aikaisemmin kopioinut toiselta koneelta Sauron -palvelimelle.

Kopioiminen tapahtui komennolla rsync -avz käyttäjä@palvelin:hakemisto /kohdekansio.

Tehtävä J. Asensin sysstat -paketin sudo apt install sysstat -komennolla.

Sar -komento palautti tässä vaiheessa, että lokitus on pois päältä. Menin hakemistoon /etc/default/ jossa sudo nano sysstatilla menin editoimaan konfiguraatiotiedostoa. Muutin enabled -arvoksi true.

Tämän jälkeen käynnistin palvelun uudelleen.

Ajoin sar, pidsat ja iostat komennot, jotka palauttivat tietoja järjestelmän kuormituksesta.

Kuten kuvasta voidaan havaita, järjestelmän kuormitus on minimaalista. Prosessoritehoista 99.92% on idle -tilassa, prosessit kuluttavat keskimäärin 0.00% tehoja, vaikka niitä on monta kymmentä kappaletta. Jos palvelimellani olisi useampia käyttäjiä, kuormitus olisi korkeampi.

Lähteet:

sysstat: https://askubuntu.com/questions/839795/cannot-open-var-log-sysstat-sa20-no-such-file-or-directory

Tehtävät: http://terokarvinen.com/2018/aikataulu-linux-palvelimet-ict4tn021-3004-ti-alkukevat-2019-5-op

https://www.linuxjournal.com/content/sysadmins-toolbox-sar
ufw & ssh:http://terokarvinen.com/2017/first-steps-on-a-new-virtual-private-server-an-example-on-digitalocean
rsync:https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories-on-a-vps

Virtuaalisen weppipalvelimen konffaus

Aloitan tehtävät 6.2.2019 klo 18:31. Tehtävälistaan kuuluvat
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) Ole huolellinen, jos otat vastaan syötteitä lomakkeilla (forms).

Suoritimme jo tunnilla erinäisiä toimenpiteitä tehtävän edistämiseksi. Loimme virtuaalipalvelimet, tässä tapauksessa digital oceaniin (1GB RAM, 25GB Disk) ja palvelin sijaitsee Ranskassa. Palvelimella pyörii Ubuntu 18.04 x64.

Yhdistin koneelle SSH:lla, ja tein sudo-tunnuksen itselleni. Tämän jälkeen avasin palomuurista portin 80 ja lukitsin rootin sudo usermod –lock rootilla. sshd configista kävin vielä vaihtamassa PermitRootLogin -> No.

Ensitöikseni otan ssh -yhteyden palvelimelle tehtävää A -varten.

Jotta voimme tehdä kotisivuja normaalin käytätjän oikeuksin, teemme ensin normaalin käyttäjän ilman sudo, tai admin oikeuksia. Olkoon hänen nimensä pepe.

Annetaan pepelle niin vaikea salasana, ettei hakkerit pääse hänen tunnuksillaan sisään, mutta pepe pääsee juuri ja juuri.

Pepe voi kirjautua nyt ssh:lla palvelimelle, mutta kotisivuja ei voi vielä tehdä. Pepellä on nyt oma kotikansio home -hakemistossa.

Tein pepelle oman index.html -sivun.

Mennään pihlaniemi.com/~pepe, jotta näemme onko uurastus kantanut hedelmää.

Pepen sivut toimivat, toisin kuin namecheapin mainostama SSL sertifikaatti

Seuraavaksi, tehtävä S, laitoin oletussivuksi hankkimalleni palvelimelle ruman mutta toimivan testisivun. Prosessi tehtiin osittain tunnilla, joten dokumentoin ulkomuistista alkuosan. Nimipalvelusta hankin osuvasti omalle nimelleni domainin (pihlaniemi.com). Tämän jälkeen loin oman käyttäjätunnukseni alle home/ossi/publicsites/pihlaniemi/index.html yksinkertaisen sivun. Sudo a2ensite pihlaniemi.com.conf -tiedostolla sain lisättyä sites-available -kansioon. Sitten boottasin apachen sudo service apache2 restartilla.

Lisäsin sitten etc/apache2/sites-availableen konfiguraatiotiedostoon pihlaniemi.com.conf seuraavanlaista sisältöä

Seurasi typing errorista johtuvaa kiroilua ja 403 -virhettä runsaasti. Avasin kaljan ja jatkoin toimintaa päättäväisesti. Kuitenkin ylläolevaan kuvaan olin saanut oikean konfiguraation aikaiseksi. Oikean konfiguraation jälkeen ajoin sudo systemctl reload apache

Sitten katsotaan lopputulosta:

Herraisä, sehän toimii. Kello on nyt 21:56 ja olen voittanut pienen taistelun elämässäni

Siirrytään tehtävään Y, eli katsotaan onko palvelimeni herättänyt kiinnostusta esimerkiksi bottien piireissä.

Miltei sekunnin välein palvelimelleni on yritetty tunkeutua mitä surkeammilla käyttäjätunnusehdotuksilla

Kokeilin whoisilla yhtä ip-osoitteesta ja ruotsalaiset asialla. Ehkä. Jätän asian puimisen sikseen palvelunestohyökkäyksen pelossa.

Windowsilta scp:lla siirtäminen lokaaleista tiedostoista osoittautui konstikkaaksi terminaalilla. Kello oli 22:30 ja pidin tauon.

Jatkoin klo 00:30, asensin puttyn scp -ohjelman pscp:n. Siirsin joskus digipalvelukurssilla tekemäni nettisivun linux -palvelimelleni komennolla: pscp -r Desktop\kultainenpeura2 ossi@188.166.167.2:/home/ossi

Komento onnistui niinkin hyvin että mukana lähti myös tiedostoja joiden en muistanut edes olevan kansiossa.

Hautaustoimiston sivut siirtyivät hienosti ja lähdin tekemään pientä PHP -scriptiä tehtävää C varten. Lopetan tämän tekemisen klo 02:00.

Jatkoin sunnuntaina klo 19:00, 10.2.2019. Pihlaniemi.com ohjaa nyt ossi/publicsites/pihlaniemi/ -hakemistoon. Tein sinne uuden filen, index.php:n sudo nano index.php:lla. Näppäilen yli 21 merkkisen jumalaisen salasanani jotta ubuntu tietää kuka on sudo ja kuka ei.

Laitetaan laatucontenttia sivulle testiksi

Mennään selaimessa testaamaan näkyykö tiedostoon laitetut kilkkeet.

Php -testi jytää selaimessa hienosti

Kello on 19:30, ja sivu näkyy juuri kuten pitääkin. lopetan tehtävät tältä viikolta.

Lähteet:
Saitin perustaminen: http://terokarvinen.com/2017/first-steps-on-a-new-virtual-private-server-an-example-on-digitalocean

https://jvaris.wordpress.com/2014/03/03/linux-server-task-5-apache-name-based-virtual-hosting/
LAMP jne:
http://terokarvinen.com/2016/read-mysql-database-with-php-php-pdo

SCP:
https://stackoverflow.com/questions/8975798/scp-w-ssh-copying-a-local-file-from-windows-to-a-remote-server-using-scp
ROISTOT: https://www.tecmint.com/find-failed-ssh-login-attempts-in-linux/


Linux weppipalvelimena

Päivän agendana on tehdä viisi seuraavista tehtävävaihtoehdoista:

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)

Kello on 23:30 2.1.2019.

Lähdetään A -tehtävästä liikkeelle. Vaihdetaan ensin näppäimistö lokaaliksi setxkbmap fi, sekä päivitetään järjestelmä sudo apt-get updatella. Sitten asennetaan Apache komennolla sudo apt-get install apache2.

Kun menee localhostiin selaimessa, voimme nähdä että apache rockkaa palvelimella!

Seuraavaksi tehtävän mukaisesti meidän täytyy saada weppisivun sisältö käyttäjän (xubuntu) omaan hakemistoon. Pikaisen googletuksen avulla pääsen artikkeliin https://websiteforstudents.com/setup-apache2-userdir-module-on-ubuntu-16-04-lts-servers/ jossa on mainiot ohjeet toimenpiteen suorittamiseksi.

Komennetaan terminaalia sudona a2enmod userdir, jonka jälkeen käynnistetään apache uudelleen.

Seuraavaksi tehdään public_html käyttäjän hakemistoon, sekä nanolla muokataan yksinkertainen weppisaitti pyörimään.

Saitti ei ole kaunis, mutta aikakin se pyörii juuri asentamallani Apachella ja sisältö löytyy käyttäjän hakemistosta.

Tehtävä B. Seuraavaksi käsitellään Apachen logitusta ja mennään samalla tehtävään B. Äskeisen sivun avaamisen pitäisi tuottaa http- koodi 200, eli OK. Käydään vilkaisemassa apachen logia /var/log/apache2 -hakemistossa.

Viimeisimpänä GET koodilla 200 (OK) joka saatiin aikaiseksi yksinkertaisesti avaamalla sivu

Laitoin tail -f access.log -komennon ja koitin mennä resurssiin jota ei löydy public_html -hakemistosta. Tämän pitäisi oletettavasti antaa meille virhe 404, joka tarkoittaa että HTTP -kutsu ei löydä hakemaansa resurssia.

Laitoin osoitepalkkiin http://localhost/~xubuntu/hermes joka tuotti logiin http -virhekoodin odotetusti:

127.0.0.1 – – [03/Feb/2019:22:25:24 +0000] “GET /~xubuntu/hermes HTTP/1.1” 404 505 “-” “Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0”

Lokirivistä näkee kätevästi Apachen clientin IP-osoitteen, timestampin kutsun tekohetkestä, kutsutyypin sekä pyydetyn urlin (GET /~xubuntu/hermes) ja HTTP -protokollan versio. lisäksi mukana tulee virhekoodi (404), merkkijonon pituus (505), sekä ns. user agent josta näkee millä softalla / alustalla kutsu on tehty.

Tehtävä J: Lähdetään asentamaan koko LAMP -pakettia muita tehtäviä varten. Apache löytyykin jo Linuxistani. Yritin asentaa mysql serverin. sudo apt install mysql-server. Syslog ilmoittaa fatal errorista.

xubuntu@xubuntu:/$ mysql
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2). Yritin bootata koneen, asentaa apachen uudelleen ja mysql uudelleen. Sama virhe palautuu yhä.


Jatketaan kuitenkin PHP:lla. sudo apt install php-pear php-fpm php-dev php-zip php-curl php-xmlrpc php-gd php-mysql php-mbstring php-xml libapache2-mod-php. Asennus onnistuu muuten, mutta mysql-moduulit aiheuttivat virheen:

Errors were encountered while processing:
mysql-server-5.7
mysql-server
E: Sub-process /usr/bin/dpkg returned an error code (1)

Käynnistetään apache kuitenkin uudelleen. sudo service apache2 restart

Testataan PHP:n toimivuus php -r ‘echo “\n\nYour PHP installation is working fine.\n\n\n”;’

Apachen ja PHP:n toimivuus testattu, valitettavasti MySQL Server ei alkanut toimia. Yritetty käyttää toimenpiteitä https://stackoverflow.com/questions/11657829/error-2002-hy000-cant-connect-to-local-mysql-server-through-socket-var-run -keskustelusta apuna, mutta sama virhe tulee toistuvasti.

Tehtävä F: Lähdetään tekemään PHP -scriptia. En osaa PHP:ta yhtään joten tässähän sitä viisastuu samalla.

Etsitään dirconf-tiedosto, koska serverin pitäisi priorisoida HTML -tiedostojen sijaan PHP filejä: sudo nano /etc/apache2/mods-enabled/dir.conf

Teen pienen filen /var/www/html hakemistoon jolle annan nimeksi index.php. Tiedostoon laitan sisälle sudo nanolla <?php
print(“Toimiiko???”); ?>

Helloworld -tyyppinen testiscripti pyörii nyt apachen voimalla ja näyttää PHP -tiedoston sisällön


Helloworld tyyppisen kokeilun jälkeen rohkenen yrittää tehdä tehtävän mukaisen laskuri-PHP -tiedoston. Kokemattomana PHP-maakarina googletan esimerkkejä.

Copy<form action="site.php" method="GET">
     Num1: <input type="number" name="num1">
     Num2: <input type="number" name="num2">
     <input type="submit">
</form>

<?php
     $num1 = $_GET["num1"];
     $num2 = $_GET["num2"];
     echo $num1 + $num2;
?>
https://www.mikedane.com/web-development/php/creating-a-calculator/

Hienoa! Nyt meillä on sovellus joka laskee yksinkertaisen matematiikkalaskun.

Kello on nyt 2:26, tehtävät ovat olleet henkisesti rankkoja.

Siirrytään tehtävään D. Tehdään apachen configuraatiotiedostoon virhe, ja mennään ihmettelemään sitä lokitiedostoista.

Navigoin hakemistoon /etc/apache2/ josta löytyy tiedosto apache2.conf. Sudo nano apache2.confilla lähdetään tuhoamaan toimivaa configuraatiota.

Tein kaksi muutosta tiedostoon apache2.conf. Muutin DefaultRuntimeDirin “APACHE_RUIN_DIR” ja PidFileen lisäsin “222”

sudo service apache2 restart tuotti virheilmoituksen “Job for apache2.service failed because the control process exited with error code.
See “systemctl status apache2.service” and “journalctl -xe” for details.”

Apachemme kaatui hienosti jo ensimmäiseen muutokseen. Runtime -hakemistoa ei löytynyt konfiguraatiomuuttujan takaa. Palvelun käynnistäminen epäonnistuu ja http-serverimme on alhaalla.

Feb 04 00:36:30 xubuntu systemd[1]: Starting The Apache HTTP Server…
Feb 04 00:36:30 xubuntu apachectl[28201]: [Mon Feb 04 00:36:30.730887 2019] [core:warn] [pid 28204] AH00111: Config variable ${APACHE_RUIN_DIR} is not defined
Feb 04 00:36:30 xubuntu apachectl[28201]: apache2: Syntax error on line 80 of /etc/apache2/apache2.conf: DefaultRuntimeDir must be a valid directory, absolute or relative to ServerRoot

Kävin myös katsomassa var/log/apache2/error.login, jossa oli melko geneerinen ilmoitus uudelleenkäynnistymisestä [Mon Feb 04 00:36:30.662104 2019] [mpm_prefork:notice] [pid 27274] AH00169: caught SIGTERM, shutting down. Googlettamisen tuloksena havaitsin, että tälläisiä ilmoituksia saattaa tulla ihan normaalistikin, mutta error.logiin ei tullut virheestä muuta tietoa.

Kello on 03:15 ja tehtävät ovat tehty. Huomasin tehtävien aikana, että terminaalin käyttö on helpottanut huomattavasti ja se ei tunnu yhtä vieraalta kuin aikaisemmin. Asiat tuntuvat myös löytyvän helpommin ja PHP sekä Apache tuntuu nyt paljon tutummalta. Apachen asentaminen ja pyörittäminen tuntui hyvin yksinkertaiselta näin perustasolla.

Tehtävät:

http://terokarvinen.com/2018/aikataulu-linux-palvelimet-ict4tn021-3004-ti-alkukevat-2019-5-op  (H3)

Weppipalvelimet:
Kotihakemisto: https://websiteforstudents.com/setup-apache2-userdir-module-on-ubuntu-16-04-lts-servers/
Logit: https://blog.codeasite.com/how-do-i-find-apache-http-server-log-files/
Loki-ilmoituksen tutkiminen: https://serverfault.com/questions/607873/apache-is-ok-but-what-is-this-in-error-log-mpm-preforknotice/607880

Asennus:
LAMP: https://howtoubuntu.org/how-to-install-lamp-on-ubuntu
MySql-ongelmat:
https://stackoverflow.com/questions/11657829/error-2002-hy000-cant-connect-to-local-mysql-server-through-socket-var-run
PHP:
Scripti: https://www.mikedane.com/web-development/php/creating-a-calculator/
Conffaus: https://stackoverflow.com/questions/7873634/why-does-index-html-have-priority-over-index-php

Linux palvelimen terminaali ja lokit

Aloitin tekemään kurssin h2 -harjoituksia kello 20:18, samalla koneella kuin aikaisemmassa harjoituksessa, eli Lenovo P51:lla. Harjoituksen aikana ajan XUbuntu -järjestelmää livetikulta.

Ensinmäinen harjoitus on etsiä Linuxin logista esimerkki onnistuneesta ja epäonnistuuneesta toimenpiteestä. Koska ajamme joka bootissa tyhjenevää Linuxia, ei meillä ole mitään ohjelmistoa ja tavanomaisten käytössä ilmenevien virheiden mahdollisuus on hyvin pieni.

Tässä vaiheessa järjestelmässä salasanan yrittäminen väärin kirjoittamalla on varma tapa saada logitettava virheilmoitus.

Lähdetään siis liikkeelle käynnistämällä terminaali, ja muuttamalla näppäimistö lokaaliksi setxkbmap fi.

Selvittelin https://www.digitalocean.com/community/tutorials/how-to-monitor-system-authentication-logs-on-ubuntu -sivulta missä Ubuntussa logitetaan sisäänkirjautumisia. Lähdetään katsomaan login sisältöä ennen salasanan asettamista.

auth.log boottauksen jälkeen 20:45

Löysimme lokitiedoston. Lähdetään asettamaan salasanaa.

Ajan komennon passwd, jonka jälkeen terminaali kysyy nykyistä salasanaa. Sitä ei luonnollisesti bootin jälkeen ole. Tämän jälkeen annan uuden salasanan joka sisältää yhdeksän merkkiä, isoja ja pieniä kirjaimia, numeron ja erikoismerkin. Tästä näemme auth logissa merkinnän salasananvaihdon onnistumisesta

Jan 27 18:49:10 xubuntu passwd[2801]: pam_unix(passwd:chauthtok): password changed for xubuntu – Salasana vaihdettu siis onnistuneesti.

Kyseisessä lokirivissä näkyy toimenpiteen aika ja päivämäärä, sekä palvelin jossa komento ajetaan. Ilmeisesti passwd[2801] viittaa lokissa rivinumeroon ja komentoon josta lokimerkintä on tullut. Tämän jälkeen lokissa on käyttäjätunnus (pam_unix) jolle salasana vaihdettiin, sekä lokitettu toimenpide, eli salasanan vaihtaminen kansankielistettynä versiona.

Kuitenkin päädyn testimielessä unohtamaan salasanani, ja koittamaan vaihtaa se takaisin tyhjäksi. Laitan uudeleen passwd -komennon, jonka jälkeen sain lokiin (auth.log) virheilmoituksen Jan 27 19:05:24 xubuntu passwd[3019]: pam_unix(passwd:chauthtok): authentication failure; logname= uid=999 euid=0 tty= ruser= rhost= user=xubuntu

Oheisen virheilmoituksen logname viittaa kirjautuneeseen käyttäjään, jota ei livetikulta ajettaessa oletuksena ole. Uid=999 viittaa Linuxin oletuskäyttäjään, EUID eli effective user id, tämä kenttä täyttyy kun prosessin käyttäjä poikkeaa alkuperäisestä (uid). TTY on jotain ihan käsittämätöntä legacyhömppää josta en saanut mitään selkoa edes googlettamalla. Ruser viittaa kirjautuneisiin laitteisiin paikallisverkossa jotka vastaavat (https://linux.die.net/man/1/rusers), rhost palauttaa yhden ip-osoitteen, mutta tässä kontekstissa livetikulla en tiedä mikä ip tähän pitäisi tulostua. Varmaan jos auth -muutos tulee jostain paikallisverkon laitteesta, joka eroaa laitteesta jossa XUbuntua ajetaan.

Softan asennus terminaalin kautta

Seuraavaksi koitetaan asentaa Chrome -selain. Käyttöjärjestelmän mukana tuleva firefox 59.0.2 kaatuu jatkuvasti. Kuitenkaan sudo apt-get update ei toimi. Koitin ottaa screenshotin ja sekin tuotti virheilmoituksen.

Järjestelmässä screenshotin ottaminenkin tuotti virheen.

Koitin ratkaista ongelman linkin https://askubuntu.com/questions/358560/eread-error-read-5-input-output-error-ethe-package-lists-or-status-file -ohjeiden mukaisesti. Poistetaan listat aptista ja tehdään ne uudelleen, jonka jälkeen update:

sudo rm -r /var/lib/apt/lists/
sudo mkdir -p /var/lib/apt/lists/partial
sudo apt-get update

Yritän ajaa sudo apt-get updaten uudelleen:

Get:3 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:4 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
0% [3 InRelease 77.9 kB/242 kB 32%] [4 InRelease 1138 B/88.7 kB 1%]Failed to exec method /usr/lib/apt/methods/gpgv ( via /usr/lib/apt/methods/gpgv)
Get:5 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
0% [5 InRelease 5497 B/88.7 kB 6%] [4 InRelease 20.0 kB/88.7 kB 22%]Failed to exec method /usr/lib/apt/methods/gpgv ( via /usr/lib/apt/methods/gpgv)
0% [4 InRelease 25.8 kB/88.7 kB 29%]Failed to exec method /usr/lib/apt/methods/gpgv ( via /usr/lib/apt/methods/gpgv)
sh: 1: /usr/bin/test: Input/output error
sh: 1: /bin/echo: Input/output error
Reading package lists… Done
E: The repository ‘cdrom://Xubuntu 18.04 LTS Bionic Beaver – Release amd64 (20180426) bionic Release’ does not have a Release file.
N: Updating from such a repository can’t be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
E: Method gpgv has died unexpectedly!
E: Sub-process gpgv returned an error code (100)
E: Method /usr/lib/apt/methods/gpgv did not start correctly
E: Method gpgv has died unexpectedly!
E: Sub-process gpgv returned an error code (100)
E: Method /usr/lib/apt/methods/gpgv did not start correctly
E: Method gpgv has died unexpectedly!
E: Sub-process gpgv returned an error code (100)
E: Method /usr/lib/apt/methods/gpgv did not start correctly
E: Problem executing scripts APT::Update::Post-Invoke-Success ‘/usr/bin/test -e /usr/share/dbus-1/system-services/org.freedesktop.PackageKit.service && /usr/bin/test -S /var/run/dbus/system_bus_socket && /usr/bin/gdbus call –system –dest org.freedesktop.PackageKit –object-path /org/freedesktop/PackageKit –timeout 4 –method org.freedesktop.PackageKit.StateHasChanged cache-update > /dev/null; /bin/echo > /dev/null’
E: Sub-process returned an error code

Get:3 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:4 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
0% [3 InRelease 77.9 kB/242 kB 32%] [4 InRelease 1138 B/88.7 kB 1%]Failed to exec method /usr/lib/apt/methods/gpgv ( via /usr/lib/apt/methods/gpgv)
Get:5 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
0% [5 InRelease 5497 B/88.7 kB 6%] [4 InRelease 20.0 kB/88.7 kB 22%]Failed to exec method /usr/lib/apt/methods/gpgv ( via /usr/lib/apt/methods/gpgv)
0% [4 InRelease 25.8 kB/88.7 kB 29%]Failed to exec method /usr/lib/apt/methods/gpgv ( via /usr/lib/apt/methods/gpgv)
sh: 1: /usr/bin/test: Input/output error
sh: 1: /bin/echo: Input/output error
Reading package lists… Done
E: The repository ‘cdrom://Xubuntu 18.04 LTS Bionic Beaver – Release amd64 (20180426) bionic Release’ does not have a Release file.
N: Updating from such a repository can’t be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
E: Method gpgv has died unexpectedly!
E: Sub-process gpgv returned an error code (100)
E: Method /usr/lib/apt/methods/gpgv did not start correctly
E: Method gpgv has died unexpectedly!
E: Sub-process gpgv returned an error code (100)
E: Method /usr/lib/apt/methods/gpgv did not start correctly
E: Method gpgv has died unexpectedly!
E: Sub-process gpgv returned an error code (100)
E: Method /usr/lib/apt/methods/gpgv did not start correctly
E: Problem executing scripts APT::Update::Post-Invoke-Success ‘/usr/bin/test -e /usr/share/dbus-1/system-services/org.freedesktop.PackageKit.service && /usr/bin/test -S /var/run/dbus/system_bus_socket && /usr/bin/gdbus call –system –dest org.freedesktop.PackageKit –object-path /org/freedesktop/PackageKit –timeout 4 –method org.freedesktop.PackageKit.StateHasChanged cache-update > /dev/null; /bin/echo > /dev/null’
E: Sub-process returned an error code

Linux yrittää murtaa miestä, mutta pysyn vahvana. Psyykeeni muurit eivät murru ja jatkan yrittämistä. Koitan sulkea linuxin käyttöliittymän kautta, ja sekin tuotti virheen.

Sammuttaessa uloskirjautumisen prosessi epäonnistui myös.

Tässä vaiheessa huomasin että koira oli heilauttanut USB -tikkua, jota epäilen syyksi loki-ilmoituksille että tiedostoja ei löydy apt -komennoissa ja järjestlemän peruskomponentit kaatuvat.

Pidin 15 minuutin tauon, kello on nyt 22:00. Boottasin koneen ja virheet tuntuvat poistuneen. Sudo apt-get upgrade toimii taas.

Ajan sudo apt-get updaten, jonka jälkeen apt-cache searchilla haen, millä saan Google Chromen ladattua.

Kohta surffaillaan mukavasti Chrome -selaimella!

Seuraavaksi asennamme kolme(3) ohjelmaa, joita käytetään komentokehoitteesta. Asennetaan ensimmäisenä Lynx. Lynx on komentorivipohjainen verkkoselain.

Sudo apt-get install lynx tekee työtä käskettyä ja saan ladattua Lynxin. Menen katsomaan tätä blogia komentorivin kautta:

En voi käsittää kuka haluaisi selata verkkoa terminaalilla, mutta ohjelma toimii kuitenkin!

Seuraavaksi asensin GNUChessin sudo apt-get gnuchess.

Pääsin ottamaan terminaalista mittaa shakkiottelussa.

Seuraavaksi asennetaan Linux -piireissä käsittääkseni suosittu Vim.
Sudo apt-get install vim – ohjelma latautui onnistuneesti.

Kirjoitin terminaaliin vim – jonka jälkeen ohjelma käynnistyi. Seuraavaksi kirjoitin Hello Linux. Seuraavaksi selvitin Googlen kautta miten tiedosto saadaan tallennettua levylle.

Googlen avulla ja : x -komennolla lisäämällä tiedostonimen perään “testi” -niminen tiedosto tallentui kotihakemistoon. Data tallentui myös tiedoston sisään.

22:38 sain asennettua ohjelmat sekä testattua virheilmoituksia ja katsottua ohjelmat ja lokitiedostot läpi.

Lähteet

Terminaalikomennot:
http://terokarvinen.com/2009/command-line-basics-4
http://terokarvinen.com/2008/commands-for-admin-4
https://askubuntu.com/questions/358560/eread-error-read-5-input-output-error-ethe-package-lists-or-status-file
https://stackoverflow.com/questions/28381359/probably-incorrect-release-file-causing-apt-get-update-to-fail/34947334

Ohjelmat:https://www.linux.fi/wiki/Lynx
https://www.linux.fi/wiki/Vim
http:// http://vim.wikia.com/wiki/Saving_a_file
https://www.gnu.org/software/chess/manual/gnuchess.html

Lokitus:
https://linux.die.net/man/1/rusers
https://manpages.debian.org/jessie/jdresolve/rhost.1.en.html
https://askubuntu.com/questions/481906/what-does-tty-stand-for
https://www.digitalocean.com/community/tutorials/how-to-monitor-system-authentication-logs-on-ubuntu
https://linux.die.net/man/8/pam_unix

Asennus ja softan lataaminen

Tarkoituksenani on ensimmäisenä asiana tehdä oma Linux livetikku.

Käytössäni on Kingston Data Traveler USB 3.0 64GB muistitikku, johon on tarkoitus asentaa Linux Ubuntu.

Latasin version 18.04, Bionic Beaver, ilman torrenttiohjelmaa käyttäen Ranskalaista mirroria. Valitsin
xubuntu-18.04-desktop-amd64.iso -filen ladattavaksi, tiedoston koko 1.3Gt. Tämän jälkeen latasin UNetbootin -ohjelman, jotta levykuvasta saadaan bootissa hyödynnettävä kokonaisuus.

Käynnistin lataamani Unetbootin -ohjelman, josta valitsin Diskimagen lähdedataksi. Valitsin .iso -tiedoston Documents -kansiosta jonne latasin Bionic Beaverin.
ääKatsoin muistitikulta, ja sinne oli muodostunut boottaamiseen tarvittavat tiedostot, tai pikemminkin ne oli luettu levykuvasta ja tallennettu tikulle. Backupit ovat otettuna koneeltani viime sunnuntaina EaseUSTodoBackup -ohjelmalla.

Boottasin koneen pitämällä Enteriä pohjassa. Boot -menusta valitsin USB -laitteen boottaamista varten. Seuraavaksi aukesi valikko, jossa tarjottiin vaihtoehtoa kokeilla Ubuntua tai asentaa se. Valikko sulkeutui itsestaan ja päädyin työpöydälle. Hiiri ja näppäimistö eivät toimineet. Boottasin uudelleen, ja valitsin nopeasti Try Ubuntu jonka jälkeen pääsin työpöydälle. Nyt hiiri ja näppäimistö toimivat. Ensitöikseni avasin terminaalin ja vaihdoin näppäimistön kielisyyden suomen asetuksille komennolla setxkbmap fi.

Seuraavaksi tarkastin oman työkoneeni hardwaren komennolla sudo lshw -short -sanitize

Screenshotin ottaminen terminaalista sujui näppärääkin näppärämmin vasemmalla altilla ja printscreenilla.

Seuraavaksi asentelemme softaa. Päivitetään ensin järjestelmää sudo apt-get updatella, jotta saamme ladattua ohjelmistoa.
Asennamme Atomin, Kazamin ja MPlayerin.

sudo apt install MPlayer/Kazam/Atom. Atomin kanssa käytettiin lisäkomentoa sudo add-apt-repository ppa:webupd8team/atom

Nauhoitin Kazamilla videon työpöydän käyttämisestä. Kazam on tarkoitettu nauhoitteiden tekemiseen tietokoneen käyttämisestä. Toistin videon ajamalla mplayer <videonnimi> -komennon terminaalissa. Video alkoi toistaa ilman viivettä. Mplayeria ei löydy valikosta muiden ohjelmien seasta, mutta terminaali tunnistaa komennon. Seuraavaksi testaamme Atomin.

Vaihdoin Atomin koodauskieleksi pythonin ja nyt sovellus tukee python syntaksia ja ehdotuksia. Kevyt, yksinkertainen ja toimiva!

Lisenssit

Atom käyttää MIT -lisenssiä, joka poistaa kehittäjältä vastuun ohjelmiston aiheuttamista vahingoista, eikä vakuuta tuotetta millään tavalla. Tuote jaetaan sellaisenaan ja sitä voidaan käyttää kaupallisessa tarkoituksessa, sekä muokata itse toisenlaiseksi. Tuotetta voi lisensoida ja myydä sillä ehdolla, että softan mukana kulkee copyright -teksti, sellaisenaan.

Kazam ja MPlayer käyttävät GNU GPL v3 tai v2 (versiosta riippuen) -lisenssiä. Tämän lisenssin alla olevat ohjelmistot ovat kenen tahansa käytettävissä, kopioitavissa, muutettavissa sekä edelleenjaettavissa. Loppukäyttäjän on vain muistettava, että muunnellut ohjelmistot tulee myös jakaa saman lisenssin alla, eikä sille saa antaa lisärajoitteita.

Muihin käyttämiini ohjelmiin kuuluu esimerkiksi Spotify, josta on asennettava Linux -versio, sekä Chromium -selain, josta on myös Linuxille oma versio. Microsoftin Office -tuoteperhe on minulla työkäytössä, johon Linuxilla on ilmainen vaihtoehto, eli Libreoffice. SQL Server Management Studio ei ole virallisesti tuettu Linuxille, ja usein parhaana käytäntönä pidetään, että SQL palvelimeen yhdistetään jollain toisella clientilla. Esimeriksi DBeaver -clientia suositellaan tähän käyttötarkoitukseen, mutta monet lisäohjelmat, kuten valtaosa RedGaten työkaluista MS SQL Serverille, eivät luonnollisesti ole käytettävissä muissa ohjelmistoissa.

Lähteet

Atom lisenssi: https://raw.githubusercontent.com/atom/atom/master/LICENSE.md
Xubuntu 18.04.1: https://xubuntu.org/news/18-04-1-released/
Livetikun luominen: http://terokarvinen.com/2017/creating-legacy-boot-xubuntu-usb
UNetbootin: https://unetbootin.github.io/
Kazam & lisenssitiedot: https://launchpad.net/kazam
Mplayer & lisenssitiedot: http://www.mplayerhq.hu/design7/info.html
GNU GPL3: https://www.gnu.org/licenses/gpl-3.0.html
Linux SQL Server vaihtoehdot (DBeaver): https://www.slant.co/topics/9123/~sql-clients-for-linux#3
Atom editori: https://atom.io/
Libreoffice: https://fi.libreoffice.org/