Как установить и защитить phpMyAdmin с помощью Nginx на сервере Debian 9

Вступление

В то время как многим пользователям необходимы функциональные возможности системы баз данных, такой как MySQL, взаимодействие с системой исключительно из клиента командной строки MySQL требует знакомства с языком SQL, поэтому для некоторых он может быть не предпочтительным интерфейсом.

phpMyAdmin был создан для того, чтобы пользователи могли взаимодействовать с MySQL через интуитивно понятный веб-интерфейс, работающий параллельно со средой разработки PHP. В этом руководстве мы обсудим, как установить phpMyAdmin поверх сервера Nginx и как настроить сервер для повышения безопасности.

Предпосылки

Прежде чем начать работу с этим руководством, вам потребуется следующее:

Поскольку phpMyAdmin обрабатывает аутентификацию с использованием учетных данных MySQL, настоятельно рекомендуется установить сертификат SSL / TLS, чтобы разрешить зашифрованный трафик между сервером и клиентом. Если у вас нет существующего домена, настроенного с действительным сертификатом, вы можете следовать руководству на https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt -on-debian-9 [Как защитить Nginx с помощью Let’s Encrypt на Debian 9].

После того, как вы выполнили эти предварительные условия, вы можете продолжить работу с остальной частью руководства.

Шаг 1 - Установка phpMyAdmin

Первое, что нам нужно сделать, это установить phpMyAdmin на сервер LEMP. Для достижения этой цели мы будем использовать стандартные репозитории Debian.

Начнем с обновления индекса пакета сервера:

sudo apt update

Теперь вы можете установить phpMyAdmin с:

sudo apt install phpmyadmin

В процессе установки вам будет предложено выбрать веб-сервер (Apache или Lighthttp) для настройки. Поскольку мы используем Nginx в качестве веб-сервера, мы не должны делать здесь выбор. Нажмите + tab, а затем` + OK`, чтобы перейти к следующему шагу.

Затем вам будет предложено использовать + dbconfig-common + для настройки базы данных приложения. Выберите + Да +. Это настроит внутреннюю базу данных и административного пользователя для phpMyAdmin. Вам будет предложено определить новый пароль для пользователя * phpmyadmin * MySQL. Вы также можете оставить это поле пустым и позволить phpMyAdmin случайным образом создать пароль.

Установка завершится. Чтобы веб-сервер Nginx правильно находил и обслуживал файлы phpMyAdmin, нам нужно создать символическую ссылку из установочных файлов на корневой каталог документов Nginx:

sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin

Ваша установка phpMyAdmin теперь работает. Чтобы получить доступ к интерфейсу, перейдите по имени домена или общедоступному IP-адресу вашего сервера, а затем в вашем браузере введите + / phpmyadmin +

https:///phpmyadmin

изображение: https: //assets.digitalocean.com/articles/phpmyadmin_lemp_1404/login.png [экран входа phpMyAdmin]

Как упоминалось ранее, phpMyAdmin обрабатывает аутентификацию с использованием учетных данных MySQL, что означает, что вы должны использовать то же имя пользователя и пароль, которые вы обычно используете для подключения к базе данных через консоль или через API. Если вам нужна помощь в создании пользователей MySQL, ознакомьтесь с этим руководством по адресу https://www.digitalocean.com/community/tutorials/how-to-manage-sql-database-cheat-sheet#creating-a-user[How To Manage an База данных SQL.

На этом этапе ваша установка phpMyAdmin должна быть полностью функциональной. Однако, установив веб-интерфейс, мы представили наш сервер баз данных MySQL внешнему миру. Из-за популярности phpMyAdmin и больших объемов данных, к которым он может предоставить доступ, установки, подобные этим, являются общими целями атак. В следующих разделах этого руководства мы увидим несколько разных способов сделать нашу установку phpMyAdmin более безопасной.

Шаг 2 - Изменение местоположения phpMyAdmin по умолчанию

Один из основных способов защитить вашу установку phpMyAdmin - усложнить ее поиск. Боты будут искать общие пути, такие как + / phpmyadmin,` + / pma`, + / admin,` + / mysql` и тому подобное. Изменение URL-адреса интерфейса с + / phpmyadmin + на что-то нестандартное усложнит автоматизированным сценариям поиск вашей установки phpMyAdmin и попытки атак методом перебора.

С нашей установкой phpMyAdmin мы создали символическую ссылку, указывающую на + / usr / share / phpmyadmin +, где находятся фактические файлы приложения. Чтобы изменить URL интерфейса phpMyAdmin, мы переименуем эту символическую ссылку.

Во-первых, давайте перейдем к корневому каталогу документов Nginx и перечислим содержащиеся в нем файлы, чтобы лучше понять изменения, которые мы сделаем:

cd /var/www/html/
ls -l

Вы получите следующий вывод:

Outputtotal 8
-rw-r--r-- 1 root root 612 Apr  8 13:30 index.nginx-debian.html
lrwxrwxrwx 1 root root  21 Apr  8 15:36  -> /usr/share/phpmyadmin

Вывод показывает, что у нас есть символическая ссылка + phpmyadmin + в этом каталоге. Мы можем изменить имя этой ссылки на любое другое. Это, в свою очередь, изменит URL доступа phpMyAdmin, что может помочь скрыть конечную точку от ботов, жестко заданных для поиска общих имен конечных точек.

Выберите имя, которое скрывает цель конечной точки. В этом руководстве мы назовем нашу конечную точку + / +, но вы * должны выбрать альтернативное имя *. Для этого мы переименуем ссылку:

sudo mv phpmyadmin
ls -l

После выполнения вышеуказанных команд вы получите следующий вывод:

Outputtotal 8
-rw-r--r-- 1 root root 612 Apr  8 13:30 index.nginx-debian.html
lrwxrwxrwx 1 root root  21 Apr  8 15:36  -> /usr/share/phpmyadmin

Теперь, если вы перейдете на старый URL, вы получите ошибку 404:

https:///phpmyadmin

изображение: https: //assets.digitalocean.com/articles/phpmyadmin_lemp_1604/nginx_notfound.png [ошибка phpMyAdmin 404]

Ваш интерфейс phpMyAdmin теперь будет доступен по новому URL-адресу, который мы только что настроили:

https:///

изображение: https: //assets.digitalocean.com/articles/phpmyadmin_lemp_1404/login.png [экран входа phpMyAdmin]

Запутывая реальное расположение phpMyAdmin на сервере, вы защищаете его интерфейс от автоматического сканирования и ручных попыток перебора.

Шаг 3 - Отключение Root Login

В MySQL, а также в обычных системах Linux учетная запись * root * является специальной учетной записью администратора с неограниченным доступом к системе. Помимо того, что это привилегированная учетная запись, это известное имя для входа, что делает ее очевидной целью для атак методом перебора. Чтобы минимизировать риски, мы настроим phpMyAdmin для запрета любых попыток входа в систему от пользователя * root *. Таким образом, даже если вы предоставите действительные учетные данные для пользователя * root *, вы все равно получите сообщение об ошибке «Отказано в доступе» и не сможете войти в систему.

Поскольку мы решили использовать + dbconfig-common + для настройки и сохранения настроек phpMyAdmin, конфигурация по умолчанию в настоящее время хранится в базе данных. Нам нужно создать новый файл + config.inc.php, чтобы определить ваши пользовательские настройки.

Хотя PHP-файлы для phpMyAdmin находятся внутри + / usr / share / phpmyadmin +, приложение использует файлы конфигурации, расположенные в + / etc / phpmyadmin +. Мы создадим новый файл пользовательских настроек внутри + / etc / phpmyadmin / conf.d + и назовем его + pma_secure.php +:

sudo nano /etc/phpmyadmin/conf.d/pma_secure.php

Следующий файл конфигурации содержит необходимые настройки для отключения входа без пароля (+ AllowNoPassword + установлен в + false +) и root-вход (+ AllowRoot + установлен в + false +):

/etc/phpmyadmin/conf.d/pma_secure.php

<?php

# PhpMyAdmin Settings
# This should be set to a random string of at least 32 chars
$cfg['blowfish_secret'] = '';

$i=0;
$i++;

$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
$cfg['Servers'][$i]['AllowRoot'] = false;

?>

Сохраните файл, когда вы закончите редактирование, нажав + CTRL ` + X`, затем ` y` для подтверждения изменений и` + ENTER`. Изменения вступят в силу автоматически. Если вы перезагрузите страницу входа сейчас и попытаетесь войти в систему как root, вы получите ошибку * Access Denied *:

изображение: https: //assets.digitalocean.com/articles/phpmyadmin_nginx_1804/pma_access_denied_root_error.png [доступ запрещен]

Вход в систему root теперь запрещен при установке phpMyAdmin. Эта мера безопасности блокирует попытки сценариев перебора попытаться угадать пароль базы данных root на вашем сервере. Более того, он обеспечит использование менее привилегированных учетных записей MySQL для доступа к веб-интерфейсу phpMyAdmin, что само по себе является важной практикой безопасности.

Шаг 4 - Создание шлюза аутентификации

Скрытие установки phpMyAdmin в необычном месте может обойти некоторых автоматических ботов, сканирующих сеть, но бесполезно против целевых атак. Чтобы лучше защитить веб-приложение с ограниченным доступом, обычно эффективнее остановить злоумышленников, прежде чем они смогут добраться до приложения. Таким образом, они не смогут использовать универсальные эксплойты и атаки методом "грубой силы", чтобы угадать учетные данные для доступа.

В конкретном случае phpMyAdmin еще более важно держать интерфейс входа заблокированным. Сохраняя его открытым для всего мира, вы предлагаете злоумышленникам платформу грубой силы, чтобы угадать ваши учетные данные базы данных.

Добавление дополнительного уровня аутентификации к вашей установке phpMyAdmin позволяет повысить безопасность. Пользователи должны будут пройти через запрос HTTP-аутентификации, прежде чем увидят экран входа в систему phpMyAdmin. Большинство веб-серверов, включая Nginx, предоставляют эту возможность изначально.

Чтобы настроить это, нам сначала нужно создать файл паролей для хранения учетных данных аутентификации. Nginx требует, чтобы пароли были зашифрованы с помощью функции + crypt () +. Пакет OpenSSL, который уже должен быть установлен на вашем сервере, включает эту функцию.

Чтобы создать зашифрованный пароль, введите:

openssl passwd

Вам будет предложено ввести и подтвердить пароль, который вы хотите использовать. Затем утилита отобразит зашифрованную версию пароля, которая будет выглядеть примерно так:

Output

Скопируйте это значение, так как вам нужно будет вставить его в файл аутентификации, который мы создадим.

Теперь создайте файл аутентификации. Мы назовем этот файл + pma_pass + и поместим его в каталог конфигурации Nginx:

sudo nano /etc/nginx/pma_pass

В этом файле вы указываете имя пользователя, которое хотите использовать, за которым следует двоеточие (+: +), за которым следует зашифрованная версия пароля, полученного из утилиты + openssl passwd +.

Мы собираемся назвать нашего пользователя + sammy +, но вы должны выбрать другое имя пользователя. Файл должен выглядеть так:

/ И т.д. / Nginx / pma_pass

:

Сохраните и закройте файл, когда вы закончите.

Теперь мы готовы изменить файл конфигурации Nginx. Для этого руководства мы будем использовать файл конфигурации, расположенный по адресу + / etc / nginx / sites-available / +. Вы должны использовать соответствующий файл конфигурации Nginx для веб-сайта, где в настоящее время находится phpMyAdmin. Откройте этот файл в вашем текстовом редакторе, чтобы начать:

sudo nano /etc/nginx/sites-available/

Найдите блок + server + и раздел + location / + внутри него. Нам нужно создать раздел * new * + location + в этом блоке, чтобы соответствовать текущему пути phpMyAdmin на сервере. В этом руководстве местоположение phpMyAdmin относительно корневого веб-каталога равно + / nothingtosee +:

/ И т.д. / Nginx / сайты-отсутствуют / по умолчанию

server {
   . . .

       location / {
               try_files $uri $uri/ =404;
       }

       location / {
               # Settings for phpMyAdmin will go here
       }

   . . .
}

В этом блоке нам нужно установить две разные директивы: + auth_basic +, которая определяет сообщение, которое будет отображаться в приглашении для аутентификации, и + auth_basic_user_file +, указывающий на файл, который мы только что создали. Вот как должен выглядеть ваш файл конфигурации, когда вы закончите:

/ И т.д. / Nginx / сайты-отсутствуют / по умолчанию

server {
   . . .

       location / {
               auth_basic "";
               auth_basic_user_file ;
       }


   . . .
}

Сохраните и закройте файл, когда вы закончите. Чтобы проверить, является ли файл конфигурации действительным, вы можете запустить:

sudo nginx -t

Ожидается следующий вывод:

Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Для активации нового шлюза аутентификации необходимо перезагрузить веб-сервер:

sudo systemctl reload nginx

Теперь, если вы посещаете URL-адрес phpMyAdmin в своем веб-браузере, вам будет предложено ввести имя пользователя и пароль, которые вы добавили в файл + pma_pass +:

https:///

изображение: https: //assets.digitalocean.com/articles/phpmyadmin_lemp_1404/auth_gate.png [страница аутентификации Nginx]

Как только вы введете свои учетные данные, вы попадете на стандартную страницу входа phpMyAdmin.

В дополнение к обеспечению дополнительного уровня безопасности, этот шлюз поможет сохранить ваши журналы MySQL чистыми от попыток аутентификации спама.

Шаг 5 - Настройка доступа через зашифрованные туннели (необязательно)

Для повышения безопасности можно заблокировать установку phpMyAdmin только для авторизованных хостов. Вы можете whitelist авторизованные хосты в вашем файле конфигурации Nginx, так что любой запрос, поступающий с IP-адреса, которого нет в списке, будет отклонен.

Хотя в некоторых случаях одной этой функции может быть достаточно, она не всегда является лучшим долгосрочным решением, главным образом из-за того, что большинство людей не имеют доступа к Интернету со статических IP-адресов. Как только вы получите новый IP-адрес от вашего интернет-провайдера, вы не сможете получить доступ к интерфейсу phpMyAdmin, пока не обновите файл конфигурации Nginx своим новым IP-адресом.

Для более надежного долгосрочного решения вы можете использовать управление доступом на основе IP, чтобы создать установку, в которой пользователи будут иметь доступ к вашему интерфейсу phpMyAdmin, только если они получают доступ с * авторизованного IP-адреса * или * localhost через SSH tunneling *. Мы увидим, как это настроить, в следующих разделах.

Сочетание управления доступом на основе IP с туннелированием SSH значительно повышает безопасность, поскольку полностью блокирует доступ, поступающий из общедоступного Интернета (за исключением авторизованных IP-адресов), в дополнение к обеспечению безопасного канала между пользователем и сервером посредством использования зашифрованных туннелей.

Настройка управления доступом на основе IP в Nginx

В Nginx управление доступом на основе IP может быть определено в соответствующем блоке + location + данного сайта с использованием директив + allow + и + deny +. Например, если мы хотим разрешить только запросы, поступающие с данного хоста, мы должны включить следующие две строки в этом порядке в соответствующий блок + location + для сайта, который мы хотим защитить:

allow ;
deny all;

Вы можете разрешить столько хостов, сколько захотите, вам нужно только включить одну строку + allow + для каждого авторизованного хоста / IP внутри соответствующего блока + location + для сайта, который вы защищаете. Директивы будут оцениваться в том же порядке, в котором они перечислены, до тех пор, пока не будет найдено совпадение или пока запрос не будет окончательно отклонен из-за директивы + deny all +.

Теперь мы настроим Nginx так, чтобы он разрешал только запросы, поступающие с локального хоста или с вашего текущего IP-адреса. Во-первых, вам нужно знать текущий общедоступный IP-адрес вашего локального компьютера, который используется для подключения к Интернету. Есть разные способы получить эту информацию; для простоты мы собираемся использовать сервис, предоставляемый https://ipinfo.io [ipinfo.io]. Вы можете открыть URL-адрес https://ipinfo.io/ip в своем браузере или выполнить следующую команду на своем * локальном компьютере *:

curl https://ipinfo.io/ip

Вы должны получить простой IP-адрес как вывод:

Output

Это ваш текущий public IP-адрес. Мы настроим блок местоположения phpMyAdmin, чтобы разрешать запросы, поступающие только с этого IP, в дополнение к localhost. Нам нужно еще раз отредактировать блок конфигурации для phpMyAdmin внутри + / etc / nginx / sites-available / +.

Откройте файл конфигурации Nginx, используя выбранный редактор командной строки:

sudo nano /etc/nginx/sites-available/

Поскольку у нас уже есть правило доступа в нашей текущей конфигурации, нам нужно объединить его с управлением доступом на основе IP с помощью директивы + удовлетворить все +. Таким образом, мы можем сохранить текущее приглашение HTTP-аутентификации для повышения безопасности.

Вот как должна выглядеть ваша конфигурация phpMyAdmin Nginx после того, как вы закончите редактирование:

/etc/nginx/sites-available/example.com

server {
   . . .

   location / {
       satisfy all; #requires both conditions

       allow ; #allow your IP
       allow 127.0.0.1; #allow localhost via SSH tunnels
       deny all; #deny all other sources

       auth_basic "Admin Login";
       auth_basic_user_file /etc/nginx/pma_pass;
   }

   . . .
}

Не забудьте заменить реальный путь, по которому можно найти phpMyAdmin, и выделенный IP-адрес с вашим текущим общедоступным IP-адресом.

Сохраните и закройте файл, когда вы закончите. Чтобы проверить, является ли файл конфигурации действительным, вы можете запустить:

sudo nginx -t

Ожидается следующий вывод:

Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Теперь перезагрузите веб-сервер, чтобы изменения вступили в силу:

sudo systemctl reload nginx

Поскольку ваш IP-адрес явно указан в качестве авторизованного хоста, ваш доступ не должен нарушаться. Любой, кто попытается получить доступ к вашей установке phpMyAdmin, теперь получит ошибку 403 (запрещено):

https:///

изображение: https: //assets.digitalocean.com/articles/phpmyadmin_nginx_1804/403_error.png [ошибка 403]

В следующем разделе мы увидим, как использовать SSH-туннелирование для доступа к веб-серверу через локальные запросы. Таким образом, вы все равно сможете получить доступ к интерфейсу phpMyAdmin, даже если ваш IP-адрес изменится.

Доступ к phpMyAdmin через зашифрованный туннель

Туннелирование SSH работает как способ перенаправления сетевого трафика через зашифрованные каналы. Запустив команду + ssh +, аналогичную той, которую вы использовали бы для входа на сервер, вы можете создать безопасный «туннель» между вашей локальной машиной и этим сервером. Весь трафик, поступающий на данный локальный порт, теперь может быть перенаправлен через зашифрованный туннель и использовать удаленный сервер в качестве прокси-сервера, прежде чем выйти в Интернет. Это похоже на то, что происходит, когда вы используете VPN (Virtual Private Network), однако SSH-туннелирование гораздо проще настроить.

Мы будем использовать SSH-туннелирование для передачи наших запросов на удаленный веб-сервер, на котором работает phpMyAdmin. Создав туннель между вашей локальной машиной и сервером, на котором установлен phpMyAdmin, вы можете перенаправить локальные запросы на удаленный веб-сервер, и, что более важно, трафик будет зашифрован, а запросы будут поступать в Nginx, как если бы они поступали от localhost. Таким образом, независимо от того, с какого IP-адреса вы подключаетесь, вы сможете безопасно получить доступ к интерфейсу phpMyAdmin.

Поскольку трафик между вашим локальным компьютером и удаленным веб-сервером будет зашифрован, это безопасная альтернатива для ситуаций, когда вы не можете установить сертификат SSL / TLS на веб-сервере, на котором работает phpMyAdmin.

  • С вашего локального компьютера *, запускайте эту команду всякий раз, когда вам нужен доступ к phpMyAdmin:

ssh user@ -L 8000:localhost:80 -L 8443:localhost:443 -N

Давайте рассмотрим каждую часть команды:

  • * пользователь *: пользователь SSH для подключения к серверу, на котором работает phpMyAdmin

  • * hostname_or_IP *: SSH-хост, на котором работает phpMyAdmin

  • * -L 8000: localhost: 80 * перенаправляет HTTP-трафик на порт 8000

  • * -L 8443: localhost: 443 * перенаправляет трафик HTTPS на порт 8443

  • * -N *: не выполнять удаленные команды

Теперь перейдите в ваш браузер и замените на + localhost: PORT, когда` + PORT` равен либо + 8000 + для HTTP или `+ 8443 + для HTTPS:

http://localhost:/
http://localhost:/

изображение: https: //assets.digitalocean.com/articles/phpmyadmin_lemp_1404/login.png [экран входа phpMyAdmin]

Все запросы к + localhost: 8000 + (HTTP) и + localhost: 8443 + (HTTPS) теперь перенаправляются через безопасный туннель в ваше удаленное приложение phpMyAdmin. Вы не только повысили уровень безопасности, отключив публичный доступ к phpMyAdmin, но и защитили весь трафик между локальным компьютером и удаленным сервером, используя зашифрованный туннель для отправки и получения данных.

Если вы хотите принудительно использовать SSH-туннелирование для всех, кто хочет получить доступ к вашему интерфейсу phpMyAdmin (включая вас), вы можете сделать это, удалив любые другие авторизованные IP-адреса из файла конфигурации Nginx, оставив + 127.0.0.1 + как единственный разрешенный хост для доступа к этому местоположению. Учитывая, что никто не сможет делать прямые запросы к phpMyAdmin, безопасно удалить HTTP-аутентификацию, чтобы упростить настройку. Вот как будет выглядеть ваш файл конфигурации в таком сценарии:

/etc/nginx/sites-available/example.com

server {
   . . .

   location / {
       allow 127.0.0.1; #allow localhost only
       deny all; #deny all other sources
   }

   . . .
}

После перезагрузки конфигурации Nginx с помощью + sudo systemctl reload nginx + ваша установка phpMyAdmin будет заблокирована, и пользователям будет * необходимо * использовать SSH-туннели для доступа к интерфейсу phpMyAdmin через перенаправленные запросы.

Заключение

В этом руководстве мы увидели, как установить phpMyAdmin в Ubuntu 18.04 с запущенным Nginx в качестве веб-сервера. Мы также рассмотрели расширенные методы защиты установки phpMyAdmin в Ubuntu, такие как отключение учетной записи root, создание дополнительного уровня аутентификации и использование SSH-туннелирования для доступа к установке phpMyAdmin только через локальные запросы.

После завершения этого урока вы сможете управлять базами данных MySQL из достаточно безопасного веб-интерфейса. Этот пользовательский интерфейс предоставляет большую часть функциональности, доступной через командную строку MySQL. Вы можете просматривать базы данных и схемы, выполнять запросы и создавать новые наборы данных и структуры.

Related