vineri, 20 ianuarie 2012

phpMyAdmin printr-un tunel SSH ? Da, dar numai daca doriti securitate.

Imi place sa folosesc pentru administrarea bazelor de date phpMyAdmin. Si asta pentru ca o consider o scula foarte eficienta. Dar ca orice scula de administrare, utilizarea ei peste internet este periculoasa atunci cand cineva poate sa foloseasca un sniffer cu ajutorul caruia sa ne ghidoneze. Definitiv.
O solutie eleganta si sigura este accesarea phpMyAdmin printr-un tunel SSH. La prima vedere suna pompos. Dar este extrem de simplu.

Presupunem ca deja avem pe server instalat openssh-server iar pe client openssh-client.
Instalam pe server phpMyAdmin dupa care modificam /etc/phpmyadmin/apache.conf astel incat phpMyAdmin sa nu poata fi accesat decat local (pe 127.0.0.1). Pentru asta, dupa linia
<directory phpmyadmin="" share="" usr="">
adaugam urmatoarele :
Order deny,allow
Deny from all
Allow from 127.0.0.1
si apoi restartam apache.

Daca doriti sa nu mai faceti aceste modificari pe server manual puteti sa urcati scriptul de mai jos pe server, sa va conectati pe SSH si sa-l rulati. Va face el modificarile pentru voi (nu uitati ca trebuie sa il executati cu drepturi de root cu sudo).

#!/bin/bash

Red='\E[31m'
yellow='\E[33;47m'
green='\E[32;47m'
reset='\E[0m'

if [ $LOGNAME != "root" ] ; then
echo -e "${yellow}Trebuie sa fiti logat ca ${Red}root${yellow} sau sa folositi ${Red}[sudo]${yellow} pentru a executa acest script. Scriptul nu a fost executat...${reset}"
exit 1
fi

function inslin() {
# insereaza o linie noua continand stringul $2 dupa/inainte de linia care contine stringul $1 in fisierul $3
if [ -z $4 ]
then
# daca nu exista variabila $4 sau daca este egala cu ""
# insereaza o linie continand stringul $2 dupa linia care contine stringul $1 in fisierul $3
sed -i "/$1/ a\
$2" $3
else
# insereaza o linie continand stringul $2 inainte de linia care contine stringul $1 in fisierul $3
sed -i "/$1/ i\
$2" $3
fi
}

sudo apt-get update
sudo aptitude install phpmyadmin

# in /etc/phpmyadmin adaug urmatoarele:
#Order Allow,Deny Allow from 127.0.0.1
inslin "
<directory phpmyadmin="" share="" usr="">" "Allow from 127.0.0.1" /etc/phpmyadmin/apache.conf
inslin "
<directory phpmyadmin="" share="" usr="">" "Deny from all" /etc/phpmyadmin/apache.conf
inslin "
<directory phpmyadmin="" share="" usr="">" "Order deny,allow" /etc/phpmyadmin/apache.conf
/etc/init.d/apache2 restart

Puteti sa incercati sa deschideti browserul favorit si sa va convingeti (http://ip_server/phpmyadmin) ca nu puteti sa accesati phpMyAdmin aflat pe server.

Acum deschideti un terminal in care tastati:
ssh -L 40001:127.0.0.1:80 user@server
si dupa ce introduceti parola (in cazul in care nu folositi prechea de chei public/privat) lasati deschis terminalul apoi deschideti browserul si accesati
http://127.0.0.1:40001/phpmyadmin/
Minune ! Putem accesa phpMyAdmin. Si asta datorita tunelului pe care tocmai l-am deschis cu comanda:
ssh -L 40001:127.0.0.1:80 user@server
Bineinteles ca in loc de portul 40001 puteti folosi orice (sau aproape orice) port iar in loc de user/server folositi userul pe care il aveti pentru conectarea prin SSH si IP-ul serverului. Atunci cand inchideti terminalul ori inchideti conexiunea SSH tunelul este inchis si bineinteles accesarea phpMyAdmin nu mai este posibila. Dar puteti deschide un alt tunel atunci cand aveti nevoie ...

Spor la administrat baze de date ... securizat.