h8

Tehtävänanto

Prosessinhallintaa ja lokeja.

a) Kuormitusta yli ajan. Tietysti palvelin hidastelee juuri silloin, kun olet nukkumassa. Seuraisipa joku kuormitusta tuolloin. Asenna heti aluksi jokin ohjelma seuraamaan kuormitusta, jotta voit tarkastella sitä koko tehtävän ajalta. Sopivia ohjelmia ovat esimerkiksi ’munin’ ja sysstat (’sar’).

b) Kuormita järjestelmän eri osa-alueita. Esim. ’stress’. Etsi prosessi toisesta ikkunasta ’top’ tai ’htop’, järjestystä voi vaihtaa ”P” ja ”M”.

Kokeile käytännössä, selitä ja analysoi. Muista selittää, mitä komennolla halutaan selvittää ja tulkitse kokeilusi tulokset. Aiheuta tarvittaessa kuormaa tai muuta työkalulla näkyvää tulkittavaa.

c) iotop; iotop -oa

d) dstat

e) ss –listening –tcp –numeric; ss –listening –tcp; ss –tcp; ss –listening –udp; ss –listening –udp;

f) grep -i error /var/log/syslog; grep -ir error /var/log/

g) Load average näkyy esim ’uptime’, ’top’, ’htop’. Prosessoriydinten määrä näkyy ’nproc’. Miten load average tulkitaan? Miksi prosessoriydinten määrä on tässä kiinnostava? Vapaaehtoisena bonuksena voit miettiä, mitä hyötyä on kuormituslukemasta, joka voi mennä yli yhden eli yli 100%.

h) Analysoi lopuksi koko ajalta keräämäsi kuormitustiedot. Löydätkö esimerkiksi aiheuttamasi kuormituspiikin?

a) Kuormitusta yli ajan. Tietysti palvelin hidastelee juuri silloin, kun olet nukkumassa. Seuraisipa joku kuormitusta tuolloin. Asenna heti aluksi jokin ohjelma seuraamaan kuormitusta, jotta voit tarkastella sitä koko tehtävän ajalta. Sopivia ohjelmia ovat esimerkiksi ’munin’ ja sysstat (’sar’).

  • sudo apt-get update
  • sudo apt-get install sysstat

Klo 12:09 (kone 10:09)

Sysstatilla pystyy kerätä kuormitustietoa pidemmältä ajalta. Otin tehtäväkseni seurata prossu-ja muistinkäyttöä tehtävän ajalta.

Avasin molemmille komennoille omat terminaalit ja annoin näiden rullata harjoituksen ajan. SAR keräsi lokia 5 sekunnin välein 500 kerran verran.

  • sar -r 5 500
  • sar -q 5 500

Näihin palataan tehtävän lopussa.

b) Kuormita järjestelmän eri osa-alueita. Esim. ’stress’. Etsi prosessi toisesta ikkunasta ’top’ tai ’htop’, järjestystä voi vaihtaa ”P” ja ”M”.

Suoritin kommenon stressija saamani kehotuksen myötä asensin stressin. Suoritin komennon ja sain käyttöohjeet. Käyttöohjeen lopusta kopioin examplen käyttööni.

  • stress –cpu 8 –io 4 –vm 2 –vm-bytes 128M –timeout 10s

Parametrien kuvaukset voi katsoa oheisesta kuvasta.

Oheisella komennolla testasin prossua 8 workerin voimin , inputoutputtia 4 workerin voimin sekä 2 workerilla muistitestausta 128mb:lla 10s ajan.

Cpu pyörittää jotakin neliöjuurilaskentaa, io syncciä ja muistikomento varaa/vapauttaa muistia.

Toistin komennon mutta nyt 60s ajan, tästä pitäisi jäädä tietoa a) lokikeräykseen.

Suoritin top komennon stressitestin aikana ja prosesseissa oli liuta stressiprosesseja.

Kokeile käytännössä, selitä ja analysoi. Muista selittää, mitä komennolla halutaan selvittää ja tulkitse kokeilusi tulokset. Aiheuta tarvittaessa kuormaa tai muuta työkalulla näkyvää tulkittavaa.

c) iotop; iotop -oa

Iotop avaa Iotop sovelluksen jolla seurataan järjestelmän komponenttien kuormitusta ja tilaa.

iotop -oa

  • -o, –only only show processes or threads actually doing I/O
  • -a, –accumulated show accumulated I/O instead of bandwidth

Kyseinen komento siis näyttää vain aktiiviset prosessit jotka tekevät jotakin input/outputilla juuri sillä hetkellä (ovat aktiivisena). -a parametri kerää kumulatiivisen datan I/Osta kaistan sijaan. Tarkoittaa kai siis datan määrää mitä joutunut käsittelemään, ei esim tallennusmäärää.

Aikaisempi stressi komento ei tuonut mitään reaktiota iotopin dataan. Latasin blenderin ja avasin tämän, tämän käyttämä IO oli <0.5%. Ei siis mitään suuria lukuja. Googlettelu ei paljastanut miten stress olisi voinut auttaa tässä.

d) dstat

Suoritin kommenon ja taas kehotteen mukaan asensin sen mitä komento käski.

Dstatilla pystyi seuraamaan vaikka mitä, prossukäyttöä, verkkoliikennettä, kovon käyttöä ja muuta.

Testatakseni tätä suoritin taas a) kohdan stressitestin , ohessa tulos. usr/sys sarakkeet kertovat CPU:n tarinan noin puolivälin jälkeen kun tasot nousevat keltaiselle.

Nettiliikennettä testasin lataaamalla internetistä ison tiedoston. Ohessa kuva josta selviää että filu lautautui alkuun noin kahta megaa sekunnissa.

Yritin myös käyttää stress -d komentoa mutta sain herjaa tilan loppumisesta. Simuloin omaa stressitestiäni siirtelemällä aikaisemmin ladattua tiedostoa kovalevyltä toiselle, tässä tapauksessa uudelle erillisille usbille jonka kiinnin koneeseeni. Ohessa data, write sarake kertoo usbille kirjoituksesta. Kirjoitusnopeus oli hidasta, surkea usbi 2.0 syynä oletettavasti.

e) ss –listening –tcp –numeric; ss –listening –tcp; ss –tcp; ss –listening –udp; ss –listening –udp;

Suoritin kommenon ja komentohan siis suoritti 5 erillistä komentoa peräjälkeen. Ohessa komennon tulos, komentojen vaihtuminen näkyy kun rivillä on STATE.

Tässä dokumentaatio josta katotaan mitä eri kommenot tekevät

https://linux.die.net/man/8/ss

ss –listening –tcp –numeric

  • l, –listeningDisplay listening sockets.
  • -t, –tcpDisplay only TCP sockets.
  • -n, –numericDo now try to resolve service names.

Elikkä komento siis näyttää kuuneltava tcp socketit/ yhteydet ja ei yritä ratkaista palveluiden nimiä vaan näyttää portit.

ss –listening –tcp

Sama kuin aikaisempi mutta nyt yrittää ratkoa kuunneltavien palveluiden nimet. Portissa lukee esim domain.

 ss –tcp; Komento näyttää vain tcp socketit/yhteydet.

ss –listening –udp; Komento näyttää kuunneltavat udp yhteydet

Testasin saada uuden yhteyden aikaiseksi ja otin ssh yhteyden koneeseeni. Yhteys näkyi listalla.

f) grep -i error /var/log/syslog; grep -ir error /var/log/

http://man7.org/linux/man-pages/man1/grep.1.html

  • -i, –ignore-case Ignore case distinctions in patterns and input data, so that characters that differ only in case match each other.
  • -r, –recursive Read all files under each directory, recursively, following symbolic links only if they are on the command line. Note that if no file operand is given, grep searches the working directory.

grep -i error /var/log/syslog komento etsii kaikki rivit jotka sisältävät errorin case-match ignorella (error, Error, hafdsErRRoR555 jne).

grep -ir error /var/log/ käy kaikki filut läpit logissa ja alikansiossa ja palauttaa jokaisen rivin missä lukee error case-match-ignorella.

g) Load average näkyy esim ’uptime’, ’top’, ’htop’. Prosessoriydinten määrä näkyy ’nproc’. Miten load average tulkitaan? Miksi prosessoriydinten määrä on tässä kiinnostava? Vapaaehtoisena bonuksena voit miettiä, mitä hyötyä on kuormituslukemasta, joka voi mennä yli yhden eli yli 100%.

https://scoutapm.com/blog/understanding-load-averages

Load average kertoo paljonko CPU:n on jonossa taskia. Jokainen ydin lisää tämän kapasiteettia yhdellä , eli quadcore pystyy käsittelemään 4:n asti. Coret ovat siis ainoat mitkä merkaavat tässä.

h) Analysoi lopuksi koko ajalta keräämäsi kuormitustiedot. Löydätkö esimerkiksi aiheuttamasi kuormituspiikin?

Tässä tuli hieman ongelmia, tehtävät oli jo suoritettu ja sar -r / q rullasivat taustalla (koska oli niin jumalattoman pitkä keräysaika) ja läppärin akku loppui kesken kadottaen datan bittiavaruuteen sillä en ollut määritellyt keräystä tallennettavaksi.

Suoritin aikaisemmat stressitestit uudestaan 4min ajalta.

Suoritin a) komennon, tiedoston latauksen sekä samanaikaisen tiedoston siirron usbilta kovalevylle.

Stresstestin pituudeksi oli määritelty 60s ja sen huomaa sar -q logista 12:49:20 – 12:50:15 sarakkeita katsellessa. Kuormituksen huippuhetkinä loadi oli > 9 ja yksi pyyntö oli blocked. ldavg-1 saraketta katsoessa voi päätellä minuutin minä actioni tapahtui koska tämä sarake näyttää loadin keskiarvon minuutin ajalta. ldavg-5 ja ldavg-15min näyttävät keskiarvon 5 ja 15min ajalta ja näissä keskiarvo ei juurikaan näy koska koko actioni tapahtui ~1min ajan.

h7

Tehtävänanto

  • 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”.

Otin labran http://terokarvinen.com/2018/arvioitava-laboratorioharjoitus-linux-palvelimet-ict4tn021-6-torstai-alkukevat-2018-5-op

Kuten Kalevalassa sanottiin niin lyhyestä virsi kaunis.

ESIASENNUKSET JA TESTAUKSET

Pyöräytin ubuntun päälle livetikulta.

Kone pyörii UTC 0,Pistin ssh ja palomuurin kuntoon

  • sudo ufw allow ssh
  • sudo ufw enable

Otin sshyhteyden omaan koneeseeni sshn asennettua

Kävin materiaalin läpi ja listasin tehtävässä tarvittavat palikat jotka asensin.

  • sudo apt-get update
  • sudo apt-get install -y apache2 php libapache2-mod-php sqlite3 sysstat php7.2-sqlite3 ssh

ssh xubuntu@ip

Enabloin datan keräykse sysstatissa, tällä seurataan koneen kuormitustietoja. Defaulttina lokittaa 10min välein.


sudoedit /etc/default/sysstat

enabled = ”true”

sudo systemctl restart sysstat
sar -komennolal katsoin mitä löytyy, löytyi yksi tietue. Listataan myöhemmin kaikki

Testasin apachen toiminnan, näytti localhostissa defualt sivun.
Testasin sqlite3 toiminnan
Avasin sqlite3 komennolla sqlite3

CREATE TABLE asd (id INTEGER PRIMARY KEY, numero INTEGER not null);
INSERT INTO asd VALUES(123,123);
Select * FROM asd;

sain syötetyn rivin, kaikki ok
Nyt on asennetut pömpelit testattu ja aletaan suorittaa tehtävän osia tarkemmin.

  • Virtuaalihosti kuntoon ja PHPn testaus

Loin virtuaalihostin.

sudoedit /etc/apache2/sites-available/juuh.conf

<VirtualHost *:80>
	ServerName sorkkacrm.example.com
	DocumentRoot /home/xubuntu/phpromu/sivu/
	<Directory /home/xubuntu/phpromu/sivu>
		Require all granted
	</Directory>
</VirtualHost>

Poistin apachen defaultvirtualhosti pois käytöstä ja loin oman uudentilalle. Boottasin apachen että sain sivut toimintaan,

  • sudo a2ensite juuh.conf
  • sudo a2dissite 000-default.conf
  • sudo systemctl restart apache2

Loin virtuaalihostin vaatimat kansiot ja tiedostot

  • mkdir /home/xubuntu/phpromu/
  • mkdir /home/xubuntu/phpromu/sivu
  • nano /home/xubuntu/phpromu/sivu/index.php
#index.php

<?php
print("printti")
?>

Avattu localhostissa, sivusto tulostaa printti tekstin kuten pitääkin. Tungin tiedon hostitiedostoon jotta voidaan simuloida sivustoa.

  • sudoedit /etc/hosts
  • lisätään rivi 127.0.0.1 sorkkacrm.example.com

Testasin sorkkacrm.example.com selaimessa, toimii.

cd /home/xubuntu/phpromu/sivu/

Luodaan uusi tietokanta

  • sqlite3 tietokanta.db

sqlitessä:

CREATE TABLE asiakkaat (id integer primary key , nimi varchar (300) not null);

Syötetty asiakkaat inserteillä.

- Kulta ja Kaivos ky
- Piilosana ry
- MetalliMake

Select * from asiakkaat näytti listan asiakkaista oikein.

Lähdin parantelemaan php scriptaa, käytin lähteenä https://stackoverflow.com/questions/17997722/sqlite3-query-to-list-all-tables-in-database-only-shows-one-table/17997856

#index.php

<?php
    $db = new SQLite3('tietokanta.db');
    $tablesquery = $db->query("SELECT nimi FROM asiakkaat;");
   //$tables = $tablesquery->fetchArray(SQLITE3_ASSOC);
     while ($table = $tablesquery->fetchArray(SQLITE_ASSOC))
{
echo $table['nimi'].'<br />';
}

?>

Nyt sorkkacrm.example.com suolsi ulos asiakkaat. Nasta juttu!

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

Loin uuden hostin kuten aikaisemmin

sudoedit /etc/apache2/sites-available/rautaarajalle.conf

<VirtualHost *:80>
	ServerName rauta.example.com
	DocumentRoot /home/xubuntu/phpromu/sivu2/
	<Directory /home/xubuntu/phpromu/sivu2>
		Require all granted
	</Directory>
</VirtualHost>

a2ensite rautaarajalle.conf

lisäsin tietuun hosts filuun taas

  • 127.0.0.1 rauta.example.com
  • mkdir /home/xubuntu/phpromu/sivu2
  • nano /home/xubuntu/phpromu/sivu2/index.html
<!DOCTYPE html>
<html>
<head>
<title> Sorkka ja Rauta oy</title>
</head>
<body>
<h1>Sorkka ja Rauta Oy</h1>
</body>
</html>

sudo systemctl restart apache2 ja sivusto näkyi rauta.example.comissa. JES!

## 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/ .

Loin Einarille käyttäjän

sudo adduser einari

Enabloitiin userdirri että saatiin kotihakemisto toimintaan

  • sudo a2enmod userdir
  • sudo systemctl restart apache2

Loin einarille public_html kansion

mkdir /home/einari/public_html

Lisättiin php filu tänne joka lähtee tulostamaan vaadittua tietoa

nano /home/einari/public_html/index.php

#index.php

<?php
print("Einari")
?>'

Tässä kohtaa indexi tulosti pelkän hipsun kun katsoin, luulin että olisi tuon php raakakoodinkin laittanut mutta ei.

Asetetaan kansio käyttäjä einarin alaisuuteen , kiva jos Einarikin pääsis käsittelee tätä kansiota

sudo chown einari:einari /home/einari/public_Html

lisätään myös index.php einarin alaisuuteen

sudo chown einari:einari /home/einari/public_html/index.php

Muokataan phpn conffeja jotta sallitaan php kotihakemistossa , sudoedit /etc/apache2/mods-availalbe/php7.2.conf

  • php_adminflag engone On

sudo systemctl restart apache2

Testattu localhost/~einari ja tämä tulostaa einarin

Kävin vielä lopulta testaamassa kansion toimintaa einarina, otin ssh yhteyden ssh einari@localhost ja navigoin public html cd /home/einari/public_html

nano index.php, tein muutoksen ja tallensin. Muutos välittyi selaimeen. Loin myös uuden html tiedoston public_html ja tämänkin avaaminen onnistui. Käyttäjäoikeudet kunnoss,a einari voi nyt koodata miten tahtoo 👌

## Rosvoja porteilla
Onko koneellemme yritetty murtautua? (Kyllä). Etsi omalta paikalliselta koneeltasi todisteet

Kävin läpi /var/log/auth.login, ainoat väärät kirjautumiset olivat parista omasta yrityksestä kirjautua kun typotin salasanat.

Kuormitusinfo

Eipä tässä mitää kuormitusta tapahtunut ja koko touhu näköjään meni alle tuntiin.

Lähteet

terokarvinen.com

https://stackoverflow.com/questions/17997722/sqlite3-query-to-list-all-tables-in-database-only-shows-one-table/17997856

h6

Tehtäväanto

h6

a) Tietokanta wepissä. Tee oma yksinkertainen, tietokantaa käyttävä ohjelma. Ohjelmalla tulee olla jokin käyttötarkoitus. Voit tehdä ohjelman muokkaamalla Teron koodia (muista lähdeviite).

b) Laita tietokantaohjelmasi toimimaan mod_wsgi:n kanssa

Esivalmistelut, asensin päivitykset sekä tehtävässä vaadittavat paketit.

  • sudo apt-get update
  • sudo apt-get install -y python3-flask apache2 libapache2-mod-wsgi-py3 curl

Wsgikäyttäjän ja ryhmän luonti, jotta ei tarvitsisi sudoilla säädellä.

  • sudo adduser jaaniwsgi
  • sudo usermod –lock jaaniwsgi
  • sudo adduser xubuntu jaaniwsgi
  • su – xubuntu (group policyn päivitys)

Apachen site conffi ja WSGI-asetukset

Lisäsin konffitiedoston apachen sits-availableihin

  • sudoedit /etc/apache2/sites-available/jaaniwsgi.conf
<VirtualHost *:80>
        ServerName jaanionparas.com
 
        WSGIDaemonProcess jaaniwsgi user=jaaniwsgi group=jaaniwsgi threads=5
        WSGIScriptAlias / /home/jaaniwsgi/public_wsgi/jaani.wsgi
 
        <Directory /home/jaaniwsgi/public_wsgi/>
                WSGIScriptReloading On
                WSGIProcessGroup jaaniwsgi
                WSGIApplicationGroup %{GLOBAL}
                Require all granted
        </Directory>
</VirtualHost>
  • sudo a2ensite jaaniwsgi.conf
  • sudo a2dissite 000-default.conf
  • apache2ctl configtest
  • sudo systemctl restart apache2

Configtesti ok, Testasin localhostissa toimintaa ja sain forbidden herjan, odotetusti.

jaaniwsgin hakemistojen ryhmät kuntoon

Lisäsin käyttäjälleni käyttökansiot mistä pyörittää palveluita sekä asetin ryhmäasetukset kuntoon jotta jokainen ryhmän jäsen voisi muokata tiedostoja ja kansioita.

  • sudo mkdir /home/jaaniwsgi/public_wsgi
  • sudo chown jaaniwsgi:jaaniwsgi /home/jaaniwsgi/public_wsgi/
  • sudo chmod g=rwxs /home/jaaniwsgi/public_wsgi/
  • ls -ld /home/jaaniwsgi/public_wsgi/

WSGI Filun luontia

Loin WSGI filun ja tänne sisällön

nano /home/jaaniwsgi/public_wsgi/jaani.wsgi

import sys
assert sys.version_info.major >= 3, "Python version too old in jaani.wsgi!"
 
sys.path.insert(0, '/home/jaaniwsgi/public_wsgi/')
from hello import app as application

Tämän jälkeen loin python filun jotta jotakin saataisiin pyörimään. Pohjana käytin tehtävänannossa mainittua materiaalia. Asensin myös koodin vaatimat kirjastot etukäteen oman tietoni ja lähdemateriaalin pohjalta. Turha esittää tyhmää ja tietämätöntä jos nämä on jo aikaisemmin tehnyt ja tiennyt.

  • nano /home/jaaniwsgi/public_wsgi/hello.py
  • sudo apt-get install -y python3-flask-sqlalchemy python3-wtforms python3-flaskext.wtf

hello.py

from flask import Flask, render_template, flash, redirect
from flask_sqlalchemy import SQLAlchemy
from wtforms.ext.sqlalchemy.orm import model_form
from flask_wtf import FlaskForm
import wtforms

app = Flask(__name__)
db = SQLAlchemy(app)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///autoformed.db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SECRET_KEY"] = "dUCF)mtd9MAoZ?;R|8*iB^.+TCV//0"

class Reply(db.Model):
	id = db.Column(db.Integer, primary_key=True)
	coming = db.Column(db.Boolean, nullable=False)
	email = db.Column(db.String, nullable=False)
	name = db.Column(db.String, nullable=False)

field_args = { "email": {"validators": [wtforms.validators.Email()]} }
ReplyForm = model_form(model=Reply, base_class=FlaskForm, db_session=db.session, field_args=field_args)

@app.before_first_request
def beforeFirstRequest():
	db.create_all()

@app.route("/", methods=["GET", "POST"])
def index():
	form = ReplyForm()

	if form.validate_on_submit():
		reply = Reply()
		form.populate_obj(reply)
		db.session.add(reply)
		db.session.commit()
		flash("Your reply has been added. Welcome!")
		return redirect("/")
	replies = db.session.query(Reply)
	return render_template("replies.html", form=form, replies=replies)

def main():
	app.run(debug=True)

if __name__ == "__main__":
	main()

Tämän jälkeen loin html sivustot, base.html ja tätä extendaava replies.html

templates/base.html – Base template

<!doctype html>
<html lang=en>
	<head>
		<title>Joining an Event Example</title>
		<meta charset="utf-8">
	</head>
	<body>
		{% with messages = get_flashed_messages() %}
		{% if messages %}
		<ul class=flashes>
			{% for message in messages %}
			<li>{{ message }}</li>
			{% endfor %}
		</ul>
		{% endif %}
		{% endwith %}

		{% block body %}
		<h1>Hello Tero</h1>
		{% endblock %}
		<p>Learn Flask automatic forms at <a href="TeroKarvinen.com">TeroKarvinen.com</a>
	</body>

</html>

templates/replies.html – Form and List Template

{% extends "base.html" %}
{% block body %}
<h1>Replies</h1>
<form method=post action="/">
	{{ form.csrf_token }}
	{% for field in form if not field.name in ["csrf_token"] %}
		<p>{{ field.label }}: {{ field }} <b>{{ " ".join(field.errors) }}</b></p>
	{% endfor %}
	<input type="submit">
</form>

<h2>Replies</h2>
{% for reply in replies %}
<p>{{ reply.name }}</p>
{% endfor %}

{% endblock %}

Tämän jälkeen testasin localhostin toiminnan ja sain formsin näkymään. Lisäsin repliesin ja tämä näkyi formilla.

Muokkaaminen omiin tarkoituksiin

Tavoitteenani oli luoda anonyymi ikägalluppi ja tämän myötä tallentaa tietokantaan pelkästään käyttäjän ikä. Koska arvostamme anonyymiutta niin muita tietoja käyttäjästä ei kerätty.

hello.py , replyn muokkaus

class Reply(db.Model):
	id = db.Column(db.Integer, primary_key=True)
	age= db.Column(db.Integer, nullable=False)

ja sitten muokkasin base.html ja replies.html oman näköisekseni. Lopulta touch jaani.wsgi sekä localhostin refreshaus ja lopulta hieno ikägalluppini oli toiminnassa!

Lähteet

http://terokarvinen.com/2020/flask-automatic-forms/

http://terokarvinen.com/2020/deploy-python-flask-to-production/

http://terokarvinen.com/2020/flask-templates/

h5

h5

Tee kukin tehtävä alusta lähtien ja kirjaa samalla, vaikka olisit kokeillut tunnilla. Jos pidät propellihattua, katso kohta x.

a) Hello Flask! Tee Python Flask hei maailma kehitysympäristössä. Voit siis käyttää tuotantoon sopimatonta app.run(debug=True) ajoa.

b) Tuotanto-Flask. Tee tuotantotyyppinen asennus Flaskista käyttäen Apachen WSGI-modulia. Kokeile, että pystyt muokkaamaan koodia ilman sudoa ja saat uuden version käyttöön käynnistämättä Apachea uudelleen. (’touch foo.wsgi’).

c) Lisää tuotanto-Flaskiin muotit (templates).

d) Sun IP. Tee Flask-sivu, jolla näkyy tietoja käyttäjästä. Esimerkiksi request.user_agent.string, request.remote_addr. Muista ”from flask import request”.

e) Vapaaehtoinen. Tee palvelinohjelma, joka laskee jotain käyttäjän antamista luvuista. Painoindeksi, tonttunimesi, pisteytys salasanallesi tms. Tässä tarvitaan lomakkeita (forms) ja POST-pyyntöjen lukemista.

x) Propellivaihtoehto, vapaaehtoinen, korvaa muut kohdat. Julkaise hyödyllinen Flask-ohjelma, joka käyttää tietokantaa ja lomakkeita. Hyöty voi olla pienikin, mutta ohjelman tulee tehdä jotain järkevää. (OK: äänestä paras kissankuva, ilmoittaudu arpajaisiin, nallekarhujen lainausjärjestelmä. Ei käy: lue esimerkkitietueita foo ja bar tietokannasta.) Hauskaa koodailua!

a) Hello Flask! Tee Python Flask hei maailma kehitysympäristössä. Voit siis käyttää tuotantoon sopimatonta app.run(debug=True) ajoa.

Käytin materiaalina http://terokarvinen.com/2020/hello-flask-python-web-app/ ja asensin ohjeiden mukaiset paketit ja päivitykset

  • sudo apt-get update
  • sudo apt-get install -y apache2 pyhton3-flask curl

Tämän jälkeen loin kotihakemistoon hello.py tiedoston sisällöllä

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
	return "Learn Flask at TeroKarvinen.com!"

app.run(debug=True)

Tässä kohtaa oli jo identiteettivarkaus lähellä, mutta onneksi palomuurini oli enabloitu ja muu ulkomaailma oli eristetty palvelimestani!

Suoritin komenno python3 hello.py ja scripta lähti toimintaan! Hienoa! Suunnistin localhost:5000 osoitteeseen ja ihastelin Teron sivujen mainosta onnistuneesti.

b) Tuotanto-Flask. Tee tuotantotyyppinen asennus Flaskista käyttäen Apachen WSGI-modulia. Kokeile, että pystyt muokkaamaan koodia ilman sudoa ja saat uuden version käyttöön käynnistämättä Apachea uudelleen. (’touch foo.wsgi’).

Käytin pohjamateriaalina http://terokarvinen.com/2020/deploy-python-flask-to-production/ ja koostin täältä tarvittavat paketit ja komennot jotka suoritin heti alkuun-

  • sudo apt-get -y install libapache2-mod-wsgi-py3
  • sudo a2enmod userdir
  • sudo systemctl restart apache2
  • apache2ctl configtest

Homma toimi kuin junan vessa, configtesti halusi taas ServerNamea mutta sitä ei ollut tarpeen lisätä tehtävässä. Ignorasin siis varoituksen. Tämän jälkeen testasin vielä localhostissa että apache toimisi, ja sehän toimi avautumalla oletussivuun!

Lähdin luomaan uutta käyttäjää flaski härpäkettä varten, olihan aika saada haltuun ryhmäoikeudet!

  • sudo adduser jaaniwsgi
  • sudo usermod –lock jaaniwsgi
  • sudo usermod xubuntu jaaniwsgi

Lisäsin uuden käyttäjän flaskia varten ja lisäin oman pääkäyttäjäni jaaniwsgi ryhmään. Tämän jälkeen loin virtualhostin jotta wsgi ja tuleva python scripta saataisiin toimimaan.

sudoedit /etc/apache2/sites-available/jaaniwsgi.conf

##### Ja tiedostoon sisään tämä #######

<VirtualHost *:80>
        ServerName jaanionparas.com

        WSGIDaemonProcess jaaniwsgi user=jaaniwsgi group=jaaniwsgi threads=5
        WSGIScriptAlias / /home/jaaniwsgi/public_wsgi/jaani.wsgi

        <Directory /home/jaaniwsgi/public_wsgi/>
                WSGIScriptReloading On
                WSGIProcessGroup jaaniwsgi
                WSGIApplicationGroup %{GLOBAL}
                require all granted
        </Directory>
</VirtualHost>

Tässä siis määrittelin WSGI scriptan reloadauksen päälle, tähän ryhmät ja määrittelin vielä kansiot joita ei ollut tässä vaiheessa luotu.

Tämän jälkeen poistin apachen oletussivun käytöstä ja lisäsin oman uuden sivuni josta sitten tuli oletussivu.

  • sudo a2ensite jaaniwsgi.conf
  • sudo a2dissite 000-default.conf

Tässä kohtaa pystyin testaamaan jo sivustoani, sillä wsgi pömpelit asennettiin jo alussa! On hyvä käydä materiaali etukäteen läpi niin ei tule turhia virheitä vastaan, vaikka virheistähän oppii. curl localhost paljasti että jokin on tässä kohtaa pielessä, ja apachen error logi paljasti että konffaamani kansio puuttui.

Loin uuden kansion sudo mkdir /home/jaaniwsgi/public_wsgi komennolla ja tämän jälkeen aloin laittamaan käyttäjäoikeuksiaa kuntoon.

Aikasemmin olin jo lisännyt itseni jaaniwsgi ryhmään mutta ryhmäoikeudet eivät olleet vielä tulleet voimaan, tarkastin tämän groups komennolla. su – xubuntu komento korjasi tilanteen, vaihdoin itseni xubuntusta xubuntuun ja nyt jaaniwsgi ryhmä oli ryhmissäni kun koitin groups komentoa.

ls -ld public_wsgi kansioon kuitenkin paljasti että kansio on nyt rootin hallinnassa. Vaihdoin oikeudet tähän kansioon jaaniwsgi ryhmään komennolla

sudo chown jaaniwsgi:jaaniwsgi /home/jaaniwsgi/public_wsgi

Tämän jälkeen lisäsin kansioon ryhmäoikeuksia editoimiseen tiedostoihin ja kansioihin komennolla

sudo chmod g=rwxs /home/jaaniwsgi/public_wsgi

curlasin localhostia ja sain herjan puuttuvaasta sivusta: wsgi tiedostoni puuttui jonka olin aikaisemmin määritellyt. Loin uuden tiedoston sudo /home/jaaniwsgi/public_wsgi/jaani.wsgi komennolla ja lisäsin pätkän koodia.

import sys
assert sys.version_info.major >= 3, "Python version too old in jaani.wsgi!"

sys.path.insert(0, '/home/jaaniwsgi/public_wsgi/')
from hello import app as application

Curlasin localhostia testatakseni wsgin toimintaa.

$ curl localhost
<title>500 Internal Server Error</title>
$ tail /var/log/apache2/error.log 
ModuleNotFoundError: No module named 'hello'


Aikaisemmassa scriptassa määritettiin että hello.py olisi käytettävä scripta, ja tätä ei ollut luotu vielä. Kopioin a) osiossa luoma tiedostoni public_wsgi kansioon ja poistin lopusta app.run(debug=True) rivin . Tässä kohtaa päätin poistua rikolliselta polulta ja vaihdoin teron sivujen mainostuksen omaan sivuuni muokkaamalla hello.py:n return riviä. Kuin teinipoika minä kosketin itseni mukaan nimettyä tiedostoa touch jaani.wsgi komenolla jotta tiedosto autoreloadaisi itsensä.

Testasin uudelleen localhostissa sivuni toimintaa, nyt mainostin itseäni täällä! Sivusto toimi ja muutokset olivat voimassa.

c) Lisää tuotanto-Flaskiin muotit (templates).

Materiaalina käytin http://terokarvinen.com/2020/flask-templates/ sisältöä.

Loin uuden kansion ”Templates” public_wsgi kansioon ja tänne lisäsin uuden tiedoston base.html.

<!doctype html>
<html>
	<head>
		<title>Hello Templates</title>
		<meta charset="utf-8">
	</head>
	<body>
		<h1>{{ greeting }}</h1>
		<p>
			Harjoitus
			
		</p>
	</body>
</html>

Muokkasin olemassaolevaa hello.py tiedosta ja vaihdoin tämän sisällön tähän:

#!/usr/bin/python3
"Return HTML templated page"

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def templated():
	return render_template("base.html", greeting="Hello Templates!")

Nyt hello.py palauttaisi tempate kansiosta tämän aikaisemman base.html filun.

Tilanne oli koskettava ja niin olin minäkin: touch jaani.wsgi . Tämän jälkeen navigoin localhostiin ja vastaan tuli sydäntälämmittävä tervehdys templateille.

d) Sun IP. Tee Flask-sivu, jolla näkyy tietoja käyttäjästä. Esimerkiksi request.user_agent.string, request.remote_addr. Muista ”from flask import request”.

Hetken tehtävänantoa pohdittuani tajusin että Sun IP ei viittaa aurinkoon tai oracleen vaan MINUUN.

Googlasin ”flask import request user_agent” joka vei minut https://stackoverflow.com/questions/9878020/how-do-i-get-the-user-agent-with-flask . Tässä kohtaa en oikein tiennyt että mitä vielä halutaan joten etsin sivulta user_agentilla tietoa.

flask.request.user_agent.string

Rivi vaikutti lupaavalta ja aikaisemmassa materiaalissa oli

We must import what we use. Render template is imported to main namespace, so we can call it just ”render_template()” instead of ”flask.render_template”.

joten muutin tämän komennon suoraan request.user_agent.stringiin ja kokeilin laittaa tämän returniin.

from flask import Flask, render_template, request

app = Flask(name)

@app.route(”/”)
def testi():
return request.user_agent.string

Koskettelin taas touchilla jaani.wsgiä ja reloadasin localhostini. Hyvä arvaukseni ja tekninen lukutaitoni tuottivat tulosta: Ruudulle lävähti user_agenttini tiedot!

h4

Tehtävänanto:

a) Tee alusta lähtien oma julkinen palvelin Internetiin.

Vinkkejä: Tee siis uusi virtuaalipalvelin (esim ”Droplet”) ja sille tarvittavat alkutoimet. Tee uusi DNS-nimi. Alanimiä voi yleensä tehdä maksutta: esim. jos hallitsee TeroKarvinen.com, voi tehdä hattu.TeroKarvinen.com. Tässä tehtävässä on tarkoitus sujuvoittaa koko prosessi, tee siis uusi A-tietue nimipalvelimeen ja uusi virtuaalipalvelin alusta lähtien, vaikka sinulla olisi jo sekä nimi että palvelin. Kun kaikki toimii ja raportti on valmis, voit poistaa turhan palvelimen ja jättää itsellesi esimerkiksi vain yhden käyttöön. Jos jäät jumiin, pyri päättelemään, mitkä osat toimivat ja mitkä eivät; ratkomme viimeiset ongelmat yhdessä tunnilla. Palautusaika on tuttuun tapaan 24h ennen seuraavaa tapaamiskertaa, eli vasta talvivapaan jälkeen.

b) Vapaaehtoinen: Etsi lokeistasi merkkejä murtautumisyrityksistä ja analysoi ne.

c) Vapaaehtoinen: Laita TLS-salakirjoitus (https) toimimaan certbot ja Let’s Encrypt avulla.

d) Vapaaehtoinen: Tee weppisivuja omalla, paikallisella koneellasi ja kopioi ne palvelimmelle scp-komennolla.

x) Vaikea, vapaaehtoinen vaihtoehtotehtävä Tämä on vain niille parille propellihatulle, jotka halusivat vaikeamman tehtävän. Korvaa muut h4 koti- ja tuntitehtävät. Koodaa ja julkaise uusi tietokantaa hyödyntävä weppipalvelu. Palvelun pitää ratkaista jokin käytännön ongelma, esimerkiksi ilmoittautuminen tapahtumaan, pisteytä tunti, äänestä suosikkia tms. Voit hyödyntää vanhoja koodejasi, kunhan lopputulos on uusi. Voit käyttää mitä vain kehitysalustaa (framework), esimerkiksi LAMP, Flask, Django, Postgre, Mariadb… Muista lisätä raporttiin ruutukaappaukset keskeisestä toiminnallisuudesta.

Rauta: Läppäri, livetikku, copypaste.

a) Tee alusta lähtien oma julkinen palvelin Internetiin.

Lähdin luomaan uutta virtuaalipalvelinta itselleni ja palveluntarjoajakseni päätyi vultr.com koska minulla on jo täällä muita palvelimia.

Vultr, virtuaalipalvelimen pystytys

Kirjauduin Vultrn sivuille ja lähdin luomaan uutta palvelinta painamalla Deploy Server nappia ( plus merkki sinisellä pohjalla) sivuston oikeasta yläreunasta.

Valitsin Cloude Computen palveluni tyypiksi

Tämän jälkeen Server Locationiin valitsin Amsterdamin

Käyttöliittymäksi Server Typestä valitsin Ubuntu 18.04 x64:n

Server Sizeen valitsin halvimman paketin 5 dollarin hinnalla.

Lopuksi deployasin severin painamalla Deploy Now nappia sivuston pohjalta.

Virtuaalipalvelin konffaus

Hain hallintapaneelista virtuaalipalvelimeni tiedot, elikkä tämän IP:n ja salasanan. Oletuskäyttäjä oli root.

Tehtävänäni oli lisätä uusi käyttäjä sudo voimin, asentaa apache2 ja saada palvelimeni näkymään domainissani jaanisavolainen.com

Avasin terminaalin ja otin ssh-yhteyden virtuaaliapalvelimeeni komennolla

  • ssh root@45.32.232.15

Ensimmäinen tehtäväni oli laittaa palomuuri kuntoon lisäämällä tähän pääsyn portteihin 22 ja 80 jotta pystyn käyttämään apache2 ja ssh:a.

  • sudo ufw allow 22/tcp
  • sudo ufw allow 80/tcp
  • sudo uwf enable

Loin uuden käyttäjän tunnuksella jaani ja lisäsin tämän sudo ryhmään.

  • sudo adduser jaani
  • sudo usermod -aG sudo jaani

Vaihdoin käyttäjän jaaniin komennolla ”su – jaani” ja tarkistin sudo oikeuksien toiminnan päivittämällä paketit sekä asentalalla apachen.

  • sudo apt-get update
  • sudo apt-get install -y apache2

Toiminnot menivät läpi ja totesin apachen toiminnan avaamalla selaimesta virtuaalipalvelimen ip:n. Tämä näytti apachen defaultsivua.

Tämän jälkeen lukitsin root käyttäjän tietoturvasyistä, sillä tämä hankaloittaa potentiaalisten tunkeutujien työtä koska he eivät tiedä muita käyttäjiä kuin rootin. (Ainakin periaatteessa, nythän blogin perusteella tiedetään Jaani)

  • sudo usermode -L -e 1 root

-L parametri tarkoittaa Lockia, -e tarkoittaa expirationia ja 1 että milloinka, elikkäs -e 1 tarkoittaa että lukitsee koneen 1pv unixin alkuajan mukaan, elikkä 1970-01-01 olisi tässä kohtaa lukitus/expire päivämäärä.

Yritin kirjautua puttylla virtuaalipalvelimelle käyttäen root tunnusta ja sain ilmoituksen että access denied. Tunnus on nyt lukittuna.

Myöhemmin googletin lisää aiheesta ja sain tietooni että rootiin voisi vielä olla pääsy root loginilla ssh:n kautta. http://terokarvinen.com/2017/first-steps-on-a-new-virtual-private-server-an-example-on-digitalocean

Muokkasin sudoeditillä tiedostoa /etc/ssh/sshd_config ja vaihdoin PermitRootLoginin arvon yes -> no. Tallensin tiedoston ja käynnistin palvelun uudelleen sudo service ssh restart komennolla.

Namecheap, Domainin DNS nimi , A record

Kirjauduin Namecheap.com sivustolle ja sivusto aukesi dashboardille. Valitsin jo olemassa olevan domainin painamalla tämän ”Manage” nappulaa

Menin ylävalikosta Advanced DNS osioon ja lähdin hallinnoimaan Recordeja. Poistin jo olemassaolevat recordit pois, näitä oli mm. parkkeeraus palvelu ja redirecti.

Painoin Add New Record nappia ja valitsin aukeavastaa vetovalikosta A Recordin. Lisäsin tämän tietueen Host kentään @ – arvon ja valueeseen lisäsin virtuaalipalvelimeni osoitteen. Toistin toimenpiteen mutta nyt laitoin host kenttään www arvon jotta sivustoni vastaisi myös osoitteeseen http://www.jaanisavolainen.com pelkän jaanisavolainen.com sijaan.

Tallensin lisäykseni ja odotin A recordin voimaantulemista. Olin jo aikaisemmin käynyt sivustolla jaanisavolainnen.com käyttökoneellani ja käyttökone näytti cachettuaa sivua vanhoista recordeista. Testasin toisella koneella sivustoa 5 minuuttia myöhemmin ja tämä latasi heti apachen oletussivun jonka olin laittanut pyörimään virtuaalipalvelimelle

h3

Tehtävänkuvaus

Tee viisi vapaavalintaista kohtaa. Säädä vaikeustaso oikeaksi: jos olet ihan alussa ja tämä on haastavaa, tee helpoimmat a b d i m. Jos osaat jo perusteet, tee useampia tai vaikeampia kohtia. Tarkoitus on, että tehtävät tehtyäsi osaat enemmän kuin osasit ennen. Tee tehtävät alusta lähtien koneella, vaikka olisitkin kokeillut samaa asiaa tunnilla.

Laitteisto

  • Kannettava tietokone: Lenovo v320-17ikb
  • Muistitikku: DT50 32gb

a) Asenna Apache, laita käyttäjien kotisivut (http://example.com/~tero) toimimaan. Testaa esimerkkikotisivulla.

Klo 9:46

Käynnistitin Xubuntun live-tikulta try-moodiin.

Päivin paketit ja asensin Apachen.

  • sudo apt-get update
  • sudo apt-get install -y apache2

Laitoin palomuurin toimintaan ja sallin tcp liikenteen portista 80 jotta pystyn testaamaan Apachen sivuja.

  • sudo ufw enable
  • sudo ufw allow 80/tcp

Aktivoin userdir moduulin Apachessa ja käynnistin Apache demonin uudelleen. Userdir moduuli sallii jokaiselle käyttäjälle omat kotisivuhakemistot public_html kansion avulla omassa kotihakemistossa.

  • sudo a2enmod userdir
  • sudo systemlctl restart apache2

Loin public_html kansion käyttäjän xubuntu kotikansioon ja lisäsin tänne html sivun joka toimii oletussivuna käyttäjän kotisivuille.

  • mkdir /home/xubuntu/public_html
  • echo ”xubuntu user page”|sudo tee /home/xubuntu/public_html/index.html

Menin selaimessa sivulle localhost/~xubuntu ja sivu latautui luomalleni index filulle.

b) Surffaa oman palvelimesi weppisivuja. Etsi Apachen lokista esimerkki onnistuneesta (200 ok) sivulatauksesta ja epäonnistuneesta (esim 404 not found) sivulatauksesta. Analysoi rivit.

Klo 9:56

Jatkoin tehtävää suoraan A:sta ja suoritin kolme erilaista toimintoa.

Menin sivustolle localhost/~xubuntu. Tutkiin tämän jälkeen tail /var/log/apache2/access.log komennolla lokia.

127.0.0.1 – – [09/Feb/2020:08:02:07 +0000] ”GET /~xubuntu/ HTTP/1.1” 200 655 ”-” ”Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:68.0) Gecko/20100101 Firefox/68.0”

Rivin tarina:
127.0.0.1 – ; Remote host, Missä tapahtui, palvelin siis.
09/Feb/2020:08:02:07 +0000] – Timestamp ja aikavyöhyke
”GET /~xubuntu/ HTTP/1.1” Suoritettu pyyntö, tässä tapauksessa index.html:n haku
ja protokollalla http/1.1
200 655 – http pyynnön statuskoodi, onnistunut tässä tapauksessa. 655 on vastauksen tavukoko.
”-” – Ei tietoa
”Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:68.0) Gecko/20100101 Firefox/68.0” Metadataa requestista, mitä käyttöjärjestelmää ja selainta käytetty.

Menin sivustolle localhost/asdf toivoen herjaa puuttuvasta sivustosta. Tutkiin tämän jälkeen tail /var/log/apache2/access.log komennolla lokia.

127.0.0.1 – – [09/Feb/2020:08:14:09 +0000] ”GET / HTTP/1.1” 404 488 ”-” ”Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:68.0) Gecko/20100101 Firefox/68.0”

127.0.0.1 – ;Remote host, Missä tapahtui, palvelin siis.
[09/Feb/2020:08:14:09 +0000] – Timestamp ja aikavyöhyke
”GET /~xubuntu/ HTTP/1.1” Suoritettu pyyntö, asdf.html tai asdf kansion haku protokollalla http/1.1
” 404 488 ” – 404 herja, sivustoa ei löytynyt. ja 488 vastauksen tavukoko.
”Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:68.0) Gecko/20100101 Firefox/68.0” Metadataa requestista, mitä käyttöjärjestelmää ja selainta käytetty.

Tehtävässä m tuli vastaan 403 ja rivi on analysoitu siellä.

d) Tee virhe johonkin Apachen asetustiedostoon, etsi ja analysoi tuo rivi. Etsimiseen sopivat esimerkiksi Apachen omat lokit, syslog sekä ‘apache2ctl configtest’.

Klo 10:06

Avasin sudoeditillä tiedoston /ect/apache2/000-default.conf ja muokkasin DocumentRoot variablen arvoa /var/www/html -> /var/www/htmlasd

Suoritin komennon sudo systemlctl restart apache2 ja menin localhostin sivulle. Sivu antoi 404 not found errorin selaimessa.

Suoritin komennon apach2ctl configtest, ohessa rivien analysointi.

AH00112: Warning: DocumentRoot [/var/www/htmlasd] does not exist
AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1. Set the ’ServerName’ directive globally to suppress this message
Syntax OK

AH00112: Warning: DocumentRoot [/var/www/htmlasd] does not exist – Tämä tarkoittaa että kansiota ei ole olemassa. Tämä ei ota kuitenkaan kantaa kansion sisältöön.
AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1. Set the ’ServerName’ directive globally to suppress this message Virhe kertoo että ei voi luotettavasti päätellä serverin domain nimeä pelkän ip:n avulla. ServerNamen asettaminen ilmeisesti sitten auttaa päättelmään ja virhe kertoo että ServerName asetuksen lisääminen poistaa varoituksen. Tämä lisäys suoritettiin tehtävässä M.

m) Vaihda Apachen oletussivu. Eli laita palvelimen etusivulla (ilman tildeä) näkyvä sivu niin, että alkuperäinen on jonkun käyttäjän kotihakemistossa ja voit muokata sitä ilman pääkäyttäjän oikeuksia.

Klo 10:17

Alkuun ajatuksia: En huomaa M ja H tehtävien välillä mitään eroa, ellei h) kohdassa mainittu ”sivu” tarkoitua .confi tiedostoja sites-available kansion alla? Jos tarkoittaa niin nimeäminen ja termit ovat vähän sekoittavia. Enivei, harjoituksen vuoksi nyt tein sen kuitenkin kopioimalla 000-default.confin uuteen tiedostoon ja a2dissiteemällä vanhan sivun sekä muokkaamalla documentroottia osoittamaan public_htmlja sitten a2ensite uusisivu . Tämän jälkeen restarttasin apache2. Homma toimi ja tämä kuvaus on nyt epätarkka koska en siis tarkoituksella tehnyt tehtävää h, elikkä takaisin tehtävään M.

Avasin sudoeditillä /etc/apache2/sites-available/000-default.confin

Vaihdoin DocumentRootin arvon /var/www/html -> /home/xubuntu/harjoitusm , tallensin ja loin uuden kansion komennolla mkdir /home/xubuntu/harjoitusm ja tänne uuden tiedoston index.html komennolla nano /home/xubuntu/harjoitusm/index.html . Nyt kansio viittaa käyttäjän kotihakemistoon.

Boottasin demonin sudo systemlctl restart apache2:lla.

Avasin localhostin ja sain 403 fordbidden herjan selaimessa. Ohessa access.login rivi ja analysointi tehtävää b) varten,

127.0.0.1 – – [09/Feb/2020:08:21:30 +0000] ”GET / HTTP/1.1” 403 491 ”-” ”Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:68.0) Gecko/20100101 Firefox/68.0”

127.0.0.1 – ;Missä tapahtui, palvelin siis.
[09/Feb/2020:08:21:30 +0000] – Timestamp
”GET /~xubuntu/ HTTP/1.1” Suoritettu pyyntö, asdf.html tai asdf kansion haku
” 403 491 ” – 403 herja, tarkoittaa että pääsy kielletty. Tämä symtyi siitä kun käyttäjällä ei ollut lupaa kansioon.
”Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:68.0) Gecko/20100101 Firefox/68.0” Metadataa requestista, mitä käyttöjärjestelmää ja selainta käytetty.

Koska aikaisemmasta kävi ilmi että käyttöoikeudet eivät riittäneet niin muokkasin sudoeditillä /etc/apache2/sites-available/000-default.conf tiedostoa ja lisäsin tänne uuden asetuksen.

  • <Directory ”/home/xubuntu/harjoitusm/”>
    • require all granted
  • </Directory>

Boottasin demonin sudo systemlctl restart apache2:lla ja menin localhostiin. Sivu näkyi. Avasin /home/xubuntu/harjoitusm/index.html tiedoston komennolla nano /home/xubuntu/harjoitusm/index.html ja lisäsin pari riviä tekstiä jotta muutokset näkyisivät. Tallensin tiedoston ja refreshasin localhostin selaimessa. Muutokset näkyivät ja muutosten tekeminen onnistui ilman sudoa.

n) Laita kaksi nimeä samaan IP-osoitteeseen. Voit simuloida nimipalvelun toimintaa /etc/hosts -tiedoston avulla. Eli niin, että samalla palvelimella osoitteella teronlenkkisivu.com tulee eri sisältö kuin osoitteella opipentest.com.

Klo 12:26

Käynnistitin Xubuntun live-tikulta try-moodiin.

Päivin paketit ja asensin Apachen.

  • sudo apt-get update
  • sudo apt-get install -y apache2

Laitoin palomuurin toimintaan ja sallin tcp liikenteen portista 80 jotta pystyn testaamaan Apachen sivuja.

  • sudo ufw enable
  • sudo ufw allow 80/tcp

Loin kaksi uutta tiedostoa /etc/apache2/available-sites kansioon, tiedostot sivu1.com.conf ja sivu2.com.conf

<VirtualHost *:80>

	ServerName sivu1.com
	ServerAdmin webmaster@localhost
	DocumentRoot "/home/xubuntu/sivu1/"
	
	<Directory "/home/xubuntu/sivu1/">
		require all granted
	</Directory>

</VirtualHost>

<VirtualHost *:80>

	ServerName sivu2.com
	ServerAdmin webmaster@localhost
	DocumentRoot "/home/xubuntu/sivu2/"
	
	<Directory "/home/xubuntu/sivu2/">
		require all granted
	</Directory>

</VirtualHost>

Suoritin komennon sudoedit /etc/hosts ja lisäsin kaksi riviä

  • 127.0.0.1 sivu1.com
  • 127.0.0.1 sivu2.com

Ajoin komennot sudo a2ensite sivu1.com.conf ja sudo a2ensite sivu2.com.conf jotta nämä sivut lisättäisiin tarjoiltavien sivujen joukkoon.

Ajoin komennon sudo systemctl restart apache2 ja avasin selaimessa sivut sivu1.com ja sivu2.com . Molemmat sivut näyttivät eri sisällöt.

h2

Tehtävänanto

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

A) Loki

Tavoitteenani on luoda kaksi lokimerkintää, virheellinen ja onnistunut.

Onnistunut merkintä

Klo 19:17. Aloitin boottaamalla läppärin aikaisemmalla Xubuntun livetikulla. Aikeenani on luoda uusi käyttäjä ja yrittää kirjautua tällä väärällä salasanaaalla ja oikealla. Tavoite on että lokiin jää merkintä tästä.

Luodan uuden käyttäjän komennolla

  • sudo adduser jaani

ja syötän tälle salasanan sekä annan tyhjät lisäkäyttäjätiedot. Yritän kirjautua käyttäjälle väärällä salasanalla komennolla

  • su – jaani

ja tämän jälkeen antamalla väärän salasanan. Sain viestin ”Authentication failure”. Tämän jälkeen kirjauduin uudelleen, nyt oikealla salasanalla. Tämä vaihtoi käyttäjätunnukseni Jaaniin. varmistin tämän komennolla ”whoami”

Vaihdoin käyttäjäni takaisin xubuntuun ja navigoin logi kansioon komennolla ”cd /var/log”

Avasin auth.log tiedoston komennolla ”less auth.log” ja navigoin tiedoston loppuun shift G näppäinyhdistelmällä.

Feb 4 17:48:14 xubuntu su[4283]: pam_unix(su:auth): authentication failure; logname= uid=999 euid=0 tty=/dev/pts/0 ruser=xubuntu rhost= user=jaani
Feb 4 17:48:16 xubuntu su[4283]: pam_authenticate: Authentication failure
Feb 4 17:48:16 xubuntu su[4283]: FAILED su for jaani by xubuntu
Feb 4 17:48:16 xubuntu su[4283]: – /dev/pts/0 xubuntu:jaani
Feb 4 17:48:19 xubuntu su[4284]: Successful su for jaani by xubuntu
Feb 4 17:48:19 xubuntu su[4284]: + /dev/pts/0 xubuntu:jaani
Feb 4 17:48:19 xubuntu su[4284]: pam_unix(su:session): session opened for user jaani by (uid=999)
Feb 4 17:48:19 xubuntu su[4284]: pam_systemd(su:session): Cannot create session: Already running in a session
Feb 4 17:48:25 xubuntu su[4295]: Successful su for xubuntu by jaani
Feb 4 17:48:25 xubuntu su[4295]: + /dev/pts/0 jaani:xubuntu
Feb 4 17:48:25 xubuntu su[4295]: pam_unix(su:session): session opened for user xubuntu by (uid=1000)
Feb 4 17:48:25 xubuntu su[4295]: pam_systemd(su:session): Cannot create session: Already running in a session

Lokin analysointia

Feb 4 17:48:14 xubuntu su[4283]: pam_unix(su:auth): authentication failure; logname= uid=999 euid=0 tty=/dev/pts/0 ruser=xubuntu rhost= user=jaani
Feb 4 17:48:16 xubuntu su[4283]: pam_authenticate: Authentication failure
Feb 4 17:48:16 xubuntu su[4283]: FAILED su for jaani by xubuntu
Feb 4 17:48:16 xubuntu su[4283]: – /dev/pts/0 xubuntu:jaani

Ensimmäinen ja toinen rivi kertoo että authentication failure .
Kolmas rivi kertoo että käyttäjänä vaihto jaanin käyttäjällä xubuntu epäonistui.

Feb 4 17:48:19 xubuntu su[4284]: Successful su for jaani by xubuntu
Feb 4 17:48:19 xubuntu su[4284]: + /dev/pts/0 xubuntu:jaani
Feb 4 17:48:19 xubuntu su[4284]: pam_unix(su:session): session opened for user jaani by (uid=999)
Feb 4 17:48:19 xubuntu su[4284]: pam_systemd(su:session): Cannot create session: Already running in a session

Nyt vastaavasti

b)

Päivitän koneen paketit komennolla sudo apt-get update ja tämän jälkeen asennan ssh demonin(?) komennolla

  • sudo apt-get install -y openssh-server openssh-client

Tutkin ja seuraan sivuston https://help.ubuntu.com/lts/serverguide/openssh-server.html dokumentointia.

Kokeilin komentoa ”ssh jaani@xubuntu” ja ohessa kuva tapahtumista.

Tässä kohtaa minä en tiedä mitä tapahtuu, olenko nyt ssh palvelimella, olenko xubuntu käyttäjällä ottanut etäyhteyden samaan koneeseen käyttäen jaani tunnusta vai mitä.

Loin juuh.txt tiedoston nano juuh.txt komennolla ja yritin siirtää tämän etäyhteyden kautta käyttäen scp komentoa.

c)

Unelmieni suosikkikomento tulikin jo aikaisemmassa tehtävässä, tässä se kertauksena:

  • sudo apt-get install -y openssh-server openssh-client

d)

Aloitin tehtävän tekemisen 20:15 ja googlailin että mistä löytyisi ohjelmista joita käyteään komentoriviltä. Tehtävän aikana koin suurta ärtymystä sillä https://packages.ubuntu.com/bionic-updates/ ei auttanut hakemisessa mitenkään.

Turvauduin siis jonkun muun redditissä https://www.reddit.com/r/commandline/comments/9b426l/best_terminal_apps/ kyhäämään listaan ja asensin täältä muutaman. Valintani kohdistuivat ohjelmiin tty-clock, bc ja htop.

Suoritin terminaalissa komennot

  • sudo apt-get update
  • sudo apt-get install -y tty-clock bc htop

Käynnistin ohjelman tty-clock komennolla ”tty-clock”. Ohjelma oli kirjaimellisesti kello.

Tämän jälkeen avasiin uudern terminaalin ja avasin bc:n komennolla ”bc”. Tämä oli konsolipohjainen laskin ja mikään käyttöliittymässä ei indikoinut että ohjelma oli valmiina toimintaan. Syötin ruudulle 2-5 ja painoin entteriä ja ihmetyksekseni ohjelma laski tämän.

Lopuksi kokeilin htoppia syöttämällä uuteen terminaaliin komennon ”htop”. Tämä on interaktiivinen system-monitor process-viewer ja process-manager eli voit hallita atällä aktiivisia prosesseja.

h1

Harjoitus 1

Tehtävänanto

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

Laitteisto:

  • Dt52 32gb usbi
  • v320 -17kib läppäri

A) Livetikku


Klo 17:43
Aloitin tehtävän lataamalla Ubuntun ja Rufuksen, ohessa linkit
https://github.com/pbatard/rufus/releases/download/v3.8/rufus-3.8.exe
http://ftp.free.fr/mirrors/ftp.xubuntu.com/releases/18.04/release/xubuntu-18.04.3-desktop-i386.iso
Plugasin USBn kiinni tietokoneeseeni ja tämän jälkeen käynnistin rufuksen.

Rufus ja livetikun teko

Klo 17:47
Valitse Deviceen USB:si vetovalikosta.
Valitse boot selectionista SELECTillä lataamasi xubuntu tiedosto
Tämän jälkeen painoin STARTia ja hyväksyin ponnahdusikkunat oletusasetuksilla.
Ohjelma loi tämän jälkeen livetikun ja suljin rufuksen tikun valmistuttua.

Livetikun käyttö

Klo 17:49
Pidin usbin koneessa kiinni.
Boottasin tietokoneeni ja avasin koneen biosin.
Asetin usbin boottialustaksi ja tallensin asetukset ja poistuin biosista.
Koneen käynniestyessä uudestaan xubuntun livetikku käynnistyi, ja käynnistin tästä kokeilutilan ”Try xubuntu” nappia painamalla.

B) Linux

Klo 17:51
Linux käynnistyi työpöydälle ja aloin suorittamaaan raudan listaus tehtävää.
Avasin terminaalin win + t näppäiyhdistlemällä ja syötin seuraavan komennon

sudo lshw -short -sanitize

Tulokset sivun lopussa.

C) Ohjelmien asennus

Klo 17:53
Kirjoitin terminaaliin kehotteen ”sudo apt-get update” komennon ja sain herjoja jotka kertoivat yhteysongelmista.
Kiinnitin ethernet kaapelin koneeseen. Toistin ”sudo apt-get update” komennon ja virheet poistuivat.
Seuraavaksi suoritin seuraavat komennot:

  • sudo apt-get install -y apache2
  • sudo apt-get install -y blender
  • sudo apt-get install -y gimp

Asennusten todentaminen

klo 17:55
Käynnistin Blenderin komennolla ”blender” terminaalista.
Ohjelma käynnistyi ja liikutin default scenen boxia ylös ja alas.
Apachen asentumisen ja toiminnan totesin käynnistämällä selaimessa osoitteen ”localhost”, ruudulle ilmestyi apachen default-sivu.
Gimpin käynnistin terminaalista komennolla ”gimp”.

D) Lisenssit

Blenderi ja GIMP käyttävät GPL lisenssiä. Voit myydä, käyttää, levittää, muokata ja siinä kohtaa kuin julkaiset sovelluksen niin muutokset pitää laittaa julkiseen jakoon. Tämän lisäksi nämä julkaistut johdannaiset ja tuote pitää asettaa GPL lisenssin alaiseksi. Yksityinen käyttö ei vaadi julkaisua jos tuote ei pääse esim firman sisältä muiden käyttöön.

Apache lisenssi: Voit käyttää, muokata, myydä, levittää. Vaatii tekijänoikeuden huomautuksen säilyttämisen ja erottamislausuman.

E) Listaa käyttämäsi ohjelmat

Windows versio, linux vastaava käyttötarkoitus

  • Office tuote perhe, vastaava Libreoffice. Tekstinkäsittely, toimisto- ja taulukkotyökalut
  • Blender, Blender. Mallinnusohjelma
  • Paint.net, GIMP. Kuvankäsittelyohjelma.

F) Varmuuskopioinnit

Omat tärkeiden tiedostojeni varmuuskopioni ovat joko versionhallintaohjelmissa pilvessä tai pilvivarastoissa. Omistan myös ulkoisia ylimääräisiä kovoja joissa on backuppeja.

Hardware specsit

H/W path Device Class Description==============================================================system 81CN (LENOVO_MT_81CN_BU_idea_/0 bus LNVNB161216/0/0 memory 128KiB BIOS/0/4 processor Intel(R) Core(TM) i5-8250U CP/0/4/5 memory 256KiB L1 cache/0/4/6 memory 1MiB L2 cache/0/4/7 memory 6MiB L3 cache/0/24 memory 8GiB System Memory/0/24/0 memory 4GiB SODIMM DDR4 Synchronous/0/24/1 memory 4GiB SODIMM DDR4 Synchronous/0/100 bridge Xeon E3-1200 v6/7th Gen Core/0/100/2 display UHD Graphics 620/0/100/14 bus Sunrise Point-LP USB 3.0 xHCI/0/100/14/0 usb1 bus xHCI Host Controller/0/100/14/0/4 generic Generic USB device/0/100/14/0/7 communication Bluetooth Radio/0/100/14/0/8 multimedia EasyCamera/0/100/14/1 usb2 bus xHCI Host Controller/0/100/14/1/1 scsi2 storage DataTraveler 3.0/0/100/14/1/1/0.0.0 /dev/sdc disk 30GB DataTraveler 3.0/0/100/14/1/1/0.0.0/0 /dev/sdc disk 30GB/0/100/14/1/1/0.0.0/0/1 /dev/sdc1 volume 28GiB Windows FAT vol/0/100/14.2 generic Sunrise Point-LP Thermal subs/0/100/15 generic Sunrise Point-LP Serial IO I2/0/100/16 communication Sunrise Point-LP CSME HECI #1/0/100/17 storage 82801 Mobile SATA Controller/0/100/1c bridge Sunrise Point-LP PCI Express/0/100/1c/0 enp1s0 network RTL8111/8168/8411 PCI Express/0/100/1c.5 bridge Sunrise Point-LP PCI Express/0/100/1c.5/0 network RTL8821CE 802.11ac PCIe Wirel/0/100/1f bridge Intel(R) 100 Series Chipset F/0/100/1f.2 memory Memory controller/0/100/1f.3 multimedia Sunrise Point-LP HD Audio/0/100/1f.4 bus Sunrise Point-LP SMBus/0/1 scsi0 storage/0/1/0.0.0 /dev/sda disk 256GB INTEL SSDSC2KW25/0/1/0.0.0/1 /dev/sda1 volume 259MiB Windows FAT volume/0/1/0.0.0/2 /dev/sda2 volume 15MiB reserved partition/0/1/0.0.0/3 /dev/sda3 volume 212GiB Windows NTFS volume/0/1/0.0.0/4 /dev/sda4 volume 24GiB Windows NTFS volume/0/1/0.0.0/5 /dev/sda5 volume 999MiB Windows NTFS volume/0/2 scsi1 storage/0/2/0.0.0 /dev/sdb disk 1TB ST1000LM035-1RK1/0/2/0.0.0/1 /dev/sdb1 volume 127MiB reserved partition/0/2/0.0.0/2 /dev/sdb2 volume 931GiB Windows NTFS volume/1 power CRB Battery 0/2 power OEM Define 5

Lähteet

Design a site like this with WordPress.com
Aloitus