News:

Одно из неприятных свойств нашего времени состоит в том, что те, кто испытывает уверенность, глупы, а те, кто обладает хоть каким-то воображением и пониманием, исполнены сомнений и нерешительности. Бертран Рассел

Main Menu

Защита доступа к phpMyAdmin средствами Nginx

Started by STALKER_SLX, 16 January 2018, 23:28

Previous topic - Next topic

0 Members and 4 Guests are viewing this topic.

STALKER_SLX

Доброго времени суток, уважаемые форумчане!

Установил и настроил веб-сервер Nginx и phpMyAdmin в Ubuntu 16.04, согласно статьи Настраиваем веб-сервер на базе Nginx + PHP-FPM в Debian / Ubuntu Server с внесением корректив для PHP7.0.
Всё отлично заработало!

Но возник вопрос, как же защитить доступ к «phpMyAdmin» средствами самого Nginx, по аналогии с тем как это было при использовании веб-сервера Apache.

Немного погулив, решил внести такую секцию в файл виртуального хоста  моего тестового сайта – http://drupal-site.loc:

location /phpmyadmin/ {
    auth_basic "Restricted zone";
    auth_basic_user_file /home/tester/.htpasswd;
  }


Создал файл с паролями по указанному пути – «/home/tester/.htpasswd».

После этого выполнил:
service nginx reload

и nginx –t

Ошибок не обнаружено.

В результате при переходе по ссылке: http://drupal-site.loc/phpmyadmin/ - открывается окно с запросом логина и пароля доступа и после выполнения успешной авторизации выдает ошибку «404 Not Found» (?!).

Хотя до внесения вышеупомянутой конструкции по защите доступа – все было ОК.

Подскажите, пожалуйста, что я делаю не так?!


2. При обслуживании нескольких сайтов на одном сервере, дабы не плодить лишние конструкции в каждом конфиге виртуального хоста, какие изменения нужно внести в созданный раннее шаблон (согласно указанной выше статье) конфига «phpMyAdmin» для Nginx?!

Уваров А.С.

location /phpmyadmin/ {
    auth_basic "Restricted zone";
    auth_basic_user_file /home/tester/.htpasswd;
  }

А дальше? Nginx получил запрос, нашел location, аутентифицировал клиента и... Дальше то что?

Стандартная настройка Phpmyadmin для Nginx выглядит так:

location /phpmyadmin {
        root /usr/share/;
            index index.php index.html index.htm;

            location ~ ^/phpmyadmin/(.+\.php)$ {
                    try_files $uri =404;
                        root /usr/share/;
                        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
               }

               location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
                       root /usr/share/;
access_log    off;
    log_not_found    off;
    expires 1M;
               }
        }

Возьмите его на основу, в начало добавьте аутентификацию и проверьте как работает.

STALKER_SLX

Спасибо большое Вам, Андрей, за хорошую подсказку!

1. После внесения этих двух строк:
auth_basic "Restricted zone";
auth_basic_user_file /home/tester/.htpasswd;


в самое начало шаблона «phpmyadmin» (содержимое которого приведено Вами выше, а также в Вашей статье) сразу после строки
location /phpmyadmin {

но перед root /usr/share/; - все заработало как нужно!!!


2. Кроме того, хочу внести некоторую ясность. Всю настройку Nginx выполнял строго следуя методологии Вашей статье, используя шаблоны для phpmyadmin и php-fpm, поскольку Ваш материал отлично структурирован (логично-модульно), легче в понимании и усвоении для новичка, а такая схема гибче для дальнейшего применения.
За что Вам отдельная БЛАГОДАРНОСТЬ!

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

STALKER_SLX

Вместе с этим хотел узнать Ваше мнение/позицию по поводу изменения URL для доступа к phpmyadmin, как это изложено в статьях:

http://devanswers.co/installing-phpmyadmin-nginx-ubuntu-16-04-17-04/

http://www.imdxf.com/2017/08/01/342.html

Иными словами, заменить дефолтный URL – http://drupal-site.loc/phpmyadmin/  на другой, к примеру – http://drupal-site.loc/pma_secure/


Если описанный в статьях способ добавляет дополнительную безопасность для phpmyadmin, то прошу Вас подсказать: как это можно реализовать при текущей нашей схеме настройки Nginx (описанный в Ваших замечательных статьях), возможно через шаблоны.

Уваров А.С.

Добавляет ли он безопасности? Вопрос неоднозначный. В принципе актуальный и работающий по защищенному протоколу phpmyadmin достаточно безопасен. Тем более, если ограничить доступ к нему через аутентификацию.

Способ позволяет довольно эффективно скрыть присутствие сервиса на хосте, но если в качестве нового имени использовать что-либо действительно нестандартное, скажем y9u2bkq6. Если переименовать в pma или что-то подобное, то толку не будет, все это широко известно и будет перебираться в первую очередь.

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

STALKER_SLX

Подсмотрел рекомендации по поводу изменения URL для доступа к phpmyadmin в соседней теме: https://interface31.ru/forum/index.php?topic=181.0

И решил попробовать применить к своей конфигурации, описанной тут выше.

Для этого выполнил следующие шаги.

1. Создал новую папку:
sudo mkdir -p /usr/share/some_dir

2. Потом создал в этой папке символическую ссылку на каталог, в котором находится сам «phpmyadmin»:
sudo ln -s /usr/share/phpmyadmin/ /usr/share/some_dir

3. После переименовал ссылку «phpmyadmin» на «zone_z»:
sudo mv phpmyadmin zone_z

4. В каталоге сервера «Nginx» создал новый шаблон «additionals.conf»:
sudo touch /etc/nginx/templates/additionals.conf

И добавил в него следующие строки (по аналогии с шаблоном «phpmyadmin»):

location /zone_z {
   auth_basic "Restricted zone";
   auth_basic_user_file /home/tester/.htpasswd;
   root /usr/share/some_dir/;
   index index.php;

   location ~ ^/zone_z/(.+\.php)$ {
     try_files $uri =404;
     root /usr/share/some_dir/;
     fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
     fastcgi_index index.php;
     include fastcgi_params;
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   }
  
   location ~* ^/zone_z/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
     root /usr/share/some_dir/;
     expires 1M;
   }
}

# Перенаправляет на правильный URL – «zone_z», если было введено «Zone_z»
# (с изменённым регистром символов)

location /Zone_z {
   rewrite ^/* /zone_z last;
 }


5. В файле виртуального хоста сайта «drupal-site.loc» заменил строку, которая подключала старый шаблон «phpmyadmin.conf» на только что созданный:
include /etc/nginx/templates/additionals.conf;

6. После этого выполнил:
nginx –t
и service nginx reload

Ошибок не обнаружено.

7. Теперь при переходе по ссылке:
http://drupal-site.loc/zone_z/

открывается окно с запросом авторизации и после прохождения успешной аутентификации – открывается станица входа в сам «phpmyadmin».

То есть, все вроде-бы заработало. Но тут в силу своей малой грамотности возникли у меня сомнения: правильно ли сделал или так не принято в кругах опытных профи-админов?!


Прошу уважаемых форумчан оказать посильную помощь в этом вопросе :)

Уваров А.С.

Вполне нормально сделали. Только вот создание симлинка на /some_dir излишне. Вы и так поменяли внешний адрес на zone_z и закрыли его аутентификацией, но хуже тоже не будет.

Однако, всем людям, и мне тоже, свойственно забывать. Поэтому через некоторое время подробности настройки могут забыться, после чего вам придется вспоминать и разбираться в том, что это за симлинк и для чего. Лично наш подход: чем проще - тем лучше. Если какое-то действие можно не делать, то его лучше не делать.

STALKER_SLX

Спасибо Вам, Андрей, большое за ликбез!
Но теперь я немного запутался: если не делать симлинк, то каким образом возможно изменить адрес в УРЛ? Использовать алиасы прямо в файле шаблона?! Подскажите, пожалуйста :)

Уваров А.С.

Снаружи у вас и так zone_z, зачем еще менять путь к phpmyadmin, если он спрятан за аутентификацию? В данном случае само действие по смене URL на мой взгляд излишне.

STALKER_SLX

Правильно ли я понимаю, что для Nginx достаточно добавить в файл шаблона «additionals.conf» вот такой «location /zone_z {», чтобы изменить URL?! Но ведь такой папки по такому пути не существует!

STALKER_SLX

Выходит, что и пункты 1-3 вовсе не нужны?!

Уваров А.С.

Пункт 3 как раз нужен, иначе не будет работать вся остальная конструкция.

STALKER_SLX

Я так понимаю, чтобы не путаться в будущем и долго не вспоминать, что и как делал давным-давно, правильнее создать символическую ссылку прямо в самом каталоге «phpmyadmin»?!

Уваров А.С.

А потом вспоминать что это за ссылка, кто, зачем и почему ее сделал...

Любой большой проект, даже если его ведет один человек, постепенно обрастает кучей костылей, которые в 99% не нужны, но тронуть их страшно, а как что-то отвалится... А разбираться долго...

Так лучше не плодить костыли без необходимости.

STALKER_SLX

А каков тогда будет оптимальный вариант для размещения ссылки?!

Уваров А.С.

ln -s /usr/share/phpmyadmin/   /usr/share/zone_z
И больше не нужно ничего изобретать.

STALKER_SLX

Спасибо Вам, Андрей, за помощь!
В силу своего небольшого админского опыта, задаю Вам много «занудных» вопросов :)