Для корректной работы многих проектов нужны системы управления базами данных (СУБД), например, MariaDB. Однако взаимодействовать с этой системой исключительно с помощью командной строки не всегда удобно.
Благодаря phpMyAdmin пользователи могут управлять системой MariaDB через веб-интерфейс. Данный мануал содержит пошаговые инструкции по установке и защите интерфейса phpMyAdmin в Debian 10.
Требования
- Сервер Debian 10, предварительно настроенный по этому мануалу (с пользователем sudo и настроенным ufw).
- Стек LAMP (его поможет установить этот мануал).
- Сертификат Let’s Encrypt для Apache 10. Его можно бесплатно получить с помощью мануала Создание сертификата Let’s Encrypt для Apache в Debian 10. Если у вас нет домена, вы можете создать самоподписанный сертификат, он тоже подойдет для шифрования данных.
Примечание: MariaDB – это разработанный сообществом форк MySQL. Хотя эти два программы очень похожи, они не вполне взаимозаменяемы. Интерфейс phpMyAdmin разработан специально для управления базами MySQL и во многих диалоговых окнах ссылается именно на MySQL. Однако MariaDB тоже будет работать с phpMyAdmin.
При использовании программ вроде phpMyAdmin всегда следует учитывать, что она:
- Взаимодействует с MariaDB напрямую;
- Выполняет аутентификацию при помощи учётных данных MariaDB;
- Обрабатывает и возвращает результаты для произвольных запросов SQL.
По этим причинам (а еще из-за своей распространённости) данное PHP-приложение часто подвергается атакам. Потому ни при каких обстоятельствах его нельзя запускать в удалённой системе по HTTP-соединению. Без SSL/TLS-сертификата для веб-сервера Apache использовать phpMyAdmin очень опасно.
1: Установка phpMyAdmin и дополнительных пакетов
Прежде чем устанавливать phpMyAdmin, официальная документация рекомендует установить несколько вспомогательных PHP-расширений, которые позволяют активировать дополнительные функции и улучшить производительность.
Если вы выполнили мануал по установке стека LAMP, некоторые из этих модулей уже есть на вашем сервере – они были установлены вместе с пакетом php. Но мы рекомендуем также установить пакеты:
- php-mbstring: PHP-расширение для обработки не-ASCII строк и преобразования строк в другое кодирование.
- php-zip: модуль PHP для поддержки загрузки .zip файлов в phpMyAdmin.
- php-gd: модуль PHP для поддержки библиотеки GD Graphics.
Обновите индекс пакетов и установите необходимые компоненты:
sudo apt update
sudo apt install php-mbstring php-zip php-gd
Теперь можно приступать к установке phpMyAdmin. На момент написания статьи phpMyAdmin не доступен в репозитории Debian по умолчанию, потому мы установим этот пакет с официального сайта проекта.
Перейдите на страницу загрузки. Найдите ссылку на последний стабильный релиз phpMyAdmin, скопируйте и загрузите ссылку, которая оканчивается на tar.gz. Эта ссылка ведет к архиву (тарболу), после распаковки которого в системе создается ряд файлов. На данный момент последним стабильным релизом является 4.9.0.1.
Примечание: На этой странице загрузки вы также увидите ссылки с метками all-languages и english. Ссылки all-languages загружают версию phpMyAdmin, в которой вы можете выбрать один из 72 языков, а english, соответственно, предоставляет вам английскую версию интерфейса.
В мануале мы используем версию all-languages для демонстрации настройки, но если вы собираетесь использовать английскую версию, просто установите пакет с меткой english.
Замените ссылку в следующей команде скопированной только что ссылкой, а затем нажмите ENTER.
wget https://files.phpmyadmin.net/phpMyAdmin/4.9.0.1/phpMyAdmin-4.9.0.1-all-languages.tar.gz
Распакуйте загруженный архив:
tar xvf phpMyAdmin-4.9.0.1-all-languages.tar.gz
Вы получите ряд новых файлов и каталогов, они будут в родительском каталоге phpMyAdmin-4.9.0.1-all-languages.
Запустите следующую команду. Она переместит каталог phpMyAdmin-4.9.0.1-all-languages и все его подкаталоги в /usr/share/. В этом расположении phpMyAdmin по умолчанию надеется найти свои конфигурационные файлы. Также команда переименует каталог в phpmyadmin.
sudo mv phpMyAdmin-4.9.0.1-all-languages/ /usr/share/phpmyadmin
Итак, phpMyAdmin установлен. Но прежде чем войти и начать работу с базами данных, вам нужно выполнить базовую настройку интерфейса.
2: Ручная настройка phpMyAdmin
При установке phpMyAdmin через пакетный менеджер, как это чаще всего делается в среде Ubuntu, вы получаете программу в режиме «Zero Configuration». Это позволяет автоматически настроить интерфейс в несколько шагов. Поскольку мы установили phpMyAdmin из исходного кода, нам нужно выполнить все эти шаги вручную.
Для начала создайте новый каталог, в котором phpMyAdmin будет хранить свои временные файлы.
sudo mkdir -p /var/lib/phpmyadmin/tmp
Передайте права на каталог пользователю www-data (это пользователь Linux, который используется веб-серверами типа Apache для работы в среде Ubuntu и Debian).
sudo chown -R www-data:www-data /var/lib/phpmyadmin
Извлеченные ранее файлы включают образец конфигурации, который можно использовать в качестве основы. Скопируйте этот файл в тот же каталог /usr/share/phpmyadmin, но переименуйте в config.inc.php:
sudo cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php
Откройте файл в текстовом редакторе:
sudo nano /usr/share/phpmyadmin/config.inc.php
По умолчанию phpMyAdmin использует метод аутентификации cookie, что позволяет вам входить в phpMyAdmin как любой валидный пользователь MariaDB с помощью куки. По этому методу пароль пользователя MariaDB хранится и шифруется по алгоритму Advanced Encryption Standard (AES) во временных куки.
Традиционно phpMyAdmin использовал вместо этого алгоритма шифр Blowfish, и это по-прежнему отражено в конфигурации. Прокрутите файл до строки , которая начинается с $cfg[‘blowfish_secret’]:
. . .
$cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
. . .
В единичных кавычках введите строку из 32 случайных символов. Это не пароль, ее не нужно запоминать, эта строка будет использоваться алгоритмом AES только внутренне.
. . .
$cfg['blowfish_secret'] = 'STRINGOFTHIRTYTWORANDOMCHARACTERS'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
. . .
Примечание: Если эта строка окажется короче 32 символов, ваши зашифрованные куки будут менее надежны. Если же строка будет длиннее, ничего не изменится.
Вы можете сгенерировать случайную строку с помощью инструмента pwgen. Чтобы установить его, введите:
sudo apt install pwgen
По умолчанию pwgen создает легко запоминающиеся, но не очень надежные пароли. Но с помощью флага –s мы можем создать совершенно случайную последовательность, которую сложно запомнить. Обратите внимание на два последних аргумента: 32 задает длину случайной строки, а 1 – количество случайных строк, которое нужно сгенерировать.
pwgen -s 32 1
Затем найдите комментарий /* User used to manipulate with storage */. В этом разделе содержатся некоторые директивы, которые определяют пользователя базы данных MariaDB по имени pma, который выполняет определенные административные задачи в phpMyAdmin. Согласно официальной документации, эта специальная учетная запись не нужна в тех случаях, когда доступ к phpMyAdmin имеет только один пользователь, но ее рекомендуется настроить в многопользовательских сценариях.
Раскомментируйте директивы controluser и controlpass, удалив косую черту в начале строки. Затем обновите директиву controlpass, указав в ней надежный пароль. Если вы этого не сделаете, программа будет использовать пароль по умолчанию, и неизвестные пользователи смогут легко получить доступ к вашей базе данных через интерфейс phpMyAdmin.
После внесения этих изменений этот раздел файла будет выглядеть следующим образом:
. . .
/* User used to manipulate with storage */
// $cfg['Servers'][$i]['controlhost'] = '';
// $cfg['Servers'][$i]['controlport'] = '';
$cfg['Servers'][$i]['controluser'] = 'pma';
$cfg['Servers'][$i]['controlpass'] = 'password';
. . .
Ниже вы найдете еще один раздел, с комментарием /* Storage database and tables */. Этот раздел содержит ряд директив, определяющих хранилище конфигурации phpMyAdmin, базу данных и несколько таблиц, используемых pma. Эти таблицы включают в phpMyAdmin ряд функций, в том числе вкладки, комментарии, генерацию PDF и многое другое.
Раскомментируйте каждую строку в этом разделе, удалив косую черту в начале, чтобы раздел выглядел следующим образом:
. . .
/* Storage database and tables */
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
$cfg['Servers'][$i]['relation'] = 'pma__relation';
$cfg['Servers'][$i]['table_info'] = 'pma__table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma__column_info';
$cfg['Servers'][$i]['history'] = 'pma__history';
$cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
$cfg['Servers'][$i]['tracking'] = 'pma__tracking';
$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
$cfg['Servers'][$i]['recent'] = 'pma__recent';
$cfg['Servers'][$i]['favorite'] = 'pma__favorite';
$cfg['Servers'][$i]['users'] = 'pma__users';
$cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
$cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
$cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
$cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
$cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
$cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';
. . .
Эти таблицы еще не существуют, но скоро мы их создадим.
Перейдите в конец файла и добавьте следующую строку. Это настроит phpMyAdmin на использование каталога /var/lib/phpmyadmin/tmp, который вы создали ранее, в качестве своего временного каталога. phpMyAdmin будет использовать этот временный каталог для кэша шаблонов, который позволяет быстрее загружать страницы:
. . .
$cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';
Сохраните и закройте файл (CTRL + X, Y, затем ENTER).
Затем вам нужно создать базу данных и таблицы конфигурации phpMyAdmin. Когда вы установили phpMyAdmin, вместе с тем вы установили файл create_tables.sql. Этот файл SQL содержит все команды, необходимые для создания базы данных хранилища конфигурации и таблиц, которые нужны phpMyAdmin для того чтобы правильно функционировать.
Выполните следующую команду, чтобы использовать файл create_tables.sql для создания базы данных и таблиц конфигурации:
sudo mariadb < /usr/share/phpmyadmin/sql/create_tables.sql
После этого вам нужно создать администратора pma. Откройте командную строку MariaDB:
sudo mariadb
В командной строке выполните следующую команду, чтобы создать пользователя pma и предоставить ему соответствующие права. Обязательно измените пароль – он должен соответствовать паролю, который вы определили в файле config.inc.php:
GRANT SELECT, INSERT, UPDATE, DELETE ON phpmyadmin.* TO 'pma'@'localhost' IDENTIFIED BY 'password';
Если вы еще не сделали этого, вам также следует создать обычного пользователя MariaDB для управления базами данных через phpMyAdmin: входить в систему рекомендуется через другую учетную запись, не через пользователя pma. С помощью этой команды вы можете создать пользователя, который имеет доступ ко всем таблицам в базе данных, а также права добавлять, изменять и удалять привилегии пользователей. Какие бы привилегии вы ни делегировали этому пользователю, обязательно выберите для него надежный пароль:
GRANT ALL PRIVILEGES ON *.* TO '8host'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
После этого выйдите из оболочки MariaDB:
exit
3: Настройка Apache для обслуживания phpMyAdmin
При установке phpMyAdmin из репозитория по умолчанию процесс установки автоматически создает файл конфигурации для Apache и помещает его в каталог /etc/apache2/conf-enabled/. Поскольку мы установили phpMyAdmin из исходного кода, нам нужно создать и включить этот файл вручную.
Создайте файл phpmyadmin.conf в каталоге /etc/apache2/conf-available/:
sudo nano /etc/apache2/conf-available/phpmyadmin.conf
Добавьте в него такое содержимое:
# phpMyAdmin default Apache configuration
Alias /phpmyadmin /usr/share/phpmyadmin
<Directory /usr/share/phpmyadmin>
Options SymLinksIfOwnerMatch
DirectoryIndex index.php
<IfModule mod_php5.c>
<IfModule mod_mime.c>
AddType application/x-httpd-php .php
</IfModule>
<FilesMatch ".+\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
php_value include_path .
php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
php_admin_value mbstring.func_overload 0
</IfModule>
<IfModule mod_php.c>
<IfModule mod_mime.c>
AddType application/x-httpd-php .php
</IfModule>
<FilesMatch ".+\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
php_value include_path .
php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
php_admin_value mbstring.func_overload 0
</IfModule>
</Directory>
# Authorize for setup
<Directory /usr/share/phpmyadmin/setup>
<IfModule mod_authz_core.c>
<IfModule mod_authn_file.c>
AuthType Basic
AuthName "phpMyAdmin Setup"
AuthUserFile /etc/phpmyadmin/htpasswd.setup
</IfModule>
Require valid-user
</IfModule>
</Directory>
# Disallow web access to directories that don't need it
<Directory /usr/share/phpmyadmin/templates>
Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/libraries>
Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/setup/lib>
Require all denied
</Directory>
Это стандартный файл конфигурации phpMyAdmin для Apache, который можно найти в установках Ubuntu – но он хорошо подходит и для Debian.
Сохраните и закройте файл, а затем включите его:
sudo a2enconf phpmyadmin.conf
Затем перезагрузите сервис apache2, чтобы изменения вступили в силу:
sudo systemctl reload apache2
После этого можно получить доступ к странице входа в phpMyAdmin, для этого откройте следующий URL-адрес в веб-браузере:
https://your_domain/phpmyadmin
Чтобы получить доступ к интерфейсу, используйте имя и пароль вашего пользователя MariaDB.
Теперь, когда вы настроили установку phpMyAdmin и можете работать с ней в браузере, пора защитить phpMyAdmin.
4: Защита phpMyAdmin
Из-за своей распространённости PhpMyAdmin часто подвергается атакам хакеров. На данном этапе необходимо обеспечить интерфейсу достаточный уровень защиты для предотвращения вредоносного использования.
Один из самых простых способ защиты phpMyAdmin – размещение шлюза безопасности. Это делается при помощи специальных файлов Apache под названием .htaccess.
Сначала нужно включить поддержку файлов .htaccess, для этого отредактируйте конфигурационный файл Apache.
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
<IfModule mod_php5.c>
. . .
Сохраните и закройте файл.
Перезапустите 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 /usr/share/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 установлен, запущен и надежно защищен от злоумышленников. При помощи этого интерфейса можно быстро и легко создавать базы данных, пользователей, таблицы и т.п., а также выполнять такие рутинные задачи как удаление и редактирование структур и данных.