cd /var/www/
mkdir -p sites/site1
echo «
Welcome
» > sites/site1/index.html
В результате файл “/var/www/sites/site1/index.html” будет содержать одну html-строку:
Welcome
3. Конфигурация Apache-сервера
Конфигурационные файлы сайтов находятся в каталоге “/etc/apache2/sites-available/”. Создадим конфигурационный файл для нового виртуального хоста взяв за основу конфигурацию по умолчанию из файла “000-default.conf”
cd /etc/apache2/sites-available/
cp 000-default.conf site1.conf
Откроем файл “site1.conf” и изменим параметр “DocumentRoot”. В качестве значения нужно указать путь к новому сайту, в нашем случае это “/var/www/sites/site1”
На данном этапе нам не требуется настройка одновременной работы нескольких сайтов, поэтому отключим сайт по умолчанию и включим новый сайт. Для применения изменений перезагружаем конфигурацию сервера.
a2dissite 000-default
a2ensite site1
systemctl reload apache2
Снова переходим по ссылке “http://[ip_адрес_сервера]” и убеждаемся, что вместо стандартной страницы приветствия отображается наша новая страница.

Настройка HTTP-сервера завершена, переходим к следующему этапу.
Настройка FTP-сервера
1. Установка
Устанавливаем ftp-сервер и дополнительный пакет “db-util”, который потребуется для настройки виртуальных пользователей.
apt install vsftpd db-util
2. Создание локальной учетной записи
Сервер vsftpd позволяет очень гибко настраивать права доступа. Для решения наших задач ftp-пользователям необходимо обеспечить следующие возможности:
- полный доступ к содержимому директории “/var/www/sites/”;
- невозможность выхода за пределы директории “/var/www/”;
- подключение с использованием виртуальной учетной записи;
Создадим локальную учетную запись “virtual” без возможности входа в систему, с домашней директорией “/var/www/”. Эта учетная запись будет использоваться для подключения виртуальных ftp-пользователей.
useradd -d /var/www virtual
По умолчанию, владельцем директории “/var/www” является “root”. Для того, того, чтобы ftp-пользователи могли изменять содержимое сайтов, изменим владельца каталога “/var/www/sites/”, включая вложенные папки на “virtual”.
chown -R virtual:root /var/www/sites
В результате изменения прав, пользователь “virtual” сможет просматривать содержимое каталога “/var/www/” и записывать во вложенный каталог “/var/www/sites/”
3. Конфигурация
Основная конфигурация хранится в файле “/etc/vsftpd.conf”, приводим его к следующему виду:
#Включаем виртуальных пользователей
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=virtual
#Настраиваем права
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_world_readable_only=NO
anon_umask=0022
chroot_local_user=YES
#задаем параметры запуска
listen=YES
pasv_min_port=30000
pasv_max_port=30999
4. Создание базы данных
База данных необходима для хранения виртуальных учетных записей.
Предварительно создадим в домашнем каталоге простой текстовый файл “users.txt” и запишем логины и пароли виртуальных пользователей в чередующиеся строки. Например нам нужен виртуальный пользователь с логином “ftp” и паролем “Qwe123”, тогда содержимое файла будет таким:
Создаем базу данных
db_load -T -t hash -f ~/users.txt /etc/vsftpd_login.db
Меняем стандартное содержимое PAM файла “/etc/pam.d/vsftpd” на следующие строки.
auth required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd_login
account required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd_login
Обратите внимание, что в различных дистрибутивах расположение библиотеки “pam_userdb.so” может отличаться, при необходимости путь к файлу нужно скорректировать.
Для применения изменений перезагружаем vsftpd сервер.
systemctl restart vsftpd
Настройка FTP-сервера завершена.
Данные для подключения:
- ftp://[ip_адрес_сервера]
- Логин: ftp
- Пароль: Qwe123
Настройка PHP-сервера
1. Установка
На текущий момент последней стабильной версией PHP является php 7.4.5, которая отсутствует в официальных репозиториях Ubuntu. Подключим сторонний репозиторий и установим последнюю версию PHP.
apt update
apt install software-properties-common
add-apt-repository ppa:ondrej/php
apt update
apt install php7.4
2. Проверка
Для того, чтобы PHP код мог быть исполнен, файл веб страницы должен иметь расширение “.php”. Переименовываем тестовою страницу
cd /var/www/sites/site1/
mv index.html index.php
Добавляем в файл “/var/www/sites/site1/index.php” строку php-кода. В результате содержимое файла будет таким:
Welcome
phpinfo();
?>
Сохраняем изменения и проверяем результат в браузере.

Если вы видите результат работы функции “phpinfo()”, значит интерпретатор PHP работает корректно. Приступаем к следующему этапу.
Настройка MySQL (MariaDB)
1. Установка
Устанавливаем MariaDB и PHP-модуль для работы с MySQL, после завершения установки перезагружаем Apache
apt install mariadb-server php-mysql
systemctl restart apache2
Для проверки обновим тестовую страницу и в таблице с конфигурацией PHP и перейдем к разделу PDO. Наличие секции “PDO_mysql” говорит о корректной установке драйвера для работой с базой данных Mysql.

Для дальнейшей работы необходимо выполнить первоначальную настройку безопасности MariaDB, во время которой для пользователя “root” устанавливается пароль, запрещается удаленный вход и удаляются гостевые учетные записи.
На первом шаге необходимо ввести пароль пользователя «root» для входа в СУБД или нажать Enter, если пароль не задан. Так как после установки учетная запись «root» не имеет пароля, нажимаем “Enter”.
Обратите внимание, что в MariaDB существуют собственные учетные записи, которые не имеют отношения к учетным записям операционной системы. Речь идет о пользователе «root» в MariaDB.

Далее конфигуратор предложит задать пароль для пользователя root, нажимаем “y” для подтверждения и вводим новый пароль, в нашем случае “Qwe123”

На все последующие запросы просто нажимаем “y” до окончания настройки.
Данные для входа в MariaDB:
- Логин: root
- Пароль: Qwe123
Настройка phpMyAdmin
1. Установка
Устанавливаем обязательное PHP-расширение mbstring.
apt install php-mbstring
В официальном репозитории размещена устаревшая версия phpMyAdmin, поэтому выполним установку в ручном режиме.
Заходим на официальный сайт проекта “https://www.phpmyadmin.net/” и скачиваем архив актуальной версии.

Копируем архив на сервер в каталог “/var/www/sites/” используя любой ftp-клиент.
Распаковываем архив, и для удобства, переименовываем извлеченную папку в “phpMyAdmin”. Для распаковки zip-архива предварительно установим утилиту “unzip”. После распаковки архив можно удалить.
apt install unzip
cd /var/www/sites/
unzip phpMyAdmin-5.0.2-all-languages.zip
mv phpMyAdmin-5.0.2-all-languages phpMyAdmin
rm phpMyAdmin-5.0.2-all-languages.zip
Создаем папку “/var/www/sites/phpMyAdmin/tmp” для хранения временных файлов с полными доступом для всех. Если этого не сделать phpMyAdmin сообщит об отсутствии доступа в временной папке.
cd /var/www/sites/phpMyAdmin/
mkdir tmp
chmod 777 tmp
2. Создание псевдонима
Так как phpMyAdmin не является отдельным виртуальным хостом и находится за пределами корневой директории сайта, настроим псевдоним для возможности доступа.
Открываем файл “/etc/apache2/mods-available/alias.conf” и вставляем строку
Alias /pma “/var/www/sites/phpMyAdmin»

Перезагружаем конфигурацию Apache для применения изменений.
systemctl reload apache2
Псевдоним настроен. Сейчас мы можем входить в phpMyAdmin по ссылке “http://[ip_адрес_сервера]/pma”
3. Подготовка базы данных
Так как при первоначальной настройке MariaDB мы запретили использование учетной записи root для удаленного подключения, необходимо создать новую учетную запись с полными правами, которая будет использоваться для входа в phpMyAdmin.
Кроме того, для работы дополнительных функций phpMyAdmin необходима служебная база данных и учетная запись для доступа к ней.
Создадим учетные записи
mariadb -u root -p
GRANT ALL PRIVILEGES ON *.* TO ‘pma’@’localhost’ IDENTIFIED BY ‘Qwe123’ WITH GRANT OPTION;
GRANT SELECT, INSERT, UPDATE, DELETE ON `phpmyadmin`.* TO ‘pmaservice’@’localhost’ IDENTIFIED BY ‘Qwe123’ WITH grant option;
Обратите внимание, что имя базы данных во втором запросе заключено в обратные апострофы: “… ON `phpmyadmin`.* TO ‘pma’@’localhost’ IDENTIFIED BY …”,
В результате в MariaDB будет создано две учетные записи:
- Логин: pma, пароль: Qwe123
Учетная запись имеет полные права и будет использоваться для входа в phpMyAdmin - Логин: pmaservice, пароль:Qwe123
Служебная учетная запись необходимая для работы дополнительных функций.
На следующем шаге эти учетные данные должны быть указаны в конфигурационном файле “config.inc.php”
Далее необходимо импортировать базу данных из файла “phpMyAdmin/sql/create_tables.sql”. Выполним импорт средствами phpMyAdmin.
Открываем браузер и переходим по ссылке “http://[ip_адрес _сервера]/pma”
Вводим логин “pma”, пароль “Qwe123”
Переходим на вкладку “Импорт”, нажимаем кнопку “Выберите файл” и выбираем файл ”sql/create_tables.sql” в корневой директории phpMyAdmin. Предполагается что на локальном компьютере существует папка с файлами “phpMyAdmin”, если необходимо, распакуйте архив.

Для завершения импорта нажимаем кнопку “Вперед”.
4. Конфигурация
Копируем файл конфигурации из шаблона
cd /var/www/sites/phpMyAdmin/
cp config.sample.inc.php config.inc.php
Открываем конфигурационный файл “/var/www/sites/phpMyAdmin/config.inc.php” и вносим следующие изменения:
- Задаем произвольное значение длиной 32 символа для параметра “$cfg[‘blowfish_secret’]”. Можно воспользоваться любым генератором паролей.

- Снимаем комментарии со всех строк раздела “phpMyAdmin configuration storage settings” и указываем для параметров “controluser” и “controlpass” логин и пароль служебной учетной записи MariaDB, созданной на предыдущем шаге. В нашем случае логин — pmaservice, пароль — Qwe123

Сохраняем изменения. Настройка завершена.
Данные для входа в phpMyadmin:
- http://[ip_адрес_сервера]/pma/
- Логин: pma
- Пароль: Qwe123
Установка и настройка WordPress на сервер Linux
1. Размещение файлов дистрибутива WP
Заходим на официальный сайт “https://ru.wordpress.org/” и скачиваем архив на локальный компьютер.


Загружаем архив на сервер в каталог “/var/www/sites/” и распаковываем, файлы будут извлечены в папку “wordpress”.
Копируем содержимое папки “/var/www/sites/wordpress/” в корневую директорию сайта “/var/www/sites/site1/”
Так как копирование файлов выполнялось из консоли с root-правами еще раз изменяем владельца каталога “/var/www/sites/”, включая содержимое на virtual. Это нужно для восстановления полного доступа при подключении через ftp-клиент.
cd /var/www/sites/
tar -xzvf wordpress-5.4-ru_RU.tar.gz
cp -R wordpress/* site1/
chown -R virtual:root /var/www/sites
2. Создание базы данных для WordPress
Входим в PHPMyAdmin и нажимаем “Создать БД”. Указываем произвольное имя базы данных, в нашем случае “wordpress_db” и нажимаем кнопку “Создать”.

Выделяем в левой части окна созданную БД и нажимаем кнопку “Привилегии”

Далее нажимаем “Добавить учетную запись пользователя”.
В открывшемся окне вводим логин и пароль (wpservice / Qwe123), помечаем опцию “Предоставить все привилегии в базе данных wordpress_db” и нажимаем кнопку “Вперед”

На следующей странице нажимаем “Отметить все” для установки всех привилегий уровня базы данных и нажимаем “Вперед”.

3. Конфигурация WP на сервере под Linux
Переходим в корневую директорию сайта и копируем из шаблона конфигурационный файл.
cd /var/www/sites/site1/
cp wp-config-sample.php wp-config.php
Открываем файл “wp-config.php” и вводим параметры подключения к базе данных, созданной на предыдущем шаге и сохраняем изменения.

4. Установка CMS WordPress
Открываем браузер и переходим по ссылке “http://[ip_адрес_сервера]/wp-admin/install.php”
Заполняем предложенные поля и нажимаем “Установить WordPress” Имя пользователя и пароль указываем произвольные, в нашем случае логин — wpadmin, пароль — Qwe123
Эти учетные данные будут использоваться для входа в WordPress.

После завершения установки переходим по ссылке “http://[ip_адрес_сервера]/wp-login.php”, вводим учетные данные, указанные на предыдущем шаге и входим в WordPress

На главной странице сайта будет отображаться один из шаблонов WordPress

Данные для входа в WordPress:
- http://[ip_адрес _сервера]/wp-login.php
- Логин: wpadmin
- Пароль: Qwe123
Просмотр PHP онлайн
Открывайте и просматривайте файлы PHP онлайн используя бесплатное приложение для просмотра файлов PHP.
Загружая файлы или используя наш сервис, вы соглашаетесь с нашими Условиями использования. и Политикой конфиденциальности.
Мы уже обработали 2 113 797 файлов общим размером 3 780 548 МБ.
О приложении просмотра
Современные компьютерные приложения хранят информацию в файлах разных типов. Для обработки файлов определенного типа зачастую необходимо специализированное программное обеспечение, занимающее много места, а иногда и требующее оплаты. Однако вы не станете устанавливать программный пакет, занимающий десять или более гигабайт, да еще и платить за это, чтобы просмотреть один файл. Кроме того, вы можете получить файл на мобильный телефон, а многие программные пакеты не имеют мобильных версий. Конечно, вы можете добраться до компьютера, но иногда это займет много времени, да и на компьютере может не быть необходимого программного обеспечения.
GroupDocs.Viewer — быстрый и эффективный API для рендеринга файлов более чем 170 различных форматов. Работая на высокопроизводительном облачном сервере GroupDocs, он отображает файлы PHP в браузере. Технологии GroupDocs.Viewer позволяют добиться идеального и идентичного отображения документа на любой платформе.
Это бесплатное онлайн-приложение на базе GroupDocs.Viewer API отображает файлы PHP на вашем устройстве. Мы сохраняем вашу конфиденциальность, файл виден только вам. Вы можете распечатать просматриваемый файл прямо из браузера. Вы также можете загрузить файл PDF, чтобы поделиться с кем-то или просмотреть его позже. Приложение работает на любом устройстве, включая смартфоны.
Возможности приложения для просмотра
- Приложение Viewer — это бесплатное онлайн-приложение, позволяющее просматривать файлы более чем в 170 форматах, от широко распространенного Microsoft Office до узкоспециализированных CorelDRAW, Adobe Illustrator или AutoCAD.
- Используйте это приложение для открытия файлов, навигации по страницам и преобразования файлов в формат PDF.
- Онлайн-приложение не требует установки. Запустите браузер, откройте страницу приложения и просмотрите файлы.
- Ограничений нет. Просмотр любого количества файлов в день абсолютно бесплатно.
Установка комплекта Linux, Apache, MySQL, PHP (LAMP) в Ubuntu 20.04

Комплект LAMP — это набор программного обеспечения с открытым исходным кодом, которое обычно устанавливается в комплексе для размещения на сервере динамических сайтов и веб-приложений, написанных на PHP. Этот термин представляет собой аббревиатуру. Операционная система Linux используется с веб-сервером Apache. Данные сайта хранятся в базе данных MySQL, а за обработку динамического контента отвечает PHP.
В этом обучающем модуле мы выполним установку комплекта LAMP на сервере Ubuntu 20.04.
Предварительные требования
Для данного обучающего модуля вам потребуется сервер Ubuntu 20.04 с учетной записью пользователя без привилегий root и с привилегиями sudo , а также базовым брандмауэром. Для настройки такого сервера воспользуйтесь нашим документом «Руководство по начальной настройке сервера Ubuntu 20.04».
Шаг 1 — Установка Apache и обновление брандмауэра
Веб-сервер Apache — один из самых популярных веб-серверов в мире. По нему имеется много документации и активное сообщество пользователей. Веб-сервер Apache широко использовался в течение большей части истории интернета, что делает его отличным стандартным выбором для размещения сайтов.
Установите Apache с помощью диспетчера пакетов apt в Ubuntu:
Если это первое использование sudo в этом сеансе, вам нужно будет ввести пароль пользователя для подтверждения прав управления системными пакетами с помощью apt . Чтобы подтвердить установку Apache, нажмите Y , а затем ENTER .
После завершения установки вам нужно будет изменить настройки брандмауэра, чтобы разрешить трафик HTTP и HTTPS. Для этой цели в UFW можно использовать разные профили приложений. Чтобы вывести все доступные профили приложений UFW, запустите следующую команду:
Вывод будет выглядеть следующим образом:
OutputAvailable applications: Apache Apache Full Apache Secure OpenSSH
Вот что означает каждый из этих профилей:
- Apache: этот профиль открывает только порт 80 (нормальный веб-трафик без шифрования).
- Apache Full: этот профиль открывает порт 80 (нормальный веб-трафик без шифрования) и порт 443 (трафик с шифрованием TLS/SSL).
- Apache Secure: этот профиль открывает только порт 443 (трафик с шифрованием TLS/SSL).
Сейчас лучше всего разрешить только соединения на порту 80 , поскольку мы только что установили Apache, и у нас еще нет сертификата TLS/SSL, настроенного для разрешения трафика HTTPS на нашем сервере.
Чтобы разрешить только трафик на порту 80 , используйте профиль Apache :
Проверить изменения можно с помощью следующей команды:
OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache (v6) ALLOW Anywhere (v6)
Теперь брандмауэр пропускает трафик порта 80 .
Вы можете провести быструю проверку, открыв в браузере публичный IP-адрес вашего сервера (если вы не знаете свой публичный IP-адрес, следуйте указаниям примечания в следующем разделе):
http://your_server_ip
Вы увидите веб-страницу по умолчанию Ubuntu 20.04 Apache, предназначенную для информационных целей и целей тестирования. Она должна выглядеть следующим образом:

Если вы видите эту страницу, ваш веб-сервер правильно установлен и доступен через ваш брандмауэр.
Как определить публичный IP-адрес сервера
Если вы не знаете внешний IP-адрес вашего сервера, вы можете определить его с помощью нескольких способов. Обычно это адрес, который вы используете для подключения к серверу через SSH.
Существует несколько способов сделать это через командную строку. Во-первых, вы можете использовать инструменты iproute2 для получения IP-адреса с помощью следующей команды:
В результате будут выведены две или три строки. Все указанные адреса верные, но ваш компьютер может использовать только один из них, так что вы можете попробовать каждый.
Также можно использовать утилиту curl для связи с внешним устройством. Вы увидите, как это устройство видит ваш сервер. Для этого нужно запросить ваш IP-адрес у конкретного сервера:
Вне зависимости от метода получения IP-адреса введите его в адресную строку браузера для просмотра страницы Apache по умолчанию.
Шаг 2 — Установка MySQL
Мы запустили веб-сервер, и теперь нам нужно установить СУБД, которая может хранить данные вашего сайта и управлять ими. MySQL — популярная СУБД, используемая в средах PHP.
Используйте apt для получения и установки этого программного обеспечения:
Для подтверждения установки введите Y , а затем нажмите ENTER .
После завершения установки рекомендуется запустить скрипт безопасности, предустановленный в MySQL. Этот скрипт будет удалять некоторые небезопасные настройки по умолчанию и блокировать доступ к системе управления базы данных. Для запуска интерактивного скрипта введите следующую команду:
Скрипт предложит настроить плагин 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 user в 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, набрав следующую команду:
В результате будет установлено подключение к серверу MySQL с помощью пользователя root базы данных с правами администратора, который логически выводится в результате использования sudo при запуске данной команды. Результат должен выглядеть следующим образом:
OutputWelcome 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 введите следующую команду:
Обратите внимание, что для подключения под именем пользователя root не требуется вводить пароль, хотя вы и задали его при запуске скрипта mysql_secure_installation . Это работает, поскольку используемый по умолчанию метод аутентификации для пользователя MariaDB с правами администратора — unix_socket , а не пароль . Хотя это может выглядеть как проблема безопасности, это делает сервер БД более безопасным, поскольку вход с правами root в MySQL доступен только системным пользователям с привилегиями sudo, которые подключаются через консоль или через приложение с тем же уровнем прав. На практике это означает, что вы не сможете использовать пользователя root базы данных с правами администратора для подключения из вашего приложения PHP. Настройка пароля учетной записи root MySQL работает как гарантия, если метод аутентификации по умолчанию меняется с unix_socket на password .
Для дополнительной безопасности рекомендуется иметь специальные учетные записи пользователей с менее обширными привилегиями, особенно если вы планируете использовать несколько баз данных на сервере.
Примечание. На момент написания этого руководства родная библиотека MySQL PHP mysqlnd не поддерживает caching_sha2_authentication , метод аутентификации MySQL 8 по умолчанию. Поэтому при создании пользователей базы данных для приложений PHP на MySQL 8 вам нужно убедиться, что они настроены на использование вместо этого пароля mysql_native_password . Мы расскажем, как это сделать в Шаге 6.
Теперь ваш сервер MySQL установлен и защищен. Далее мы выполним установку PHP, последнего компонента набора LAMP.
Шаг 3 — Установка PHP
Мы установили Apache для обслуживания вашего контента и MySQL для хранения и управления вашими данными. PHP — это элемент нашей настройки, который будет обрабатывать код для отображения динамического контента конечному пользователю. Помимо пакета php вам потребуется php-mysql , модуль PHP, который позволяет PHP взаимодействовать с базами данных MySQL. Также вам потребуется libapache2-mod-php для активации Apache для обработки файлов PHP. Ключевые пакеты PHP автоматически будут установлены в качестве зависимостей.
Чтобы установить эти пакеты, выполните команду:
После завершения установки вы можете использовать следующую команду для подтверждения вашей версии PHP:
OutputPHP 7.4.3 (cli) (built: Mar 26 2020 20:24:23) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
Теперь комплект LAMP полностью работоспособен. Однако, прежде чем тестировать настройку с помощью скрипта PHP, лучше всего настроить виртуальный хост Apache для хранения файлов и папок вашего сайта. Мы сделаем это на следующем шаге.
Шаг 4 — Создание виртуального хоста для сайта
При использовании веб-сервера Apache вы можете создать виртуальные хосты (аналогичные серверным блокам в Nginx) для инкапсуляции данных конфигурации и размещения на одном сервере нескольких доменов. Мы настроим домен your_domain, но вы должны заменить это имя собственным доменным именем.
Примечание. Если вы используете DigitalOcean в качестве провайдера хостинга DNS, вы можете изучить нашу документацию для продукта для получения подробных инструкций по настройке нового доменного имени и указать ваш сервер.
В Apache в Ubuntu 20.04 по умолчанию включен один серверный блок, настроенный на обслуживание документов из директории /var/www/html . Хотя это хорошо работает для отдельного сайта, при хостинге нескольких сайтов это неудобно. Вместо изменения /var/www/html мы создадим внутри /var/www структуру каталогов для нашего сайта your_domain, оставив /var/www/html в качестве каталога по умолчанию для вывода в случае, если запросу клиента не соответствуют никакие другие сайты.
Создайте следующий каталог для your_domain:
Затем необходимо назначить права владения для директории с помощью переменной среды $USER , которая будет использоваться для текущего системного пользователя:
После этого откройте новый файл конфигурации в директории Apache sites-available с помощью любого редактора командной строки. Мы будем использовать nano :
В результате будет создан новый пустой файл. Вставьте следующую пустую конфигурацию:
/etc/apache2/sites-available/your_domain.conf
ServerName your_domain ServerAlias www.your_domain ServerAdmin webmaster@localhost DocumentRoot /var/www/your_domain ErrorLog $/error.log CustomLog $/access.log combined
Эта конфигурация VirtualHost указывает Apache обслуживать your_domain , используя /var/www/ your_domain в качестве корневого каталога. Если вы хотите протестировать Apache без доменного имени, вы можете удалить или закомментировать опции ServerName и ServerAlias , добавляя символ # в начале строк опций.
Теперь вы можете использовать a2ensite для активации нового виртуального хоста:
Возможно, вы захотите отключить сайт по умолчанию, устанавливаемый с Apache. Это требуется, если вы не используете собственное доменное имя, поскольку в таком случае конфигурация Apache по умолчанию перезаписывает ваш виртуальный хост. Чтобы отключить сайт Apache по умолчанию, введите следующую команду:
Чтобы убедиться в отсутствии ошибок синтаксиса в вашем файле конфигурации, выполните команду:
В заключение перезагрузите Apache, чтобы эти изменения вступили в силу:
Теперь ваш новый сайт активен, но корневой веб-каталог /var/www/ your_domain все еще пуст. Создайте файл index.html в этом расположении, чтобы убедиться, что виртуальный хост работает, как ожидалось:
Внесите в файл следующее:
/var/www/your_domain/index.html
It works!
This is the landing page of your_domain.
Откройте браузер и введите в адресную строку доменное имя вашего сервера или IP-адрес:
http://server_domain_or_IP
Страница будет выглядеть следующим образом:

Если вы видите эту страницу, это означает, что виртуальный хост Apache работает, как и ожидалось.
Вы можете оставить этот файл в качестве временной начальной страницы для вашего приложения, пока не настроите файл index.php для его замены. Как только вы сделаете это, не забудьте удалить или переименовать файл index.html из корневого каталога документов, так как он будет иметь приоритет перед файлом index.php по умолчанию.
Примечание о DirectoryIndex в Apache
Если в Apache используются настройки DirectoryIndex по умолчанию, файл index.html всегда будет иметь приоритет по сравнению файлом index.php . Это полезно при настройке страниц техобслуживания приложений PHP посредством создания временного файла index.html с информационным сообщением для посетителей. Поскольку эта страница будет иметь приоритет перед страницей index.php , она станет начальной страницей приложения. После завершения обслуживания файл index.html можно переименовать или удалить из корневого каталога документов, в результате чего восстановится обычная начальная страница приложения.
Если вы хотите изменить это поведение, отредактируйте файл /etc/apache2/mods-enabled/dir.conf и измените порядковое расположение файла index.php в директиве DirectoryIndex :
/etc/apache2/mods-enabled/dir.conf
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
После сохранения и закрытия файла вам нужно будет перезагрузить Apache, чтобы изменения вступили в силу:
На следующем шаге мы создадим скрипт PHP для тестирования правильности установки и настройки PHP на вашем сервере.
Шаг 5 — Тестирование обработки PHP на веб-сервере
Мы указали персонализированное расположение для хостинга файлов и папок сайта и теперь можем создать тестовый скрипт PHP, чтобы подтвердить способность Apache обрабатывать запросы для файлов PHP.
Создайте новый файл с именем info.php в корневой папке сайта:
В результате откроется пустой файл. Вставьте в файл следующий код PHP:
/var/www/your_domain/info.php
phpinfo();
После завершения редактирования сохраните и закройте файл.
Чтобы протестировать этот скрипт, откройте браузер и введите доменное имя или IP-адрес вашего сервера, а затем название скрипта, в данном случае info.php :
http://server_domain_or_IP/info.php
Вы увидите приблизительно следующую страницу:

На этой странице содержится информация о вашем сервере с точки зрения PHP. Эта информация полезна для отладки и обеспечения правильного применения настроек.
Если вы видите эту страницу в своем браузере, ваша система PHP работает надлежащим образом.
После проверки соответствующей информации о вашем сервере PHP с помощью данной страницы рекомендуется удалить созданный вами файл, поскольку он содержит конфиденциальную информацию о вашей среде PHP и о вашем сервере Ubuntu. Для этого можно использовать rm :
Если впоследствии вам снова потребуется эта информация, вы всегда можете воссоздать эту страницу.
Шаг 6 — Тестирование подключения к базе данных для PHP (необязательно)
Если вы хотите проверить, может ли PHP подключаться к MySQL и выполнять запросы для базы данных, вы можете создать тестовую таблицу с шаблонными данными и запрашивать ее содержимое из скрипта PHP. Прежде чем сделать это, нам нужно создать тестовую базу данных и нового пользователя MySQL с правильной настройкой для доступа к ней.
На момент написания этого руководства родная библиотека MySQL PHP mysqlnd не поддерживает caching_sha2_authentication , метод аутентификации по умолчанию для MySQL 8. Мы должны создать нового пользователя с помощью метода аутентификации mysql_native_password для подключения к базе данных MySQL из PHP.
Мы создадим базу данных с именем example_database и пользователя с именем example_user, но вы можете использовать и другие имена.
Вначале необходимо подключиться к консоли MySQL с помощью учетной записи root:
Чтобы создать новую базу данных, запустите следующую команду в консоли MySQL:
Теперь вы можете создать нового пользователя и предоставить ему полный набор прав для только что созданной вами базы данных.
Следующая команда создает нового пользователя с именем example_user , используя mysql_native_password в качестве метода аутентификации по умолчанию. Следующая команда определяет пароль этого пользователя как password , но вы можете заменить его на безопасный пароль по вашему выбору.
Теперь нам нужно предоставить этому пользователю разрешение для базы данных example_database :
В результате пользователь example_user получит полный набор привилегий для базы данных example_database, но не будет обладать возможностью создания или изменения других баз данных на сервере.
Теперь закройте оболочку MySQL:
Вы можете проверить наличие у нового пользователя необходимых разрешений, выполнив повторный вход в консоль MySQL, на этот раз используя учетные данные вашего собственного пользователя:
Обратите внимание на флаг -p в этой команде, который будет запрашивать пароль, который вы задаете при создании пользователя example_user. После входа в консоль MySQL убедитесь, что у вас есть доступ к базе данных example_database:
Результат будет выглядеть следующим образом:
Output+--------------------+ | Database | +--------------------+ | example_database | | information_schema | +--------------------+ 2 rows in set (0.000 sec)
Далее мы создадим тестовую таблицу с именем todo_list. Из консоли MySQL запустите следующее выражение:
Теперь добавьте несколько строк содержимого в тестовую таблицу. Возможно, вам потребуется несколько раз повторить следующую команду, используя разные значения:
Чтобы подтвердить, что данные были успешно сохранены в таблицу, запустите следующую команду:
Вывод должен выглядеть так:
Output+---------+--------------------------+ | item_id | content | +---------+--------------------------+ | 1 | My first important item | | 2 | My second important item | | 3 | My third important item | | 4 | and this one more thing | +---------+--------------------------+ 4 rows in set (0.000 sec)
Убедившись в том, что у вас есть надлежащие данные в тестовой таблице, вы можете закрыть консоль MySQL:
Теперь вы можете создать скрипт PHP, который будет подключаться к MySQL и запрашивать ваше содержимое. Создайте новый файл PHP в пользовательской корневой веб-директории в предпочитаемом вами редакторе. Мы будем использовать nano :
Следующий скрипт PHP подключается к базе данных MySQL и запросам по содержимому таблицы todo_list, выводя результаты в список. Если существует проблема подключения к базе данных, будет выдана ошибка. Скопируйте это содержимое в скрипт todo_list.php :
/var/www/your_domain/todo_list.php
Сохраните и закройте файл после завершения редактирования.
Теперь вы можете получить доступ к этой странице в браузере, посетив доменное имя или публичный IP-адрес, настроенный для вашего сайта. После этого введите /todo_list.php :
http://your_domain/todo_list.php
Вы должны увидеть примерно следующую страницу, отображающую содержимое, которое вы добавили в тестовую таблицу:

Это означает, что ваша среда PHP готова к подключению и взаимодействию с вашим сервером MySQL.
Заключение
С помощью этого руководства мы создали гибкую основу для обслуживания веб-сайтов PHP и приложений для ваших посетителей, используя Apache в качестве веб-сервера и MySQL в качестве СУБД.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
Linux 24 Рекомендации по безопасности PHP для системных администраторов

PHP — это язык сценариев на стороне сервера с открытым исходным кодом, и он широко используется. Веб-сервер Apache / Nginx / Lighttpd обеспечивает доступ к файлам и контенту по протоколу HTTP ИЛИ HTTPS. Неправильно настроенный язык сценариев на стороне сервера может создавать всевозможные проблемы. Таким образом, PHP следует использовать с осторожностью. Вот двадцать четыре лучших практики безопасности php для системных администраторов Linux и Unix для безопасной настройки PHP.
Лучшие практики по безопасности PHP
Наш образец настройки для дальнейшей работы:
Веб-сервер по умолчанию: Apache (вместо Apache можно использовать Lighttpd или Nginx)
Файл конфигурации PHP по умолчанию: /etc/php.ini или /etc/php/7.0/fpm/php.ini
Каталог конфигурации расширений PHP по умолчанию: /etc/php.d/ или /etc/php/7.0/fpm/conf.d/
Наш пример файла конфигурации безопасности php: /etc/php.d/security.ini или /etc/php/7.0/fpm/conf.d/99-security.conf (вам нужно создать этот файл с помощью текстового редактора)
Операционные системы: RHEL/CentOS/Fedora Linux (инструкции должны работать с любыми другими дистрибутивами Linux, такими как Debian/Ubuntu или другими Unix-подобными операционными системами, такими как OpenBSD/FreeBSD/HP-UX).
Порты TCP/UDP по умолчанию сервера PHP: нет
Большинство действий, перечисленных в этом посте, написаны с предположением, что они будут выполняться пользователем root, запускающим bash или любую другую современную оболочку:
$ php -v
Пример результат вывода:
PHP 5.3.3 (cli) (built: Oct 24 2011 08:35:41) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
PHP 7.3.7 (cli) (built: Jul 8 2019 09:58:12) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.7, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.3.7, Copyright (c) 1999-2018, by Zend Technologies
В демонстрационных целях я собираюсь использовать следующую операционную систему:
$ cat /etc/redhat-release
Пример результат вывода:
Red Hat Enterprise Linux Server release 6.1 (Santiago)
1. Знай своего врага
Приложения на основе PHP могут сталкиваться с различными типами атак. Я заметил разные типы атак:
1. XSS – межсайтовый скриптинг — это уязвимость в веб-приложениях php, которую злоумышленники могут использовать для кражи информации пользователей. Вы можете настроить Apache и написать более безопасные сценарии PHP (проверяющие все вводимые пользователем данные), чтобы избежать атак xss.
2. SQL injection – это уязвимость на уровне базы данных приложения php. Если пользовательский ввод неправильно отфильтрован, приложение может выполнять любые операторы SQL. Вы можете настроить Apache и написать безопасный код (проверяющий и избегающий всех вводимых пользователем данных), чтобы избежать атак SQL-инъекций. Обычной практикой в ??PHP является экранирование параметров с помощью функции mysql_real_escape_string ()перед отправкой запроса SQL.
Spoofing.
3. Загрузка файлов — позволяет посетителю размещать файлы (загружать файлы) на ваш сервер. Это может привести к различным проблемам с безопасностью, таким как удаление ваших файлов, удаление базы данных, получение сведений о пользователе и многое другое. Вы можете отключить загрузку файлов с помощью php или написать безопасный код (например, проверить ввод данных пользователем и разрешить только файлы изображений, такие как png или gif)
4. Including локальные и удаленные файлы — Злоумышленник может открывать файлы с удаленного сервера и выполнять любой PHP-код. Это позволяет им загружать файл, удалять файл и устанавливать бэкдоры. Вы можете настроить php для отключения удаленного выполнения файла.
5. eval() — оценивает строку как код PHP. Это часто используется злоумышленниками, чтобы скрыть свой код и инструменты на самом сервере. Вы можете настроить php, чтобы отключить eval().
6. Sea-surf Attack (подделка межсайтовых запросов — CSRF) – эта атака вынуждает конечного пользователя выполнять нежелательные действия в веб-приложении, в котором он / она в настоящее время аутентифицирован. Успешный эксплойт CSRF может поставить под угрозу данные и работу конечного пользователя в случае обычного пользователя. Если целевой конечный пользователь является учетной записью администратора, это может поставить под угрозу все веб-приложение.
2. Найдите встроенные модули PHP
Чтобы увидеть набор встроенных модулей PHP, введите следующую команду:
# php -m
[PHP Modules] apc bcmath bz2 calendar Core ctype curl date dom ereg exif fileinfo filter ftp gd gettext gmp hash iconv imap json libxml mbstring memcache mysqli openssl pcntl pcre PDO pdo_mysql pdo_sqlite Phar readline Reflection session shmop SimpleXML sockets SPL sqlite3 standard tokenizer wddx xml xmlreader xmlrpc xmlwriter xsl zip zlib
Я рекомендую вам использовать PHP с сокращенным количеством модулей для повышения производительности и безопасности. Например, вы можете отключить модуль sqlite3, удалив (удалив) файл конфигурации, или переименовав (переместив) файл с именем /etc/php.d/sqlite3.ini следующим образом:
# rm /etc/php.d/sqlite3.ini
Другие скомпилированные модули можно удалить только путем переустановки PHP с уменьшенной конфигурацией. Вы можете загрузить исходный код php с php.net и скомпилировать его с поддержкой GD, fastcgi и MySQL следующим образом:
# mv /etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disable
./configure --with-libdir=lib64 --with-gd --with-mysql --prefix=/usr --exec-prefix=/usr \ --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share \ --includedir=/usr/include --libexecdir=/usr/libexec --localstatedir=/var \ --sharedstatedir=/usr/com --mandir=/usr/share/man --infodir=/usr/share/info \ --cache-file=../config.cache --with-config-file-path=/etc \ --with-config-file-scan-dir=/etc/php.d --enable-fastcgi \ --enable-force-cgi-redirect
Узнайте, как скомпилировать и переустановить php в Unix, например в операционной системе, для получения дополнительной информации.
3. Ограничьте утечку информации PHP
Чтобы ограничить утечку информации PHP, отключите expose_php. Отредактируйте /etc/php.d/cuity.ini и установите следующую директиву:
expose_php=Off
Когда включено, expose_php вы сообщаете миру, что PHP установлен на сервере, включая версию PHP в заголовке HTTP (например, X-Powered-By: PHP / 7.3.1). Также отображаются идентификаторы логотипа PHP, поэтому добавление их к URL-адресу сайта с поддержкой PHP приведет к отображению соответствующего логотипа. Когда expose_php включен, вы можете увидеть версию php, используя следующую команду:
$ curl -I https://www.example.com/index.php
HTTP/1.1 200 OK X-Powered-By: PHP/5.3.3 Content-type: text/html; charset=UTF-8 Vary: Accept-Encoding, Cookie X-Vary-Options: Accept-Encoding;list-contains=gzip,Cookie;string-contains=wikiToken;string-contains=wikiLoggedOut;string-contains=wiki_session Last-Modified: Thu, 03 Nov 2011 22:32:55 GMT
Я также рекомендую вам настроить директивы ServerTokens и ServerSignature в httpd.conf, чтобы скрыть версию Apache и скрыть версию PHP 5/7 при использовании Nginx.
4. Минимизируйте загружаемые модули PHP (динамические расширения)
PHP поддерживает «Динамические расширения». По умолчанию RHEL загружает все модули расширения, находящиеся в каталоге /etc/php.d/.Чтобы включить или отключить конкретный модуль, просто найдите файл конфигурации в каталоге /etc/php.d/ и закомментируйте имя модуля. Вы также можете переименовать или удалить файл конфигурации модуля. Для лучшей производительности и безопасности PHP вам следует включать только те расширения, которые требуются вашим веб-приложениям. Например, чтобы отключить расширение gd, введите следующие команды:
# cd /etc/php.d/ # mv gd. # /sbin/service httpd restart
Чтобы включить модуль php с именем gd, введите:
# mv gd. # /sbin/service httpd restart
5. Регистрировать все ошибки PHP
Не показывайте сообщения об ошибках PHP всем посетителям сайта. Отредактируйте /etc/php.d/security.ini и установите следующую директиву:
display_errors=Off
Убедитесь, что вы записываете все ошибки php в файл журнала:
log_errors = On error_log=/var/log/httpd/php_scripts_error.log
6. Запретить загрузку файлов
Отредактируйте /etc/php.d/security.ini и установите следующую директиву, чтобы отключить загрузку файлов по соображениям безопасности:
file_uploads=Off
Если пользователям вашего приложения необходимо загружать файлы, включите эту функцию, установив параметр upload_max_filesize, ограничивающий максимальный размер файлов, которые PHP будет принимать при загрузке:
file_uploads=On # user can only upload upto 1MB via php upload_max_filesize=1M
7. Отключите удаленное выполнение кода
Если включено, allow_url_fopen позволяет файловым функциям PHP, таким как file_get_contents() и операторам include и require, получать данные из удаленных мест, таких как FTP или веб-сайт.
Программисты часто забывают об этом и не выполняют надлежащую фильтрацию ввода при передаче данных, предоставленных пользователем, этим функциям, что делает их уязвимыми для внедрения кода. Большое количество уязвимостей, связанных с внедрением кода, о которых сообщается в веб-приложениях на основе PHP, вызвано сочетанием включения allow_url_fopen и плохой фильтрации ввода. Отредактируйте /etc/php.d/security.ini и установите следующую директиву:
allow_url_fopen=Off
Также рекомендую отключить allow_url_include из соображений безопасности:
allow_url_include=Off
8. Контроль размера POST
Метод запроса HTTP POST используется, когда клиенту (браузеру или пользователю) необходимо отправить данные на веб-сервер Apache как часть запроса, например, при загрузке файла или отправке заполненной формы. Злоумышленники могут попытаться отправить POST-запросы большого размера, чтобы съесть ресурсы вашей системы. Вы можете ограничить максимальный размер POST-запроса, который будет обрабатывать PHP. Отредактируйте /etc/php.d/security.ini и установите следующую директиву:
; Set a realistic value here post_max_size=1K
1K устанавливает максимальный размер данных публикации, разрешенный приложениям php. Этот параметр также влияет на загрузку файлов. Для загрузки больших файлов это значение должно быть больше, чем upload_max_filesize. Я также предлагаю вам ограничить доступные методы с помощью веб-сервера Apache. Отредактируйте httpd.conf и установите следующую директиву для DocumentRoot /var/www/html:
Order allow,deny ## Add rest of the config goes here. ##
9. Контроль ресурсов (DoS Control)
Вы можете установить максимальное время выполнения каждого скрипта php в секундах. Другой рекомендуемый вариант — установить максимальное количество времени, в течение которого каждый сценарий может тратить на анализ данных запроса, и максимальный объем памяти, который может потреблять сценарий. Отредактируйте /etc/php.d/security.ini и установите следующие директивы:
# set in seconds max_execution_time = 30 max_input_time = 30 memory_limit = 40M
10. Отключение опасных функций PHP
PHP имеет множество функций, которые можно использовать для взлома вашего сервера, если они используются неправильно. Вы можете установить список функций в /etc/php.d/security.ini с помощью директивы disable_functions:
disable_functions=exec,passthru,shell_exec,system,proc_open, popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
11. Директива PHP Fastcgi / CGI – cgi.force_redirect
PHP работает с FastCGI. Fascgi сокращает объем памяти, занимаемый вашим веб-сервером, но по-прежнему дает вам скорость и мощность всего языка PHP. Вы можете настроить Apache2 + PHP + FastCGI или cgi, как описано здесь. Директива конфигурации cgi.force_redirect запрещает кому-либо вызывать PHP напрямую с URL-адресом, например http://www.example.com/cgi-bin/php/hackerdir/backdoor.php. Включите cgi.force_redirect из соображений безопасности. Отредактируйте /etc/php.d/security.ini и установите следующую директиву:
; Enable cgi.force_redirect for security reasons in a typical *Apache+PHP-CGI/FastCGI* setup cgi.force_redirect=On
12. Пользователь PHP и идентификатор группы
mod_fastcgi — это cgi-модуль для веб-сервера Apache. Он может подключаться к внешнему серверу FASTCGI. Вам необходимо убедиться, что php запускается как пользователь без полномочий root. Если PHP выполняется как root или UID ниже 100, он может обращаться к системным файлам и / или манипулировать ими. Вы должны выполнять PHP CGI от имени непривилегированного пользователя, используя suEXEC или mod_suPHP Apache. Функция suEXEC предоставляет пользователям Apache возможность запускать программы CGI под идентификаторами пользователя, отличными от идентификатора пользователя вызывающего веб-сервера. В этом примере мой php-cgi работает как пользователь phpcgi, а apache работает как пользователь apache:
# ps aux | grep php-cgi
Вы можете использовать такой инструмент, как spawn-fcgi, для создания удаленных и локальных процессов FastCGI в качестве пользователя phpcgi (сначала добавьте пользователя phpcgi в систему):
# spawn-fcgi -a 127.0.0.1 -p 9000 -u phpcgi -g phpcgi -f /usr/bin/php-cgi
теперь вы можете настроить веб-сервер Apache, Lighttpd и Nginx для использования внешнего php FastCGI, работающего на порт 9000 с IP-адресом 127.0.0.1.
13. Ограничьте доступ PHP к файловой системе
Директива open_basedir устанавливает каталоги, из которых PHP разрешен доступ к файлам, используя такие функции, как fopen() и другие. Если файл находится за пределами путей, определенных open_basdir, PHP откажется его открыть. Вы не можете использовать символическую ссылку в качестве временного решения. Например, разрешить доступ только к каталогу /var/www/html, но не к каталогам /var/www, /tmp или /etc:
; Limits the PHP process from accessing files outside ; of specifically designated directories such as /var/www/html/ open_basedir="/var/www/html/" ; ------------------------------------ ; Multiple dirs example ; open_basedir="/home/httpd/vhost/example.com/html/:/home/httpd/vhost/nixcraft.com/html/:/home/httpd/vhost/theos.in/html/" ; ------------------------------------
14. Путь сессий
Поддержка сессий в PHP заключается в способе сохранения определенных данных при последующих доступах. Это позволяет вам создавать более индивидуальные приложения и повышать привлекательность вашего веб-сайта. Этот путь определен в файле /etc/php.ini, и все данные, относящиеся к конкретному сеансу, будут храниться в файле в каталоге, указанном параметром session.save_path. По умолчанию в RHEL/CentOS/Fedora Linux установлено следующее:
session.save_path="/var/lib/php/session" ; Set the temporary directory used for storing files when doing file upload upload_tmp_dir="/var/lib/php/session"
Убедитесь, что путь находится за пределами /var/www/html и не доступен для чтения или записи другими пользователями системы:
# ls -Z /var/lib/php/
drwxrwx---. root apache system_u:object_r:httpd_var_run_t:s0 session
Примечание. Параметр -Z команды ls отображает контекст безопасности SELinux, такой как режим файла, пользователь, группа, контекст безопасности и имя файла.
15. Своевременно обновляйте PHP, программное обеспечение и ОС
Применение исправлений безопасности — важная часть поддержки серверов Linux, Apache, PHP и MySQL. Все обновления безопасности php должны быть проверены и применены как можно скорее с помощью любого из следующих инструментов (если вы устанавливаете PHP через диспетчер пакетов): или Вы можете настроить Red Hat/CentOS/Fedora Linux для отправки уведомления об обновлении пакета yum по электронной почте. Другой вариант — применить все обновления безопасности через задание cron. В Debian/UbuntuLinux вы можете использовать apticron для отправки уведомлений безопасности.
# yum update
# apt-get update && apt-get upgrade
16. Ограничение доступа к файлам и каталогам
Убедитесь, что вы запускаете Apache как пользователь без полномочий root, например Apache или www. Все файлы и каталог должны принадлежать пользователю без полномочий root (или пользователю apache) в /var/www/html: /var/www/html/ — это подкаталог, а DocumentRoot может быть изменен другими пользователями, поскольку root никогда не выполняет никаких файлов там.
# chown -R apache:apache /var/www/html/
Убедитесь, что права доступа к файлам установлены на 0444 (только для чтения) в /var/www/html/:
# chmod -R 0444 /var/www/html/
Убедитесь, что все права доступа к каталогам установлены на 0445 в /var/www/html/:
# find /var/www/html/ -type d -print0 | xargs -0 -I <> chmod 0445 <>
Примечание о настройке правильных разрешений для файлов
Команды chown и chmod гарантируют, что ни при каких обстоятельствах DocumentRoot или файлы, содержащиеся в DocumentRoot, не будут доступны для записи пользователю веб-сервера apache. Обратите внимание, что вам нужно установить разрешения, которые наиболее подходят для модели разработки вашего веб-сайта, поэтому не стесняйтесь настраивать команды chown и chmod в соответствии с вашими требованиями. В этом примере сервер Apache запущен как пользователь apache. Это настраивается с помощью директив User и Group в вашем файле httpd.conf. Пользователь apache должен иметь доступ для чтения ко всему, что находится под DocumentRoot, но не должен иметь доступа для записи ни к чему.
Убедитесь, что httpd.conf имеет следующие директивы для ограничительной конфигурации:
Options None AllowOverride None Order allow,deny
Вы должны предоставлять доступ на запись только при необходимости. Некоторым веб-приложениям, таким как wordpress и другим, может потребоваться каталог кеширования. Вы можете предоставить доступ на запись в каталог кеширования, используя следующие команды:
# chmod a+w /var/www/html/blog/wp-content/cache ### block access to all ### # echo 'deny from all' > /var/www/html/blog/wp-content/cache/.htaccess
17. Защита от записи файлов конфигурации Apache, PHP и MySQL.
Используйте команду chattr для записи файлов конфигурации защиты:
# chattr +i /etc/php.ini # chattr +i /etc/php.d/* # chattr +i /etc/my.ini # chattr +i /etc/httpd/conf/httpd.conf # chattr +i /etc/
Команда chattr также может защитить ваш php файл или файлы в каталоге /var/www/html:
# chattr +i /var/www/html/file1.php # chattr +i /var/www/html/
18. Используйте расширения безопасности Linux (например, SELinux).
Linux поставляется с различными патчами безопасности, которые можно использовать для защиты от неправильно настроенных или скомпрометированных серверных программ. Если возможно, используйте SELinux и другие расширения безопасности Linux, чтобы наложить ограничения на сеть и другие программы. Например, SELinux предоставляет множество политик безопасности для ядра Linux и веб-сервера Apache. Чтобы вывести список всех переменных защиты Apache SELinux, введите:
# getsebool -a | grep httpd
allow_httpd_sys_script_anon_write --> off httpd_builtin_scripting --> on httpd_can_check_spam --> off httpd_can_network_connect --> off httpd_can_network_connect_cobbler --> off httpd_can_network_connect_db --> off httpd_can_network_memcache --> off httpd_can_network_relay --> off httpd_can_sendmail --> off httpd_dbus_avahi --> on httpd_enable_cgi --> on httpd_enable_ftp_server --> off httpd_enable_homedirs --> off httpd_execmem --> off httpd_read_user_content --> off httpd_setrlimit --> off httpd_ssi_exec --> off httpd_tmp_exec --> off httpd_tty_comm --> on httpd_unified --> on httpd_use_cifs --> off httpd_use_gpg --> off httpd_use_nfs --> off
Чтобы отключить поддержку Apache cgi, введите:
# setsebool -P httpd_enable_cgi off
19. Установите Mod_security
ModSecurity — это механизм обнаружения и предотвращения вторжений с открытым исходным кодом для веб-приложений. Вы можете легко установить mod_security под Linux и защитить приложения на основе apache и php от xss и различных других атак:
## Examples ## # Do not allow to open files in /etc/ SecFilter /etc/ # Stop SQL injection SecFilter "delete[[:space:]]+from" SecFilter "select.+from"
20. Если возможно, запустите Apache / PHP в Chroot Jail
Помещение PHP и / или Apache в chroot jail сводит к минимуму ущерб, наносимый потенциальным взломом, за счет изоляции веб-сервера от небольшого раздела файловой системы. Вы можете использовать традиционный способ настройки chroot с Apache. Тем не менее, я рекомендую FreeBSD Jail, XEN виртуализацию, KVM виртуализацию или OpenVZ виртуализацию или Docker которые используют концепцию контейнеров.
21. Используйте брандмауэр для ограничения исходящих подключений
Злоумышленник загрузит файл локально на ваш веб-сервер с помощью таких инструментов, как wget. Используйте iptables, чтобы заблокировать исходящие соединения от пользователя apache. Модуль ipt_owner пытается сопоставить различные характеристики создателя пакетов для локально сгенерированных пакетов. Он действителен только в цепочке OUTPUT. В этом примере разрешите пользователю user подключаться снаружи через порт 80 (полезно для доступа к репо RHN или centos)
/sbin/iptables -A OUTPUT -o eth0 -m owner --uid-owner user -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
Вот еще один пример, который блокирует все исходящие подключения от пользователя apache, кроме нашего собственного smtp-сервера и службы API проверки спама
# . /sbin/iptables --new-chain apache_user /sbin/iptables --append OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT /sbin/iptables --append OUTPUT -m owner --uid-owner apache -j apache_user # allow apache user to connec to our smtp server /sbin/iptables --append apache_user -p tcp --syn -d 192.168.1.100 --dport 25 -j RETURN # Allow apache user to connec to api server for spam validation /sbin/iptables --append apache_user -p tcp --syn -d 66.135.58.62 --dport 80 -j RETURN /sbin/iptables --append apache_user -p tcp --syn -d 66.135.58.61 --dport 80 -j RETURN /sbin/iptables --append apache_user -p tcp --syn -d 72.233.69.89 --dport 80 -j RETURN /sbin/iptables --append apache_user -p tcp --syn -d 72.233.69.88 --dport 80 -j RETURN ######################### ## Add more rules here ## ######################### # No editing below # Drop everything for apache outgoing connection /sbin/iptables --append apache_user -j REJECT
Узнайте, как настроить брандмауэр UFW на сервере Ubuntu 20 для получения дополнительной информации.
22. Следите за своими журналами и аудитом
Проверьте файл журнала apache. Используйте команду grep /egrep:
# tail -f /var/log/httpd/error_log # grep 'login.php' /var/log/httpd/error_log # egrep -i "denied|error|warn" /var/log/httpd/error_log
проверьте файл журнала php:
# tail -f /var/log/httpd/php_scripts_error.log # grep ". etc/passwd" /var/log/httpd/php_scripts_error.log
Просмотр файлов журнала — хорошая практика безопасности php. Файлы журналов дадут вам некоторое представление о том, какие атаки совершаются на сервер, и позволят вам проверить, присутствует ли необходимый уровень безопасности или нет. Услуга auditd предназначена для системного аудита. Включите его, чтобы контролировать события SELinux, события аутентификации, модификации файлов, модификации учетной записи и т. д. Я также рекомендую использовать стандартные «Инструменты мониторинга системы Linux» для мониторинга вашего веб-сервера.
23. Запуск службы для каждой системы или экземпляра виртуальной машины.
Для больших проектов рекомендуется запускать базу данных, статический и динамический контент с разных серверов.
Запускайте разные сетевые службы на отдельных серверах или экземплярах виртуальных машин. Это ограничивает количество других сервисов, которые могут быть скомпрометированы. Например, если злоумышленник сможет успешно использовать программное обеспечение, такое как поток Apache, он /она получит доступ ко всему серверу, включая другие службы, работающие на том же сервере (например, MySQL, сервер электронной почты и т. д.). Но в приведенном выше примере контент обслуживается следующим образом
static.lan.example.com — используйте сервер lighttpd или nginx для статических ресурсов, таких как js/css/images.
- phpcgi1.lan.example.com и phpcgi2.lan.example.com — веб-сервер Apache с php, используемый для генерации динамического контента.
- mysql1.lan.example.com — сервер базы данных MySQL.
- mcache1.lan.example.com — Сервер Memcached — это очень быстрая система кеширования для MySQL. Он использует libevent или epoll (среда выполнения Linux) для масштабирования до любого количества открытых подключений и использует неблокирующий сетевой ввод-вывод.
- LB01 — веб-сервер nginx и обратный прокси-сервер перед веб-серверами Apache. Все соединения, поступающие из Интернета и адресованные одному из веб-серверов, маршрутизируются через прокси-сервер nginx, который может либо обрабатывать сам запрос, либо передавать его полностью или частично на основные веб-серверы. LB01 обеспечивает простую балансировку нагрузки.
24. Дополнительные инструменты
Со страницы проекта:
PHPIDS (PHP-система обнаружения вторжений) — это простой в использовании, хорошо структурированный, быстрый и современный уровень безопасности для вашего веб-приложения на основе PHP. IDS не удаляет, не дезинфицирует и не фильтрует вредоносный ввод, она просто распознает, когда злоумышленник пытается взломать ваш сайт, и реагирует именно так, как вы этого хотите.
Вы можете использовать PHPIDS для обнаружения злоумышленников и регистрации любых обнаруженных атак для последующего просмотра. Обратите внимание, что я лично не использовал этот инструмент.
Со страницы проекта:
PhpSecInfo предоставляет эквивалент функции phpinfo(), которая сообщает информацию о безопасности среды PHP и предлагает предложения по улучшению. Это не замена безопасным методам разработки и не выполняет какой-либо аудит кода или приложений, но может быть полезным инструментом в многоуровневом подходе к безопасности.
Используйте статические анализаторы кода такие как Psalm или PHPStan. С их помощь, можно найти множество проблем в своем коде,
Со страницы проекта:
Псалом помогает людям поддерживать самые разные кодовые базы — большие и маленькие, древние и современные. При самой строгой настройке он может помочь вам предотвратить почти все ошибки времени выполнения, связанные с типом, и позволяет вам воспользоваться безопасными шаблонами кодирования, популярными на других языках.
Psalm также может автоматически исправлять ошибки, позволяя вам улучшить свой код, не беспокоясь о нем.
Примечание о бэкдорах PHP
Вы можете встретить скрипты php или так называемые общие бэкдоры, такие как c99, c99madshell, r57 и так далее. Скрипт backdoor php — это не что иное, как скрытый скрипт для обхода всей аутентификации и доступа к вашему серверу по запросу. Он устанавливается злоумышленниками для доступа к вашему серверу, пытаясь остаться незамеченным. Обычно сценарий PHP (или любого другого сценария CGI) по ошибке позволяет включить код, использующий уязвимости в веб-браузере. Злоумышленник может использовать такие уязвимости для загрузки оболочек бэкдора, которые могут дать ему или ей ряд возможностей, таких как:
Установите почтовые серверы для спама / сервер ретрансляции
Установите прокси-сервер, чтобы скрыть треки
Возьмите под свой контроль сервер
Возьмите под свой контроль сервер базы данных
Украсть всю информацию
Удалить всю информацию и базу данных
Открытые порты TCP / UDP и многое другое
Совет: как искать бэкдоры PHP?
Используйте команду grep в Unix / Linux для поиска оболочки c99 или r57:
# grep -iR 'c99' /var/www/html/ # grep -iR 'r57' /var/www/html/ # find /var/www/html/ -name \*.php -type f -print0 | xargs -0 grep c99 # grep -RPn "(passthru|shell_exec|system|base64_decode|fopen|fclose|eval)" /var/www/html/
Заключение
Ваш сервер на базе PHP теперь должным образом усилен и готов к отображению динамических веб-страниц. Однако уязвимости в основном вызваны несоблюдением передовых правил программирования и недостаточным тестированием приложений.
Надеюсь наш список основных советов по безопасности PHP, которые может применять системный администратор Linux будет полезен для Вас.
Кстати на нашем виртуальном UNIX хостинге используется WAF файрвол для защиты сайтов, есть возможность управления модулями PHP, можно настроить дополнительную защиту административной части сайта, получать ежедневные отчеты про измененные файлы, управлять правами доступа к файлам (через ssh, FTP клиент, WEB-интерфейс), настраивать опции PHP и многое другое.
Есть какие-нибудь другие рекомендации по безопасности PHP?
Дайте нам знать в комментариях ниже.
