Поиск по сайту:

Лучшие советы по усилению безопасности PHP для серверов Linux


Нет ничего более умного в том, что PHP является одним из наиболее часто используемых языков программирования серверных сценариев. Злоумышленнику имеет смысл найти различные способы манипулирования PHP, поскольку он часто сочетается с MySQL и обеспечивает доступ к личным данным ваших пользователей.

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

1. Удалите ненужные модули PHP.

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

php -m

Модули расположены в каталоге /etc/php.d/ и могут легко изменить текущий каталог на /etc/php.d/ с помощью следующей команды cd.

cd /etc/php.d/

Причина, по которой мы меняем каталог для удаления модулей, заключается в том, что в исходном каталоге модули называются совсем по-другому. Теперь перечислите доступные модули с помощью данной команды:

ls

Например, давайте удалим модуль curl, используя данную команду:

sudo rm -r 20-curl.ini

2. Отключите удаленное выполнение PHP-кода.

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

sudo nano /etc/php.ini

Теперь используйте CRTL + w и введите allow_url_fopen, что приведет нас к определенным строкам, где мы отключим эти параметры.

allow_url_fopen=Off
allow_url_include=Off

Закончив внесение изменений, сохраните файл конфигурации, нажав CTRL + O и нажмите Enter.

3. Отключите утечку информации PHP

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

sudo nano /etc/php.ini

Теперь измените настройки по умолчанию на «Выкл.».

expose_php=Off

4. Отключите журналы ошибок PHP.

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

sudo nano /etc/php.ini

И измените настройку по умолчанию для отображения журналов ошибок на «Выкл.».

display_errors = Of

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

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

log_errors=On
error_log=/var/log/httpd/php_scripts_error.log

5. Управление ресурсами PHP

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

Мы выбрали 25 секунд для времени выполнения и ввода и 30 МБ ограничения памяти. Конечно, вы можете настроить его в соответствии со своими потребностями.

max_execution_time = 25
max_input_time = 25
memory_limit = 30M

6. Ограничьте доступ к файлам PHP

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

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

open_basedir = "/home/sagar/public_html:/var/lib/php/tmp_upload:/var/lib/php/session"

7. Настройте загрузку файлов PHP

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

file_uploads = Off

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

file_uploads = On
upload_max_filesize = 1M
max_file_uploads = 1

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

Поскольку мы использовали open_basedir, мы будем использовать то же местоположение, которое мы уже занесли в белый список.

upload_tmp_dir = /var/lib/php/tmp_upload

8. Отключите опасные функции PHP

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

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

disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

9. Измените каталог кэша SOAP.

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

soap.wsdl_cache_dir = /var/lib/php/soap_cache

10. Контролируйте размер PHP POST

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

post_max_size=4M

11. Защитите конфигурации PHP

Удаляя ненужные файлы, мы часто удаляем некоторые важные файлы или даже каталоги. Поэтому мы должны настроить параметры таким образом, чтобы даже пользователи root не могли их удалить. Для создания файлов и каталогов мы будем использовать chattr с разными флагами.

После использования данной команды вы больше не сможете изменить конкретный файл или удалить его.

sudo chattr +i /etc/php.ini

При попытке удалить неизменяемый файл отображается сообщение об ошибке «Операция не разрешена».

sudo rm -r /etc/php.ini

Но что, если вы хотите продолжать записывать эти файлы, делая их неизменяемыми? Этого можно легко добиться, используя флаг +a вместо +i.

sudo chattr +a /etc/php.ini

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

sudo chattr -i /etc/php.ini

Аналогично, если вы использовали атрибуты +a в процессе создания неизменяемых файлов, вы можете отменить это, используя данную команду:

sudo chattr -a /etc/php.ini

12. Используйте SSL-сертификаты для HTTPS

В настоящее время каждый современный браузер, такой как Google Chrome, Firefox, Opera и другие, рекомендует использовать HTTPS для веб-серверов. Поскольку HTTPS обеспечивает защищенный и зашифрованный канал доступа для ненадежных сайтов, мы можем обеспечить надежность работы наших пользователей.

Добавив HTTPS, мы можем защититься от атак XSS, в том числе не дать хакерам прочитать передаваемые данные с помощью кодов.

Чтобы включить HTTPS, мы установим и будем использовать на сервере бесплатный SSL-сертификат Let's Encrypt.

sudo dnf install epel-release 
sudo dnf install certbot python3-certbot-apache mod_ssl
sudo certbot --apache -d domain.com   [For Apache]
sudo certbot --nginx -d domain.com    [For Nginx]

13. Регулярно обновляйте PHP

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

yum update & yum upgrade    [On RHEL-based systems]
apt update && apt upgrade   [On Debian-based systems]

Это был наш взгляд на то, как можно легко повысить безопасность PHP в системах Linux. На протяжении всего этого урока мы старались максимально упростить задачу, и если у вас все еще есть какие-либо сомнения, сообщите нам об этом в комментариях.