Для корректной работы многих веб-проектов нужна система управления базами данных (СУБД), например, MySQL. Однако взаимодействовать с системой исключительно с помощью командной строки MySQL не всегда удобно.
Благодаря phpMyAdmin пользователи могут управлять MySQL через веб-интерфейс. Данный мануал содержит пошаговые инструкции по установке и защите веб-интерфейса phpMyAdmin в системе Ubuntu 20.04.
Требования
- Сервер Ubuntu 20.04, настроенный по этому мануалу (с пользователем sudo и настроенным ufw).
- Стек LAMP (его можно установить с помощью этого мануала).
При использовании программ вроде phpMyAdmin следует учитывать, что она:
- Взаимодействует с MySQL напрямую;
- Проходит аутентификацию при помощи учётных данных MySQL;
- Обрабатывает и возвращает результаты для произвольных запросов SQL.
По этим причинам (а также из-за своей популярности и распространённости) это приложение PHP часто подвергается атакам злоумышленников. Потому ни при каких обстоятельствах его нельзя запускать в удалённой системе по HTTP-соединению. Без SSL/TLS-сертификата для веб-сервера Apache использовать phpMyAdmin очень опасно.
Читайте также:
- Создание сертификата Let’s Encrypt для Apache в Ubuntu 20.04
- Установка веб-сервера Apache в Ubuntu 20.04
1: Установка phpMyAdmin
Пакеты phpMyAdmin доступны в стандартном репозитории Ubuntu.
Войдите в систему как пользователь sudo и обновите индекс пакетов
sudo apt update
Теперь можно начинать установку phpmyadmin. Также официальная документация рекомендует установить пару расширений PHP, чтобы получить доступ к дополнительным функциям и улучшить производительность.
Если вы установили стек LAMP по этому руководству, ряд необходимых модулей уже есть у вас на сервере (их мы устанавливали вместе с php). Сейчас рекомендуется установить эти пакеты:
- php-mbstring: модуль для обработки строк, которые не поддерживают ASCII, и преобразования их в другие кодировки
- php-zip: включает загрузку.zip файлов в phpMyAdmin
- php-gd: обеспечивает поддержку библиотеки GD Graphics
- php-json: обеспечивает поддержку сериализации JSON для PHP
- php-curl: обеспечивает взаимодействие PHP с разными типами серверов по разным протоколам.
Чтобы установить эти пакеты, введите следующую команду. Чтобы настроить экземпляр phpMyAdmin, во время установки нужно ответить на ряд вопросов.
- Выберите apache2 как веб-сервер (обратите внимание: в первом окне ответ apache2 выделен, но по факту не выбран. Если вы не нажмёте пробел, инсталлятор не сможет переместить нужные файлы во время установки. Чтобы выбрать Apache, нажмите пробел, Tab и Enter).
- Ответьте yes на вопрос, нужно ли использовать dbconfig-common для настройки БД.
- После чего программа предложит выбрать и подтвердить пароль phpMyAdmin.
Примечание: Если при установке MySQL вы включили плагин Validate Password, это может вызвать ошибку при попытке установить пароль для пользователя phpmyadmin:
mysql said: ERROR 1819 (HY000) at line 1: your password does not satisfy the current policy requirements. Your options are: […]
Чтобы устранить ошибку, выберите в списке предложенных ответов опцию abort, чобы остановить установку. Затем откройте консоль MySQL:
sudo mysql
Если у вас включена парольная аутентификация для пользователя root MySQL, запустите эту команду и затем введите пароль:
mysql -u root -p
В командной строке MySQL запустите следующую команду, чтобы отключить плагин Validate Password. Обратите внимание: эта команда не удалит этот компонент, а просто остановит его загрузку на сервер MySQL:
UNINSTALL COMPONENT "file://component_validate_password";
Теперь можно закрыть клиент MySQL:
exit
Снова попробуйте установить phpmyadmin. На этот раз ошибки быть не должно:
sudo apt install phpmyadmin
Когда установка phpMyAdmin будет завершена, снова откройте командную строку MySQL (с помощью команды sudo mysql or mysql -u root –p) и включите плагин Validate Password.
INSTALL COMPONENT "file://component_validate_password";
Во время установки в каталог /etc/apache2/conf-enabled/ добавляется конфигурационный файл phpMyAdmin. В этом каталоге файл читается автоматически. Чтобы завершить настройку Apache и PHP для поддержки phpMyAdmin, нужно только явно включить PHP-расширение mbstring.
sudo phpenmod mbstring
Перезапустите Apache, чтобы обновить настройки:
sudo systemctl restart apache2
Теперь phpMyAdmin установлен и может взаимодействовать с Apache. Но прежде чем вы сможете начать работу с MySQL при помощи phpMyAdmin, вам нужно настроить привилегии пользователей MySQL.
2: Настройка аутентификации и привилегий
После установки phpMyAdmin автоматически генерирует пользователя базы данных phpmyadmin, который выполняет базовые процессы программы. Однако для входа в phpMyAdmin рекомендуется использовать другую учетную запись, не phpmyadmin. Вместо него вы можете использовать либо root-аккаунт MySQL, либо специальный аккаунт для phpMyAdmin.
Настройка парольного доступа для root-пользователя MySQL
В установках Ubuntu, которые используют MySQL 5.7+, root-пользователь по умолчанию поддерживает аутентификацию с помощью плагина auth_socket, а не с помощью пароля. Это позволяет во многих случаях обеспечить большую безопасность и удобство, но это также может усложнить работу, например, когда вам необходимо с помощью этого пользователя дать внешней программе (как phpMyAdmin) права администратора.
Чтобы подключаться к phpMyAdmin как root-пользователь MySQL, измените метод аутентификации. Вместо auth_socket настройте парольную аутентификацию. Для начала откройте командную строку MySQL:
sudo mysql
Затем проверьте, какой метод аутентификации использует ваш пользователь MySQL:
SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | | auth_socket | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost |
| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost |
| debian-sys-maint | *8486437DE5F65ADC4A4B001CA591363B64746D4C | caching_sha2_password | localhost |
| phpmyadmin | *5FD2B7524254B7F81B32873B1EA6D681503A5CA9 | caching_sha2_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
5 rows in set (0.00 sec)
Как видите, пользователь root использует плагин auth_socket. Чтобы настроить его для поддержки парольной аутентификации, запустите команду ALTER USER (вместо password укажите надежный пароль):
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';
Примечание: Эта команда ALTER USER настроит пользователя root MySQL для аутентификации с помощью плагина caching_sha2_password. Этот плагин рекомендуется использовать в официальной документации MySQL, поскольку он обеспечивает более надежное шифрование, чем старый, но широко используемый mysql_native_password. Однако некоторые версии PHP плохо поддерживают caching_sha2_password. Эта проблема была устранена в PHP 7.4, но если вы все же получите ошибку при попытке войти в phpMyAdmin, вы можете настроить для root аутентификацию с помощью плагина mysql_native_password:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Проверьте, какой метод аутентификации поддерживают ваши пользователи и убедитесь, что root больше не поддерживает auth_socket:
SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 | caching_sha2_password | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost |
| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost |
| debian-sys-maint | *8486437DE5F65ADC4A4B001CA591363B64746D4C | caching_sha2_password | localhost |
| phpmyadmin | *5FD2B7524254B7F81B32873B1EA6D681503A5CA9 | caching_sha2_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
5 rows in set (0.00 sec)
Теперь вы знаете, что root пользователь поддерживает парольную аутентификацию, и можете войти в phpMyAdmin как этот пользователь.
Настройка парольной аутентификации для выделенного пользователя MySQL
В некоторых случаях для подключения к phpMyAdmin лучше использовать специально выделенного пользователя. Чтобы настроить такой доступ, откройте командную строку MySQL:
sudo mysql
Если вы включили парольную аутентификацию для пользователя root, вам нужно будет запустить следующую команду и ввести пароль:
mysql -u root -p
Создайте нового пользователя:
CREATE USER '8host'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';
Примечание: Опять же, в зависимости от установленной версии PHP вам может потребоваться настроить аутентификацию по плагину mysql_native_password вместо caching_sha2_password:
ALTER USER '8host'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Затем предоставьте новому пользователю соответствующие права. Например, вы можете предоставить ему права на все таблицы в БД, а также возможность добавлять, изменять и удалять пользовательские привилегии с помощью этой команды:
GRANT ALL PRIVILEGES ON *.* TO '8host'@'localhost' WITH GRANT OPTION;
Закройте оболочку MySQL:
exit
Чтобы открыть интерфейс, посетите в браузере следующую ссылку:
https://your_domain_or_IP/phpmyadmin
Чтобы получить доступ к интерфейсу, используйте имя и пароль вашего нового пользователя.
3: Защита phpMyAdmin
Из-за своей распространённости PhpMyAdmin часто подвергается атакам злоумышленников. Теперь нам необходимо обеспечить интерфейсу достаточный уровень защиты для предотвращения неавторизованного доступа.
Один из самых простых способ защиты phpMyAdmin – размещение шлюза безопасности. Это делается при помощи специальных файлов Apache под названием .htaccess.
Сначала нужно включить поддержку файлов .htaccess, отредактировав конфигурационный файл phpmyadmin.conf.
sudo nano /etc/apache2/conf-available/phpmyadmin.conf
В раздел <Directory /usr/share/phpmyadmin> нужно добавить параметр AllowOverride All:
<Directory /usr/share/phpmyadmin>
Options FollowSymLinks
DirectoryIndex index.php
AllowOverride All
. . .
Сохраните и закройте файл.
Перезапустите Apache, чтобы обновить настройки:
sudo systemctl restart apache2
Теперь приложение поддерживает файлы .htaccess; осталось создать такой файл.
Для корректной работы необходимо создать этот файл в каталоге приложения. Для этого введите:
sudo nano /usr/share/phpmyadmin/.htaccess
Вставьте в файл такие строки:
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/phpmyadmin/.htpasswd
Require valid-user
Рассмотрим эти строки подробнее:
- AuthType Basic задает тип авторизации; в данном случае используется аутентификация по паролю с помощью файла паролей .htpasswd.
- AuthName содержит текст сообщения диалогового окна аутентификации. Чтобы неавторизованные пользователи не могли получить дополнительной информации о закрытом приложении, это сообщение не должно содержать подробностей, а только общие данные.
- AuthUserFile задает расположение файла паролей htpasswd, который будет использоваться для авторизации. Он должен находиться вне обслуживаемых каталогов. Такой файл будет создан позже.
- Require valid-user указывает, что доступ к этому ресурсу могут получить только авторизованные пользователи. Именно этот параметр защищает ресурс от неавторизованных пользователей.
Сохраните и закройте файл.
Файл с паролями нужно создать в каталоге, заданном в директиве AuthUserFile, в данном случае это /etc/phpmyadmin/.htpasswd.
sudo htpasswd -c /etc/phpmyadmin/.htpasswd username
Будет предложено выбрать и подтвердить пароль нового пользователя. После этого файл .htpasswd будет создан, а только что введённый пароль будет помещен в него в хэшированном виде.
Чтобы добавить в файл еще одного пользователя, используйте вышеприведенную команду без флага –с:
sudo htpasswd /etc/phpmyadmin/.htpasswd additionaluser
Теперь при входе в подкаталог phpMyAdmin будут запрашиваться учетные данные пользователя:
https://domain_name_or_IP/phpmyadmin
The server http://111.111.11.111:22 requires a username and password. The server says: Restricted Files.
User Name:
Password:
Только после аутентификации пользователь сможет получить доступ к странице авторизации phpMyAdmin. Это установит дополнительный уровень безопасности, который защитит веб-интерфейс phpMyAdmin от атак методом подбора паролей.
Заключение
Теперь phpMyAdmin установлен, запущен и надежно защищен от злоумышленников. При помощи этого интерфейса можно быстро и легко создавать базы данных, пользователей, таблицы и т.п., а также выполнять такие рутинные задачи как удаление и редактирование структур и данных.