Posts Tagged ‘administravimas’

Robotžmogiams: „Svetainė atnaujinama, prašome užsukti vėliau…“

Friday, December 26th, 2008

Nuolat vystomuose interneto projektuose karts nuo karto daromi atnaujinimai. Tai failų struktūra pakeičiama, tai duomenų bazės schemoje sukuriama kokia nauja lentelė, tai masiškai keičiami duomenys bazėje. Paprastesniu atveju atnaujinami HTML šablonai ir stilius. Dažniausiai sudėtingesnis atnaujinimas vyksta pusvalandį ar net valandą ir jį vykdant vietoj standartinės svetainės turi būti rodomas puslapis „Svetainė atnaujinama“, kad naudotojai nematytų brokuoto vaizdo bei kad nesugadintų duomenų įrašinėdami ką į duomenų bazę keitimų proceso eigoje.

Atnaujinama

Gera praktika Apache tarnybinės stoties naudotojams yra tokiems atvejams turėti porą Apache nustatymų failų, kurie būtų pakaitom aktyvuojami, priklausomai, ar svetainė pasiekiama visiems, ar yra atnaujinimo stadijoje. Kažkada Tomas mestelėjo idėją, kad atnaujinimo atvejams konfigūraciją galima nusistatyti taip, kad kiti matytų puslapį „Svetainė atnaujinama“, o pats – galėtum naršyt visą turinį ir testuot, ar viskas veikia teisingai. Taip vienąkart ir pasireguliavau.

Apache leidžia nurodyti tarnybinės stoties konfigūraciją katalogo lygyje, naudojant .htaccess failus. Aš svarbiems projektams šakniniame (angl. root) svetainės kataloge turiu failus .htaccess_live ir .htaccess_under_construction su skirtingais nustatymais. Prireikus pakeisti būseną, konfigūraciją perkopijuoju į .htaccess failiuką:

cp .htaccess_under_construction .htaccess

ar

cp .htaccess_live .htaccess

Apache konfigūracijos failiuko .htaccess_live turinys yra maždaug toks:

# index.html ir index.php – standartiniai katalogą atvaizduojantys failai
DirectoryIndex index.html index.php
<ifmodule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    # Jei puslapis pasiektas example.com adresu, nukreipiam užklausą į www.example.com
    RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
    RewriteRule ^(.*)$ http://www.example.com$1 [R=301,L]
</ifmodule>

Tuo tarpu .htaccess_under_construction turinys toks:

# index.html ir index.php – standartiniai katalogą atvaizduojantys failai
DirectoryIndex index.html index.php
<ifmodule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    # Jei puslapis pasiektas example.com adresu, nukreipiam užklausą į www.example.com
    RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
    RewriteRule ^(.*)$ http://www.example.com$1 [R=301,L]

    # jei lankytojo IP adresas nėra 1.2.3.4 ir užklausiamas ne media katalogas,
    # tuomet nukreipk užklausą į failą temporarily-offline.html
    RewriteCond %{REMOTE_HOST} !^1\.2\.3\.4
    RewriteCond %{REQUEST_URI} !/temporary-offline\.html$
    RewriteCond %{REQUEST_URI} !^/media
    RewriteRule .* /temporary-offline.html [R=302,L]
</ifmodule>

Šiose konfigūracijose naudojamas mod_rewrite modulis. RewriteCond nurodo sąlygas, kuriomis turi būti vykdomas užklausos nukreipimas per RewriteRule. Parametrai laužtiniuose skliaustuose reiškia štai ką:

  • NC (no case) – nekreipti dėmesio, ar naudojamos didžiosios, ar mažosios raidės.
  • R=301 – užklausą nukreipti su kodu 301 „Pastovus nukreipimas“.
  • R=302 – užklausą nukreipti su kodu 302 „Laikinai perkelta“.
  • L (last rule) – paskutinė taisyklė, tad nebekreipti dėmesio į toliau einančias taisykles.

Savo IP adresą galima sužinoti vienoj iš daugelio What’s My IP tarnybų.

Kaip techniškai nustatyti laikinąjį vaizdelį „Svetainė atnaujinama“ dabar jau aišku. Kitas dalykas, kuris mano manymu yra ganėtinai svarbus, yra rodyti tinkamą laikinąjį puslapį. Man asmeniškai patinka tokie klaidų ir sisteminių pranešimų puslapiai, kurie vaizdžiai ir netechniškai man parodo, kame problema, kaip pavyzdžiui twitter.com, arba tokie, kurie papildomai pateikia kokį filmuką arba ką nors interaktyvaus, kad užimtų mane, kol vyksta atnaujinimo darbai.

Buriam Apačės naudotojo autentikaciją per SSL

Tuesday, November 28th, 2006

Kai esi vienintelis kompiuteristas kompanijoje, tenka ne tik programuot ar projektuot, bet ir paadministratoriaut. Specifinės programinės įrangos derinimas, diegimas ir konfigūravimas dažniausiai būna daug skausmingesnis nei tikiesi prieš pradėdamas darbą. Todėl labai naudinga dokumentuot savo žingsnius, kad palengvintum ateities užduočių atlikimą. Šito įrašo tikslas — atmintinė sau ir kitam, kaip nustatyti Apache serverio naudotojo autentikaciją per SSL.

Šiuo metu dažniausiai naudojamas žiniatinklio serveris Apache turi modulį apsaugoti katalogo turinį nuo pašalinių akių. Tai naudotojo autentikacijos modulis mod_auth. Kai internautas suveda puslapio adresą, kuris reikalauja autentikacijos, naršyklė atidaro jam dialogo langą, prašantį įvesti naudotojo vardą ir slaptažodį. Kitas būdas patekti į autentikacijos reikalaujantį puslapį yra naudotojo vardą ir slaptažodį, atskirtus dvitaškiu, bei su internetine eta gale, įrašyti į adreso eilutę tarp protokolo ir domeno vardo:

protokolas://naudotojas:slaptazodis@www.domenas.com/ka↵
talogas/failas.pletinys

Lankytojui įvedus teisingus prisijungimo duomenis, jam parodomas adresuotas informacinis puslapis, kuris gali būti tiek paprastas dokumentas (html, txt, pdf), tiek skripto (php, perl, python) sugeneruotas turinys, tiek parsiųstinas vykdomasis failas, tiek kitas biesas.

Reikia paminėti, kad naudotojo vardą ir slaptažodį, atskirtus dvitaškiu, naršyklė prieš siųsdama į serverį, užkoduoja base64 algoritmu, kuris serveryje atkoduojamas į grynąjį tekstą ir sulyginamas su užregistruotom prisijungimo sąskaitom. Deja gan lengvai naudotojo vardas ir slaptažodis gali būti nuskaitytas ir atsikoduotas tau nežinant kažkur pakelėj link serverio. Dėl šios priežasties saugumo vardan kartu su naudotojo autentikacija naudinga naudot SSL.

Kas yra SSL? Tai papildomas kompiuterių tinklo sluoksnis, užtikrinantis, kad persiunčiami duomenys bus užkoduoti ir tarpinės grandys, kaip DNS (domenų vardų serverių) administratoriai, negalės jų tiesiogiai perskaityti. Kaskart kai jungiamės prie internetinių banko sąskaitų ar kitų ypatingo saugumo reikalaujančių svetainių, dažniausiai suvedame “https://”, kur “s” nurodo saugų SSL jungimąsi, kurio perduodamo turinio smalsieji hakeriai nesupras. Komunikacijos saugumo sluoksnį įgyvendina Apačės modulis mod_ssl.

Jeigu abu moduliai jau yra Apache/modules kataloge, tuomet gali džiaugtis ir varom toliau. Priešingu atveju dar teks gerokai paprakaituot, kol juos susikompiliuosi.

Toliau užtikrink, kad moduliai mod_auth ir mod_ssl pakraunami kartu su Apache. Apache/conf/httpd.conf faile turi būti įrašytos (ir neužkomentuotos “#” ženklu) šios eilutės:


LoadModule auth_module modules/mod_auth.so
LoadModule ssl_module modules/mod_ssl.so

Jei serveryje naudoji PHP, gali pasitikrint, ar moduliai tikrai pasikrovė testinio failo su phpinfo(); funkcija išvesty susiradęs “mod_auth” ir “mod_ssl” prie “Loaded Modules” skilties.

Apache/conf/httpd.conf faile taip pat turi būti SSL konfigūracijos įterpimas:


<IfModule mod_ssl.c>
    Include conf/ssl.conf
</IfModule>

Faile Apache/conf/ssl.conf reiktų standartiškai patalpint Alias ir Directory, arba Location, arba VirtualHost direktyvas. Detalių pasieškok kitur, nes pačiam dažniausiai tenka naudoti gudrią serverio administravimo programą, valdomą per naršyklę, kas leidžia kai kurias užduotis atlikti greičiau ir per daug nesigilinant į konfigūracines smulkmenas.

Norėsim nustatyti skirtingas naudotojų teises skirtingiems katalogams, o ne visam domenui. Todėl autentikacijos nustatymus rašysim į .htaccess failus atitinkamuose kataloguose, o ne į bendrą Apache/conf/httpd.conf nustatymų failą (ir ne į jo įtraukiamus konfigūracijos failus, kaip kad conf/ssl.conf). Taigi mums dar reikės aktyvuoti .htaccess failų dalyvavimą konfigūracijoje. Tai padaroma Apache/conf/ssl.conf nurodant

AllowOverride AuthConfig

arba, jei nori pasišvaistyti kompo atmintimi ir savo administravimo laisve:

AllowOverride all

Toliau naudotojo autentikacijos nustatymas. Jis susideda iš dviejų dalių: naudotojo sąskaitos sukūrimo ir katalogo teisių priskyrimo sukurtam naudotojui. Naudojų sąskaitos specialia komanda (pagalbine programa) htpasswd, sukuriamos administratoriaus pasirinktame faile, kuris privalo būti nepasiekiamas per žiniatinklį. Tarkim, naudotojus surašysim Apache/users/naudotojai. Rašom:

htpasswd -c /kelias/iki/Apache/users/naudotojai jonukas

Mūsų paklaus, kokį slaptažodį norime nustatyti Jonukui, po to paprašys pakartoti. Štai ir Jonuko sąskaita sukurta. Parametras -c komandoje reiškia, kad failas “naudotojai” dar neegzistuoja ir jį reikia sukurti. Kitų naudotojų sąskaitas sukuriame analogiškai, tik be parametro -c:


htpasswd /kelias/iki/Apache/users/naudotojai petriukas
htpasswd /kelias/iki/Apache/users/naudotojai maryte
htpasswd /kelias/iki/Apache/users/naudotojai onute

Jei atidarytume sąskaitų failą “naudotojai”, pamatytume skirtingose eilutėse išsaugotas naudotojų vardų ir md5 algortimu užkoduotų slaptažodžių poras, maždaug taip:


jonukas:p0wTkpxYnO/9YZYfTlAM..
petriukas:skfow[9kp25ppxa33goz
maryte:h7gmtUxbG.4w3QKkCzCBs0
onute:IsLgWauXXnx9BYTT0Mchm1

Kas nežino, md5 algoritmas koduoja tik į vieną pusę — užkoduoto slaptažodžio atkoduoti praktiškai nebeįmanoma. Kai asmuo jungiasi savo naudotojo vardu bei slaptažodžiu prie apsaugoto katalogo, jo slaptažodis užkoduojamas ir sulyginamas su esančiu sąskaitų faile. Bet kodėl gi tuomet naudotojų sąskaitų failą reikia laikyti nuošaliai nuo internautų akių ir pirštų? Gudrieji hakeriai dažniausiai turi duomenų bazes su dažniausiai pasitaikančių slaptažodžių/angliškų žodžių ir jų md5 kodų porom. Jiems tereikia paleisti paiešką, ieškant md5 kodo “IsLgWauXXnx9BYTT0Mchm1″, ir štai vos per kelias sekundes jiems prieš akis Onutės slaptažodis. Taigi būkime budrūs ir gudrūs.

Dabar bandysim nustatyti katalogų teises skirtingiems naudotojams. Tarkim, kad Apačė nustatyta taip, kad Apache/httpsdocs kataloge visi duomenys pasiekiami per SSL. Apache/httpsdocs kataloge susikuriame pakatalogį “slapta”, kuriame kavosim slaptus failus, o jo viduje pakatalogius “tik-mergaitems”, “tik-berniukams” ir “visiems-pabiruciams”. Kataloge Apache/httpsdocs/slapta susikuriame failą .htaccess ir jo viduje parašom:


AuthName "Kas paslepta -- to nerasi"
AuthType Basic
AuthUserFile /kelias/iki/Apache/users/naudotojai
require valid-user

Kas čia kur ir kaip? AuthName apibūdina apribojimų karalystę. Naudotojo vardo ir slaptažodžio reikalaujantis dialogo langas, bandant pasiekti failus iš katalogo “slapta” arba jo pakatalogių, bus pavadintas “Kas paslepta — to nerasi”. AuthType apibūdina autentikacijos tipą. Jų yra du, bet tik “Basic” yra šiuo metu standartizuotas, tai apie kitą gali nė nekvaršint galvos. AuthUserFile nurodo failą, iš kurio nuskaitomos naudotojų sąskaitos. Skirtingiems domenams ir netgi katalogams gali naudoti skirtingus naudotojų sąskaitų failus. Paskutinė eilutė reiškia, kad katalogo turinį gali pasiekti bet kuris naudotojas, užregistruotas naudotojų sąskaitų faile.

Einam toliau. Kataloge Apache/httpsdocs/slapta/tik-berniukams sukuriame failą .htaccess ir jame įrašome:


AuthName "Reikejo berniukams beribio dangaus..."
AuthType Basic
AuthUserFile /kelias/iki/Apache/users/naudotojai
require user jonukas petriukas

Analogiškai kataloge Apache/httpsdocs/slapta/tik-mergaitems sukuriame failą .htaccess ir jame įrašome:


AuthName "Tarp musu mergaiciu (ir Petriuko nepamirskit)"
AuthType Basic
AuthUserFile /kelias/iki/Apache/users/naudotojai
require user maryte onute petriukas

Direktyva require user su toliau išvardintais naudotojų vardais, atskirtais tarpais, nurodo, kas turės teisę pasiekti apriboto priėjimo katalogą.

O kaip su teisių paveldėjimu pakatalogiuose? Į apribojimo karalystę patenka visi pakatalogiai, kurie neturi nurodytos savo karalystės. Pavyzdžiui, Apache/httpsdocs/slapta/visiems-pabiruciams taikomos lygiai tokios pat priėjimo teisės, kaip ir tėvukui Apache/httpsdocs/slapta, t.y. tuose kataloguose esančius failus pasiekia visi prisijungę registruoti naudotojai. Tuo tarpu, katalogo Apache/httpsdocs/slapta/tik-mergaitems ir jo pakatalogių, nors tu ką, neprieina Jonukas (bei, žinoma, neturintys naudotojo sąskaitos); analogiškai katalogo Apache/httpsdocs/slapta/tik-berniukams pornuškės nemato Marytė ir Onutė.

Pats įdomumas prasideda, kai pradedi žaisti su žiniatinklio tarnybom (ach ta lietuvybė – webservisais). Kai socket’ais užmezgi autentikuotą ir apsaugotą prisijungimą, nusiunti klausimų ir gauni atsakymų. Bet tai ne šiam kartui. Beje, nenustebk, kad tavo skirtingi Apačės komponentai (konfigūracija, httpsdocs, moduliai, vykdomieji failai) bus patalpinti skirtinguose failų sistemos kataloguose, nebent naudoji ką nors iš *AMP srities (WAMP, LAMP ir MAMP yra konfigūraciniai paketai interneto svetainių kūrimui konkrečioje operacinėje sistemoje, susidedantys iš Apache žiniatinklio tarnybinės stoties, MySQL duomenų bazės ir PHP programavimo kalbos). Gal visa šita nuobodybė pravers ne tik man? Pastabos ir kritika – prašom!

*nix baubai

Tuesday, April 11th, 2006

Linux’ai, Mac OS X ir kitos Unix’ais paremtos operacinės sistemos turi visokių gražių alternatyvų Windows’inėms programoms, tačiau turi ir pulką baubų, dėl kurių neryžtingi kompiuterastai nenorėtų migruot prie atviro kodo operacinės sistemos. Tai programų kompiliavimas. Pamiršk „next-next“, admine. Pamiršk „Ctrl+F9“, programuotojau.

Tiek Linux, tiek Mac OS X turi visokiausių automatinių diegiklių (apt, pkg, rpm, fink, %&!§$, …), net grafinis naudotojo interfeisas kartais įgyvendintas. Tačiau, kai tik prireikia diegti ką nors specifinio, kaip kad kokią tarnybinę paslaugą (servisą) ar kokį programinės įrangos kūrimo įrankį (svn, gettext, &*$?°§, …), tuomet visada atsiras reikalavimuose punktas (kiaulystės dėsnis), kad prieš tai reikalinga kokios programos naujausia versija. O naujausia versija, kaip įprasta, būna paruošta diegimui tik Windows’ams ir kokiai vienai Linux distribucijai (tavo smagumui, ne tai, kurią pats naudoji). Bet! Gerieji atvirojo kodo programeriai tavo patogumui (na kaip čia pasakius) visada tau pasiūlys atvirą kodą. Susikompiliuok ir turėsi!

Papraščiausiu atveju, standartinis kompiliavimo procesas vyksta taip: įsijungi Terminalą, komandomis cd ir ls nusigauni iki katalogo, kuriame yra parsisiųstas ir išpakuotas (išarchyvuotas) programos kodas. Tada suvedi šitas komandas:


$ ./configure
$ make
$ sudo make install

Po kiekvienos iš jų įvedimo pasirodo tirados eilučių, kuriose tau nesuprantama kalba (ne dėl to, kad angliškai), aiškinama, kas vyksta.

configure atrenka, kokį kompiliatorių tu turi, kur ir kaip tavo sistemoje laikomi sisteminiai failai, bibliotekos, ką tavo kompas moka, ko ne. ./configure --help išrašo kokius parametrus gali naudoti, norėdamas programą susidiegti ne pagal gamintojo standartus.

make sukompiliuoja programą, naudodamas per konfigūravimą (configure procesą) surinktus tavo kompo nustatymus.

make install nukopijuoja sukompiliuotą programą, duomenų failus ir dokumentaciją į katalogus, nustatytus per konfigūravimą, kitaip sakant, įdiegia programą. sudo (N.B. ne „šūdo“) čia reikalingas tam, kad programa būtų įdiegta root teisėmis ir galėtų būti įkopijuota į sisteminius katalogus, kurie kokiam Mac OS X’e be papildomų utiličių per Finder net nėra matomi. Po sudo make install Terminalas užklausia administratoriaus slaptažodžio.

Tai va, gerai, jei standartiniai gamintojo nustatymai atitinka tavo nustatymus, tačiau kiek būna atvejų, kai reikia išsiaiškinti specifines detales ir žaisti su configure parametrais! Gerai, kai kompe yra bent vienas C++ kompiliatorius, o būna atvejų, kai jokio kompiliatoriaus nėra. Apie dekonstrukciją (išdiegimą) tai net nekalbu (nėra net šitokio automatizavimo — viską rankom reikia trint).

Jei nusprendei būti Linuxų administratorium, tai sėkmės! Nelengvas tas admino-gedimino darbas…

Internetas antram kompui: pasidaryk pats

Monday, July 11th, 2005

Per praėjusią savaitę gavau praktinių tinklų jungimo pradmenų. Buvo kompas A su Internetu per kabelinį modemą ir kompas B be Interneto. Abiejuose naudojami Windows XP. Reikėjo prijungti B prie A ir sureguliuoti B kompui Internetą. Trumpai nupasakosiu šį procesą, mat tai gali praversti pradedančiajam.

Pradžiai technika.

Du kompus, mano žiniomis, galima sujungti naudojant komutatorius (Switch) arba tiesiogiai iš tinklo plokštės į tinklo plokštę. Dėl pigumo ir kadangi daugiau kompiuterių artimiausiu metu į tinklą jungti nežadam, pasirinkau pastarąjį variantą.

Nusipirkau 10 m tinklo kabelį (~20 Lt) jungti A su B, kurie stovi skirtinguose kambariuose.

Kompiuteryje A įdėta tinklaplokštė jungia išorinį kabelinį modemą su kompiuteriu A, todėl tinklui sujungti kompiuteriui A reikėjo nusipirkti antrą tinklo plokštę.

Taigi nusipirkau dar antrą tinklo plokštę (~20 Lt) ir ją įstačiau greta pirmosios. Windows XP iškart ją atpažino (papildomai tvarkyklių diegti nereikėjo).

Sužinojau, kad jungiant du kompiuterius tiesiogiai iš tinklo plokštės į tinklo plokštę, jungiamasis kabelis turi būti kryžiuotas (cross-over), t.y. 8 laideliai kabelio viduje turi būti nevienodai sujungti vienam ir kitam gale. Jei turi specialias antgalio (kištuko, kuris kišasi į tinklo plokštę) uždėjimo žnyples, tai gali pasidaryti pats pagal instrukcijas Internete, tačiau mano atveju teko nueiti į vieną iš didesnių kompiuterių parduotuvių Klaipėdoje ir už kelis Litus to užsiprašyti.

Kompiuteryje B tinklaploštė stovėjo jau nuo seniau, taigi iš techninės dalies beliko kryžiuotuoju kabeliu sujungti A naująją tinklo plokštę su B kompiuterio ten esančiąja.

Toliau programiniai nustatymai.

Kompiuteryje A:

Start -> Settings -> Control Panel -> Network Connections
dešiniu pelės mygtuku spustelt
Local Area Connection (prisijungimas prie išorinio kabelinio modemo)
ir iš meniu pasirinkti Properties -> kortelė Advanced ir pažymėti varnele kvadratėlį (checkbox) virš „Allow other computers on a local network to access the Internet“.

Tada užtikrinti, kad Local Area Connection 2 (prisijungimas prie kompiuterio A) nurodytas IP adresas 192.168.0.1, jeigu ne — nustatyti:
dešiniu pelės mygtuku spustelėti virš
Local Area Connection 2
iš meniu pasirinkti Properties -> kortelė General ir sąraše „This connection uses the following items“ pasirinkus „Internet Protocol (TCP/IP)“, spustelt komandų mygtuką „Properties“. „Use the following IP address“ yra tai, ką reikia patikrinti/nustatyti.

Kompiuteryje B:

Patikrinti ar tinklas veikia, einant
Start -> Run, įrašant „cmd“, tada atsidariusiame Command Prompt lange rašant:
ping 192.168.0.1
Jei gaunamas atsakymas
Reply from 192.168.0.1: ...
tinklas sujungtas gerai. Kitu atveju reikia patikrinti, ar gerai prijungtas kabelis abiejuose galuose, ar gerai įstatytos tinklo plokštės, ar ryšio neblokuoja ugniasienės A ir/arba B kompiuteriuose.

Galiausiai, reikia eiti Internet Explorer Properties -> Connections, paspausti „Setup…“ ir nureguliuoti Internetą kompui B per tinklą (small home or office network). Baigiant pasiūlys susikurt kompaktą, kuriuo būtų galima diegti Internetą į kitus tinklo kompus, bet to reikėjo atsisakyti, nes daugiau kompų kaip ir nėra.

Vualá! Kol kompiuteriu A užsiėmę kiti šeimos nariai, aš kompiuteryje B pilnu tempu tęsiu savo kompiuterinius darbus ir nepamirštu parašyti žinučių čia.

Mano tinklo trūkumai:

  • Jei kompiuteris A yra išjungtas, kompiuteryje B Interneto nėra.
  • Jei kompiuteris A pakimba, kompiuteryje B Internetas dingsta.
  • Jei kompiuteryje A pakeičiamas naudotojo abonentas (account), kompiuteryje B Internetas dingsta.
  • Jei kompiuteryje B apkraunamas Internetas, kompiuteris A gali sulėtėti.