Первоначальная настройка сервера с помощью Ubuntu 20.04
root user — это пользователь с правами администратора в среде Linux, который имеет очень широкий набор привилегий. Из-за такого широкого набора привилегий учетной записи root не рекомендуется использовать ее на регулярной основе. Это связано с тем, что часть возможностей, получаемых с помощью учетной записи root, включает возможность внесения очень разрушительных изменений, даже если это происходит непреднамеренно.
В следующем шаге будет настраиваться новая учетная запись пользователя с ограниченными привилегиями для повседневного использования. Позже мы расскажем о том, как получить расширенные привилегии только на то время, когда они необходимы.
Создание нового пользователя
После входа в систему с правами root мы готовы добавить новую учетную запись пользователя. В будущем мы выполним вход с помощью этой новой учетной записи, а не с правами root.
$ adduser username
Теперь у нас есть новая учетная запись пользователя со стандартными правами. Однако иногда может потребоваться выполнение административных задач.
Используя права root, запустите эту команду, чтобы добавить нового пользователя в группу sudo
$ usermod -aG sudo username
Настройка базового брандмауэра
Серверы Ubuntu 20.04 могут использовать брандмауэр UFW для проверки, что подключения разрешены только к определенным службам. Мы можем легко настроить базовый брандмауэр с помощью приложения.
Приложения могут регистрировать свои профили в UFW после установки. Эти профили позволяют UFW управлять этими приложениями по имени. OpenSSH, служба, позволяющая подключиться к нашему серверу сейчас, имеет профиль, зарегистрированный в UFW.
Чтобы увидеть это, можно ввести следующую команду:
$ ufw app list
Available applications:
OpenSSH
Нам нужно убедиться в том, что брандмауэр разрешает подключения SSH, чтобы мы могли выполнить вход в следующий раз. Чтобы разрешить эти подключения, можно ввести следующее:
$ ufw allow OpenSSH
После этого мы можем активировать брандмауэр с помощью следующей команды:
$ ufw enable
Введите y и нажмите ENTER, чтобы продолжить. Чтобы увидеть, что подключения SSH разрешены, введите следующее:
$ ufw status
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Активация внешнего доступа для стандартного пользователя
Теперь, когда у нас есть стандартный пользователь для повседневного использования, необходимо убедиться, что мы можем ввести SSH непосредственно в учетную запись.
Процесс настройки доступа SSH для нового пользователя зависит от того, использует ли учетная запись с правами root на сервере пароль или ключи SSH для аутентификации.
Если вы выполнили вход в учетную запись root с помощью пароля, тогда для SSH активирована аутентификация по паролю. Вы можете использовать SSH для новой учетной записи пользователя, запустив новый сеанс терминала и используя SSH с новым именем:
ssh username@your_server_ip
Установка NGINX
Поскольку Nginx доступен в репозиториях Ubuntu по умолчанию, его можно установить из этих репозиториев с помощью системы пакетов apt.
$ sudo apt update
$ sudo apt install nginx
Настройка брандмауэра
Перед тестированием Nginx необходимо выполнить настройку программного обеспечения брандмауэра, чтобы разрешить доступ к службе.
$ sudo ufw app list
Необходимо получить список профилей приложений:
Output
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
Как показал вывод, есть три профиля, доступных для Nginx:
- Nginx Full: этот профиль открывает порт 80 (обычный веб-трафик без шифрования) и порт 443 (трафик с шифрованием TLS/SSL)
- Nginx HTTP: этот профиль открывает только порт 80 (обычный веб-трафик без шифрования)
- Nginx HTTPS: этот профиль открывает только порт 443 (трафик с шифрованием TLS/SSL)
Рекомендуется применять самый ограничивающий профиль, который будет разрешать заданный трафик. Сейчас нам нужно будет разрешить трафик на порту 80.
Для активации можно ввести следующую команду:
$ sudo ufw allow 'Nginx HTTP'
Для проверки изменений введите:
$ sudo ufw status
Вывод укажет, какой трафик HTTP разрешен:
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
Проверка веб-сервера
В конце процесса установки Ubuntu 20.04 запускает Nginx. Веб-сервер уже должен быть запущен и работать.
Используйте команду systemd init system, чтобы проверить работу службы:
$ systemctl status nginx
Output
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-04-20 16:08:19 UTC; 3 days ago
Docs: man:nginx(8)
Main PID: 2369 (nginx)
Tasks: 2 (limit: 1153)
Memory: 3.5M
CGroup: /system.slice/nginx.service
├─2369 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
└─2380 nginx: worker process
Когда вы узнаете IP-адрес вашего сервера, введите его в адресную строку браузера:

Основные команды управлением сервера
Остановка сервера
$ sudo systemctl stop nginx
Запуск сервера
$ sudo systemctl start nginx
Рестарт
$ sudo systemctl restart nginx
Если вы просто вносите изменения в конфигурацию, во многих случаях Nginx может перезагружаться без отключения соединений. Для этого введите:
$ sudo systemctl reload nginx
Настройка блоков сервера
При использовании веб-сервера Nginx вы можете использовать блоки сервера (аналогичные виртуальным хостам в Apache) для инкапсуляции данных конфигурации и размещения на одном сервере нескольких доменов.
Создайте директорию для your_domain следующим образом, используя флаг -p для создания необходимых родительских директорий:
$ sudo mkdir -p /var/www/your_domain/html
Затем назначьте владение директорией с помощью переменной среды $USER:
$ sudo chown -R $USER:$USER /var/www/your_domain/html
Разрешения корневых директорий веб-сервера должны быть правильными, если вы не изменяли значение unmask, которое устанавливает разрешения файла по умолчанию. Чтобы убедиться, что разрешения корректны, позволить владельцу читать, писать и запускать файлы, а группам и другим пользователям разрешить только читать и запускать файлы, вы можете ввести следующую команду:
$ sudo chmod -R 755 /var/www/your_domain
Затем создайте в качестве примера страницу index.html, используя nano или свой любимый редактор:
$ nano /var/www/your_domain/html/index.html
Добавьте в страницу следующий образец кода HTML:
<html>
<head>
<title>Welcome to your_domain!</title>
</head>
<body>
<h1>Success! The your_domain server block is working!</h1>
</body>
</html>
Сохраните и закройте файл с помощью ввода CTRL и X, а затем Y и ENTER после завершения работы.
Для обслуживания этого контента Nginx необходимо создать серверный блок с правильными директивами. Вместо того чтобы изменять файл конфигурации по умолчанию напрямую, мы создадим новый файл в директории /etc/nginx/sites-available/you_domain:
$ sudo nano /etc/nginx/sites-available/your_domain
Введите следующий блок конфигурации, который похож на заданный по умолчанию, но обновлен с учетом новой директории и доменного имени:
server {
listen 80;
listen [::]:80;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain www.your_domain;
location / {
try_files $uri $uri/ =404;
}
}
Ниже описано действие этих директив и блоков расположения:
listen— определяет, что будет прослушивать порт Nginx. В данном случае он будет прослушивать порт80, используемый по умолчанию для протокола HTTP.root— определяет корневую директорию документа, где хранятся файлы, обслуживаемые этим сайтом.index— задает для Nginx приоритет обслуживания файлов индекса для этого сайта. Довольно часто вы указываете файлыindex.html, которые имеют высший приоритет по сравнению с файламиindex.php, чтобы обеспечить быструю настройку начальной страницы в приложениях PHP. Вы можете менять эти настройки в зависимости от потребностей вашего приложения.server_name— определяет, на какие доменные имена и/или IP-адреса должен реагировать ваш серверный блок. Эта директива должна указывать на доменное имя или публичный IP-адрес вашего сервера.location /— первый блок расположения включает директивуtry_files, которая проверяет наличие файлов или директорий, соответствующих запросу URI. Если Nginx не сможет найти соответствующий ресурс, будет возвращена ошибка 404.location ~ \.php$— этот блок расположения отвечает за фактическую обработку PHP посредством указания Nginx на файл конфигурацииfastcgi-php.confи файлphp7.4-fpm.sock, который объявляет, какой сокет ассоциирован сphp-fpm.location ~ /\.ht— последний блок расположения отвечает за файлы.htaccess, которые Nginx не обрабатывает. При добавлении директивыdeny all, если любой из файлов.htaccessпопадет в корневую директорию документа, они не будут выводиться посетителям.
Мы обновили конфигурацию root с указанием новой директории и заменили server_name на имя нашего домена.
Теперь мы активируем файл, создав ссылку в директории sites-enabled, который Nginx считывает при запуске:
$ sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
Чтобы избежать возможной проблемы с хэшированием памяти при добавлении дополнительных имен серверов, необходимо изменить одно значение в файле /etc/nginx/nginx.conf. Откройте файл:
$ sudo nano /etc/nginx/nginx.conf
Найдите директиву server_names_hash_bucket_size и удалите символ #, чтобы раскомментировать строку. Если вы используете nano, вы можете быстро найти слова в файле, нажав CTRL и w.
...
http {
...
server_names_hash_bucket_size 64;
...
}
...
Сохраните файл и закройте его после завершения.
Проведите тестирования, чтобы убедиться в отсутствии ошибок синтаксиса в файлах Nginx:
$ sudo nginx -t
Если проблемы отсутствуют, перезапустите Nginx, чтобы активировать изменения:
$ sudo systemctl restart nginx
Важные директории NGNIX
Контент
/var/www/html: веб-контент, в состав которого по умолчанию входит только показанная ранее страница Nginx по умолчанию, выводится из директории/var/www/html. Это можно изменить путем изменения файлов конфигурации Nginx.
Конфигурация сервера
/etc/nginx: директория конфигурации Nginx. Здесь хранятся все файлы конфигурации Nginx./etc/nginx/nginx.conf: основной файл конфигурации Nginx. Его можно изменить для внесения изменений в глобальную конфигурацию Nginx./etc/nginx/sites-available/: директория, где могут храниться серверные блоки для каждого сайта. Nginx не будет использовать файлы конфигурации из этой директории, если они не будут связаны с директориейsites-enabled. Обычно конфигурации серверных блоков записываются в эту директорию и активируются посредством ссылки на другую директорию./etc/nginx/sites-enabled/: директория, где хранятся активные серверные блоки каждого узла. Они созданы посредством ссылки на файлы конфигурации в директорииsites-available./etc/nginx/snippets: в этой директории содержатся фрагменты конфигурации, которые можно включить в конфигурацию Nginx. Воспроизводимые сегменты конфигурации хорошо подходят для преобразования в сниппеты.
Журналы сервера
/var/log/nginx/access.log: каждый запрос к вашему веб-серверу регистрируется в этом файле журнала, если Nginx не настроен иначе./var/log/nginx/error.log: любые ошибки Nginx будут регистрироваться в этом журнале.
Установка стека LEMP (Linux, Nginx, MySQL, PHP)
Программный стек LEMP — это комплекс программного обеспечения, используемый для обслуживания динамических веб-страниц и веб-приложений, написанных на PHP. Аббревиатура LEMP обозначает операционную систему Linux с веб-сервером Nginx (произносится как «энджинкс»). Данные серверной части хранятся в базе данных MySQL, а динамическая обработка выполняется PHP.
Установка MySQL
$ sudo apt install mysql-server
Для подтверждения установки введите Y, а затем нажмите ENTER.
После завершения установки рекомендуется запустить скрипт безопасности, предустановленный в MySQL. Этот скрипт будет удалять некоторые небезопасные настройки по умолчанию и блокировать доступ к системе управления базы данных. Для запуска интерактивного скрипта введите следующую команду:
$ sudo mysql_secure_installation
Скрипт предложит настроить плагин VALIDATE PASSWORD PLUGIN. Эту функцию следует активировать при наличии разумных оснований. Если она активирована, MySQL будет отклонять пароли, не соответствующие определенным критериям, и выводить сообщение об ошибке. Оставить проверку отключенной достаточно безопасно, но для входа в базу данных всегда нужно использовать надежные уникальные пароли.
Выберите Y для активации или любой другой вариант, чтобы продолжить без активации этой функции.
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
Press y|Y for Yes, any other key for No:
Если вы ответите утвердительно, вам будет предложено выбрать уровень проверки пароля. Если вы укажете самый высокий уровень 2, система будет выводить сообщения об ошибке при попытке установки пароля, который не будет содержать цифры, буквы в верхнем и нижнем регистре и специальные символы или будет содержать распространенные словарные слова.
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1
Вне зависимости от того, будете ли вы использовать плагин VALIDATE PASSWORD PLUGIN, ваш сервер предложит вам выбрать и подтвердить пароль для пользователя root в MySQL. Не нужно путать его с системным пользователем root. Пользователь root базы данных — это пользователь с правами администратора, который имеет все права для работы с системой управления базы данных. Хотя в MySQL метод аутентификации пользователя root по умолчанию не требует использования пароля даже при его наличии, задайте надежный пароль для обеспечения дополнительной безопасности. Чуть дальше мы расскажем об этом подробнее.
Если вы включили использование паролей, вы увидите уровень надежности введенного пароля root, и ваш сервер запросит у вас подтверждение дальнейшего использования этого пароля. Если вас устраивает текущий пароль, введите Y в диалоге для подтверждения:
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
Для всех остальных вопросов нужно выбирать Y и нажимать ENTER в каждом диалоге. Выбрав эти ответы, вы удалите ряд анонимных пользователей и тестовую базу данных, отключите возможность удаленного входа пользователя root и загрузите новые правила, чтобы внесенные изменения немедленно активировались в MySQL.
Завершив настройку, проверьте возможность входа в консоль MySQL, набрав следующую команду:
$ sudo mysql
В результате будет установлено подключение к серверу MySQL с помощью пользователя root базы данных с правами администратора, который логически выводится в результате использования sudo при запуске данной команды. Результат должен выглядеть следующим образом:
Output
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 8.0.19-0ubuntu5 (Ubuntu)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Для выхода из консоли MySQL введите следующую команду:
mysql > exit
Создание нового пользователя в MySQL
mysql > CREATE USER 'user-name'@'localhost' IDENTIFIED BY 'password';
Где:
- user-name ― логин пользователя базы данных,
- password ― пароль нового пользователя.
Вы создали нового пользователя, но на данный момент у него нет никаких прав, и он не может войти в систему MySQL. Чтобы предоставить новому пользователю неограниченные права, введите команду:
GRANT ALL PRIVILEGES ON * . * TO 'user-name'@'localhost';
Чтобы сохранить изменения, введите команду:
FLUSH PRIVILEGES;
Установка PHP
Для установки пакетов php-fpm и php-mysql воспользуйтесь следующей командой:
$ sudo apt install php-fpm php-mysql
При поступлении запроса введите Y и ENTER для подтверждения установки.
Теперь вы установили компоненты PHP. Далее вы настроите Nginx для их использования.
Установка и настройка phpMyAdmin
При разработке веб-сайта или веб-приложения многим пользователям требуются функциональные возможности системы баз данных, такой как MySQL. Однако взаимодействие с системой исключительно из клиента командной строки MySQL требует знакомства с языком структурированных запросов, который чаще называют SQL, что может представлять собой серьезное препятствие для некоторых пользователей.
phpMyAdmin был создан, чтобы позволить пользователям взаимодействовать с MySQL через интуитивно понятный веб-интерфейс, работающий вместе со средой разработки PHP. Это руководство поможет вам установить phpMyAdmin поверх сервера Nginx.
Установка phpMyAdmin
$ sudo apt update
$ sudo apt install phpmyadmin
В процессе установки вам будет предложено выбрать веб-сервер (Apache или Lighttpd) для настройки. phpMyAdmin может автоматически вносить ряд изменений в конфигурацию, чтобы обеспечить правильную работу с любым из этих веб-серверов после установки. Однако, поскольку вы используете Nginx в качестве веб-сервера, вам не следует выбирать ни один из этих вариантов. Вместо этого нажмите TAB, чтобы выделить , а затем нажмите ENTER, чтобы продолжить процесс установки.
Далее вам будет предложено использовать dbconfig-common для настройки базы данных приложения. Выберите <Да>. Это настроит внутреннюю базу данных и администратора для phpMyAdmin. Вам будет предложено определить новый пароль для пользователя phpmyadmin MySQL, но, поскольку это не тот пароль, который вам нужно запомнить, вы можете оставить его пустым и позволить phpMyAdmin создать пароль случайным образом.
После завершения команды apt install phpMyAdmin будет полностью установлен. Однако, чтобы веб-сервер Nginx правильно находил и обслуживал файлы phpMyAdmin, вам необходимо создать символическую ссылку из установочных файлов на корневой каталог документов Nginx. Если вы следовали обязательному руководству по стеку LEMP, корневой каталог документа вашей установки Nginx — /var/www/your_domain/
$ sudo ln -s /usr/share/phpmyadmin /var/www/your_domain/phpmyadmin
Ваша установка phpMyAdmin теперь работает. Чтобы получить доступ к интерфейсу, перейдите к доменному имени вашего сервера или общедоступному IP-адресу, а затем /phpmyadmin в веб-браузере:

Изменение локации url phpmyadmin
Один из способов защитить вашу установку phpMyAdmin — затруднить ее поиск. Боты будут сканировать общие пути, такие как /phpmyadmin, /pma, /admin, /mysql и другие подобные имена. Изменение URL-адреса интерфейса с /phpmyadmin на что-то нестандартное значительно затруднит автоматическим скриптам поиск вашей установки phpMyAdmin и попытку атаки методом грубой силы.
На предыдущем шаге вы создали символическую ссылку в корневом каталоге веб-документа Nginx, указывающую на /usr/share/phpmyadmin, где находятся фактические файлы приложения phpMyAdmin. Вы можете переименовать эту символическую ссылку, чтобы изменить URL-адрес интерфейса phpMyAdmin.
Для этого перейдите в корневой каталог документа Nginx:
$ cd /var/www/your_domain/
Затем выполните следующую команду ls, чтобы получить список файлов в корневом каталоге документа, чтобы лучше понять изменения, которые вы вносите. Эта команда включает параметр -l, который указывает команде использовать формат «длинного списка». Это заставит ls вернуть больше информации, чем в противном случае:
$ ls -l
Ваш вывод будет содержать строку, подобную следующей:
Output
. . .
lrwxrwxrwx 1 root root 22 Jan 15 21:09 phpmyadmin -> /usr/share/phpmyadmin/
. . .
Эта строка указывает, что у вас есть символическая ссылка с именем phpmyadmin в этом каталоге. Вы можете изменить имя этой ссылки на любое другое, и это, в свою очередь, изменит URL-адрес, по которому вы можете получить доступ к phpMyAdmin. Это поможет скрыть конечную точку от ботов, выполняющих автоматический поиск общих имен конечных точек.
Выберите имя, которое скрывает назначение конечной точки. В этом руководстве конечная точка будет называться /hiddenlink и будет использоваться это имя во всех примерах, но вам следует выбрать другое имя.
Переименуйте символическую ссылку с помощью команды mv:
$ sudo mv phpmyadmin hiddenlink
После выполнения этой команды снова запустите команду ls -l, чтобы убедиться, что символическая ссылка была переименована правильно:
$ ls -l
На этот раз выходные данные укажут, что список символической ссылки был обновлен новым именем:
Output
total 8
. . .
lrwxrwxrwx 1 root root 22 Jan 15 21:09 hiddenlink -> /usr/share/phpmyadmin/
. . .
Теперь, когда вы перейдете по URL-адресу, который вы ранее использовали для доступа к phpMyAdmin, вы получите ошибку 404.
You can instead access your phpMyAdmin interface at the new URL you just configured:
https://server_domain_or_IP/hiddenlink
Скрывая реальное местоположение phpMyAdmin на сервере, вы защищаете его интерфейс от автоматических сканирований и попыток взлома вручную.
Отключение входа root
В MySQL, как и в обычных системах Linux, учетная запись root — это специальная административная учетная запись с неограниченным доступом к системе. Помимо того, что это привилегированная учетная запись, это известное имя для входа в систему, что делает его очевидной целью для атак грубой силы. Чтобы свести к минимуму эти риски, на этом шаге будет описано, как настроить phpMyAdmin для отказа от любых попыток входа в систему, исходящих от пользователя root MySQL. Таким образом, даже если вы предоставите действительные учетные данные для пользователя root, вы все равно получите отказ в доступе! ошибка и не будет разрешено войти в систему.
Поскольку вы выбрали dbconfig-common для настройки и хранения настроек phpMyAdmin, конфигурация приложения по умолчанию в настоящее время хранится в вашей базе данных MySQL. Вам нужно будет создать новый файл config.inc.php в каталоге конфигурации phpMyAdmin, чтобы определить ваши пользовательские настройки. Несмотря на то, что PHP-скрипты phpMyAdmin расположены в каталоге /usr/share/phpmyadmin, файлы конфигурации приложения находятся в /etc/phpmyadmin.
Создайте новый файл пользовательских настроек в каталоге /etc/phpmyadmin/conf.d и назовите его pma_secure.php:
$ sudo nano /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'] = 'CHANGE_THIS_TO_A_STRING_OF_32_RANDOM_CHARACTERS';
$i=0;
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
$cfg['Servers'][$i]['AllowRoot'] = false;
?>
Включая директивы AllowNoPassword и AllowRoot и устанавливая для них значение false, этот файл конфигурации отключает вход в систему без пароля и вход в систему пользователем root MySQL соответственно.
Обратите внимание, что параметр auth_type настраивает phpMyAdmin на использование метода аутентификации cookie. phpMyAdmin по умолчанию использует метод аутентификации с помощью файлов cookie, что позволяет вам войти в phpMyAdmin как любой действительный пользователь MySQL с помощью файлов cookie. При использовании этого метода пароль пользователя MySQL сохраняется и шифруется с помощью алгоритма Advanced Encryption Standard (AES) во временном файле cookie.
Исторически сложилось так, что phpMyAdmin вместо этого использовал для этой цели алгоритм Blowfish. Однако он по-прежнему ищет директиву blowfish_secret, которая указывает на парольную фразу, которая будет использоваться внутри алгоритма AES. Это не парольная фраза, которую вам нужно запомнить, поэтому здесь подойдет любая строка, содержащая 32 случайных символа.
Обновите строку CHANGE_THIS_TO_A_STRING_OF_32_RANDOM_CHARACTERS до случайной строки, содержащей не менее 32 символов.
Сохраните и закройте файл, когда закончите его редактирование. Если вы использовали nano, сделайте это, нажав CTRL + X, Y, чтобы подтвердить изменения, а затем ENTER, чтобы вернуться к командной строке bash.
Изменения вступят в силу автоматически. Если вы сейчас перезагрузите страницу входа и попытаетесь войти в систему как пользователь root, вы получите отказ в доступе!
Вход в систему пользователем root MySQL теперь запрещен в вашей установке phpMyAdmin. Эта мера безопасности не позволит сценариям грубой силы попытаться угадать пароль пользователя корневой базы данных на вашем сервере. Более того, это обеспечит использование менее привилегированных учетных записей MySQL для доступа к веб-интерфейсу phpMyAdmin, что само по себе является важной практикой безопасности.
Создание шлюза аутентификации
Скрытие вашей установки phpMyAdmin в необычном месте может обойти некоторых автоматических ботов, сканирующих сеть, но бесполезно против целевых атак. Чтобы лучше защитить веб-приложение с ограниченным доступом, как правило, более эффективно остановить злоумышленников еще до того, как они смогут добраться до приложения. Таким образом, они не смогут использовать общие эксплойты и атаки грубой силы, чтобы угадать учетные данные для доступа.
В конкретном случае с phpMyAdmin еще важнее держать интерфейс входа в систему заблокированным. Оставляя его открытым для всего мира, вы предлагаете злоумышленникам платформу грубой силы, чтобы угадать ваши учетные данные базы данных.
Этот шаг описывает, как добавить дополнительный уровень аутентификации в вашу установку phpMyAdmin, чтобы повысить безопасность ваших баз данных MySQL. Большинство веб-серверов, включая Nginx, изначально предоставляют эту возможность. Выполнив этот шаг, любой, кто попытается получить доступ к экрану входа в систему вашей установки phpMyAdmin, сначала должен будет пройти через запрос HTTP-аутентификации, введя действительное имя пользователя и пароль.
Чтобы настроить это, вам сначала нужно создать файл паролей для хранения учетных данных аутентификации. Nginx требует, чтобы пароли были зашифрованы с помощью функции crypt(). Пакет OpenSSL, который должен быть установлен на вашем сервере Ubuntu по умолчанию, включает эту функциональность.
Чтобы создать зашифрованный пароль, введите:
$ openssl passwd
Вам будет предложено ввести и подтвердить пароль, который вы хотите использовать. Затем утилита отобразит зашифрованную версию пароля, которая будет выглядеть примерно так:
Output
9YHV.p60.Cg6I
Скопируйте это значение, так как вам нужно будет включить его в файл аутентификации, который вы собираетесь создать.
Теперь создайте файл аутентификации. Для целей этого руководства мы назовем этот файл pma_pass и поместим его в каталог конфигурации Nginx:
$ sudo nano /etc/nginx/pma_pass
В этом файле укажите имя пользователя, которое вы хотите использовать, затем двоеточие (:), а затем зашифрованную версию пароля, который вы получили от утилиты openssl passwd.
В этом примере пользователя зовут sammy, но вы можете выбрать любое другое имя пользователя. Это не обязательно должно быть имя существующего профиля пользователя на вашем сервере Ubuntu или пользователя MySQL.
После добавления выбранного вами имени пользователя и зашифрованного пароля, который вы скопировали ранее, файл будет выглядеть так:
sammy:9YHV.p60.Cg6I
Сохраните и закройте файл, когда закончите.
Далее вам нужно изменить файл конфигурации Nginx. Опять же, это руководство следует соглашениям, установленным в предварительном руководстве по LEMP, поэтому в следующих примерах используется файл конфигурации /etc/nginx/sites-available/your_domain. Убедитесь, что вы используете соответствующий файл конфигурации Nginx для веб-сайта, где в настоящее время размещена ваша установка phpMyAdmin.
Для начала откройте файл конфигурации Nginx в предпочитаемом вами текстовом редакторе:
$ sudo nano /etc/nginx/sites-available/your_domain
Найдите серверный блок и местоположение/раздел внутри него. Вам нужно создать новый раздел местоположения под этим местоположением/блоком, чтобы он соответствовал текущему пути phpMyAdmin на сервере.
Напомним, что на шаге 2 этого руководства вы изменили имя расположения phpMyAdmin, переименовав символическую ссылку (в нашем примере — скрытую ссылку). Здесь вам нужно ввести имя, которое вы использовали для этой символической ссылки. Вам не нужно указывать полный путь к файлу, просто имя символической ссылки относительно корневого каталога документа Nginx:
server {
. . .
location / {
try_files $uri $uri/ =404;
}
location ^~ /hiddenlink {
}
. . .
}
В этом блоке настройте две директивы: auth_basic, определяющую сообщение, которое будет отображаться в запросе аутентификации, и auth_basic_user_file, указывающее на только что созданный файл аутентификации. Добавьте обе эти директивы в раздел нового местоположения:
server {
. . .
location / {
try_files $uri $uri/ =404;
}
location ^~ /hiddenlink {
auth_basic "Admin Login";
auth_basic_user_file /etc/nginx/pma_pass;
}
. . .
}
Наконец, обратите внимание, что этот блок имеет селектор ^~ перед определением нового местоположения. Это сделано для того, чтобы Nginx не обошел ваши правила доступа, когда он соответствует правилу для файлов PHP, которые обычно определяются как регулярное выражение для перехвата всех файлов .php. В файлах конфигурации Nginx определения регулярных выражений имеют более высокий приоритет по сравнению со стандартными определениями местоположения. Это означает, что если вы не используете селектор ^~ в начале местоположения, пользователи все равно смогут обойти запрос аутентификации, перейдя по адресу http://server_domain_or_ip/hiddenlink/index.php в своем браузере.
Селектор ^~ в начале определения местоположения указывает Nginx игнорировать другие совпадения, когда он находит совпадение для этого местоположения. Это означает, что любые подкаталоги или файлы внутри /hiddenlink/ будут соответствовать этому правилу. Однако, поскольку определение для разбора файлов PHP будет пропущено в результате использования селектора ^~, нам потребуется включить новый блок местоположения PHP в определение /hiddenlink. Это обеспечит правильный анализ файлов PHP в этом месте; в противном случае они будут отправлены в браузер как загружаемый контент.
Добавьте следующие выделенные строки в только что добавленный блок местоположения:
server {
. . .
location / {
try_files $uri $uri/ =404;
}
location ^~ /hiddenlink/ {
auth_basic "Admin Login";
auth_basic_user_file /etc/nginx/pma_pass;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
}
. . .
}
Не забудьте заменить hiddenlink фактическим путем, по которому можно найти phpMyAdmin. Вы также должны дважды проверить расположение вашего файла сокета PHP-FPM, которое зависит от того, какая версия PHP у вас установлена. В этом примере мы используем php7.4-fpm.sock, который действителен для PHP 7.4, версии, установленной в Ubuntu 20.04 через репозитории APT по умолчанию.
Сохраните и закройте файл, когда закончите. Чтобы проверить, действителен ли файл конфигурации, выполните следующую команду:
$ sudo nginx -t
Следующий вывод показывает, что синтаксис файла конфигурации действителен:
Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Чтобы активировать новый шлюз аутентификации, перезагрузите Nginx:
$ sudo systemctl reload nginx
Теперь, когда вы посещаете URL-адрес phpMyAdmin в своем веб-браузере, вам будет предложено ввести имя пользователя и пароль, которые вы добавили в файл pma_pass:

Как только вы введете свои учетные данные, вы попадете на стандартную страницу входа в phpMyAdmin.
В дополнение к обеспечению дополнительного уровня безопасности, этот шлюз поможет защитить ваши журналы MySQL от спамных попыток аутентификации.
Источники
- https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-20-04-ru
- https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-20-04-ru
- https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-20-04-ru
- https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-phpmyadmin-with-nginx-on-an-ubuntu-20-04-server

