Стек LAMP, который стоит на Linux и состоит из: Apache, MySQL/MariaDB и PHP/Python/Perl является очень популярным сочетанием свободного и открытого программного обеспечения и используется сегодня для запуска миллионы сайтов. Хотя многие выбирают для более эффективного стека LEMP на основе Nginx вместо Apache, есть еще значительное число пользователей, которые выбирают LAMP для своих проектов. На самом деле, более 30% активных сайтов сегодня работают на верхней части LAMP. Стек считается надежным и очень подходит для работы с высокой производительностью и доступностью веб – приложений. В этой статье мы собираемся показать вам, как защитить стек LAMP на вашем Linux VPS.
Защита Linux
Включение автоматического обновления
Имеется в виду, что стек LAMP основан на Linux и все сообщества с открытым исходным кодом работает над улучшениями, он считается безопасным тоже. На Ubuntu VPS, все обновления безопасности и патчи доступны для автоматической установки, как только они станут доступны в репозиториях Ubuntu, поэтому убедитесь, что вы настроили систему на автоматическую установку обновлений безопасности, если вы беспокоитесь о безопасности, В случае, если эта функция не включена на сервере, и вы не устанавливаете последние обновления и исправления вручную, вы ставите свой сервер под угрозой взлома.
Для включения автоматического обновления без присмотра, вы должны установить пакет unattended-upgrades.
sudo apt-get install unattended-upgrades
Чтобы настроить какие категории пакетов будут автоматически обновлены, вы должны отредактировать файл /etc/apt/apt.conf.d/50unattended-upgrades.
Настройка брандмауэра
Имея правильно настроенный брандмауэр очень важно для общей безопасности. UFW является инструментом конфигурации брандмауэра по умолчанию для Ubuntu и изначально отключен. Чтобы включить UFW вы можете использовать:
sudo ufw enable
Разрешить доступ к основным услугам, как OpenSSH и Apache:
sudo ufw allow 22 sudo ufw allow 80 sudo ufw allow 443
Включение доступа к другим сервисам довольно легко. Просто замените номер порта в приведенных выше примерах на номер порта службы, который вы хотите, чтобы обеспечить доступ к и это все. Правила брандмауэра будут активны даже после перезагрузки системы.
Отключение неиспользуемых служб
Если у вас есть активные услуги, которые вы не используете, вы можете просто отключить их. Например, если у вас есть службы, как Dovecot и работает на сервере, и вы не используете его, остановите и отключите службу, используя следующие команды:
sudo systemctl stop dovecot.service sudo systemctl disable dovecot.service
Установка fail2ban
Fail2ban это сервис, который сканирует файлы журнал для слишком многих неудачных попыток входа и блокирует IP – адрес, который показывает вредоносный код. Эта услуга очень полезна, если вы не используете двуфакторную аутентификацию или услуги частных механизмов аутентификации, такие как OpenSSH. Для того, чтобы установить Fail2ban, выполните следующую команду:
sudo apt-get install fail2ban
Создайте копию файла конфигурации по умолчанию, так что вы можете смело вносить изменения:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Редактирование файла jail.local:
sudo nano /etc/fail2ban/jail.local
Блок [SSHD] должен выглядеть следующим:
[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 5 bantime = 600
Сохраните файл и перезапустите Fail2ban для того, чтобы изменения вступили в силу:
sudo systemctl restart fail2ban.service
Включить Fail2ban при загрузке системы:
sudo systemctl enable fail2ban.service
Безопасность Apache
Скройте конфиденциальную информацию в Apache
По умолчанию конфигурация в Apache обеспечивает много конфиденциальной информации, которая может быть использована против службы. Необходимо эту информацию скрыть, поэтому мы далее создадим файл конфигурации для новых установок:
sudo nano /etc/apache2/conf-available/custom.conf
Вставьте следующее содержание:
ServerTokens Prod ServerSignature Off TraceEnable Off Options all -Indexes Header unset ETag Header always unset X-Powered-By FileETag None
Включите заголовки модуля Apache, если он еще не включен:
sudo a2enmod headers
Включите конфигурацию:
sudo a2enconf custom.conf
Перезапустите Apache для того, чтобы изменения вступили в силу:
sudo systemctl restart apache2.service
Установите и включите mod_security
Mod_security это веб-приложение брандмауэра (WAF), который может быть установлен в качестве дополнительного модуля для Apache. Он может быть использован для защиты веб-сервера от многочисленных атак, таких как инъекции SQL, захват сеанса, межсайтовый скриптинг, плохих пользовательских агентов и многие другие. Для того, чтобы установить и включить mod_security, запустите следующие команды:
sudo apt-get install libapache2-modsecurity sudo a2enmod security2
После установки вы должны настроить модуль и включить OWASP ModSecurity Core Rule Set (CRS).
sudo mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
Затем откройте файл /etc/modsecurity/modsecurity.conf и отредактируйте/добавьте следующие параметры:
SecRuleEngine On SecResponseBodyAccess Off SecRequestBodyLimit 8388608 SecRequestBodyNoFilesLimit 131072 SecRequestBodyInMemoryLimit 262144
Сохраните и закройте файл. Удалите текущий CRS и загрузите OWASP CRS с помощью следующих команд:
sudo rm -rf /usr/share/modsecurity-crs sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/share/modsecurity-crs cd /usr/share/modsecurity-crs sudo mv crs-setup.conf.example crs-setup.conf
Отредактируйте файл /etc/apache2/mods-enabled/security2.conf. Он должен выглядеть как на картинке ниже:
<IfModule security2_module> SecDataDir /var/cache/modsecurity IncludeOptional /etc/modsecurity/*.conf IncludeOptional "/usr/share/modsecurity-crs/*.conf" IncludeOptional "/usr/share/modsecurity-crs/rules/*.conf </IfModule>
И, наконец, перезапустите Apache для того, чтобы изменения вступили в силу:
sudo systemctl restart apache2.service
Установите и включите mod_evasive
Mod_evasive является модулем Apache, который может быть использован для защиты веб-сервера от DoS (отказ в обслуживании), DDoS (Распределенный отказ в обслуживании) и грубой силы атаки. Чтобы установить mod_evasive на сервере, выполните следующую команду:
sudo apt-get install libapache2-mod-evasive
Откройте файл конфигурации по умолчанию в /etc/apache2/mods-enabled/evasive.conf и измените настройки, чтобы они выглядели, как показано ниже:
<IfModule mod_evasive20.c> <IfModule mod_evasive20.c> DOSPageCount 5 DOSSiteCount 50 DOSPageInterval 1 DOSSiteInterval 1 DOSBlockingPeriod 600 DOSLogDir "/var/log/mod_evasive" </IfModule>
Сохраните и закройте файл. Создайте каталог для файлов журнала:
sudo mkdir /var/log/mod_evasive sudo chown -R www-data: /var/log/mod_evasive
Перезапустите Apache:
sudo systemctl restart apache2.service
Безопасный MySQL
Защита сервера MySQL
Первое, что нужно сделать, чтобы защитить службу MySQL, это запустить сценарий mysql_secure_installation.
sudo mysql_secure_installation
Сценарий поможет вам выполнить важные задачи по обеспечению безопасности, как настройки корневого пароля, отключение удаленного входа администратора, удаление анонимных пользователей и т.д.
Отключение удаленного доступа MySQL
Если вы не будете выполнять удаленные операции над вашим MySQL сервером, отключите удаленный доступ к сервису. Вы можете сделать это путем редактирования файла /etc/mysql/mysql.conf.d/mysqld.cnf и изменение Bind-адрес на 127.0.0.1.
bind-address = 127.0.0.1
Перезапустите службу для того, чтобы изменения вступили в силу.
sudo systemctl restart mysql.service
Создание отдельных пользователей MySQL
Еще одна вещь, которую вы должны рассмотреть, является создание отдельных пользователей MySQL для каждой базы данных и приложения.
Войдите в MySQL как root:
mysql -u root -p
Вы можете создать базу данных MySQL и предоставить все привилегии для нового пользователя с помощью следующих команд:
mysql> CREATE DATABASE new_db; mysql> GRANT ALL PRIVILEGES on new_db.* to 'new_user'@'localhost' identified by 'PaSsW0rD'; mysql> FLUSH PRIVILEGES; mysql> EXIT
Затем вы можете использовать вновь созданную базу данных и пользователя для вашего приложения.
Отключите LOCAL INFILE
Если вы явно не используететсь LOCAL INFILE, то это хорошо, чтобы отключить его. Опять же, отредактируйте конфигурационный файл MySQL и добавьте следующую строку под блоком [mysqld]:
local-infile=0
Перезапустите службу MySQL для того, чтобы изменения вступили в силу.
Защита PHP
Если вы выполнили описанные выше действия, ваш сервер должен быть уже в безопасности. Последняя часть защиты сервера LAMP является защита PHP, которая является довольно простым процессом. Найдите местоположение файла ini в PHP:
php --ini | grep "Loaded Configuration File"
Все изменения, которые мы будем делать в этот файл.
Скрыть основную информацию в PHP
Первый шаг, это скрыть информацию, предоставленную PHP, который некоторые злоумышленники могут воспользоваться. Откройте файл php.ini и изменить настройки, чтобы они соответствовали следующим образом:
expose_php = Off display_errors = Off mail.add_x_header = Off
Сохраните файл и перезапустите Apaсhe:
sudo systemctl restart apache2.service
Отключение опасных функций PHP
Директива Disable_functions позволяет отключить некоторые функции, которые могут быть вредны для вашей системы. Измените директиву в вашем файле php.ini, чтобы соответствовать следующим образом:
disable_functions = show_source,system,shell_exec,passthru,exec,phpinfo,popen,proc_open,allow_url_fopen,curl_exec,curl_multi_exec
Пока вы здесь, отключить удаленное выполнение кода PHP с помощью следующих параметров:
allow_url_fopen=Off allow_url_include=Off
Ограничение загрузки файлов
Если вы не используете функции загрузки файлов полностью, безопасно ограничить загрузку файлов в PHP. Откройте файл php.ini и установите следующий параметр:
file_uploads=Off
В случае, если вы используете функции загрузки файлов можно установить следующее:
file_uploads=On upload_max_filesize=1M
где upload_max_filesize является ограничением размера загрузки.
Перезапустите Apache после внесения этих изменений.
Установить максимальное время выполнения
Опять же, отредактируйте файл php.ini и измените следующие параметры:
max_execution_time = 30 max_input_time = 30 memory_limit = 40M
Это устанавливает максимальное время в секундах сценарий, которое разрешено запускать или синтаксического анализа данных, а также установит максимальный объем памяти, который можно выделить скрипту.
Включить open_basedir
Директива open_basedir позволяет установить местоположение, из которого PHP разрешается доступ к файлам. Отредактируйте фал php.ini и установите правильное расположение, чтобы соответствовать текущей конфигурации:
open_basedir="/path/to/the/directory/"
Не забудьте перезапустить Apache, чтобы изменения вступили в силу.