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

PHP - это язык сценариев на стороне сервера с открытым исходным кодом, который широко используется. Веб-сервер Apache/Nginx/Lighttpd обеспечивает доступ к файлам и содержимому по протоколу HTTP или HTTPS. Неправильно настроенный серверный язык сценариев может создать всевозможные проблемы. Поэтому PHP следует использовать с осторожностью. Вот двадцать пять лучших практик безопасности php для системных администраторов Linux и Unix для безопасной настройки PHP.

Содержание

Лучшие методы обеспечения безопасности PHP

Наш пример настройки для советов по безопасности PHP

  • DocumentRoot: /var/www/html
  • Веб-сервер по умолчанию: Apache (вы можете использовать Lighttpd или Nginx вместо Apache)
  • Файл конфигурации PHP по умолчанию: /etc/php.ini или /etc/php/8.0/fpm/php.ini
  • Каталог конфигурации расширений PHP по умолчанию: /etc/php.d/ ИЛИ /etc/php/8.0/fpm/conf.d/
  • Наш пример конфигурационного файла безопасности php: /etc/php.d/security.ini ИЛИ /etc/php/8.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

Для демонстрации я буду использовать следующую операционную систему:

Образец вывода:

CentOS Stream release 8

Давайте посмотрим на некоторые лучшие практики безопасности php.

1. Знайте своего врага

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

  • XSS - межсайтовый скриптинг - это уязвимость в веб-приложениях php, которую злоумышленники могут использовать для кражи информации пользователей. Вы можете настроить Apache и писать более безопасные PHP-скрипты (проверяя все вводимые пользователем данные), чтобы избежать XSS-атак.
  • SQL-инъекция - это уязвимость в уровне базы данных php-приложения. Когда пользовательский ввод неправильно фильтруется, приложение может выполнять любые SQL-запросы. Вы можете настроить Apache и написать безопасный код (проверяя и экранируя весь пользовательский ввод), чтобы избежать атак SQL-инъекций. В PHP принято экранировать параметры с помощью функции mysql_real_escape_string() перед отправкой SQL-запроса.
  • Загрузка файлов - позволяет посетителю размещать файлы (загружать файлы) на вашем сервере. Это может привести к различным проблемам безопасности, таким как удаление файлов, удаление базы данных, получение данных о пользователе и многое другое. Вы можете отключить загрузку файлов с помощью php или написать безопасный код (например, проверять вводимые пользователем данные и разрешать только файлы изображений типа png или gif).
  • Использование локального и/или удаленного файлы - Злоумышленник может открыть файлы с удаленного сервера и выполнить любой PHP-код. Это позволяет им загружать файлы, удалять их и устанавливать бэкдоры. Вы можете настроить php на отключение удаленного выполнения файлов.
  • eval() - Оценить строку как PHP-код. Это часто используется злоумышленниками для того, чтобы скрыть свой код и инструменты на самом сервере. Вы можете настроить php для отключения eval().
  • Sea-surf Attack (Cross-site request forgery - CSRF) - эта атака заставляет конечного пользователя выполнять нежелательные действия в веб-приложении, в котором он/она в данный момент аутентифицирован. Успешный CSRF-эксплойт может поставить под угрозу данные конечного пользователя и его работу в случае обычного пользователя. Если конечным пользователем является учетная запись администратора, это может скомпрометировать все веб-приложение.

2. Поиск встроенных модулей PHP

Чтобы увидеть набор скомпилированных модулей PHP, введите следующую команду:

Примеры вывода:

php -m

Рекомендуется использовать PHP с уменьшенным количеством модулей для повышения производительности и безопасности. Например, вы можете отключить модуль sqlite3, удалив (удалив) конфигурационный файл , ИЛИ переименовав (переместив) файл /etc/php.d/sqlite3.ini следующим образом:

ИЛИ

Другие скомпилированные модули могут быть удалены только путем переустановки PHP с уменьшенной конфигурацией. Вы можете скачать исходный код php с php.net и скомпилировать его следующим образом с поддержкой GD, fastcgi и MySQL:

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

Чтобы ограничить утечку информации PHP, отключите expose_php. Отредактируйте /etc/php.d/secutity.ini и установите следующую директиву:

Когда expose_php включен, он сообщает миру, что на сервере установлен PHP, который включает версию PHP в HTTP-заголовок (например, X-Powered-By: PHP/5.3.3). Руководства по логотипу PHP (см. пример) также раскрываются, поэтому при добавлении их к URL сайта с поддержкой PHP будет отображаться соответствующий логотип. Когда expose_php включен, вы можете узнать версию php с помощью следующей команды:

утечка информации PHP

Также рекомендуется настроить директивы ServerTokens и ServerSignature в httpd.conf, чтобы скрыть версию Apache и скрыть версию PHP при использовании Nginx.

4. Минимизируйте загружаемые модули PHP (динамические расширения)

PHP поддерживает "Динамические расширения". По умолчанию RHEL загружает все модули расширений, найденные в каталоге /etc/php.d/. Чтобы включить или отключить определенный модуль, просто найдите конфигурационный файл в каталоге /etc/php.d/ и прокомментируйте название модуля. Вы также можете переименовать или удалить конфигурационный файл модуля. Для лучшей производительности и безопасности PHP следует включать только те расширения, которые необходимы вашему веб-приложению. Например, чтобы отключить расширение gd, введите следующие команды:

Чтобы включить модуль php под названием gd, введите:

5. Регистрируйте все ошибки PHP

Не показывайте сообщения об ошибках PHP всем посетителям сайта. Отредактируйте /etc/php.d/security.ini и установите следующую директиву:

Убедитесь, что все ошибки php записываются в лог-файл:

6. Запретите загрузку файлов

Отредактируйте /etc/php.d/security.ini и установите следующую директиву, чтобы запретить загрузку файлов по соображениям безопасности:

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

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

Если опция allow_url_fopen включена, файловые функции PHP - такие как file_get_contents() и операторы include и require - могут получать данные из удаленных мест, таких как FTP или веб-сайт.

Опция allow_url_fopen позволяет файловым функциям PHP - таким как file_get_contents(), а также операторам include и require - получать данные из удаленных мест, используя протоколы ftp или http. Программисты часто забывают об этом и не выполняют надлежащую фильтрацию входных данных при передаче пользовательских данных в эти функции, открывая их для уязвимостей инъекции кода. Большое количество уязвимостей инъекции кода в веб-приложениях на базе PHP вызвано сочетанием включения allow_url_fopen и плохой фильтрации ввода. Отредактируйте /etc/php.d/security.ini и установите следующую директиву:

Также рекомендуется отключить allow_url_include по соображениям безопасности:

8. Включите безопасный режим SQL

Отредактируйте /etc/php.d/security.ini и установите следующую директиву:

Если включено, mysql_connect() и mysql_pconnect() игнорируют любые переданные им аргументы. Обратите внимание, что вам, возможно, придется внести некоторые изменения в ваш код. Сторонние приложения и приложения с открытым исходным кодом, такие как WordPress и другие, могут вообще не работать при включенном sql.safe_mode. Также рекомендуется отключить magic_quotes_gpc во всех установках php, так как фильтрация с его помощью неэффективна и не очень надежна. mysql_escape_string() и пользовательские функции фильтрации служат лучше:

9. Управление размером POST

Метод запроса HTTP POST используется, когда клиенту (браузеру или пользователю) необходимо отправить данные на веб-сервер Apache как часть запроса, например, при загрузке файла или отправке заполненной формы. Злоумышленники могут попытаться отправить POST-запросы большого размера, чтобы съесть ресурсы вашей системы. Вы можете ограничить максимальный размер POST-запроса, который будет обрабатывать PHP. Отредактируйте /etc/php.d/security.ini и установите следующую директиву:

1K устанавливает максимальный размер данных поста, разрешенный php-приложениям. Эта настройка также влияет на загрузку файлов. Для загрузки больших файлов это значение должно быть больше, чем upload_max_filesize. Я также предлагаю ограничить доступные методы с помощью веб-сервера Apache. Отредактируйте файл httpd.conf и установите следующую директиву для DocumentRoot /var/www/html:

10. Контроль ресурсов (контроль DoS)

Вы можете установить максимальное время выполнения каждого php-скрипта в секундах. Также рекомендуется установить максимальное время, которое каждый скрипт может потратить на разбор данных запроса, и максимальный объем памяти, который может занимать скрипт. Отредактируйте /etc/php.d/security.ini и установите следующие директивы:

11. Установите Suhosin Advanced Protection System для PHP

Со страницы проекта:

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

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

PHP имеет множество функций, которые могут быть использованы для взлома вашего сервера при неправильном использовании. Вы можете задать список функций в /etc/php.d/security.ini с помощью директивы disable_functions:

13. PHP Fastcgi / CGI - Директива cgi.force_redirect

Работа PHP с FastCGI. Fascgi уменьшает объем памяти вашего веб-сервера, но при этом предоставляет вам скорость и мощь всего языка PHP. Вы можете настроить Apache2+PHP+FastCGI или cgi, как описано здесь. Директива конфигурации cgi.force_redirect не позволяет никому напрямую вызывать PHP с URL типа http://www.cyberciti.biz/cgi-bin/php/hackerdir/backdoor.php. Включите cgi.force_redirect из соображений безопасности. Отредактируйте /etc/php.d/security.ini и установите следующую директиву:

14. Идентификатор пользователя и группы PHP

mod_fastcgi - это cgi-модуль для веб-сервера Apache. Он может подключаться к внешнему серверу FASTCGI. Вам необходимо убедиться, что php выполняется от имени пользователя, не являющегося root. Если PHP выполняется от имени root или UID меньше 100, он может получить доступ к системным файлам и/или манипулировать ими. Вы должны выполнять PHP CGIs от имени непривилегированного пользователя, используя suEXEC или mod_suPHP от Apache. Функция suEXEC предоставляет пользователям Apache возможность запускать CGI-программы под идентификаторами пользователей, отличными от идентификатора пользователя вызывающего веб-сервера. В этом примере мой php-cgi запущен под пользователем phpcgi, а apache - под пользователем apache:

Пример вывода:

Вы можете использовать такой инструмент, как spawn-fcgi для запуска удаленных и локальных FastCGI-процессов от имени пользователя phpcgi (сначала добавьте пользователя phpcgi в систему):

Теперь вы можете настроить веб-серверы Apache, Lighttpd и Nginx на использование внешнего php FastCGI, работающего на порту 9000 по IP-адресу 127.0.0.1.

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

Директива open_basedir устанавливает каталоги, из которых PHP разрешено обращаться к файлам с помощью таких функций, как fopen() и других. Если файл находится вне путей, определенных open_basdir, PHP откажется его открывать. Вы не можете использовать символическую ссылку в качестве обходного пути. Например, разрешите доступ только к каталогу /var/www/html, но не к /var/www, или /tmp, или /etc:

16. Путь сессии

Поддержка сеансов в PHP - это способ сохранения определенных данных при последующих обращениях. Это позволяет создавать более настраиваемые приложения и повышать привлекательность вашего сайта. Этот путь определяется в файле /etc/php.ini, и все данные, относящиеся к определенной сессии, будут храниться в файле в директории, указанной опцией session.save_path. В RHEL/CentOS/Fedora Linux по умолчанию используется следующее значение:

Убедитесь, что путь находится вне /var/www/html и не доступен для чтения или записи другим пользователям системы:

Примеры результатов:

Опция -Z команды ls отображает контекст безопасности SELinux, такой как режим файла, пользователь, группа, контекст безопасности и имя файла.

17. Поддерживайте PHP, программное обеспечение и ОС в актуальном состоянии

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

ИЛИ

Вы можете настроить Red hat / CentOS / Fedora Linux на отправку уведомления об обновлении пакетов yum по электронной почте. Другой вариант - применять все обновления безопасности через задание cron. В Debian / Ubuntu Linux вы можете использовать apticron для отправки уведомлений о безопасности.

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

Убедитесь, что вы запускаете Apache от имени пользователя, не являющегося root-пользователем, например Apache или www. Все файлы и каталоги должны принадлежать пользователю, не являющемуся root-пользователем (или пользователю apache), в каталоге /var/www/html:

/var/www/html/ - это подкаталог и DocumentRoot, который может быть изменен другими пользователями, поскольку root никогда не выполняет никаких файлов оттуда, и не должен создавать файлы там.

Убедитесь, что права доступа к файлам установлены на 0444 (только для чтения) под /var/www/html/:

Убедитесь, что разрешения всех каталогов установлены на 0445 под /var/www/html/:

Замечание о настройке правильных прав доступа к файлам

Команды chown и chmod гарантируют, что ни при каких обстоятельствах DocumentRoot или файлы, содержащиеся в DocumentRoot, не могут быть записаны пользователем веб-сервера apache. Обратите внимание, что вам нужно установить разрешения, которые наиболее подходят для модели разработки вашего сайта, поэтому не стесняйтесь корректировать команды chown и chmod в соответствии с вашими требованиями. В этом примере сервер Apache работает под пользователем apache. Это настраивается с помощью директив User и Group в файле httpd.conf. Пользователь apache должен иметь доступ на чтение ко всему, что находится в DocumentRoot, но не должен иметь доступа на запись.

Убедитесь, что в httpd.conf есть следующие директивы для ограничительной конфигурации:

Вы должны предоставлять доступ на запись только при необходимости. Некоторым веб-приложениям, таким как wordpress и другие, может понадобиться каталог кэширования. Вы можете предоставить доступ на запись в каталог кэширования с помощью следующих команд:

заблокировать доступ для всех

19. Запись защищенных конфигурационных файлов Apache, PHP и MySQL

Используйте команду chattr для защиты от записи конфигурационных файлов:

Команда chattr также может защитить от записи ваш php-файл или файлы в каталоге /var/www/html:

20. Используйте расширения безопасности Linux (например, SELinux)

Linux поставляется с различными патчами безопасности, которые можно использовать для защиты от неправильно настроенных или скомпрометированных серверных программ. Если возможно, используйте SELinux и другие расширения безопасности Linux для наложения ограничений на сетевые и другие программы. Например, SELinux обеспечивает различные политики безопасности для ядра Linux и веб-сервера Apache. Чтобы перечислить все переменные защиты Apache SELinux, введите:

Примеры вывода:

Чтобы отключить поддержку Apache cgi, введите:

Дополнительную информацию см. в руководстве Red Hat SELinux.

21. Установите Mod_security

ModSecurity - это механизм обнаружения и предотвращения вторжений с открытым исходным кодом для веб-приложений. Вы можете легко установить mod_security в Linux и защитить приложения на базе apache и php от xss и различных других атак:

22. По возможности запускайте Apache / PHP в chroot jail

Размещение PHP и/или Apache в chroot jail минимизирует ущерб от потенциального взлома, изолируя веб-сервер от небольшого участка файловой системы. Вы можете использовать традиционную настройку типа chroot для Apache. Однако я рекомендую использовать джейлы FreeBSD, виртуализацию XEN, виртуализацию KVM или виртуализацию OpenVZ, которая использует концепцию контейнеров.

23. Используйте брандмауэр для ограничения исходящих соединений

Злоумышленник будет загружать файл локально на ваш веб-сервер с помощью таких инструментов, как wget. Используйте iptables для блокирования исходящих соединений от пользователя apache. Модуль ipt_owner пытается сопоставить различные характеристики создателя пакета для локально сгенерированных пакетов. Он действует только в цепочке OUTPUT. В этом примере разрешите пользователю vivek подключаться снаружи, используя порт 80 (полезно для доступа к RHN или репозиториям centos):

Вот еще один пример, который блокирует все исходящие соединения от пользователя apache, кроме нашего собственного smtp-сервера и API-сервиса проверки спама:

24. Следите за журналами и аудитом

Проверьте файл журнала apache. Используйте команду grep/egrep:

Проверьте дисковое пространство для файлов app/logs, чтобы избежать DoS-атак, используя команду df/duf и команду du. Например:

Проверьте файл журнала php:

Просмотр лог-файлов - это хорошая практика безопасности php. Файлы журналов дадут вам некоторое понимание того, какие атаки совершаются на сервер, и позволят проверить, присутствует ли необходимый уровень безопасности или нет. Для аудита системы предусмотрен сервис auditd. Включите его для аудита событий SELinux, событий аутентификации, модификации файлов, модификации учетных записей и так далее. Я также рекомендую использовать стандартные "Linux System Monitoring Tools" для мониторинга вашего веб-сервера.

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

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

Запускайте различные сетевые службы на отдельных серверах или экземплярах виртуальных машин. Это ограничивает количество других служб, которые могут быть скомпрометированы. Например, если злоумышленник сможет успешно использовать такое программное обеспечение, как Apache flow, он/она получит доступ ко всему серверу, включая другие службы, работающие на том же сервере (такие как MySQL, почтовый сервер и т.д.).

26. Дополнительные инструменты

Со страницы проекта:

PHPIDS (PHP-Intrusion Detection System) - это простой в использовании, хорошо структурированный, быстрый и современный уровень безопасности для вашего веб-приложения на базе PHP. IDS не отсекает, не санирует и не фильтрует вредоносный ввод, она просто распознает, когда злоумышленник пытается взломать ваш сайт, и реагирует именно так, как вы этого хотите.

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

Со страницы проекта:

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

Заметка о бэкдорах PHP

Вы можете столкнуться с php-скриптами или так называемыми обычными бэкдорами, такими как c99, c99madshell, r57 и так далее. Бэкдорный php-скрипт - это не что иное, как скрытый скрипт для обхода всех проверок подлинности и получения доступа к вашему серверу по требованию. Он устанавливается злоумышленниками для получения доступа к вашему серверу, пытаясь остаться незамеченным. Обычно PHP (или любой другой CGI-скрипт) по ошибке позволяет включить код, использующий уязвимости в веб-браузере. Атакующий может использовать такие уязвимости для загрузки бэкдоров, которые могут предоставить ему ряд возможностей, таких как:

  • скачивать файлы
  • загружать файлы
  • устанавливать руткиты
  • Устанавливать почтовые серверы спама / сервер ретрансляции
  • Установить прокси-сервер для скрытия следов
  • Взять под контроль сервер
  • Взять под контроль сервер баз данных
  • Украсть всю информацию
  • Удалить всю информацию и базу данных
  • Открывать TCP / UDP порты и многое другое

Заключение

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

Понравилась статья? Поделиться с друзьями:
Добавить комментарий