Linux palvelimet: Automaatio ja ohjelmointiympäristöt.

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


1) Python 3:

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

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

Seuraavaksi luomme tiedoston jonne kirjoitamme koodin:

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

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

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


2) C++:

Aloitamme taas luomalla kansion C++ koodeja varten:

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

Seuraavaksi luomma tiedoston ja koodin:

nano hello.cc
#include 
using namespace std;

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

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

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

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

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

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

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

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

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


3) Assembly:

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

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

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

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

section .text
    global _start

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

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

Seuraavaksi rakennamme koodista ohjelman nasm compilerilla ja suoritamme sen:

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

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


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

Advertisements

Linux palvelimet: OpenSSH-etähallinta. Tulimuuri.

Tehtävä a-c)

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

sudo ufw allow 22/tcp
sudo ufw enable

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

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

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


Tehtävä d)

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

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

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


Tehtävä e)

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


Tehtävä i)

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

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

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

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

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

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

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

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


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

Linux palvelimet: Syventävä aihe weppipalvelimista

Tehtävä a)

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

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

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

Komennot:

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

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

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

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

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

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


Tehtävä s)

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

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

namecheap

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


Tehtävä y)

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

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

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

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

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


Tehtävä b/c)

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

www.topiniskala.com/~topi/


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

Linux palvelimet: Apache-weppipalvelin ja LAMP kehitysalusta

Tehtävä j)

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

sudo apt-get update
sudo apt-get upgrade

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

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

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

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

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

cd
mkdir public_html
cd public_html
nano index.html

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

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

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

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

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

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

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

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

Seuraavaksi testaamme että luomamme tietokanta toimii oikein:

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

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

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

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


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

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

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

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

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

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


Tehtävä b)

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

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

Tuloksena saamme rivit:

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

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


Tehtävä c)

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

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

Tuloksena saamme rivin:

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

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


Tehtävä f)

PHP laskin:

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

Seuraavaksi:

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

LINKIT:
Tehtävänannot

Linux Palvelimet: Komentokehote, ylläpito ja paketinhallinta

Linux Palvelimet kurssin toisen tehtäväpaketin vastaukset:

Tehtävä a)

Tehtävän tarkoituksena on tuottaa Linuxin logeihin kaksi merkintää, toinen onnistuneesta toimenpiteestä ja toinen epäonnistuneesta. Lähtöasetelmana tehtävää varten minulla on linux läppärillä (täältä näkee koneen tiedot) kaksi konsoli-ikkunaa auki, joista toinen on rootissa ja toinen /var/log/ kansiossa logien lukua varten. Ensimmäisenä vuorossa onnistunut toimenpide:
Ikkuna 1:

sudo apt-get update

Ja salasana annettu oikein.

Ikkuna 2:
Komento tail auth.log paljastaa, että logiin ilmestyivät seuraavat kolme riviä:

Jan 29 02:43:59 linuxasema sudo: topiniskala : TTY=pts/4 ; PWD=/ ; USER=root ; COMMAND=/usr/bin/apt-get update
Jan 29 02:43:59 linuxasema sudo: pam_unix(sudo:session): session opened for user root by topiniskala(uid=0)
Jan 29 02:44:12 linuxasema sudo: pam_unix(sudo:session): session closed for user root

Jokainen näistä kolmesta logirivistä alkaa päivämäärällä, joka kertoo mihin aikaan eri operaatioita kirjattiin logiin (sekä kammottavan huonosta unirytmistä). Seuraavaksi mainittu linuxasema on taas minun linux läppärini nimi ja sudo tarkoittaa komentoa ‘Super User DO’.
Ensimmäinen näistä kolmesta rivistä kertoo teknistä infoa annetusta komennosta. TTY=pts/4 tarkoittaa tekstityyppistä komentoa, joka annettiin terminaalista numero 4. PWD=/ (PWD = Print Work Directory), ja kertoo mistä sijainnista komento suoritettiin, eli tässä tapauksessa “/” eli ROOT kansiosta. USER=root taas kertoo, että komennon toteutti järjestelmän root käyttäjä ja COMMAND=/usr/bin/apt-get update suoritetun komennon sijainnin.
Toisella ja kolmannella rivillä logi kertoo, että sessio on avattu root eli pääkäyttäjälle topiniskala ja 13 sekunnin kuluttua suljettu. Riveillä mainittu pam_unix on unix pohjaisten käyttöjärjestelmien standardi salasana-autentikointijärjestelmä ja toisen rivin lopussa mainittu (uid=0) on id numero jonka järjestelmä antoi pääkäyttäjälle session ajaksi.

Seuraavaksi vuorossa epäonnistunut toimenpide:
Ikkuna 1:

sudo apt-get upgrade

Tällä kertaa annamme väärän salasanan. Varmuuden vuoksi kokeilin kahta erilaista väärää salasanaa jos se tuottaisi logiin jotakin uutta.

Ikkuna 2:
tail auth.log paljastaa seuraavat kolme uutta riviä:

Jan 29 03:12:04 linuxasema sudo: pam_unix(sudo:auth): authentication failure; logname=topiniskala uid=1000 euid=0 tty=/dev/pts/4 ruser=topiniskala rhost= user=topiniskala
Jan 29 03:12:37 linuxasema sudo: pam_unix(sudo:auth): auth could not identify password for [topiniskala]
Jan 29 03:12:37 linuxasema sudo: topiniskala : 2 incorrect password attempts ; TTY=pts/4 ; PWD=/ ; USER=root ; COMMAND=/usr/bin/apt-get upgrade

Ensimmäinen näistä riveistä ilmoittaa autentikaation epäonnistumisesta käyttäjänimellä topiniskala. ‘uid’ ja ‘euid’ ovat pam_unixin antamia id tietoja,tty on sama terminaalikomentotieto kuin aikaisemmin, mutta en tiedä miksi se nyt mainitsee /dev/ kansion mukana.
Toisella rivillä mainitaan syy epäonnistuneelle kirjautumiselle, eli väärä salasana. Tämäkin tieto tulee pam_unix järjestelmältä ja viittaa käyttäjään topiniskala. Kolmas rivi kertoo toisesta epäonnistuneesta kirjautumisyrityksestä ja on mielenkiintoista huomata, että auth.log ei pelkästään vain listannut mekaanisesti jokaista tapahtumaa vaan yhdisti ilmoitukseksi kahdesta epäonnistuneesta salasanan autentikoinnista.


Tehtävä b)

Asenna itsellesi SSH demoni ja ota sillä yhteyttä omaan koneeseesi. Olin jo tunnilla asentanut itselleni openssh-server sovelluksen (sudo apt-get install openssh-server). Seuraavaksi loin nanolla tekstitiedoston foo.txt roottiin (sudo nano foo.txt). Lopuksi vielä tarkistin IP osoitteeni ‘ip addr show’ komennolla. Aika siirtyä itse ssh demonin testaukseen:


sudo scp topiniskala@xxx.xxx.xxx.xxx:/foo.txt /home/topiniskala/

Tiedosto siirtyi kansioon /home/topiniskala/ kuten pitääkin ja tail foo.txt kirjaa terminaliin tekstitiedoston sisällön, eli ‘bar’. Ainoa ongelma tehtävän aikana oli googlella löytämäni virheellinen ssh komento, joka oli muotoa ‘sudo scp foo.txt topiniskala@iposoite /kohde’, joka ei toiminut.


Tehtävä c)

Kirjoita itsellesi unelmien apt-get komento. Koska käytän linux läppäriäni etupäässä ainoastaan koodaamiseen ja kouluprojekteihin en tarvitse siihen oikeastaan muuta kuin ohjelmointiin liittyviä paketteja, mutta ehkä ainakin VLC olisi myös hyvä olla mukana kesän mökkireissuja ajatellen, eli:


sudo apt-get install gedit git openjdk-8-jre-headless curl openssh-server mongodb vlc


Tehtävä d)

Asenna apt-get paketinhallinnan kautta itsellesi kolme sovellusta.

1. Node

Olen käyttänyt nodea aikaisemmin Windowsilla erilaisissa ohjelmointiprojekteissa, mutta Linux versio on minulle tuntemattomampi.


curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
cd /home/topiniskala/Koodit/Node/kokeilu1
npm install express-generator -g

Tämä komentosarja asensi minulle nodejs paketin ja loi kokeilu1 kansioon pohjan node express projektille, eli testasi että node toimii.

Tässä tutoriaali node express projekteihin jota käytin: https://expressjs.com/en/starter/generator.html

2. Mongodb

Mongodb NoSQL shell palvelin.


sudo apt-get install mongodb
sudo mkdir /data/db

MongoDB tarvitsee toimiakseen tuon data/db kansion, jonka default sijainti on /data/db. Minulle tuo oletussijainti sopii hyvin joten loin jo ennen asennusta kyseisen kansion. Lopulta testasin että MongoDB palvelin toimii komennolla ‘sudo mongod’, mutta palvelin ei käynnistynyt. ERROR viesti kertoi, että socket 27017 jota mongodb olisi halunnut käyttää oli jo jonkin prosessin käytössä. Niinpä päätin tarkistaa mikä prosessi kyseistä sockettia käyttää ja komennolla ‘sudo lsof -i:27017
sain selville että minulla oli jo päällä mongodb kuuntelemassa kyseistä porttia. Tämä oli kuitenkin mahdotonta, koska ainoa kerta kun olin käynnistänyt mongodb:n oli, kun kokeilin sitä ilman tuota /data/db kansiota. Komento ‘sudo killall mongod’ sulki tuon päälle jääneen mongodb:n ja nyt palvelin käynnistyi kiltisti ja jäi odottamaan yhteydenottoja.

3. Lynx

Lynx on konsolipohjainen verkkoselain. Ihan mielenkiitoinen testata mutta en kyllä firefoxia kaikkine ongelmineen tuohon vaihtaisi…


sudo spt-get install lynx

Lynx käynnistyi ilman ongelmia, joten päätin seuraavaksi kokeilla avata sillä jotakin tuttua sivua jonka URLin muista. http://www.cinemassacre.com aukesi normaalisti, mutta luonnollisesti yksikään sivun videolinkeistä ei auennut (youtube).

LINKIT:
Tehtävänannot

Linux palvelimet: Asennus, työpöytä ja linsennsit.

Tehtävä a)
Aika asentaa ja oppia hallitsemaan Linux! Olen aikaisemmin kokeillut muutamaa eri Linux distroa, mutta en ole ikinä sukeltanut niiden maailmaan tarpeeksi, että kykenisin käyttämään niitä sulavasti esimerkiksi työympäristössä. Siksi päädyinkin Linux Palvelin kurssille, jolla saisin nujerrettua kaksi kärpästä yhdellä iskulla: Oppisin käyttämään Linuxia tehokkaammin, sekä oppisin lisää palvelimista ja sitä kautta backend puolen ohjelmoinnista.
Aikaisempi Linux kokemukseni tosiaan rajoittuu isolta osin Ubuntuun normaalissa arkikäytössä. Aikaisemmin olen kokeillut myös Fedoraa ja jotakin todella vanhaa (90-luvun) Debiania, mutta nämä kummatkin kokeilut jäivät vain pintaraapaisuiksi. Nyt kokeiltavana distrona on Xubuntu, joka toivottavasti saa herätettyä vanhan puolikuolleen mökkiläppärini uudelleen henkiin.
Latasin Xubuntun 16.04 LTS version, rakensin .ISO tiedostosta asennustikun ja siirryin läppärin ääreen asennushommiin. Minkäänlaisia backuppeja en läppärin sisällöstä voinut ottaa, koska olin aikaisemmin syksyllä formatoinut koneen ja ottanut ne vähät koneella olleet tärkeät tiedostot talteen backup-kovolleni. Eli pääsin kirjoittamaan Linuxin täysin tyhjälle kovalevylle. Toteutin asennuksen muuten täysin koulun ohjeiden mukaan ja ainoa ongelma jonka kohtasin, oli nettiyhteyden kanssa. Jostain syystä kännykästä USB:llä saatu yhteys katkeili, eikä minulla ollut ylimääräisiä Ethernet kaapeleita modeemille. Onneksi sain silti asennuksen onnistuneesti loppuun ja Linuxin toimimaan.

 


 

Tehtävä b)

H/W path Device Class Description
=======================================================
system Aspire 5742G (Calpella_CRB)
/0 bus Aspire 5742G
/0/0 memory 1MiB BIOS
/0/1a memory 6GiB System Memory
/0/1a/0 memory 4GiB SODIMM DDR3 Synchronous 1067 MH
/0/1a/1 memory 2GiB SODIMM DDR3 Synchronous 1067 MH
/0/29 processor Intel(R) Pentium(R) CPU P6200
/0/29/2a memory 3MiB L3 cache
/0/29/2c memory 256KiB L2 cache
/0/29/2d memory 32KiB L1 cache
/0/2b memory 32KiB L1 cache
/0/100 bridge Core Processor DRAM Controller
/0/100/1 bridge Core Processor PCI Express x16 Root
/0/100/1/0 display GF108M [GeForce 610M]
/0/100/2 display Core Processor Integrated Graphics C
/0/100/16 communication 5 Series/3400 Series Chipset HECI Co
/0/100/1a bus 5 Series/3400 Series Chipset USB2 En
/0/100/1a/1 usb1 bus EHCI Host Controller
/0/100/1a/1/1 bus Integrated Rate Matching Hub
/0/100/1a/1/1/1 multimedia 1.3M HD WebCam
/0/100/1b multimedia 5 Series/3400 Series Chipset High De
/0/100/1c bridge 5 Series/3400 Series Chipset PCI Exp
/0/100/1c/0 enp2s0 network NetLink BCM57780 Gigabit Ethernet PC
/0/100/1c.1 bridge 5 Series/3400 Series Chipset PCI Exp
/0/100/1c.1/0 wlp3s0 network AR9287 Wireless Network Adapter (PCI
/0/100/1d bus 5 Series/3400 Series Chipset USB2 En
/0/100/1d/1 usb2 bus EHCI Host Controller
/0/100/1d/1/1 bus Integrated Rate Matching Hub
/0/100/1d/1/1/2 communication SAMSUNG_Android
/0/100/1e bridge 82801 Mobile PCI Bridge
/0/100/1f bridge HM55 Chipset LPC Interface Controlle
/0/100/1f.2 storage 5 Series/3400 Series Chipset 4 port
/0/100/1f.3 bus 5 Series/3400 Series Chipset SMBus C
/0/100/1f.6 generic 5 Series/3400 Series Chipset Thermal
/0/101 bridge Core Processor QuickPath Architectur
/0/102 bridge Core Processor QuickPath Architectur
/0/103 bridge Core Processor QPI Link 0
/0/104 bridge 1st Generation Core i3/5/7 Processor
/0/105 bridge 1st Generation Core i3/5/7 Processor
/0/106 bridge 1st Generation Core i3/5/7 Processor
/0/1 scsi0 storage
/0/1/0.0.0 /dev/sda disk 320GB WDC WD3200BPVT-2
/0/1/0.0.0/1 /dev/sda1 volume 487MiB Linux filesystem partition
/0/1/0.0.0/2 /dev/sda2 volume 297GiB Extended partition
/0/1/0.0.0/2/5 /dev/sda5 volume 297GiB Linux filesystem partition
/0/2 scsi1 storage
/0/2/0.0.0 /dev/cdrom disk DVD A DS8A5SH
/1 power Li-lon Battery
/2 power OEM_Define5


Tehtävä c/d)
Asenna itsellesi 3 uutta ohjelmaa ja testaa niitä:
(Itseasiassa lisäsin ohjelmia paljon enemmän kuin nämä kolme, joten päätin valita asennetuista ohjelmista kolme erilaista asennusprosessia.

Clementine:
Ensimmäiseksi tarvitsen jotakin musiikin kuuntelua varten. Minulla on levyhyllyssä yli tuhannen vinyylilevyn kokoelma synapoppia, postpunkkia ja teknoa dj hommia varten, sekä kovalevyllä näistä kopioidut digitaaliset versiot. Ennen keikkoja kappaleiden arkistointi, järjestely, soittolistoiksi rajaaminen ja kuuntelu ovat ehdottoman tärkeitä mukaan otettavia levyjä valittaessa. Windows puolella olen käyttänyt tähän Foobaria, joka on ylivoimaisesti paras sovellus tähän tarkoitukseen, jota olen ikinä käyttänyt, mutta jolle valitettavasti ei ole Linux versiota. Onneksi kuitenkin google löysi useita foorumikeskusteluita, joissa ihmisillä oli sama ongelma kuin minulla, eli tarvitsivat Foobarin kaltaisen luotettavan musiikkiohjelman Linuxille. Yleinen konsensus tuntui olevan, että ohjelma nimeltä Clementine olisi paras vaihtoehto. Sudo apt-get install clementinen jälkeen nopean testauksen perusteella kyseisessä ohjelmassa voisi olla potentiaalia. En osaa kuitenkaan sanoa ilman viikkoja kestänyttä aktiivista käyttöä, että tuleeko Clementinestä minulle pysyvä Linux puolen musiikkisovellus.

Lisenssi: Clemetine on vapaa ohjelmisto GPL v3 -lisenssillä.

Visual Studio Code:
Visual Studio on itseasiassa Microsoftin kehittämä sovellus, joten tuntuu hieman hullulta asentaa se Linux koneelle, mutta koska koulussa Ohjelmistotuotannon Teknologiat ja Ohjelmistoprojekti 2 kursseilla käytämme sitä React Nativen yhteydessä, ja koska käytämme kyseisillä kursseilla omia läppäreitä, on kyseisen ohjelman lataaminen (lähes) välttämätöntä. Visual Studiota ei saa ladattua perus apt-get komennolla, vaan ensin minun täytyi lisätä curl ja apt-get komennoilla lisää repositoryja apt-gettiin, ja vasta sitten normaali sudo apt-get install komento toimi. Itse ohjelma toimii niin kuin pitääkin, ei ongelmia.
(https://code.visualstudio.com/docs/setup/linux)

Lisenssi: Source code: MIT License; Binaries: Freeware;

ASMX:
Minulla on ollut jo parin vuoden ajan unelma, että saisin ohjelmoitua vanhalla 68k Assemblyllä Sega Mega Drive konsolille jonkinlaisen pelin. Olen tässä nyt joulun aikana pikkuhiljaa aloittanut kokeilut kyseisellä kielellä ja tarvitsen luonnollisesti compilerin binäärien luomista varten. Microsoft puolella olin pari kertaa ehtinyt kokeilla asm68k.exe compileria, mutta linux puolella ASMX on käsittääkseni eniten käytetty ja suositeltu compiler 68k assemblylle. ASMX:ää ei tietääkseni apt-get komennolla löydy, joten latasin sen .tar pakettina ja buildasin itse. Pienen kikkailun jälkeen sain compilerin toimimaan ja kokeilin sitä koodaamaani Hello Worldiin. Massiivisen errorilistan jälkeen sain ainakin testattua, että ASMX toimii oikein, vika omassa koodissa.

Lisenssi: En löytänyt mitään infoa ohjelman linsenssistä, mikä ei sinänsä olen ihme, sillä ensimmäisen Motorola 68000 prosessori valmistettiin 1979 ja viimeiset kyseistä prosessoria käyttävät laitteet taisivat olla Sega Mega Drive (1988) ja Amiga 500 (1987).


Tehtävä e)
Lista ohjelmista joita käytän usein, sekä niiden vapaat Linux versiot:

VLC -> Löytyy Linuxille käytännössä täysin identtisenä. GNU lisenssi.
Foobar -> Ei Linux versiota, Clementine on (toivottavasti) lähin vastine.
Virtual DJ -> Linux versio työn alla, tuskin valmistuu ikinä. Toimii Winellä huonosti. Yksikään linuxille tehty dj sovellus ei ole lähelläkään yhtä hyvä.
MS Word -> Libre Office Writer
Eclipse -> Löytyy Linux versio. Open Source, EPL lisenssi.
Notepad++ -> Gedit


Tehtävä f)
Musiikki, koulutehtävät, koodausprojektit, kuvat ja muu vastaava tallennettu backupkovolle.

LINKIT:
Tehtävänannot