Feb 09 2006

Apache Security

Premize

Acest tutorial are ca unic scop prezentarea pas cu pas a implementarii celei mai simple modalitati de securitate la accesarea unei pagini/director de pe un site. Aplicarea metodelor descrise mai jos, de fapt functionarea lor presupune mici modificari in configuratiile demonilor de Apache si MySQL. De fapt se mai face si o baza de date … dar toate la timpul lor.
Doua dintre metodele cele mai utilizate vor fi prezentate in continuare.

1. Securitate cu .htpasswd

Aceasta se bazeaza pe utilizarea unui fisier (care contine combinatia user/parola criptata) pentru accesul la o pagina/director de pe site. Se editeaza in httpd.conf urmatoarele linii :

Alias /cont/ "/var/www/dir-problema/"
<Directory "/var/www/dir-problema" >
AllowOverride None
AuthType Basic
AuthName login
AuthUserFile /var/www/pass/webpass
require user luser1 luser2
order allow,deny
allow from 192.168.1.0/24
</Directory >

Ce este mai sus s-ar traduce cam asa: se permite accesul in directorul /var/www/dir-problema care se vede de pe internet ca fiind
http://site.blah.com/cont/
doar a utilizatorilor luser1 si luser2. Pentru diversitate am adaugat si restrictia de acces de pe IP 192.168.1.0/24. Utilizatorii luser1 si luser2 vor fi verificati dupa datele din fisierul /var/www/pass/webpass (care poate fi oriunde pe server, dar preferabil nu in structura de fisiere accesibile de pe internet).
Fisierul de parole se creeaza cu urmatoarele comenzi :

htpasswd -nb luser1 parola1 >> /var/www/pass/webpass
htpasswd -nb luser2 parola2 >> /var/www/pass/webpass

Eu personal prefer si o editare ulterioara a fisierului cu parole pentru a vedea daca nu cumva mai trebuie sa mai tai cuiva de pe acolo accesul :) . Comenzile anterioare creaza linii de genul
luser1:DcIx1quqZOaiA
care creeaza combinatia user:parola-criptata_cu_DES. Modalitatea de criptare este relativ bleaga, ia cam 20 min la decriptare, dar nefiind publica cred ca tine destul de bine :)
In principiu, dupa ce fac toate astea si nu mi s-au incurcat degetele in taste sa bat ceva cuvant cheie gresit, dau un
killall -HUP httpd
sau daca vreau sa scriu ceva mai mult dau
service httpd restart
asta ca sa folosesc si eu ce au muncit baietii de la RH (10x guys), ma uit bine sa vad daca sigur a pornit daemonul de web, si apoi ma duc sa ma culc ceva mai linistit … nu-mi vor accesa pagina decat cei doi L mentionati mai sus :)

2. Securitate cu MySQL

Sincer sa fiu aceasta este metoda mea preferata, este mai simpatica ca implementare, dar in principiu face acelasi lucru ca prima metoda, limiteaza accesul. Deosebirea esentiala este ca se pot face grupuri de acces la un anumit director, structurari pe utilizatori si nivele de acces, deci este o idee mai versatila.

In primul rand se scrie in httpd.conf

LoadModule mysql_auth_module  modules/mod_auth_mysql.so
AddModule mod_auth_mysql.c

Alias /cont/ "/var/www/dir-problema/"
<Directory "/var/www/dir-problema" >
        Options Indexes FollowSymLinks MultiViews
        AuthName " *** LogWatcher Only *** "
        AuthType Basic
        AuthGroupFile /dev/null
        AuthMySQLHost localhost
        AuthMySQLDB auth
        AuthMySQLUserTable admins
        AuthMySQLNameField usern
        AuthMySQLPasswordField passwd
        AuthMySQLCryptedPasswords On
        AuthMySQLAuthoritative On
        AuthMySQLGroupTable admins
        AuthMySQLGroupField grup
        require group admin
        require valid-user
</Directory >

Primele doua linii sunt necesare doar daca nu exista in script sau sunt comentate, caz in care ar fi mai simplu sa fie decomentate :) ). In traducere libera, /cont/ de pe web, care este alias catre /var/www/dir-problema/ este accesibil doar pentru utilizatorii din tabela admins din baza de date auth@localhost al caror nume este in coloana usern si au parola criptata DES in coloana passwd si sunt membri ai grupului admin. Daca vreau sa permit accesul oricarui user din tabela admin indiferent de grup este suficient sa elimin linia
require group admin
iar daca doresc sa mai permit accesul unui grup adaug la aceasta linie grupul in cauza.
Nu am de gand sa intru in detaliile MySQL (nu vad de ce as face asta), structura tabelei admins este urmatoarea :

mysql> desc admins;
| Field  | Type     | Null | Key | Default | Extra |
| usern  | char(15) | YES  |     | NULL    |       |
| passwd | char(15) | YES  |     | NULL    |       |
| uname  | char(30) | YES  |     | NULL    |       |
| parola | char(15) | YES  |     | NULL    |       |
| grup   | char(25) | YES  |     | NULL    |       |

5 rows in set (0.00 sec)

iar un exemplu de din tabela arata cam asa :

mysql> select * from admins;
| usern    | passwd        | uname         | parola   | grup     |
| luser1   | J6jSBKIUTSYtI | User1         | parola1  | admin    |

Am prostul obicei sa tin in tabela si parola necriptata a utilizatorilor, pentru ca nu am memorie elefantina, si apoi un user este si va ramane un user … si uita … mai ales parolele. Ar mai trebui sa spun si linia de mysql care baga in tabela chestia de mai sus …

insert into auth.admins values('luser1,
encrypt('parola1'),'User1','parola1','admin');

si cu asta gata cu mysql.

Apoi urmeaza distractia cu killall -HUP httpd sau service … , fiecare cum prefera si gata cu securitatea pe pagina.

Nu am intrat in amanunte pentru ca nu mi s-a parut momentul sa fac studiu de caz, dar aceasta modalitate de protectie are multiple facilitati prin faptul ca se pot creea grupuri de acces pe pagini. Dar asta este pentru distractia voastra :)

Daca aveti nevoie neaparat sa comentati … sau cine stie, poate chiar niste sugestii, aici puteti sa ma contactati …

Comentarii