Защита на 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/:

Разрешаване на .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“:

Проверка, че наистина работи
Това е стъпката, която хората пропускат — правилото се пише и не се тества. Най-бързата проверка е от машина извън разрешения списък:
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 достъп, и нито един скенер не го вижда.