CategoryLinux palvelimena – ICT4TN003

Ruby on Rails Linuxissa

Tämän ohjeen mukaisesti on saatu testatusti toimimaan oma kehitysympäristöni Xubuntu 13.10 saucy. Ubuntu 12.04 LTS ei aikaisemman testin perusteella toiminut, mutta tulen lähipäivinä päivittämään tämän ohjeen toimimaan myös sillä.

Asennetaan Ruby on Rails

Testattuani asentaa Ruby on Rails moneen eri linuxin levityspakettiin tai niiden eri versioihin, olen tullut siihen johtopäätökseen että järkevintä on asentaa RVM (Ruby Version Manager), jonka kautta hallitaan Rubya. RVM löytyy myös pakettivarastosta, mutta siellä on tällä hetkellä vanha ja buginen versio, joten järkevintä on asentaa se RVM:n repositorista:

$ sudo apt-get update
$ sudo apt-get -y install curl
$ sudo curl -L https://get.rvm.io | bash -s stable --ruby --autolibs=enable --auto-dotfiles

Luodaan RVM:lle alias, jotta pystymme kutsumaan sitä myös jatkossa:

$ source $HOME/.rvm/scripts/rvm

Asennetaan rails:

$ sudo gem install rails

Hei Rails!

Luodaan “Hei Maailma” rails projekti:

$ mkdir -p /home/niko/public_html/
$ cd /home/niko/public_html/
$ rails new hello-rails

Asennetaan Apache2

$ sudo apt-get -y install apache2
$ sudo a2enmod rewrite
$ sudo a2enmod userdir
$ sudo service apache2 restart

Asennetaan Phusion Passenger

$ sudo apt-get -y install libapache2-mod-passenger

Luodaan apacheen uusi virtualhost:

$ sudoedit /etc/apache2/sites-available/hello-rails.conf

Kirjoita seuraava koodi hello-rails -tiedostoon (korvaa home-kansion käyttäjä omalla):

<VirtualHost *:80>
  RailsEnv development
  ServerName hello-rails
  DocumentRoot /home/niko/public_html/hello-rails/public/
</VirtualHost>

Hyväksy uusi sivusi, ja lataa Apache:n asetukset uudestaan:

$ sudo a2ensite hello-rails.conf
$ sudo service apache2 restart

Testaus

Otetaan sivustoon yhteyttä curlilla, todistaaksemme railsin toimivuuden:

$ curl -I hello-rails

Tulos:

HTTP/1.1 200 
Date: Thu, 05 Dec 2013 16:10:47 GMT
Server: Apache/2.4.6 (Ubuntu)
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.13
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: d63000a5-d953-4346-bf1f-4a9c4ff4f8db
X-Runtime: 0.009467
Set-Cookie: request_method=HEAD; path=/
ETag: "9fdff472a0cc0802ae8009cd2322f2da"
Status: 200
Content-Type: text/html; charset=utf-8

Lähteet

https://rvm.io/rvm/install

Minun metapaketti

Tämä artikkeli on kirjoitettu Tero Karvisen Linux palvelimena kurssin tämän viikon tehtäväksi.
Tehtäväksi sain:

1. Kerätä kokoon suosikki ohjelmani
2. Tehdä asennettavista ohjelmista metapaketti
3. Paketoida metapaketti asennustiedostoksi

1. Ohjelmiksi valitsin:
firefox, gedit, apache2, mysql-server, mysql-client ja ssh-server

Asennetaan equivs

$ sudo apt-get update
$ sudo apt-get -y install equivs

Valmistellaan metapaketti

Seuraavaksi määritellään metapaketin conffi tiedosto, ja annetaan paketille nimi nikos-apps:

$ equivs-control nikos-apps.cfg

Seuraavaksi muokataan “Package”, “Version”, “Depends” ja “Description” kohtia (Muistathan poistaa kommenttimerkin # rivien edestä). Tiedoston voimme avata muokattavaksi esimerkiksi nanolla:

$ nano nikos-apps.cfg

Muokkaamalla vain yllämainittuja rivejä, ja poistamalla turhat rivit pois, saamme aikaan seuraavanlaisen tiedoston:

Section: misc
Priority: optional
Standards-Version: 3.9.2

Package: nikos-apps
Version: 0.1
Maintainer: Niko Kiuru 
Depends: firefox, gedit, apache2, php5, libapache2-mod-php5, mysql-server, mysql-client, ssh-server
Description: This package include all my favorite softwares and servers.
 .
 Try it yourself.

Luodaan metapaketti

$ equivs-build nikos-apps.cfg

ja se muodostaa tiedoston: nikos-apps_0.1_all.deb

Metapaketin tarkistus

Metapaketin synnyttyä tarkastetaan se vielä lintianilla mahdollisista virheistä:

$ lintian nikos-apps_0.1_all.deb

Virheiltä vältyttiin tällä kertaa, ja paketti on valmiina asennukseen.
Paketin saat asennettua komennolla:

$ gdebi -n nikos-apps_0.1_all.deb

Asennus skripti

3. Tehdään skripti, joka asentaa meidän metapaketin, ja laittaa php:n toimintakuntoon:

$ nano install_nikos-apps.sh

Ja kirjoitetaan tiedostoon:

#!/bin/bash
apt-get update
gdebi -n nikos-apps_0.1_all.deb
a2enmod php5
service apahce2 restart

Ohjelmat saa nyt asennettua komennolla:

$ sudo sh install_nikos-apps.sh

Scan of the Month 15

Sain Tero Karvisen järjestämän kurssin Linux palvelimena viikon tehtäväksi ratkaista honeynet projektin Scan of the Month 15 tehtävän. Osa komentovinkeistä on kopioitu Tero Karvisen artikkelista: http://terokarvinen.com/2013/forensic-file-recovery-with-linux.

Aloitin tehtävän lataamalla tehtävänannossa olleen imagen, purkamalla sen, ja mountaamalla sen kansioon hda8:

$ wget http://old.honeynet.org/scans/scan15/honeynet.tar.gz
$ tar -xf honeynet.tar.gz
$ cd honeynet
$ mount -o "loop,noexec,nodev,ro"

Seuraavaksi aloin pläräämään levykuvan tiedostoja, saadakseni jonkinnäköisen kokonaiskuvan siitä. Siistin tulosteen tiedostoista saa aikaan Teron laatimalla komennolla:

$ sudo find -printf '%T+ M %p\n%A+ A %p\n%C+ C %p\n'|sort|less

Pläräämisen jälkeen halusin nähdä, mitä kaikkea levykuvalta oli äskettäin poistunut. Tiedostojen palauttaminen ilman asianmukaisia työkaluja on hyvinkin tuskaista, ja vaatii jopa satoja eri komentoja. Onneksi tähän on paketoitu loistava ohjelmistokirjasto, jossa nuo sadat komennot saa suoritettua yhellä komennolla. Komento on tsk_recover ja se sijaitsee sleuthkit paketissa.

Eli asennetaan sleuthkit:

$ sudo apt-get install -y sleuthkit

Seuraavaksi sitten palautetaan allokoidut- ja poistetut tiedostot saastuneesta levykuvasta.

$ mkdir files
$ mkdir files/allocated files/deleted
$ tsk_recover -a honeypot.hda8.dd files/allocated/
$ tsk_recover honeypot.hda8.dd files/deleted/

Seuraavaksi pääsimme selaamaan palautettuja tiedostoja aikaisemmin käytetyllä komennolla:

$ sudo find -printf '%T+ M %p\n%A+ A %p\n%C+ C %p\n'|sort|less

Ei tarvinnut mennä kuin muutaman rivin alaspäin, niin sattumalta osui silmään muutama epäilyttävä tiedosto:
2013-09-19+19:59:56.2092938220 M ./allocated/dev/ida/.drag-on/linsniffer
2013-09-19+19:59:56.2092938220 M ./allocated/dev/ida/.drag-on/logclear

Sniffer ja logcleaner, taidettiin päästä hieman rootkitin jäljille. Katsotaas mitä tämä logcleaner oikein on syönyt:

$ less allocated/dev/ida/.drag-on/logclear

Tuloste (logcleaner):
killall -9 linsniffer
rm -rf tcp.log
touch tcp.log
./linsniffer >tcp.log &

linsniffer prosessin lopettaminen, tcp.log tiedoston poistaminen, ja sen näpistely. Tälläistä toimintaa en tahtoisi palvelimellani tapahtuvan.

Tuosta saatiin paljon lisäapua selvitystä varten. Seuraavaksi haetaan kaikki MAC (= Modify Access Create) aikalogit levykuvasta, ja avataan se siististi less:llä näytölle.

$ tsk_gettimes sda1.dd >rawtimes
$ mactime -b rawtimes|less

Nyt minulla on täydellinen aikakirja palvelimella tapahtuvista muutoksista sen perustamisesta lähtien. Tehtävän annossa annettiin jo yksi tärkeä vihje, päivämäärä 2001-03-15 jolloin rootkit oli päässyt palvelimelle.

Pystymme etsimään lessissä helposti päivämäärän perusteella, hyökkäämis päivän logit kirjoittamalla lessiin:
/Mar 15 2001

Kun pääsin oikealle kohdalle, tein uuden haun aikaisemmin havaitullani tiedostolla logclear:lla.
/logclear

Haku johdatti minut seuraavien tapahtumien luokse:

Fri Mar 16 2001 03:36:48   520333 m... r/rrw-r--r-- 0        0        23       lk.tgz (deleted)
Fri Mar 16 2001 03:44:50   611931 .a.. -/rrwxr-xr-x 0        0        2039     $OrphanFiles/OrphanFile-2039 (deleted)
                                1 .a.. -/rrw-r--r-- 0        0        2040     $OrphanFiles/OrphanFile-2040 (deleted)
                             1345 .a.. -/rrwxr-xr-x 0        0        2043     $OrphanFiles/OrphanFile-2043 (deleted)
                              880 .a.. -/rrw-r--r-- 0        0        2048     $OrphanFiles/OrphanFile-2048 (deleted)
                              344 .a.. -/rrw-r--r-- 0        0        2050     $OrphanFiles/OrphanFile-2050 (deleted)
                              688 .a.. -/rrw-r--r-- 0        0        2052     $OrphanFiles/OrphanFile-2052 (deleted)
                            33280 .a.. r/rrwxr-xr-x 0        0        2055     bin/ps
                            35300 .a.. r/rrwxr-xr-x 0        0        2056     bin/netstat
                           520333 .a.. r/rrw-r--r-- 0        0        23       lk.tgz (deleted)
Fri Mar 16 2001 03:45:02    12288 m.c. d/drwxrwxr-x 0        0        20089    dev/ida
                             4060 .a.. -/rrwxr-xr-x 0        0        2047     $OrphanFiles/OrphanFile-2047 (deleted)
                             8268 .a.. -/rrwx------ 0        0        2053     $OrphanFiles/OrphanFile-2053 (deleted)
                            33280 ..c. r/rrwxr-xr-x 0        0        2055     bin/ps
                            35300 ..c. r/rrwxr-xr-x 0        0        2056     bin/netstat
                            19840 ..c. r/rrwxr-xr-x 0        0        2057     sbin/ifconfig
                            53588 .ac. -/rrwxr-xr-x 0        0        2058     $OrphanFiles/OrphanFile-2058 (deleted)
                               75 .a.. -/rrwx------ 0        0        2059     $OrphanFiles/OrphanFile-2059 (deleted)
                            34816 m.c. d/drwxr-xr-x 0        0        24097    dev
                               71 mac. r/rrw-r--r-- 0        0        26461    dev/rpm
                               71 mac. r/rrw-r--r-- 0        0        26461    etc/mtab~ (deleted-realloc)
                               87 mac. r/rrw-r--r-- 0        0        26479    dev/last
                             2048 m.c. d/drwxr-xr-x 0        0        30121    bin
                            11952 .a.. r/rrwxr-xr-x 0        0        30130    bin/chown
                            66736 ..c. -/rrwxr-xr-x 0        0        30188    $OrphanFiles/OrphanFile-30188 (deleted)
                            60080 ..c. -/rr-xr-xr-x 0        0        30191    $OrphanFiles/OrphanFile-30191 (deleted)
                             3072 m.c. d/drwxr-xr-x 0        0        48193    sbin
                            42736 ..c. -/rrwxr-xr-x 0        0        48284    $OrphanFiles/OrphanFile-48284 (deleted)
                             7165 m.c. r/rrwx------ 0        0        60261    dev/ida/.drag-on/linsniffer
                               75 mac. r/rrwx------ 0        0        60262    dev/ida/.drag-on/logclear
                             4060 mac. r/rrwxr-xr-x 0        0        60263    dev/ida/.drag-on/sense
                             8268 mac. r/rrwx------ 0        0        60264    dev/ida/.drag-on/sl2
                           632066 m.c. r/rrwxr-xr-x 0        0        60265    dev/ida/.drag-on/mkxfs
                              708 m.c. r/rrw-r--r-- 0        0        60266    dev/ida/.drag-on/s
                              540 m.c. r/rrw------- 0        0        60267    dev/ida/.drag-on/ssh_host_key
                             7165 mac. r/rrwx------ 0        0        60269    dev/ida/.. /linsniffer
                               75 mac. r/rrwx------ 0        0        60270    dev/ida/.. /logclear
                             4060 mac. r/rrwxr-xr-x 0        0        60271    dev/ida/.. /sense
                             8268 mac. r/rrwx------ 0        0        60272    dev/ida/.. /sl2
                           632066 .a.. r/rrwxr-xr-x 0        0        60273    dev/ida/.. /mkxfs

Aika ja päivämääriä ei tässä kohti kannata katsoa päivän tarkkuudella, koska on otettava huomioon myös eri aikavyöhykkeet, jolloin logien päivämäärä voi olla eri kuin hyökkäyspäivämäärä sinun ajassasi.
Löysin kuitenkin yhden epäilyttävän paketin heti hakemistorakenteen juuresta – lk.tgz, joka oli vielä poistettu myöhemmin. Palataan aikaisemmin palauttamiimme poistettuihin tiedostoihin, ja listataan ne:

$ cd files/deleted/
$ ls

Tuloste:
etc lk.tgz $OrphanFiles

Löysimme paketin. Puretaan tiedosto ja katsotaan mitä se pitää sisällään:

$ tar -xf lk.tgz

sisällä on last niminen kansio, joka pitää sisällään kasan rootkitin tiedostoja.

$ ls|less

Tuloste:

cleaner
ifconfig
inetd.conf
install
last.cgi
linsniffer
logclear
lsattr
mkxfs
netstat
pidfile
ps
s
sense
services
sl2
ssh
ssh_config
sshd_config
ssh_host_key
ssh_host_key.pub
ssh_random_seed
top

Apache2 logit ja prosessien seuranta

Apache2
Palvelimessa logit ovat yhtiä tärkeimpiä tiedostoja, kun aletaan virhettä etsimään. Logit pitävät yllä myös mitä on tapahtunut, ja niillä voidaan ennustaa mitä tulee tapahtumaan. Otin tähän artikkeliin esimerkkilogiksi seurantaan oman palvelimen apache2 logit.

Apache logittaa kahteen eri tiedostoon, kahta eri tyyppistä logia. Tiedostot ovat nimeltään error.log ja access.log. Error.log nimensä mukaan pitää sisällään apachen päällä toimivien nettisivujen virheet, kun taas access.log logittaa kaikki apachen yhteydenotot mm. käyttäjän sivunpäivitykset, sivuvaihdot.

Itselläni pyörii omalla palvelimellani webbisivut, jotka ovat kirjoitettu php:lla. Kävin tarkastelemassa apachen error.logia, ja otin sieltä yhden esimerkki rivin:
[Thu Sep 12 22:21:14 2013] [error] [client 198.143.xxx.xxx] PHP Notice: A session had already been started – ignoring session_start() in /var/sivun/osoite/public_html/index.php on line 4

– Ensimmäiset hakasulut sisältävät ajan milloin virhe on syntynyt ([Thu Sep 12 22:21:14 2013])
– Toiset hakasulut kertoo että kyseessä on virhe ([error])
– Kolmannet hakasulut kertoo että kyseessä on asiakasliittymästä aiheutuva virhe, ja sen on aiheutunut kyseisestä ip:stä “198.143.xxx.xxx” (loppu osa sensuroitu) ([client 198.143.xxx.xxx])
– Neljänneksi kerrotaan virheen syy, jonka on antanut PHP. Virhe ei ole kriittinen, vaan huomio. PHP antaa huomautuksen että sessio jota yritin luoda, on jo olemassa, ja PHP ei ota huomioon antamaani session_start() funktiota, joka löytyy paikasta /var/sivun/osoite/public_html/index.php ja riviltä 4. Tuosta ilmoituksesta minun on helppo päätellä, että käyttäjä tulee saamaan session_start():n kahdesti yhdellä sivunlatauksella, joka ei ole tarpeellista.

Prosessien seuranta
Saat kaikki palvelimesi prosessit näkyviin komennolla:

$ sudo ps x

Jokainen käynnissä oleva prosessi on identifikoitu numerolla. Näitä numeroita kutsutaan PID:ksi, joka tulee englanninkielisestä sanasta Process Identifier.
Palvelimen ylläpitäjänä, sinulla on oikeus hallita näitä prosesseja, käynnistää / lopettaa niitä, kuin vain haluat.
ps x antoi minulle seuraavanlaisen viimeisen rivin:
1870 pts/0 R+ 0:00 ps x

Tärkeimmät kohdat tuossa on ensimmäinen ja viimeinen kohta. Ensimmäinen kertoo mikä on prosessin PID-arvo, ja viimeinen prosessin nimen. Prosessi siis oli juuri antamani komento, joka näkyi myös hetken kyseisenä prosessina. Voimme yrittää sulkea prosessin käskyllä:

$ sudo kill -9 1870

Komento todennäköisesti antaa seuraavan ilmoituksen:
bash: kill: (1870) – No such process

Kyseinen ilmoitus johtuu siitä, että ps x oli jo ehtinyt lopettaa itse prosessinsa, kun oli saanut prosession tiedot tulostettua näytöllesi. Kun saamme kyseisen ilmoituksen, voimme olla myös varmoja, että kyseinen prosessi on onnistuneesti lopetettu.

Linux palvelimena kurssin tehtävä: Ratkaise peruskurssin linux-koe

Saimme Linux palvelimena kurssin ensimmäiseksi tehtäväksi ratkaista jonkin aikaisemman peruskurssin kokeen.
Huom! Koska Linuxin perusteet ovat itselleni tutut, olen kirjoittanut ajan säästämiseksi tämän artikkelin ulkomuistista.

Valitsin itse tämän: http://terokarvinen.com/2012/koe-tyoasemat-ja-tietoverkot-33-linux.

Tervetuloa Kiertoradan Kansa Oy:n tietohallintoon! Olet toistaiseksi koko IT-osastomme.
Asenna meille työasema, jolla voi surffailla wepissä, kirjoittaa dokumentteja ja tehdä taulukkolaskentaa. Kirjoitusohjelmista OpenOffice on meille tuttu, voitko asentaa myös sen?

Xubuntun asennus rutiinit ovat lähes identtiset ubuntun kanssa. Tästä minulla on valmiit ohjeet jo olemassa aikasemmassa artikkelissa:
http://nikokiuru.com/2011/08/ubuntu-11-04-asennus/

Meillä työskentelevät Mikko Mallikas, Maija Mehiläinen, Einari Vähäkäähkä, Ik E, Veijo Miettinen ja Håkan Persson. Tekisitkö meille käyttäjät ja jokaiselle esimerkkikotisivun. Voimme sitten muokata sivut SSH-yhteydellä mieleisiksemme. Tallenna käyttäjätunnukset ja salasanat kotihakemistoosi pelkkänä tekstinä tiedostoon users.txt.

Ensimmäisenä päivitetään apt kirjasto:

$ sudo apt-get update

Seuraavaksi lisätään uudet käyttäjät komennolla:

$ useradd käyttäjä

jonka jälkeen annetaan käyttäjälle vahva salasana, ja muutama muu käytättäjäkohtainen tieto.

Kokonaisuudessaan siis:

$ useradd mikko
$ useradd maija
$ useradd einari
$ useradd ik
$ useradd håkan

Kirjoitetaan käyttäjien tunnukset ja salasanat muistiin omaan kotihakemistoomme:

$ cd ~
$ nano users.txt

Ctrl + o -näppäinyhdistelmällä saadaan tallennettua toiminto, ja ctrl + x päästään poist perustilaan.

Seuraavaksi asennetaan apache2 http-palvelin, käyttäjien kotisivuja varten:

$ sudo apt-get install apache2
$ sudo a2enmode userdir
$ sudo service apache2 restart

Nyt käyttäjien kotihakemistoihin on ilmestynyt uusi kansio “public_html”, jotka ovat auki ulkoverkkoon perjaatteella: “http://domain_tai_serverin_ip/~kayttaja”

Einari haluaa käyttää PHP:ta. Tee Einarille “Hei maailma”.

PHP-tuen apacheen saa asennettua seuraavasti:

$ sudo apt-get install php5
$ sudo apt-get install libapache2-mod-php5
$ sudo a2enmod php5
$ sudo service apahce2 restart

Jotta käyttäjät pystyvät ajamaan php:ta omasta kotihakemistosta, täytyy meidän hieman muokata apache2:n asetustiedostoa:

$ cd /etc/apache2/mods-enabled/
$ sudoedit php5.conf

Kommentoi seuraavat rivit antamalla # merkin rivin eteen:

#<IfModule mod_userdir.c>
# <Directory /home/*/public_html>
# php_admin_value engine Off
# </Directory>
#</IfModule>

Lopuksi restartataan apache2, jotta saadaan äskeinen muutos voimaan:

$ sudo service apache2 restart

Tehdään Einarin kotihakemistoon “Hei maailma” php-tiedosto.

Ensimmäiseksi asennetaan openssh-serveri, jotta voimme kirjautua käyttäjinä sisälle.

$ sudo apt-get install openssh-server

Jonka jälkeen kirjaudutaan sisälle einarina:

$ ssh [email protected]

Ja seuraavaksi annetaan einarin salasana.

Sitten luodaan einarille kotihakemistoon public_html.

$ cd /home/einari/
$ mkdir public_html

Ja seuraavaksi luodaan Einarille “Hei maailma” testi php-skripti.

$ cd /home/einari/public_html
$ nano index.php

Kirjoita tiedostoon seuraava scripti:

<?php echo "Hello php!"; ?>

Ctrl + o tallensi tiedoston, ja ctrl + x sulki sen, kuten aikaisemminkin.

Ja lopuksi voimme poistua einarina kirjoittamalla exit komentoriville.

Maija haluaa ohjelmoida Pythonilla. Mikko haluaa ohjelmoida Javalla. Tee ja testaa “hei maailmat” kummankin kotihakemistoon.

Asennetaan python:

$ apt-get install python-dev

Tehdään “hei maailma” tiedosto Maijan kotihakemistoon.
Eli ensimmäiseksi kirjaudutaan sisään Maijana:

$ ssh [email protected]

Ja luodaan maijalle “Hei maailma!” esimerkki koodi:

$ nano heimaailma.py

Kirjoitetaan tiedostoon heimaailma.py tiedostoon:

print 'Hei maailma!'

ja testiksi voimme vielä ajaa sen komennolla:

$ python heimaailma.py

Kuulin, että saatat päästä innovaattorikurssille Turkkiin. Valmistaudu siis ylläpitämään konettamme verkon yli. Suojaa kone tulimuurilla. Tee reiät tässä asentamiasi palveluita varten

Asennetaan palomuurisovellus ufw:

$ sudo apt-get install ufw

seuraavaksi kytketään palomuuri päälle, sekä laitetaan portit 22 ja 80 avoimiksi:

$ sudo ufw enable
$ sudo ufw allow 22
$ sudo ufw allow 80
$ sudo ufw default deny

tämän jälkeen serveri on käynnistettävä uudestaa, jotta asetukset astuvat voimaan.

$ sudo shutdown -r 0

© 2017 Niko Kiuru

Theme by Anders NorenUp ↑