Implementarea Unui Server Securizat de Transferat Fisiere Sub Linux

Cuprins

Descrierea proiectului

Proiectul de față urmărește să ofere o soluție simplă pentru transferul de fișiere atât între diferiți utilizatori cât și între diferite locații fizice ale aceluiași utilizator folosind un server de FTP care îndeplinește criteriile necesare, când vine vorba de transferul unor fișiere în mediul digital. Securitatea datelor și fiabilitatea implementată, recomandă această soluție în aproape orice mediu cu o utilizare minimă de resurse.

În zilele noastre există o multitudine de servicii care oferă transfer securizat precum Dropbox sau Google Drive, care își îndeplinesc foarte bine treaba atât timp cât sunt utilizate în scop personal. Când vine vorba de informații sau fișiere importante crește nevoie de siguranță și intimitate. De aceea în cadrul profesional, utilizarea unor servicii publice este descurajată sau chiar interzisă. Așa apare necesitatea de a crea o soluție proprie de transfer al datelor, care să permită utilizatorilor să schimbe între ei sau cu clienții date de natură sensibilă.

Pentru soluția de față am ales implementarea practică a unui server FTP pe o platformă open-source cu ajutorul sistemului de operare Linux CentOS. Pentru un mai bun management al resurselor întregul server va rula în interiorul unui container virtual Oracle VM Virtual Box care permite alocarea dinamică a resurselor, astfel în cazul în care numărul de utilizatori crește brusc serverul să poată face față, fără să fie necesară întreruperea serviciului pentru utilizatorii deja existenți.

Interfața este implementată prin server-ul web Apache și limbajul PHP care oferă o securitate sporită. În fundal va rula o bază de date MySql, care ține toate înregistrările utilizatorilor și este folosită de câtre interfață pentru a autentifica utilizatorii. Serverul de FTP ales este vsFTPD (very secure FTP Daemon) care este o aplicație securizată și extrem de rapidă, publicat sub licenta GPL pentru sistemele de operare Linux/UNIX.

Motivul major pentru care am ales sistemul de operare Linux este securitatea. Pentru securizarea serverului vom folosi uneltele native Linux plus un al treilea instrument „Fail2ban”, care să ofere securitate sporită în fața atacurilor de tip bruteforce. CentOS vine de la instalare cu SELinux și IPTABLES – 2 din cele mai puternice tool-uri de securitate – care vor opri orice atac lansat câtre serverul de FTP. SELinux este un modul de securitate al nucleului (kernel) Linux, care oferă implementarea unor politici de securitate pe bază de control al accesului la fișiere dezvoltat de NSA, astfel se poate specifica felul de aplicație și ce utilizator poate să obțină acces la datele salvate pe serverul de FTP.

Implemetarea practică este una complexă, iar rezultatul permite utilizatorilor accesul prin intermediul unei interfețe web cu autentificare bazată pe un utilizator și parolă la datele salvate pe serverul de FTP. Pentru a acoperi toate nevoile va exista și un director public, unde orice utilizator poate să pună fișiere dar nici unul nu va putea să le șteargă. Acest lucru va ușura transferul de fișiere între diferiți utilizatori păstrând mediul securizat pe cât de mult posibil.

Analiza tehnică

Pentru mașina virtuală în care va rula server-ul am ales o configurație minimă(Fig. 1), care oferă suport și performanță pentru maxim 100 de utilizatori:

CentOS 6.5 64bit

1 vCPU(CPU virtual) de 2.6Ghz

1024 MB memorie RAM

8GB disk intern

Fig. 1 – Configuratia VM Virtual Box

Toți acești parametrii pot fi modificați în platforma Oracle VM Virtual Box și devin vizibili pe server, fără nevoia de a reporni sistemul de operare.

Oracle VM Virtual Box

VirtualBox este un utilitar puternic de virtualizare, atât pentru scop privat cât și în mediul de afaceri, oferind o platformă rapidă de virtualizare, fiind singura soluție profesională disponibilă gratis sub licența GNU GPL (General Public License). VirtualBox este disponibilă pentru diferite sisteme de operare începând de la Windows NT 4.0, 2000, XP, Server 2003, Vista, Windows 7, Windows 8 până la Linux (2.4, 2.6 and 3.x), Solaris și OpenSolaris, OS/2 și OpenBSD.

Principalul avantaj este faptul, că permite rularea mai multor sisteme de operare simultan, astfel pe un server fizic pot rula mai multe servere virtuale cu diferite sisteme de operare în același timp, fiecare deservind un alt scop. În acest fel scad costurile de întreținere per server și nevoile de a achiziționa mai multe servere fizice pentru scopuri diferite.

Sistemul de Operare Linux CentOS

CentOS este un acronim pentru Comunity Enterprise Operating System și este un proiect condus de comunitatea de dezvoltatori de Linux al cărui scop este, să facă disponibil utilizatorilor o platformă sigură, stabilă și ușor de mânuit. CentOS este derivat din codul sursa al RHEL (Red Hat Enterprise Linux) diferența majoră, fiind faptul că este oferit gratuit și este liber de a fi distribuit câtre orice utilizatori. La fiecare 2 ani se lansează câte o versiune nouă și este actualizată la fiecare 6 luni, pentru a include versiuni mai noi de hardware. În acest fel se creează o platforma securizată, ușor de întreținut în care poți avea încredere și mai ales, ușor de reprodus.

Pornind de la aceste avantaje, motivația pentru a alege o platformă Linux pentru implementarea serverului de FTP este una clară:

Securitate

Fiabilitate

Stabilitate

Ușor de reprodus

Partea Teoretică

Instalarea CentOS

Instalearea CentOS este una simplă. În primul rând avem nevoie de imaginea de instalare, care o putem descărca direct de pe siteul CentOS: http://wiki.centos.org/Download.

Pentru cazul de față am ales versiunea 6.6 care este și ultima versiune din seria 6. Pentru această versiune vor fi distribuite actualizări până la finalul anului 2020, când produsul își încheie ciclul de viață.

Pentru a începe instalarea se adaugă imaginea în containerul virtual și se pornește(Fig. 2):

Fig. 2 – Inserare imagine ISO CentOS 6

Odată pornită, mașina virtuală va iniția secvența de boot de pe DVD-ul cu CentOS (Fig. 3):

Fig. 3 – Meniul de boot CentOS

Instalarea va continua în interfața grafică, unde optăm pentru o instalare, ce folosește tot spațiul disponibil (Fig. 4). Alegând această opțiune CentOS își va configura partiția internă așa cum are nevoie pentru a funcționa optim:

Fig. 4 – Interfața de partiționare

Mai departe alegem opțiunea de Basic Server (Fig. 5), care va instala o versiune simplă a CentOS fără pachete inutile care ar îngreuna funcționarea:

Fig. 5 – Opțiunile Instalare CentOS

De aici începe instalarea propriu zisă, care durează câteva minute, în funcție de pachetele alese cum se vede în Fig. 6:

Fig. 6 – Progresul instalării CentOS

Odată terminată instalarea sistemul poate fi folosit, autentificarea se face cu utilizatorul root și parola definită la începerea instalării (Fig. 7):

Fig. 7 – Logarea pe sistemul nou instalat

2.2 Instalarea pachetelor necesare

Pentru a putea crea serverul de FTP avem nevoie în primul rând de pachetele, care vor sta la baza lansării serverului și anume: apache, PHP, MySQL, vsFTPD și dependințele acestora. Instalarea se face cu ajutorul utilitarului yum care este managerul standard de pachete pentru CentOS. Pachetele vor proveni din librăria de pachete publică a CentOS (Fig. 8).

Fig. 8 – Librariile de pachete CentOS

[root@FTP ~]# yum install httpd php* vsftpd mysql.x86_64

Loaded plugins: fastestmirror, security

Setting up Install Process

Loading mirror speeds from cached hostfile

* base: mirrors.biztelecom.ro

* extras: mirrors.biztelecom.ro

* updates: mirrors.biztelecom.ro

Resolving Dependencies

–> Running transaction check

–> Package httpd.x86_64 0:2.2.15-39.el6.centos will be installed

–> Processing Dependency: httpd-tools = 2.2.15-39.el6.centos for package: httpd-2.2.15-39.el6.centos.x86_64

–> Processing Dependency: apr-util-ldap for package: httpd-2.2.15-39.el6.centos.x86_64

–> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.2.15-39.el6.centos.x86_64

–> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.2.15-39.el6.centos.x86_64

Până aici managerul de pachete yum a stabilit pachetele adiționale care sunt necesare pentru a putea instala serverul web Apache. Aceste pachete se numesc dependințe și reprezintă fie pachete adiționale, fie librării de sistem cu diferite fucționalități.

–> Package mysql.x86_64 0:5.1.73-3.el6_5 will be installed

–> Package php.x86_64 0:5.3.3-40.el6_6 will be installed

–> Package php-bcmath.x86_64 0:5.3.3-40.el6_6 will be installed

–> Package php-cli.x86_64 0:5.3.3-40.el6_6 will be installed

–> Package php-common.x86_64 0:5.3.3-40.el6_6 will be installed

–> Package php-dba.x86_64 0:5.3.3-40.el6_6 will be installed

–> Package php-devel.x86_64 0:5.3.3-40.el6_6 will be installed

Mai departe pentru a instala pachetele mysql și php se creează lista de dependințe necesare pentru fiecare pachet și adițional se implinesc și dependințele necesare pentru a instala pachetele dependință. De exemplu, pachetul php.x86_64 0:5.3.3-40.el6_6 are nevoie de php-devel.x86_64 0:5.3.3-40.el6_6 care are nevoie de pachetul automake. Scopul managerului de pachete yum este să scutească utilizatorul de instalarea manuală a tuturor acestor pachete.

–> Processing Dependency: automake for package: php-devel-5.3.3-40.el6_6.x86_64

–> Processing Dependency: autoconf for package: php-devel-5.3.3-40.el6_6.x86_64

–> Package php-embedded.x86_64 0:5.3.3-40.el6_6 will be installed

–> Package php-enchant.x86_64 0:5.3.3-40.el6_6 will be installed

–> Processing Dependency: libenchant.so.1()(64bit) for package: php-enchant-5.3.3-40.el6_6.x86_64

–> Package php-fpm.x86_64 0:5.3.3-40.el6_6 will be installed

–> Package php-gd.x86_64 0:5.3.3-40.el6_6 will be installed

–> Processing Dependency: libXpm.so.4()(64bit) for package: php-gd-5.3.3-40.el6_6.x86_64

–> Package php-imap.x86_64 0:5.3.3-40.el6_6 will be installed

–> Processing Dependency: libc-client.so.2007()(64bit) for package: php-imap-5.3.3-40.el6_6.x86_64

–> Package php-intl.x86_64 0:5.3.3-40.el6_6 will be installed

–> Processing Dependency: libicuuc.so.42()(64bit) for package: php-intl-5.3.3-40.el6_6.x86_64

–> Processing Dependency: libicuio.so.42()(64bit) for package: php-intl-5.3.3-40.el6_6.x86_64

–> Processing Dependency: libicui18n.so.42()(64bit) for package: php-intl-5.3.3-40.el6_6.x86_64

–> Processing Dependency: libicudata.so.42()(64bit) for package: php-intl-5.3.3-40.el6_6.x86_64

–> Package php-ldap.x86_64 0:5.3.3-40.el6_6 will be installed

–> Package php-mbstring.x86_64 0:5.3.3-40.el6_6 will be installed

–> Package php-mysql.x86_64 0:5.3.3-40.el6_6 will be installed

–> Package php-odbc.x86_64 0:5.3.3-40.el6_6 will be installed

–> Processing Dependency: libodbc.so.2()(64bit) for package: php-odbc-5.3.3-40.el6_6.x86_64

–> Package php-pdo.x86_64 0:5.3.3-40.el6_6 will be installed

–> Package php-pear.noarch 1:1.9.4-4.el6 will be installed

–> Package php-pecl-apc.x86_64 0:3.1.9-2.el6 will be installed

–> Package php-pecl-apc-devel.x86_64 0:3.1.9-2.el6 will be installed

–> Package php-pecl-memcache.x86_64 0:3.0.5-4.el6 will be installed

–> Package php-pgsql.x86_64 0:5.3.3-40.el6_6 will be installed

–> Processing Dependency: libpq.so.5()(64bit) for package: php-pgsql-5.3.3-40.el6_6.x86_64

Pachetele necesare pentru interpretorul de limbaj PHP conțin multe dependințe din cauza portabilității sporite a limbajului PHP. Acesta poate fi integrat cu o mare varietate de baze de date sau cu alte limbaje de programare, cum este perl.

–> Package php-process.x86_64 0:5.3.3-40.el6_6 will be installed

–> Package php-pspell.x86_64 0:5.3.3-40.el6_6 will be installed

–> Processing Dependency: libpspell.so.15()(64bit) for package: php-pspell-5.3.3-40.el6_6.x86_64

–> Processing Dependency: libaspell.so.15()(64bit) for package: php-pspell-5.3.3-40.el6_6.x86_64

–> Package php-recode.x86_64 0:5.3.3-40.el6_6 will be installed

–> Processing Dependency: librecode.so.0()(64bit) for package: php-recode-5.3.3-40.el6_6.x86_64

–> Package php-snmp.x86_64 0:5.3.3-40.el6_6 will be installed

–> Processing Dependency: net-snmp for package: php-snmp-5.3.3-40.el6_6.x86_64

–> Processing Dependency: libnetsnmp.so.20()(64bit) for package: php-snmp-5.3.3-40.el6_6.x86_64

–> Package php-soap.x86_64 0:5.3.3-40.el6_6 will be installed

–> Package php-tidy.x86_64 0:5.3.3-40.el6_6 will be installed

–> Processing Dependency: libtidy-0.99.so.0()(64bit) for package: php-tidy-5.3.3-40.el6_6.x86_64

–> Package php-xml.x86_64 0:5.3.3-40.el6_6 will be installed

–> Package php-xmlrpc.x86_64 0:5.3.3-40.el6_6 will be installed

–> Package php-zts.x86_64 0:5.3.3-40.el6_6 will be installed

–> Package vsftpd.x86_64 0:2.2.2-13.el6_6.1 will be installed

–> Running transaction check

–> Package apr.x86_64 0:1.3.9-5.el6_2 will be installed

–> Package apr-util.x86_64 0:1.3.9-3.el6_0.1 will be installed

–> Package apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1 will be installed

–> Package aspell.x86_64 12:0.60.6-12.el6 will be installed

–> Package autoconf.noarch 0:2.63-5.1.el6 will be installed

–> Package automake.noarch 0:1.11.1-4.el6 will be installed

–> Package enchant.x86_64 1:1.5.0-4.el6 will be installed

–> Package httpd-tools.x86_64 0:2.2.15-39.el6.centos will be installed

–> Package libXpm.x86_64 0:3.5.10-2.el6 will be installed

–> Package libc-client.x86_64 0:2007e-11.el6 will be installed

–> Package libicu.x86_64 0:4.2.1-9.1.el6_2 will be installed

–> Package libtidy.x86_64 0:0.99.0-19.20070615.1.el6 will be installed

–> Package net-snmp.x86_64 1:5.5-50.el6_6.1 will be installed

–> Processing Dependency: libsensors.so.4()(64bit) for package: 1:net-snmp-5.5-50.el6_6.1.x86_64

–> Package net-snmp-libs.x86_64 1:5.5-50.el6_6.1 will be installed

–> Package postgresql-libs.x86_64 0:8.4.20-2.el6_6 will be installed

–> Package recode.x86_64 0:3.6-28.1.el6 will be installed

–> Package unixODBC.x86_64 0:2.2.14-14.el6 will be installed

–> Processing Dependency: libltdl.so.7()(64bit) for package: unixODBC-2.2.14-14.el6.x86_64

–> Running transaction check

–> Package libtool-ltdl.x86_64 0:2.2.6-15.5.el6 will be installed

–> Package lm_sensors-libs.x86_64 0:3.1.1-17.el6 will be installed

–> Finished Dependency Resolution

Transaction Summary

Install 53 Package(s)

La final putem observa că pentru a instala cele 4 pachete cu care am început, este necesar sa rezolvăm 49 de dependințe care vor fi și ele instalate.

La începutul dezvoltării sistemelor Linux, cand manageri de pachete nu existau, toate aceste operațiuni se făceau manual, prin compilarea surselor, operațiune complicată care dura mult timp.

Total download size: 23 M

Installed size: 77 M

Is this ok [y/N]:y

Installed:

httpd.x86_64 0:2.2.15-39.el6.centos mysql.x86_64 0:5.1.73-3.el6_5 php.x86_64 0:5.3.3-40.el6_6 php-bcmath.x86_64 0:5.3.3-40.el6_6

php-cli.x86_64 0:5.3.3-40.el6_6 php-common.x86_64 0:5.3.3-40.el6_6 php-dba.x86_64 0:5.3.3-40.el6_6 php-devel.x86_64 0:5.3.3-40.el6_6

php-embedded.x86_64 0:5.3.3-40.el6_6 php-enchant.x86_64 0:5.3.3-40.el6_6 php-fpm.x86_64 0:5.3.3-40.el6_6 php-gd.x86_64 0:5.3.3-40.el6_6

php-imap.x86_64 0:5.3.3-40.el6_6 php-intl.x86_64 0:5.3.3-40.el6_6 php-ldap.x86_64 0:5.3.3-40.el6_6 php-mbstring.x86_64 0:5.3.3-40.el6_6

php-mysql.x86_64 0:5.3.3-40.el6_6 php-odbc.x86_64 0:5.3.3-40.el6_6 php-pdo.x86_64 0:5.3.3-40.el6_6 php-pear.noarch 1:1.9.4-4.el6

php-pecl-apc.x86_64 0:3.1.9-2.el6 php-pecl-apc-devel.x86_64 0:3.1.9-2.el6 php-pecl-memcache.x86_64 0:3.0.5-4.el6 php-pgsql.x86_64 0:5.3.3-40.el6_6

php-process.x86_64 0:5.3.3-40.el6_6 php-pspell.x86_64 0:5.3.3-40.el6_6 php-recode.x86_64 0:5.3.3-40.el6_6 php-snmp.x86_64 0:5.3.3-40.el6_6

php-soap.x86_64 0:5.3.3-40.el6_6 php-tidy.x86_64 0:5.3.3-40.el6_6 php-xml.x86_64 0:5.3.3-40.el6_6 php-xmlrpc.x86_64 0:5.3.3-40.el6_6

php-zts.x86_64 0:5.3.3-40.el6_6 vsftpd.x86_64 0:2.2.2-13.el6_6.1

Dependency Installed:

apr.x86_64 0:1.3.9-5.el6_2 apr-util.x86_64 0:1.3.9-3.el6_0.1 apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1

aspell.x86_64 12:0.60.6-12.el6 autoconf.noarch 0:2.63-5.1.el6 automake.noarch 0:1.11.1-4.el6

enchant.x86_64 1:1.5.0-4.el6 httpd-tools.x86_64 0:2.2.15-39.el6.centos libXpm.x86_64 0:3.5.10-2.el6

libc-client.x86_64 0:2007e-11.el6 libicu.x86_64 0:4.2.1-9.1.el6_2 libtidy.x86_64 0:0.99.0-19.20070615.1.el6

libtool-ltdl.x86_64 0:2.2.6-15.5.el6 lm_sensors-libs.x86_64 0:3.1.1-17.el6 net-snmp.x86_64 1:5.5-50.el6_6.1

net-snmp-libs.x86_64 1:5.5-50.el6_6.1 postgresql-libs.x86_64 0:8.4.20-2.el6_6 recode.x86_64 0:3.6-28.1.el6

unixODBC.x86_64 0:2.2.14-14.el6

Complete!

Odată terminată instalarea serverul este acum pregătit, pentru a fi configurat precum avem nevoie. Pachetele acum instalate au setările standard, care mai târziu vor fi schimbate conform necesităților pentru implementarea serverului de FTP.

Principalele pachete de care avem nevoie sunt următoarele:

httpd.x86_64 0:2.2.15-39.el6.centos – conține binarele, fișierele de configurare și scripturile de pornire ale serviciului Apache.

mysql.x86_64 0:5.1.73-3.el6_5 – conține binarele și fișierele de configurare pentru serverul de baze de date MySQL, cât și interpretorul de limbaj SQL (Structured Querry Language)

php.x86_64 0:5.3.3-40.el6_6 – conține binarele și fișierele de configurare pentru interpretorul de sintaxa PHP și pornește odata cu serverul Apache.

vsftpd-2.2.2-13.el6_6.1.x86_64 – conține binarele pentru serverul securizat de FTP. Această versiune de FTP a fost re-scrisă și nu se bazează pe versiunile standard care vin cu sistemul de operare.

2.3 Managementul Utilizatorilor

Un aspect important de securitate este felul în care utilizatorii au acces la serverul de FTP. Pentru a putea separa cât mai bine drepturile fiecărui utilizator, am ales să salvez toate informațiile într-o bază de date MySQL care va fi interogată de un script PHP de fiecare dată când un utilizator folosește formularul de logare pe site.

Odată, ce un utilizator se va înscrie pe site în baza de date existentă vor fi salvate următoarele detalii :

Datele de acces la server

Datele de contact ale utilizatorului

Apartenența și permisiunile utilizatorului asupra datelor

Permisiuni ce țin de securitatea datelor

În categoria datelor de acces la server se includ:

Nume de utilizator

Parolă

Nivelul de acces (user normal sau administrator)

Validitatea contului

Pentru a putea avea o privire de ansamblu despre utilizatori se salvează următoarele date de contact:

Adresa de e-mail

Nume și prenume

În momentul în care mai mulți utilizatori au nevoie de aceleași date sau de acces la datele unui utilizator, este mult mai ușor să ținem evidența stabilind grupuri de apartenență pentru utilizatorii, care au acces într-o anumita locație:

Locația datelor

Membrii grupului care au acces în locația respectivă

Permisiunile ce țin de securitatea datelor sunt :

Datele de logout

Locațiile unde utilizatorul are permisiuni de scriere/ștergere

În baza de date vor exista două tabele principale. Unul dintre ele va fi folosit exclusiv pentru a ține datele de acces la server ; iar celălat va reține restul detaliilor necesare după autentificare pentru fiecare utilizator în parte.

2.4 Interfața Apache și PHP

Pentru interacțiunea dintre utilizator și server este nevoie de un mediu de mijloc, care să fie ușor de utilizat de câtre oricine și care să prezinte securitate. Așadar am ales implementarea unei pagini de login în Apache, care va rula scripturi PHP, ce comunică cu baza de date MySQL.

2.4.1 Prezentarea serverului web Apache

Apache este un server HTTP de tip open source. Apache a jucat și joacă un rol important în dezvoltarea webului, fiind folosit în prezent în circa 65.2 % din paginile web. Acesta este dezvoltat de o comunitate deschisă de programatori sub emblema Apache Software Foundation. Aplicația este disponibilă pentru o mare varietate de sisteme de operare incluzând Unix, FreeBSD, Linux, Solaris, Novell NetWare, Mac OS X, Microsoft Windows și OS/2.

Serverul Apache este caracterizat, ca fiind un software gratuit și open source, acesta lucru a determinat ca, începând din aprile 1996, el să fie cel mai popular server HTTP. Cu toate că în noiembrie 2005 a început să piardă din cota de piață, în aprilie 2008 Apache stătea încă la baza a peste 50 % din siturile web, iar în iunie 2013 a ajuns la 65.2%.

Prima versiune a serverului a fost creată de Robert McCool, care la vremea aceea era implicat în proiectul National Center for Supercomputing Applications, cunoscut pe scurt ca NCSA HTTPd. A doua versiune a serverului a fost o rescriere substanțială, de data aceasta punându-se accentul pe crearea unui layer prioritar (Apache Portable Runtime) și a suportului de module.

Apache suportă o mare varietate de module care îi extind funcționalitatea, acestea variază de la server side programming și până la scheme de autentificare. Câteva limbaje suportate sunt: mod_perl, mod_python, Tcl și PHP. De asemenea există alte module cum ar fi: SSL și TLS support (mod_ssl), un modul proxyun, modul de rescriere URL (cunoscut ca un motor de rescriere mod_rewrite), custom log files (mod_log_config) și suport de filtrare (mod_include și mod_ext_filter). O altă calitate a serverului Apache este virtual hosting (găzduirea virtuală), care constă în posibilitatea de a găzdui mai multe situri simultan pe același server.

2.4.2 Prezentarea limbajului PHP

PHP (acronim recursiv pentru PHP: Hypertext Preprocessor) este un limbaj de scripting de uz general, cu cod-sursă deschis (open source), utilizat pe scară largă, acesta este potrivit în special pentru dezvoltarea aplicațiilor web și poate fi integrat în HTML.

Cea ce face PHP să difere de un JavaScript de partea clientului este faptul că executarea codului său este pe server, generând HTML care este apoi trimis către client. Clientul va primi rezultatele rulării acelui script, fără a putea cunoaște codul-sursă ce stă la bază.

PHP este axat în principal pe scripting de partea server-ului, astfel puteți realiza cu el orice poate realiza un alt program CGI, cum ar fi colectarea datelor din forme, generarea conținutului dinamic al paginilor sau trimiterea și primirea cookies.

Există trei domenii principale, unde sunt utilizate scripturile PHP:

Scripting de partea serverului. Acesta este cel mai tradițional și de bază domeniu al PHP. Sunt necesare trei lucruri pentru ca aceasta să funcționeze. Analizatorul PHP (în calitate de CGI, sau modul pentru server), un server web și un navigator web. Trebuie să rulați serverul web cu o instalare PHP conectată la el. Puteți accesa ieșirile programului PHP cu navigatorul web, vizualizând pagina PHP prin server.

Scripting în linia de comandă. Puteți face un script PHP să ruleze fără un server și navigator web. Aveți nevoie doar de analizatorul PHP pentru a-l utiliza în acest mod. Acest mod de utilizare este ideal pentru script-uri executate în mod regulat cu cron (pe *nix sau Linux) sau cu Task Scheduler (pe Windows). Aceste script-uri pot fi utilizate de asemenea pentru lucrări simple de procesare a textelor.

Scrierea aplicațiilor de birou. PHP probabil că nu este cel mai potrivit limbaj pentru a crea o aplicație de birou cu o interfață grafică a utilizatorului, dar dacă cunoașteți PHP foarte bine și doriți să utilizați unele facilități avansate ale PHP în aplicații de partea clientului, puteți să utilizați PHP-GTK, pentru a scrie asemenea aplicații. De asemenea aveți posibilitatea să scrieți în acest mod aplicații, ce vor rula pe mai multe platforme. PHP-GTK este o extensie a PHP, care nu este disponibilă în distributivul de bază.

PHP poate fi utilizat pe toate sistemele de operare majore, inclusiv Linux, multe variante Unix (inclusiv HP-UX, Solaris și OpenBSD), Microsoft Windows, Mac OS X, RISC OS și probabil altele. PHP de asemenea susține majoritatea server-elor web existente în prezent. Acestea includ Apache, IIS, și multe altele. De asemenea se includ și serverele, ce pot utiliza binarul PHP FastCGI, cum ar fi lighttpd și nginx. PHP funcționează ca modul sau ca procesor CGI.

Una dintre cele mai puternice și semnificative facilități ale PHP este susținerea unui larg domeniu de baze de date. Scrierea unei pagini web ce accesează o bază de date este incredibl de simplă, utilizând una din extensiile de lucru cu baze de date (de ex. pentru mysql), sau utilizând un nivel de abstractizare precum PDO, sau conectarea la orice bază de date ce susține standardul "Open Database Connection" cu ajutorul extensiei ODBC.

2.4.3 Avatajele folosirii PHP

PHP este un limbaj de programare web puternic, iar interpretorul său, fie că este inclus în serverul web ca un modul, sau executat separat ca binar CGI, este capabil să acceseze fișiere, să execute comenzi sau să deschidă conexiuni în rețea pe server. Aceste proprietăți fac ca totul, ce este rulat pe server să fie implicit nesecurizat. PHP a fost proiectat în mod specific, pentru ca să fie un limbaj mai securizat destinat scrierii programelor CGI comparativ cu Perl sau C. Acesta dispune de o selectare corectă a opțiunilor de configurare la compilare și la rulare, dublate de o tehnică de programare corespunzătoare, PHP poate oferi combinația perfectă de libertate și securitate, de care avem nevoie.

Când PHP este utilizat ca modul în Apache, el moștenește permisiunile implicite ale Apache (de obicei acelea ale utilizatorului "nobody"). Acest fapt are mai multe impacte asupra securității și autorizării. De exemplu, dacă utilizăm PHP pentru a accesa o bază de date, și dacă aceasta nu are control de acces inclus, va trebui să facilităm la această bază de date accesul utilizatorului "nobody". Aceasta înseamnă că un script malefic va putea accesa și modifica baza de date, chiar fără a introduce numele utilizatorului și parola. Este posibil ca un robot de indexare web să acceseze accidental panoul de administrare al bazei de date și să modifice sau să șteargă toate datele. Putem proteja impotriva atacurilor de acest gen cu ajutorul sistemului de autorizare al Apache, sau printr-un model de acces personalizat folosind LDAP, fișiere tip .htaccess, etc. pe care să le introducem în scripturile PHP create.

2.5 Baza de date MySQL

2.5.1. Scurtă descriere MySQL

MySQL este un sistem de gestiune a bazelor de date relaționale, produs de compania suedeza MySQL AB și distribuit sub Licența Publică Generală GNU. Este cel mai popular SGBD open-source la ora actuală, fiind o componentă cheie a stivei LAMP (Linux, Apache, MySQL, PHP).

Deși este folosit foarte des împreună cu limbajul de programare PHP, cu MySQL se pot construi aplicații în orice limbaj major. Există multe scheme API disponibile pentru MySQL, ce permit scrierea aplicațiilor în numeroase limbaje de programare pentru accesarea bazelor de date MySQL, cum ar fi: C, C++, C#, Java, Perl, PHP, Python, FreeBasic, etc., fiecare dintre acestea folosind un tip specific API.

O interfață de tip ODBC denumită MyODBC permite altor limbaje de programare, ce folosesc această interfață, să interacționeze cu bazele de date MySQL, cum ar fi ASP sau Visual Basic. În sprijinul acestor limbaje de programare, unele companii produc componente de tip COM/COM+ sau .NET (pentru Windows) prin intermediul cărora respectivele limbaje, să poată folosi acest SGBD mult mai ușor decât prin intermediul sistemului ODBC. Aceste componente pot fi gratuite (ca de exemplu MyVBQL) sau comerciale.

MySQL este componentă integrată a platformelor LAMP sau WAMP (Linux/Windows-Apache-MySQL-PHP/Perl/Python). Popularitatea sa, ca aplicație web, este strâns legată de cea a PHP-ului, care este adesea combinat cu MySQL și denumit Duo-ul Dinamic. În multe cărți de specialitate este precizat faptul că MySQL este mult mai ușor de invățat și folosit decât multe din aplicațiile de gestiune a bazelor de date, ca exemplu comanda de ieșire fiind una simplă și evidentă: „exit” sau „quit”.

Pentru a administra bazele de date MySQL se poate folosi modul linie de comandă sau, prin descărcare de pe internet, o interfață grafică: MySQL Administrator și MySQL Query Browser. Un alt instrument de management al acestor baze de date este aplicația gratuită, scrisă în PHP, phpMyAdmin.

LAMP cuprinde și MySQL după cum se observă din Fig. 9 :

Fig. 9 – Structura LAMP

2.5.2 Structura și scopul bazei de date

In exemplul de față folosim serverul MySQL, pentru a crea o bază de date, ce va fi accesată de scripturile PHP, acestea vor realiza funcționalitatea site-ului.

Pentru a avea o cât mai bună separare a privilegiilor utilizatorilor vom folosi diferite tabele, dintr-o bază de date comună, care să includă informațiile necesare administrării accesului.

Legăturile între tabele vor fi făcute din scripturile PHP cu funcții de SELECT.

2.6 Securitate

2.6.1 SELinux

SELinux, sau denumit Security Enhanced Linux, reprezintă un mod de îmbunătățire a securității distro-urilor de operare bazate pe Linux, fiind implementat ca un modul de securitate (Linux Security Module). A fost creat de de Agentia Natională pentru Securitate – NSA). SELinux se bazează pe tehnica Mandatory Access Control (MAC), care permite implementarea unei mari varietăți de polițe de securitate. Pentru a putea folosi această tehnică, modulul SELinux adaugă o referință către kernel-ul [nucleul] Linux-ului, cu ajutorul căreia implementează MAC-ul.

Principiul pe care se bazează această tehnică este acela, de a refuza execuția aplicațiilor, ale căror permisiuni nu sunt explicit descrise, prin urmare nu se știe exact, care va fi efectul executării lor. Un alt avantaj al SELinux este acela că oferă posibilitatea de a seta anumite limite ale comportamentului unor aplicații, ce se încadrează în categoria celor potențial dăunătoare sistemului de Linux.

Astfel, respectivele aplicații nu pot ieși din acel model comportamental, rămânând blocate și probabil oprite.

2.6.2 IPtables

Iptables este folosit pentru mai multe servicii precum : translatare de adrese sursă sau destinație (SNAT / DNAT ), port forwading sau pur și simplu rejectare sau forwadare de pachete.

Toate pachetele inspectate de iptables trec printr-o secvență de tabele (cozi) pentru prelucrare. Fiecare dintre aceste cozi este dedicată unui anumit tip de activitate de pachete și este controlată de un lanț de filtrare asociat.

Iptables folosește implicit trei tabele :

1. FILTER ( tabel implicit) – este responsabil pentru filtrarea pachetelor

Forward : Filtrează pachete câtre servere protejate de firewall.

Input : Filtrează pachetele destinate firewall-ului.

Output : Filtrează pachetele expediate de firewall

2. NAT – este responsabil cu network address translation (translatarea adresei de rețea)

3. MANGLE – este responsabil pentru modificarea biților QOS din headerul TCP

Are 2 lanțuri built-in:

Pre-routing: face NAT atunci când adresa destinație a pachetului trebuie schimbată.

Post-routing: face NAT atunci când adresa sursă a pachetului trebuie schimbată.

Pentru fiecare regulă firewall, creată trebuie să fie specificată tabela și lanțul de care va aparține. La această regulă este o singură excepție: cele mai multe reguli sunt legate de filtrare, astfel iptables presupune că orice lanț definit fără o tabela asociată va face parte din tabela filter. Tabela filter este, prin urmare, implicită. Mai jos, figura 10 ne arată felul în care iptables manipulează pachetele:

Fig. 10 – Schema logica IPTABLES

Fiecare regulă firewall inspectează pachetele IP și apoi încearcă să le identifice, ca și ținte pentru o anumită operație.

Cele mai folosite ținte sunt:

ACCEPT – Iptables oprește procesarea ulterioară; Pachetul este trimis câtre aplicație sau sistemul de operare pentru prelucrare

DROP – Iptables oprește procesarea ulterioară; Pachetul este blocat

LOG – Informațiile sunt trimise la daemonul syslog pentru logare; Iptables continuă procesarea pachetului

REJECT – Funcționează DROP, dar va trimite un mesaj de eroare la gazda căreia a trimis pachetul cum că pachetul a fost blocat

DNAT – Rescrie adresa IP destinație a pachetului

SNAT – Rescrie adresa IP sursă a pachetului

MASQUERADE – Folosit pentru SNAT; În mod implicit adresa IP sursă este aceeași cu cea utilizată de interfața firewall-ului

2.6.3 Fail2ban

Fail2ban este un utilitar gratuit pentru Linux care scanează fișierele de loguri ale sistemului (de exemplu /var/log/messages) și creează reguli de firewall bazate pe directive stabilite de administratorul sistemului, în momentul în care găsește semne suspicioase, cum ar fi un anumit număr de încercări de logare cu parola greșită.

Fail2ban vine direct de la instalare cu filtre predefinite pentru serviciile populare, gen ssh, apache sau vsftpd.

Partea Practică

3.1 Configurarea Apache și PHP

După ce în pasul anterior am instalat pachetele necesare acum vom începe configurarea acestora. Serverul Apache nu are nevoie de foarte multe schimbări în configurație, funcționalitatea sa fiind disponibilă direct după instalare:

[root@FTP ~]# service httpd start

Starting httpd: [ OK ]

[root@FTP ~]#

Comanda de mai sus apelează scripturile de pornire a serviciului Apache. Putem verifica portul 80 pentru a vedea dacă server-ul a pornit :

[root@FTP ~]# lsof -i :80

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

httpd 2119 root 4u IPv6 13019 0t0 TCP *:http (LISTEN)

httpd 2121 apache 4u IPv6 13019 0t0 TCP *:http (LISTEN)

httpd 2122 apache 4u IPv6 13019 0t0 TCP *:http (LISTEN)

httpd 2123 apache 4u IPv6 13019 0t0 TCP *:http (LISTEN)

httpd 2124 apache 4u IPv6 13019 0t0 TCP *:http (LISTEN)

httpd 2125 apache 4u IPv6 13019 0t0 TCP *:http (LISTEN)

httpd 2126 apache 4u IPv6 13019 0t0 TCP *:http (LISTEN)

httpd 2127 apache 4u IPv6 13019 0t0 TCP *:http (LISTEN)

httpd 2128 apache 4u IPv6 13019 0t0 TCP *:http (LISTEN)

[root@FTP ~]#

[root@FTP ~]# ps -ef | grep httpd

root 2119 1 0 18:44 ? 00:00:00 /usr/sbin/httpd

apache 2121 2119 0 18:44 ? 00:00:00 /usr/sbin/httpd

apache 2122 2119 0 18:44 ? 00:00:00 /usr/sbin/httpd

apache 2123 2119 0 18:44 ? 00:00:00 /usr/sbin/httpd

apache 2124 2119 0 18:44 ? 00:00:00 /usr/sbin/httpd

apache 2125 2119 0 18:44 ? 00:00:00 /usr/sbin/httpd

apache 2126 2119 0 18:44 ? 00:00:00 /usr/sbin/httpd

apache 2127 2119 0 18:44 ? 00:00:00 /usr/sbin/httpd

apache 2128 2119 0 18:44 ? 00:00:00 /usr/sbin/httpd

root 2137 1633 0 18:47 pts/0 00:00:00 grep httpd

[root@FTP ~]#

Comanda ps arată procesele ce ruleaza pe serverul de linux în momentul în care este rulată. Așadar mai sus putem vedea ca procesul httpd care corespunde server-ului Apache a pornit.

Dacă acum accesăm http://IP_SERVER vom vedea pagina de întâmpinare standard a Apache (Fig. 11):

Fig. 11 – Pagina standard Apache

În momentul de față avem un server Apache funcțional cu un interpretor de sintaxă PHP.

Putem să verificam în mod exact ce versiune de PHP este inclusă cu serverul Apache creând un fișier numit phpinfo.php în radacina server-ului web care să conțină urmatoarea linie :

<?php phpinfo(); ?>

Odată ce accesăm fișierul creat prin intermediul unui browser putem vedea toate informațiile despre versiunea de PHP instalată (Fig. 12) :

Fig. 12 – phpinfo.php

După ce am stabilit ce versiune de PHP avem disponibilă, putem scrie codul sursă pentru managerul de fișiere.

În continuare voi prezenta o bucată de cod sursă care face legătura cu baza de date și un exemplu de cod sursă ce creează o interogare a bazei de date.

În scriptul PHP de mai jos definim variabilele care se vor folosi la conectarea cu serverul de MySQL, cât și funcțiile care fac conectarea respectivă:

[root@FTP system]# cat classes/config.class.php

Stabilim variabilele care conțin datele de conectare la serverul MySQL:

<?php

$dbHost = "localhost"; // serverul mysql local

$dbName = "login"; // numele bazei de date create

$dbUser = "root"; // utilizatorul cu care se face conectarea

$dbPass = "!@AAasr#25bs"; // parola bazei de date

Definim clasa Config care are rolul de a iniția legătura cu baza de date și de a returna configurația necesară stabilirii unei conexiuni.

class Config {

private static $dbLink;

public static function getDbLink() {

return Config::$dbLink;

}

Cu ajutorul datelor de acces definite initializăm funcția anterioară care realizează legarea la baza de date.

public static function initDbAccess($dbHost, $dbName , $dbUser, $dbPass) {

Config::$dbLink = mysql_connect($dbHost, $dbUser, $dbPass);

mysql_select_db($dbName, Config::$dbLink);

$errorNumber = mysql_errno(Config::$dbLink);

Veficăm daca s-a efectuat conexiunea în mod corect, iar dacă nu, returnăm un mesaj de eroare de la baza de date MySQL:

if(Config::$dbLink === false || $errorNumber != 0) {

Application::errorPage("MySQL Error $errorNumber", mysql_error(Config::$dbLink));

}

}

Inițializăm funcția care selectează baza de date de lucru și pregătește comunicarea aplicației cu tablele conținute în baza respectivă de date

public static function initApplication() {

$configArray = array();

$sql = "SELECT * FROM `website_config`";

$res = mysql_query($sql, Config::getDbLink());

while($data = mysql_fetch_assoc($res)) {

$key = $data['config_key'];

$configArray[$key] = $data['config_value'];

}

$ok = Application::initWithConfigArray($configArray);

}

}

Config::initDbAccess($dbHost, $dbName, $dbUser, $dbPass);

Config::initApplication();

?>

Scriptul PHP de mai jos este folosit pentru introducerea unui nou utilizator în baza de date. Începem prin salvarea variabilelor necesare in funcția globală implicită $_POST care are rolul de a ține temporar datele în memorie, iar după ce sunt introduse în baza de date ea se re-inițializează:

[root@FTP system]# cat actions/user.insert.php

<?php

if(isset($_POST['sent_data'])) {

Datele preluate din formularul web sunt corelate cu numele câmpurilor din tablea user_profile, care conține toate datele despre utilizatori, de exemplu câmpul user_username din formularul web trebuie să ajungă în câmpul cu același nume din tabela user_profile:

$user_role = $_POST['user_role'];

$user_username = $_POST['user_username'];

$user_password = $_POST['user_password'];

$user_email = $_POST['user_email'];

$user_form = $_POST['user_form'];

$user_firstname = $_POST['user_firstname'];

$user_lastname = $_POST['user_lastname'];

$user_company = $_POST['user_company'];

$user_status = $_POST['user_status'];

$user_send = (isset($_POST['user_send']) && $_POST['user_send'] == "true") ? "true" : "false";

$user_groups = (isset($_POST['user_groups']) && is_array($_POST['user_groups'])) ? $_POST['user_groups'] : array();

Folosim funcția md5 încorporată în PHP pentru a cripta parola utilizatorului și a trimite valoare deja criptată către baza de date.

$user_password_md5 = md5($user_password);

Funcția $sql va face o operațiune de inserare a valorilor capturate anterior în baza de date.

$sql = "INSERT `user_profile` ";

$sql .= "(`user_role`,`user_username`,`user_password`,`user_email`,`user_form`,`user_firstname`,`user_lastname`,`user_company`,`user_status`,`user_registered`) VALUES ";

$sql .= "('$user_role','$user_username','$user_password_md5','$user_email','$user_form','$user_firstname','$user_lastname','$user_company','$user_status',NOW())";

$result = mysql_query($sql, Config::getDbLink());

$user_id = mysql_insert_id();

foreach($user_groups as $group_id) {

$sql = "INSERT `relation_user2group` ";

$sql .= "(`user_id`,`group_id`) VALUES ";

$sql .= "('$user_id','$group_id')";

$result = mysql_query($sql, Config::getDbLink());

}

}

Utilities::redirect("admin.php?action=users.display");

?>

[root@FTP system]#

Scriptul PHP de mai jos este utilizat când dorim să ștergem un utilizator din baza de date:

[root@FTP system]# cat actions/user.delete.php

<?php

if(isset($_REQUEST['user_id'])) {

$user_id = $_REQUEST['user_id'];

$sql = "DELETE FROM `user_profile` WHERE `user_id` = '$user_id'";

$result = mysql_query($sql, Config::getDbLink());

$sql = "DELETE FROM `relation_user2group` WHERE `user_id` = '$user_id'";

$result = mysql_query($sql, Config::getDbLink());

}

Utilities::redirect("admin.php?action=users.display");

?>

[root@FTP system]#

3.2 Configurarea MySQL

Serverul de MySQL vine pregătit pentru a fi folosit direct după instalare. Primul lucru care trebuie făcut după ce pornim serviciul este să ne asiguram că schimbăm parola utilizatorului root pentru baza de date MySQL. Cum după instalare utilizatorul este creat fără parolă, acesta ar putea genera un mare risc de securitate.

Pentru o folosire ușoară a bazei de date MySQL vom instala phpmyadmin – o utilitară puternică de Management al bazei de date MySQL:

[root@FTP ~]# yum install phpmyadmin

Loaded plugins: fastestmirror, security

Setting up Install Process

Loading mirror speeds from cached hostfile

* base: mirrors.biztelecom.ro

* epel: mirrors.neterra.net

* extras: mirrors.biztelecom.ro

* updates: mirrors.biztelecom.ro

Resolving Dependencies

–> Running transaction check

–> Package phpMyAdmin.noarch 0:4.0.10.10-1.el6 will be installed

–> Processing Dependency: php-mcrypt >= 5.2.0 for package: phpMyAdmin-4.0.10.10-1.el6.noarch

–> Processing Dependency: php-tcpdf-dejavu-sans-fonts for package: phpMyAdmin-4.0.10.10-1.el6.noarch

–> Processing Dependency: php-tcpdf for package: phpMyAdmin-4.0.10.10-1.el6.noarch

–> Processing Dependency: php-php-gettext for package: phpMyAdmin-4.0.10.10-1.el6.noarch

–> Running transaction check

–> Package php-mcrypt.x86_64 0:5.3.3-3.el6 will be installed

–> Processing Dependency: libmcrypt.so.4()(64bit) for package: php-mcrypt-5.3.3-3.el6.x86_64

–> Package php-php-gettext.noarch 0:1.0.11-3.el6 will be installed

–> Package php-tcpdf.noarch 0:6.2.8-1.el6 will be installed

–> Package php-tcpdf-dejavu-sans-fonts.noarch 0:6.2.8-1.el6 will be installed

–> Running transaction check

–> Package libmcrypt.x86_64 0:2.5.8-9.el6 will be installed

–> Finished Dependency Resolution

Install 6 Package(s)

Total download size: 7.3 M

Installed size: 32 M

Is this ok [y/N]: y

Downloading Packages:

(1/6): libmcrypt-2.5.8-9.el6.x86_64.rpm | 96 kB 00:00

(2/6): php-mcrypt-5.3.3-3.el6.x86_64.rpm | 19 kB 00:00

(3/6): php-php-gettext-1.0.11-3.el6.noarch.rpm | 21 kB 00:00

(4/6): php-tcpdf-6.2.8-1.el6.noarch.rpm | 2.8 MB 00:01

(5/6): php-tcpdf-dejavu-sans-fonts-6.2.8-1.el6.noarch.rpm | 304 kB 00:00

(6/6): phpMyAdmin-4.0.10.10-1.el6.noarch.rpm | 4.1 MB 00:01

––––––––––––––––––––––––––––––––––––––-

Total 1.8 MB/s | 7.3 MB 00:04

warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY

Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

Importing GPG key 0x0608B895:

Userid : EPEL (6) <[anonimizat]>

Package: epel-release-6-8.noarch (@extras)

From : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

Is this ok [y/N]: y

Running rpm_check_debug

Running Transaction Test

Transaction Test Succeeded

Running Transaction

Installing : libmcrypt-2.5.8-9.el6.x86_64 1/6

Installing : php-mcrypt-5.3.3-3.el6.x86_64 2/6

Installing : php-tcpdf-6.2.8-1.el6.noarch 3/6

Installing : php-tcpdf-dejavu-sans-fonts-6.2.8-1.el6.noarch 4/6

Installing : php-php-gettext-1.0.11-3.el6.noarch 5/6

Installing : phpMyAdmin-4.0.10.10-1.el6.noarch 6/6

Verifying : phpMyAdmin-4.0.10.10-1.el6.noarch 1/6

Verifying : php-php-gettext-1.0.11-3.el6.noarch 2/6

Verifying : php-tcpdf-6.2.8-1.el6.noarch 3/6

Verifying : php-tcpdf-dejavu-sans-fonts-6.2.8-1.el6.noarch 4/6

Verifying : php-mcrypt-5.3.3-3.el6.x86_64 5/6

Verifying : libmcrypt-2.5.8-9.el6.x86_64 6/6

Installed:

phpMyAdmin.noarch 0:4.0.10.10-1.el6

Dependency Installed:

libmcrypt.x86_64 0:2.5.8-9.el6 php-mcrypt.x86_64 0:5.3.3-3.el6 php-php-gettext.noarch 0:1.0.11-3.el6 php-tcpdf.noarch 0:6.2.8-1.el6

php-tcpdf-dejavu-sans-fonts.noarch 0:6.2.8-1.el6

Complete!

După instalare trebuie editat fișierul /etc/httpd/conf.d/ phpMyAdmin.conf și adăugate adresele IP ale clienților ce au dreptul să se conecteze la interfața de phpMyAdmin și apoi restartat serviciul de apache.

Acum putem naviga pe http://IP/phpmyadmin și ne logăm cu utilizatorul și parola definită pentru serverul de MySQL (Fig. 13). Din interfața phpMyadmin avem control deplin asupra bazei de date, putem crea tabele, adăuga utilizatori sau drepturi pentru tabelele existente și optimiza funcționarea serverului de MySQL.

Fig. 13 – Pagina de logare phpMyAdmin

Pe prima pagină a phpMyAdmin avem informațiile generale despre serverul MySQL, iar în partea stângă avem bazele de date existente (Fig. 14):

Fig. 14 – Prima pagină phpMyAdmin

Pentru aplicația noastră de transferat fișiere vom avea nevoie de o bază de date cu 5 tabele, în care vor fi împărțite toate necesitățile. Vom denumi baza de date login, iar mai jos voi prezenta structura fiecărui tabel și codul SQL folosit pentru a fi creat.

3.2.1 Tabela user_profile

Tabela conține datele legate de utilizatorii care vor folosii aplicația cum ar fi numele de utilizator, parola criptată, adresa de e-mail, nume, prenume, data înregistrării etc (Fig.15).

Fig. 15 – Structura tabelei user_profile

Transformat în cod SQL sintaxa arată astfel:

CREATE TABLE IF NOT EXISTS `user_profile` (

`user_id` int(4) unsigned NOT NULL AUTO_INCREMENT,

`user_role` enum('user','admin') COLLATE latin1_german1_ci DEFAULT 'user',

`user_username` varchar(128) COLLATE latin1_german1_ci DEFAULT NULL,

`user_password` varchar(128) COLLATE latin1_german1_ci DEFAULT NULL,

`user_email` varchar(128) COLLATE latin1_german1_ci DEFAULT NULL,

`user_form` enum('mr','mrs') COLLATE latin1_german1_ci DEFAULT 'mr',

`user_firstname` varchar(128) COLLATE latin1_german1_ci NOT NULL DEFAULT '',

`user_lastname` varchar(128) COLLATE latin1_german1_ci NOT NULL DEFAULT '',

`user_company` varchar(128) COLLATE latin1_german1_ci DEFAULT NULL,

`user_registered` datetime DEFAULT '0000-00-00 00:00:00',

`user_status` enum('active','inactive') COLLATE latin1_german1_ci DEFAULT 'active',

PRIMARY KEY (`user_id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci AUTO_INCREMENT=4 ;

3.2.2 Tabela user_category

Aceasta este tabela care va reține tipurile de date și categoria din care fac parte. Scopul ei este, să ușureze managementul fișierelor și accesul utilizatorilor (Fig. 16).

Fig. 16 – Tabela user_category

Tabela a fost creată cu următoarea sintaxă SQL:

CREATE TABLE IF NOT EXISTS `user_category` (

`category_id` int(4) unsigned NOT NULL AUTO_INCREMENT,

`category_subof` int(4) unsigned DEFAULT '0',

`category_name` varchar(128) COLLATE latin1_german1_ci DEFAULT NULL,

PRIMARY KEY (`category_id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci AUTO_INCREMENT=2 ;

3.2.3 Tabela user_files

Conține informațiile despre fișierele salvate, cum ar fi numele fișierului, scurtă descriere, denumirea primită pe server, data când a fost adăugat și dimensiunea (Fig. 17).

Fig. 17 – Tabela user_files

Codul SQL folosit pentru a crea tabela:

CREATE TABLE IF NOT EXISTS `user_files` (

`file_id` int(4) unsigned NOT NULL AUTO_INCREMENT,

`file_name` varchar(128) COLLATE latin1_german1_ci DEFAULT NULL,

`file_desc` text COLLATE latin1_german1_ci,

`file_source` varchar(128) COLLATE latin1_german1_ci DEFAULT NULL,

`file_date` datetime DEFAULT NULL,

`file_size` int(32) unsigned NOT NULL DEFAULT '0',

PRIMARY KEY (`file_id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci AUTO_INCREMENT=7 ;

3.2.4 Tabela user_group

Tabela conține numele grupurilor și ajută la separarea privilegiilor utilizatorilor în funcție de grup (Fig. 18).

Fig. 18 – Tabela user_group

Codul SQL folosit pentru crearea tabelei:

CREATE TABLE IF NOT EXISTS `user_group` (

`group_id` int(4) unsigned NOT NULL AUTO_INCREMENT,

`group_name` varchar(128) COLLATE latin1_german1_ci DEFAULT NULL,

PRIMARY KEY (`group_id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci AUTO_INCREMENT=2 ;

3.2.5 Tabela website_config

Conține toate configurațiile aplicației php, care va comunica cu serverul de FTP când se întâmplă transferul de fișiere(Fig. 19).

Scopul acestei tablele este de a face aplicația cât mai portabilă, dacă o mutăm pe alt server să fie nevoie să edităm doar aceste detalii, pentru a o face funcțională în noul mediu.

Fig. 19 – Tabela website_config

Aici vor fi salvate date precum numele site-ului, calea pe disc unde se afla fișierele stocate, locul unde vor fi salvate fișierele ce trec prin server-ul FTP, cât și utilizatorul și parola server-ului de FTP (Fig. 20).

Fig. 20 – Configuratia website-ului

3.3 Configurarea vsFTPD pentru transferul de fișiere

Serverul vsFTPd este folosit în configurația noastră pentru a transfera fișierele pe server prin intermediul unei funcții PHP care îl semnalează când un utilizator cere încărcarea unui fișier.

Pentru a obține o minimă funcționalitate avem nevoie de un utilizator dedicat care să aibă acces doar în directorul unde fișierele vor fi stocate (/var/www/html/filemanager/data).

[root@FTP data]# grep ftpuser /etc/passwd

ftpuser:x:500:500:FTP User:/var/www/html/filemanager/data:/bin/bash

[root@FTP data]#

Fișierul de configurare al serviciului de ftp conține următoarele directive:

[root@FTP data]# grep -v '^$\|^\s*\#' /etc/vsftpd/vsftpd.conf

anonymous_enable=YES

local_enable=YES

write_enable=YES

local_umask=000

dirmessage_enable=YES

xferlog_enable=YES

connect_from_port_20=YES

xferlog_std_format=YES

listen=YES

pam_service_name=vsftpd

userlist_enable=YES

tcp_wrappers=YES

[root@FTP data]#

Putem porni serviciul de FTP și verifica dacă funcționează:

[root@FTP data]# /etc/init.d/vsftpd start

Starting vsftpd for vsftpd: [ OK ]

[root@FTP data]# ps -ef | grep vsftpd

root 2896 1 0 20:58 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

root 2899 1633 0 20:58 pts/0 00:00:00 grep vsftpd

[root@FTP data]# lsof -Pi :21

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

vsftpd 2896 root 3u IPv4 15940 0t0 TCP *:21 (LISTEN)

[root@FTP data]#

Serviciul de FTP este pregătit pentru a fi folosit.

3.4 Implementarea conceptelor de securitate

Fiecare din serviciile, ce ruleaza pe serverul de transfer fișiere, trebuie securizat și trebuie să ne asigurăm, că funcționează respectând niște norme minime de securitate. În acest capitol vom trece prin fiecare serviciu și vom arăta, cum se face securizarea cu fiecare din metodele descrise mai sus.

3.4.1 Securizarea Apache și PHP

Fail2ban:

[apache-tcpwrapper]

enabled = true

filter = apache-auth

action = hostsdeny

logpath = /var/log/httpd/*error_log

/home/www/myhomepage/error.log

maxretry = 6

[apache-modsecurity]

enabled = true

filter = apache-modsecurity

action = iptables-multiport[name=apache-modsecurity,port="80,443"]

logpath = /var/log/httpd/*error_log

/home/www/myhomepage/error.log

maxretry = 2

[apache-overflows]

enabled = true

filter = apache-overflows

action = iptables-multiport[name=apache-overflows,port="80,443"]

logpath = /var/log/httpd/*error_log

/home/www/myhomepage/error.log

maxretry = 2

[apache-nohome]

enabled = true

filter = apache-nohome

action = iptables-multiport[name=apache-nohome,port="80,443"]

logpath = /var/log/httpd/*error_log

/home/www/myhomepage/error.log

maxretry = 2

Aceste funcții activate ale programului fail2ban, vor căuta în log-urile serverului Apache comportamente suspecte, care ar putea să indice un atac, iar în cazul în care le detectează, vor restricționa accesul IP-ului respectiv la server-ul Web

Iptables

iptables -I INPUT -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT

iptables -I INPUT -p tcp –dport 443 -m state –state NEW,ESTABLISHED -j ACCEPT

Cu regulile de mai sus acceptăm traficul nou (NEW) și deja existent (ESTABLISHED) care are ca destinație port-urile 80 (http) și 443 (https)

iptables -I OUTPUT -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT

iptables -I OUTPUT -p tcp –sport 443 -m state –state ESTABLISHED -j ACCEPT

Cu regulile pe lanțul de OUTPUT permitem server-ului Apache să comunice cu clienții săi, care au deja o conexiune deschisă către el (ESTABLISHED). Aici nu avem nevoie de regulă pentru conexiunile noi, deoarece serverul Apache nu va contacta el un client niciodată, ci doar va răspunde la conexiunile ce vin din exterior.

Selinux

semanage fcontext -a httpd_sys_rw_content_t "/var/www/html/filemanager/(/.*)?"

Prin adăugarea contextului de securitate de mai sus, permitem server-ului Apache să scrie fără restricții în /var/www/html/filemanager și toate subdirectoarele acestuia.

3.4.2 Securizarea MySQL

Iptables

iptables -I INPUT -p tcp –dport 3306 -m state –state NEW,ESTABLISHED -j ACCEPT

iptables -I OUTPUT -p tcp –sport 3306 -m state –state ESTABLISHED -j ACCEPT

Acceptăm traficul (INPUT) ce are ca destinație port-ul 3306 pe care se face comunicarea cu server-ul MySQL și permitem traficului ce pleacă(OUTPUT) de pe port-ul 3306 să ajungă la client.

Selinux

semanage port -a -t mysqld_port_t -p tcp 3306

semanage fcontext -a -t mysqld_db_t "/var/www/html/filemanager(/.*)?"

restorecon –Rv /var/www/html/filemanager

Permitem comunicarea pe port-ul 3306 și definim /var/www/html/filemanager ca un director unde server-ul MySQL poate să adauge date.

3.4.3 Securizarea vsFTPd

Iptables

iptables -I INPUT -p tcp –dport 21 -m state –state NEW,ESTABLISHED -j ACCEPT

iptables -I INPUT -p tcp –dport 20 -m state –state NEW,ESTABLISHED -j ACCEPT

iptables -I OUTPUT -p tcp –sport 21 -m state –state ESTABLISHED -j ACCEPT

Selinux

setsebool -P ftp_home_dir=1

4. Prezentarea aplicației

Aplicația se bazează pe scripturi php, care interoghează baza de date creată anterior și comunică cu serverul de FTP pentru transferul efectiv de fișiere după cum se vede in schema bloc de la Fig 21.

Fig. 21 – Schema bloc Fileserver

După ce am făcut toate configurațiile și setările necesare putem să accesăm aplicația de transfer fișiere prin intermediul link-ului https://IP-server/filemanager (Fig. 22).

Fig. 22 – Pagina de logare în aplicație

Pe prima pagină ne întâmpină pagina de logare, unde avem utilizatorul inițial admin cu parola admin. Acest utilizator are drepturi de administrator și poate să adauge alți utilizatori în baza de date (Fig. 23).

Fig. 23 – Pagina de administrare

Pentru a demonstra funcționalitatea aplicației vom adăuga un utilizator, vom crea un grup și adăuga un fișier în grupul respectiv. Adițional vom lăsa un fișier în afara grupului adăugat, pentru a demonstra separarea de privilegii, un utilizator poate să vadă doar fișierele asignate grupului său (Fig. 24).

Fig. 24 – Formularul de adăugare utilizator

Odată adăugat, utilizatorul devine vizibil în categoria Utilizatori și se poate loga cu detaliile menționate mai sus (Fig. 25).

Fig. 25 – Fereastră Utilizatori

Acum vom adaugă un grup și vom atribui grupul respectiv pentru utilizatorul creat (Fig. 26). Acest lucru este necesar, deoarece utilizatorul poate accesa doar fișiere grupului său, iar celelalte fișiere nu vor fi vizibile pentru el.

Fig. 26 – Fereastra grupuri

Pentru testul de față adăugam 2 fișiere pe server-ul nostru și unul dintre ele îl asignăm grupului grup_test.(Fig. 27)

Fig. 27 – Formularul de încărcare fișiere

Fig. 28 – Fereastra Date

Putem vizualiza datele încărcate în fereastra Date după cum se vede in fig. 28. Creăm o categorie nouă numită documente, unde introducem fișierul excel încărcat pe server (Fig. 29):

Fig. 29 – Formularul de adăugare categorii

Ne asigurăm că fișierul test.xls se află în categoria documente, care este vizibilă pentru grupul grup_test (Fig. 30).

Fig. 30 – Categoria documente

Dacă efectuăm un login cu utilizatorul test_aplicatie vom vedea categoria documente disponibilă pentru el cu fișierul Excel vizibil (Fig. 31).

Fig. 31 – Conținutul categoriei Documente

Efectuând un click pe butonul Download vom putea descărca local fișierul de test și vedea conținutul acestuia (Fig. 32). Este de observat că nici un alt fișier, nu este vizibil pentru utilizator în momentul de față

Fig. 32 – Fereastra de salvare document

6. Concluzii

În lucrarea de față am abordat o temă de mare utilitate în zilele noastre: transferul de fișiere și importanța securității datelor, în societatea noastră unde calculatoarele și internetul au preluat puterea în orice mediu este important să înțelegem conceptul de securitate și intimitate pentru datele noastre.

Chiar dacă există o multitudine de servicii, care deja oferă servicii de transfer de date, uneori avem nevoie de siguranța, că noi suntem singurii care au acces la datele respective. Așadar cautăm soluții alternative. În cazul acesta, soluția a fost dată de libertatea care o oferă sistemul de operare Linux și simplitatea cu care putem face un server de transferat fișiere din orice calculator avem la dispoziție.

Instalarea și configurarea sistemului de operare este o sarcină, care cu puțin exercițiu poate fi făcută de oricine, iar cunoștințele lipsă pot fi foarte ușor completate cu o căutare pe Internet, care mustește cu ghiduri și exemple libere de accesat pentru toată lumea.

Pentru implementarea propriu-zisă am ales 3 dintr-e cele mai utilizate tehnologii in lumea Web în momentul de față: server-ul Web Apache, interpretorul de scripturi PHP si baza de date MySQL. Toate aceste utilitare sau servicii sunt disponibile în mod gratuit și întreținute de comunitatea programatorilor, în acest fel sunt tot timpul actualizate și îmbunătățite. De aici provine și securitatea extinsă oferită de Linux și programele care rulează pe Linux.

În ultimii ani s-a putut observa clar o răspândire a soft-ului „open-source” și a sistemelor de operare Linux (Red Hat, CentOS, Ubuntu), care devin tot mai accesibile publicului larg și dispare acea teamă de necunoscut care însoțește de obicei aceste sisteme de operare.

În concluzie, lucrarea de față a demonstrat creearea unui server de transferat fișiere compus din pagini web care servesc pe post de formulare și interfață cu utilizatorul, o bază de date care conține utilizatorii înregistrați și datele lor, cât și permisiunile care aceștia le au; o serie de scripturi PHP, care fac legătura între motorul Apache și baza de date MySQL, rulând interogări, introducând date sau relaționând tabele din interiorul bazei. Transferul efectiv de fișiere se face prin intermediul serviciului de FTP, în cazul nostru vsFTPd, care este apelat de scripturile PHP când este necesar un transfer de fișiere fie către server, fie către client.

7. Tabel de figuri

Fig. 1 – Configuratia VM Virtual Box 9

Fig. 2 – Inserare imagine ISO CentOS 6 11

Fig. 3 – Meniul de boot CentOS 11

Fig. 4 – Interfața de partiționare 12

Fig. 5 – Opțiunile Instalare CentOS 12

Fig. 6 – Progresul instalării CentOS 13

Fig. 7 – Logarea pe sistemul nou instalat 13

Fig. 8 – Librariile de pachete CentOS 13

Fig. 9 – Structura LAMP 29

Fig. 10 – Schema logica IPTABLES 31

Fig. 11 – Pagina standard Apache 34

Fig. 12 – phpinfo.php 35

Fig. 13 – Pagina de logare phpMyAdmin 39

Fig. 14 – Prima pagina phpMyAdmin 39

Fig. 15 – Structura tabelei user_profile 40

Fig. 16 – Tabela user_category 41

Fig. 17 – Tabela user_files 42

Fig. 18 – Tabela user_group 43

Fig. 19 – Tabela website_config 43

Fig. 20 – Configuratia website-ului 44

Fig. 21 – Pagina de logare în aplicatie 48

Fig. 22 – Pagina de administrare 49

Fig. 23 – Formularul de adaugare utilizator 50

Fig. 24 – Fereastra Utilizatori 51

Fig. 25 – Fereastra grupuri 51

Fig. 26 – Formularul de upload fișiere 52

Fig. 27 – Fereastra Date 52

Fig. 28 – Formularul de adaugare categorii 53

Fig. 29 – Categoria documente 53

Fig. 30 – Continutul categoriei Documente 54

Fig. 31 – Fereastra de salvare document 54

Bibliografie

Buraga S, Tănasă Ș., Tarhon-Onu V., Programare Web în Bash și Perl, 2002, Editura Polirom

Cabral, K. S., Murphy K., MySQL Administrator's Bible, 2009, Wiley

Holzner S., Inițiere în php 5, 2005, Editura Teora

http://ro.wikipedia.org/wiki/Apache_%28server%29

https://php.net/manual/ro/intro-whatis.php

http://ro.wikipedia.org/wiki/PHP

http://php.net/manual/ro/security.intro.php

http://ro.wikipedia.org/wiki/MySQL

https://rstforums.com/forum/82999-tutorial-securizare-kernel-sistem-linux-cu-selinux.rst

Tutorial IPTABLES firewall linux – comenzi de baza

http://www.fail2ban.org/wiki/index.php/Features

http://php.net/manual/en/function.phpinfo.php

http://www.phpmyadmin.net/home_page/docs.php

Nixon R., Learning Php, Mysql, Javascript, Css & Html5, 2014, O'Reilly Media

Oppel A., Modelarea datelor. Ghidul începătorului, 2011, Rosetti Internațional

Prescott P., SQL: Learn the Structured Query Language for the Most Popular Databases including Microsoft SQL Server, MySQL, MariaDB, PostgreSQL, and Oracle, 2015, Amazon Digital Services, Inc.

Rosebrock E., Filson E., Instalare, configurare și utilizare LAMP. Realizarea colaborării dintre Linux, Apache, My SQL și Php, 2007, Editura All

Welling L., Thompson L., PHP and MySQL Web Development (4th Edition), 2008, Addison-Wesley Professional

West W. A., Practical PHP and MySQL Website Databases: A Simplified Approach (Expert's Voice in Web Development), 2013, Apress

Waleed E., FTP Fundamentals, 2014, Hybird Webs

Similar Posts