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

Вступление

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

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

[.note] #Note: При использовании программного обеспечения, такого как phpMyAdmin, существуют важные соображения безопасности, поскольку он работает на сервере базы данных, имеет дело с учетными данными базы данных и позволяет пользователю легко выполнять произвольные запросы SQL к вашей базе данных. Поскольку phpMyAdmin - это широко распространенное приложение PHP, оно часто становится целью атак. Мы рассмотрим некоторые меры безопасности, которые вы можете предпринять в этом руководстве, чтобы вы могли принимать обоснованные решения.
#

Предпосылки

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

  • Сервер Ubuntu 18.04, на котором запущен стек LEMP (Linux, Nginx, MySQL и PHP), защищенныйufw, как описано вinitial server setup guide for Ubuntu 18.04. Если вы еще не настроили сервер, следуйте инструкциям поinstalling a LEMP stack on Ubuntu 18.04.

  • Доступ к этому серверу как пользователь без полномочий root с привилегиямиsudo.

Поскольку phpMyAdmin обрабатывает аутентификацию с использованием учетных данных MySQL, настоятельно рекомендуется установить сертификат SSL / TLS, чтобы разрешить зашифрованный трафик между сервером и клиентом. Если у вас нет существующего домена, настроенного с действующим сертификатом, вы можете следовать этому руководству наsecuring Nginx with Let’s Encrypt on Ubuntu 18.04.

[.warning] #Warning: Если у вас не установлен сертификат SSL / TLS на сервере, но вы все равно хотите продолжить, рассмотрите возможность принудительного доступа через туннели SSH, как описано в шаге 5 этого руководства.
#

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

[[step-1 -—- install-phpmyadmin]] == Шаг 1. Установка phpMyAdmin

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

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

sudo apt update

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

sudo apt install phpmyadmin

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

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

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

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

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

https://server_domain_or_IP/phpmyadmin

phpMyAdmin login screen

Как упоминалось ранее, phpMyAdmin обрабатывает аутентификацию с использованием учетных данных MySQL, что означает, что вы должны использовать то же имя пользователя и пароль, которые вы обычно используете для подключения к базе данных через консоль или через API. Если вам нужна помощь в создании пользователей MySQL, посмотрите это руководство наHow To Manage an SQL Database.

Note: Вход в phpMyAdmin как пользователь MySQLroot не рекомендуется, поскольку это представляет значительную угрозу безопасности. Мы увидим, как отключитьroot login на следующем шаге этого руководства.

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

[[step-2 -—- change-phpmyadmin-39-s-default-location]] == Шаг 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 phpmyadmin -> /usr/share/phpmyadmin

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

Выберите имя, которое скрывает цель конечной точки. В этом руководстве мы назовем нашу конечную точку/nothingtosee, а выshould choose an alternate name. Для этого мы переименуем ссылку:

sudo mv phpmyadmin nothingtosee
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 nothingtosee -> /usr/share/phpmyadmin

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

https://server_domain_or_IP/phpmyadmin

phpMyAdmin 404 error

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

https://server_domain_or_IP/nothingtosee

phpMyAdmin login screen

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

[[step-3 -—- dishibited-root-login]] == Шаг 3 - Отключение входа в систему Root

В 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

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

access denied

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

[[step-4 -—- created-an-authentication-gateway]] == Шаг 4. Создание шлюза аутентификации

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

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

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

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

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

openssl passwd

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

OutputO5az.RSPzd.HE

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

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

sudo nano /etc/nginx/pma_pass

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

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

/etc/nginx/pma_pass

sammy:O5az.RSPzd.HE

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

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

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

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

/etc/nginx/sites-available/default

server {
    . . .

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

        location /nothingtosee {
                # Settings for phpMyAdmin will go here
        }

    . . .
}

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

/etc/nginx/sites-available/default

server {
    . . .

        location /nothingtosee {
                auth_basic "Admin Login";
                auth_basic_user_file /etc/nginx/pma_pass;
        }


    . . .
}

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

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://server_domain_or_IP/nothingtosee

Nginx authentication page

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

Note: Если обновление страницы не работает, возможно, вам придется очистить кеш или использовать другой сеанс браузера, если вы уже использовали phpMyAdmin.

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

[[step-5 -—- setting-up-access-via-encrypted-tunnels-optional]] == Шаг 5. Настройка доступа через зашифрованные туннели (необязательно)

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

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

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

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

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

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

allow hostname_or_IP;
deny all;

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

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

curl https://ipinfo.io/ip

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

Output203.0.113.111

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

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

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

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

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

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

server {
    . . .

    location /nothingtosee {
        satisfy all; #requires both conditions

        allow 203.0.113.111; #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;
    }

    . . .
}

Не забудьте заменитьnothingtosee фактическим путем, по которому можно найти 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://server_domain_or_IP/nothingtosee

403 error

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

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

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

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

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

From your local machine, запускайте эту команду всякий раз, когда вам нужен доступ к phpMyAdmin:

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

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

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

  • hostname_or_IP: SSH-хост, на котором запущен phpMyAdmin

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

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

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

[.note] #Note: Эта команда будет блокировать терминал до тех пор, пока не будет прерванаCTRL+C, и в этом случае она завершит соединение SSH и остановит перенаправление пакетов. Если вы предпочитаете запускать эту команду в фоновом режиме, вы можете использовать параметр SSH-f.
#

Теперь перейдите в свой браузер и заменитеserver_domain_or_IP наlocalhost:PORT, гдеPORT - это либо8000 для HTTP, либо8443 для HTTPS:

http://localhost:8000/nothingtosee
https://localhost:443/nothingtosee

phpMyAdmin login screen

[.note] #Note: Если вы получаете доступ к phpMyAdmin черезhttps, вы можете получить предупреждающее сообщение, в котором спрашивается о безопасности сертификата SSL. Это происходит потому, что используемое вами доменное имя (localhost) не совпадает с адресом, зарегистрированным в сертификате (домен, в котором фактически обслуживается 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 /nothingtosee {
        allow 127.0.0.1; #allow localhost only
        deny all; #deny all other sources
    }

    . . .
}

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

Заключение

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

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

Related