0887 371 498 support@itservice-bg.net
21.12.2016 · Самуил Арсов · Debian, Hosting, Linux commands, Ubuntu

Защита на phpMyAdmin по IP адрес с .htaccess

phpMyAdmin е уеб базиран инструмент за администрация на MySQL и MariaDB, написан на PHP. През него се създават и трият бази, правят се и се променят таблици, редактират се полета, изпълнява се SQL код и се управляват ключове. Точно затова е и една от най-атакуваните точки на всеки сървър — адресът /phpmyadmin/ се пробва от скенери в рамките на часове след като машината се появи в мрежата.

Инсталация

sudo apt-get install phpmyadmin php-mbstring php-gettext

По време на инсталацията ще бъдем запитани за паролата на root на базата, за да може phpMyAdmin да я управлява. След това се активират модулите:

sudo phpenmod mcrypt
sudo phpenmod mbstring

Достъпът е на http://адреса-на-сървъра/phpmyadmin/:

phpMyAdmin — екран за влизане

Разрешаване на .htaccess

phpMyAdmin си има собствен конфигурационен файл за Apache, който на практика е препратка:

sudo ls -lah /etc/apache2/conf-available/phpmyadmin.conf
lrwxrwxrwx 1 root root 28 сеп 12 00:21 /etc/apache2/conf-available/phpmyadmin.conf -> ../../phpmyadmin/apache.conf

Затова се редактира този файл:

sudo nano /etc/phpmyadmin/apache.conf

Като се добави третата директива AllowOverride All:

<Directory /usr/share/phpmyadmin>
    Options FollowSymLinks
    DirectoryIndex index.php
    AllowOverride All

Ограничаване по IP адрес

sudo nano /usr/share/phpmyadmin/.htaccess

⚠️ Синтаксисът зависи от версията на Apache. Старият, от времето на Apache 2.2:

deny from all
allow from 192.168.0.0/16
allow from 172.16.64.2
allow from 10.10.10.3

На Apache 2.4 (тоест всичко от Ubuntu 14.04 нататък) той работи само докато е зареден модулът mod_access_compat. Изключи ли се той — а това се случва при обновяване — правилата тихо престават да важат и директорията остава отворена, без нищо да се счупи видимо. Затова правилният запис днес е:

Require all denied
Require ip 192.168.0.0/16
Require ip 172.16.64.2
Require ip 10.10.10.3

След което Apache се рестартира:

sudo systemctl restart apache2.service

Адрес, който не е в списъка, вижда „Forbidden“:

phpMyAdmin — Forbidden за адрес извън разрешения списък

Проверка, че наистина работи

Това е стъпката, която хората пропускат — правилото се пише и не се тества. Най-бързата проверка е от машина извън разрешения списък:

curl -sI https://адрес-на-сървъра/phpmyadmin/ | head -1

Трябва да върне 403 Forbidden. Ако върне 200, правилата не се четат — обикновено защото AllowOverride е останало None.

Още два слоя, ако услугата е публична

Смяна на адреса. Скенерите пробват /phpmyadmin/, не измислен път. В /etc/phpmyadmin/apache.conf:

Alias /db-panel-7731 /usr/share/phpmyadmin

Парола пред паролата. HTTP Basic authentication означава, че скенерът никога не стига до самия phpMyAdmin:

sudo htpasswd -c /etc/phpmyadmin/.htpasswd admin
AuthType Basic
AuthName "Restricted"
AuthUserFile /etc/phpmyadmin/.htpasswd
Require valid-user

Най-добрият вариант остава друг

Ограничаването по IP върши работа, когато има постоянни адреси. Ако няма, по-чистото решение е phpMyAdmin изобщо да не слуша навън, а да се стига през SSH тунел:

ssh -L 8080:127.0.0.1:80 потребител@сървър

После в браузъра — http://127.0.0.1:8080/phpmyadmin/. Така панелът е достъпен само за някой, който вече има SSH достъп, и нито един скенер не го вижда.