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

Лучшие практики безопасности PHP

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

  • DocumentRoot: /var/www/html
  • Веб-сервер по умолчанию: 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) (построено: 24 октября 2011 г., 08:35:41)
Авторские права (c) 1997-2010 Группа PHP
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

или же

PHP 7.3.7 (cli) (построено: 8 июля 2019 г., 09:58:12) (NTS)
Авторские права (c) 1997-2018 Группа PHP
Zend Engine v3.3.7, Copyright (c) 1998-2018 Zend Technologies
    с Zend OPcache v7.3.7, Copyright (c) 1999-2018, Zend Technologies

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

$ cat /etc/redhat-release

Red Hat Enterprise Linux Server, выпуск 6.1

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

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

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

  1. XSS — межсайтовый скриптинг — это уязвимость в веб-приложениях на PHP, которую злоумышленники могут использовать для кражи информации пользователей. Вы можете настроить Apache и написать более безопасные сценарии PHP (проверяющие все вводимые пользователем данные), чтобы избежать атак xss.
  2. SQL-инъекция — это уязвимость на уровне базы данных приложения php. Если пользовательский ввод неправильно отфильтрован, приложение может выполнять любые операторы SQL. Вы можете настроить Apache и написать безопасный код (проверяющий и фильтрующий все вводимые пользователем данных), чтобы избежать атак SQL-инъекций. Обычной практикой в ​​PHP является экранирование параметров с помощью функции mysql_real_escape_string () перед отправкой запроса SQL.
  3. Загрузка файлов — позволяет посетителю размещать файлы (загружать файлы) на ваш сервер. Это может привести к различным проблемам с безопасностью, таким как удаление ваших файлов, удаление базы данных, получение сведений о пользователе и многое другое. Вы можете отключить загрузку файлов с помощью php или написать безопасный код (например, проверить ввод данных пользователем и разрешить только файлы изображений, такие как png или gif).
  4. Выполнение локальных и удаленных файлов. Злоумышленник может открывать файлы с удаленного сервера и выполнять любой PHP-код. Это позволяет им загружать файл, удалять файл и устанавливать бэкдоры. Вы можете настроить php для отключения удаленного выполнения файла.
  5. eval () — оценивает строку как код PHP. Часто используется злоумышленниками, чтобы скрыть свой код и инструменты на самом сервере. Вы можете настроить php, чтобы отключить eval ().
  6. Cross-site request forgery – (подделка межсайтовых запросов — 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
mysql
mysqli
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
readline
Reflection
session
shmop
SimpleXML
sockets
SPL
sqlite3
standard
suhosin
tokenizer
wddx
xml
xmlreader
xmlrpc
xmlwriter
xsl
zip
zlib

[Zend Modules]
Suhosin

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

# rm /etc/php.d/sqlite3.ini

или

# mv /etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disable

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

./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

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

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

expose_php=Off

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

$ curl -I https://itfb.com.ua/index.php

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

HTTP / 1.1 200 OK
 X-Powered-By: PHP / 5.3.3
Тип содержимого: текст / html; charset = UTF-8
Варьируется: кодировка принятия, cookie
X-Vary-Options: Accept-Encoding; list-contains = gzip, Cookie; string-contains = wikiToken; string-contains = wikiLoggedOut; string-contains = wiki_session
Последнее изменение: Вт, 3 ноября 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.{ini,disable}
#/sbin/service httpd restart
Чтобы включить модуль php с именем gd, введите:
# mv gd.{disable,ini}
#/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
# пользователь может загружать не более 1 МБ через php
upload_max_filesize = 1MB

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_fopen = Off

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

allow_url_include = Off

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

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

sql.safe_mode = On

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

magic_quotes_gpc = Off

9. Контроль размера POST

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

; Установите здесь реалистичное значение 
post_max_size = 1K

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

<directory /var/www/html>
    <limitExcept GET POST>
        Order allow,deny
    </limitExcept>
## Add rest of the config goes here... ##
</directory>

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

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

# задается в секундах
 max_execution_time  =   30 
max_input_time  = 30 
memory_limit  = 40M

11. Установите систему расширенной защиты Suhosin для PHP.

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

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

Посмотрите, как установить и настроить suhosin в операционных системах Linux.

12. Отключение опасных функций 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

13. PHP Fastcgi / CGI — директива cgi.force_redirect

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

; Включите cgi.force_redirect из соображений безопасности в типичной настройке * Apache + PHP-CGI / FastCGI * 
cgi.force_redirect = On

14. Пользователь 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

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

phpcgi 6012 0,0 0,4 225036 60140? С 22 ноября 0:12 /usr/bin/php-cgi
phpcgi 6054 0,0 0,5 229928 62820? С 22 ноября, 0:11 /usr/bin/php-cgi
phpcgi 6055 0,1 0,4 224944 53260? С 22 ноября 0:18 /usr/bin/php-cgi
phpcgi 6085 0,0 0,4 224680 56948? С 22 ноября, 0:11 /usr/bin/php-cgi
phpcgi 6103 0,0 0,4 224564 57956? С 22 ноября, 0:11 /usr/bin/php-cgi
phpcgi 6815 0,4 0,5 228556 61220? S 00:52 0:19 /usr/bin/php-cgi
phpcgi 6821 0,3 0,5 228008 61252? S 00:55 0:12 /usr/bin/php-cgi
phpcgi 6823 0,3 0,4 225536 58536? S 00:57 0:13 /usr/bin/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.

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

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

; Ограничивает доступ процесса PHP к файлам извне 
; специально назначенных каталогов, таких как /var/www/html/ 
open_basedir = "/var/www/html/" 
; ------------------------------------ 
; Пример нескольких директорий 
; open_basedir = "/home/httpd/vhost/itfb.com.ua/html/: /home/httpd/vhost/system-admins.ru/html/" 
; ------------------------------------

16. Путь сеанса

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

session.save_path = "/var/lib/php/session" 
; Установите временный каталог, используемый для хранения файлов при загрузке файла 
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, такой как режим файла, пользователь, группа, контекст безопасности и имя файла.

17. Своевременно обновляйте PHP, программное обеспечение и ОС

Применение исправлений безопасности — важная часть поддержки серверов Linux, Apache, PHP и MySQL. Все обновления безопасности php должны быть проверены и применены как можно скорее с помощью любого из следующих инструментов (если вы устанавливаете PHP через диспетчер пакетов): или Вы можете настроить Red Hat / CentOS / Fedora Linux для отправки уведомления об обновлении пакета yum по электронной почте. Другой вариант — применить все обновления безопасности через задание cron.

#yum update
#apt-get update && apt-get upgrade
В Debian Ubuntu Linux вы можете использовать apticron для отправки уведомлений безопасности.

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

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

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

Убедитесь, что права доступа к файлам установлены на 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 имеет следующие директивы ограничений:

<directory / >
    Options None
    AllowOverride None
    Order allow,deny
</directory>

Вы должны предоставлять доступ на запись только при необходимости. Некоторым веб-приложениям, таким как 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

19. Защита от записи файлов конфигурации 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/

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

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

# getsebool -a | grep httpd

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

allow_httpd_anon_write -> Off
allow_httpd_mod_auth_ntlm_winbind -> Off
allow_httpd_mod_auth_pam -> Off
allow_httpd_sys_script_anon_write -> Off
httpd_builtin_scripting -> на
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 -> на
httpd_enable_cgi -> на
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 -> на
httpd_unified -> на
httpd_use_cifs -> Off
httpd_use_gpg -> Off
httpd_use_nfs -> Off

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

# setsebool -P httpd_enable_cgi off

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

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

## Несколько примеров ##
# Не разрешать открывать файлы в /etc/
SecFilter /etc/
 
# Остановить SQL-инъекцию
SecFilter "delete[[:space:]]+from"
SecFilter "select.+from"

22. Если возможно, запустите Apache / PHP в Chroot Jail

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

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

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

/sbin/iptables -A OUTPUT -o eth0 -m owner --uid-owner vivek -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

24. Следите за своими логами и аудитом

Проверьте файл журнала 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 » для мониторинга вашего веб-сервера.

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

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

///////////////
/ ISP/Router /
//////////////
  \
   |
   Firewall
     \
      |
     +------------+
     | LB01       |
     +------------+                 +--------------------------+
                  |                 | static.lan.itfb.com.ua |
		  +-----------------+--------------------------+
                                    | phpcgi1.lan.itfb.com.ua|
                                    +--------------------------+
                                    | phpcgi2.lan.itfb.com.ua|
                                    +--------------------------+
                                    | mysql1.lan.itfb.com.ua |
                                    +--------------------------+
                                    | mcache1.lan.itfb.com.ua|
                                    +--------------------------+

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

  1. static.lan.itfb.com.ua — используйте сервер lighttpd или nginx для статических ресурсов, таких как js / css / images.
  2. phpcgi1.lan.itfb.com.ua и phpcgi2.lan.itfb.com.ua — веб-сервер Apache с php, используемый для генерации динамического контента.
  3. mysql1.lan.itfb.com.ua — сервер базы данных MySQL.
  4. mcache1.lan.itfb.com.ua — Сервер Memcached — это очень быстрая система кеширования для MySQL. Он использует libevent или epoll (среда выполнения Linux) для масштабирования до любого количества открытых подключений и использует неблокирующий сетевой ввод-вывод.
  5. LB01 — веб-сервер nginx и обратный прокси-сервер перед веб-серверами Apache. Все соединения, поступающие из Интернета и адресованные одному из веб-серверов, маршрутизируются через прокси-сервер nginx, который может либо обрабатывать сам запрос, либо передавать его полностью или частично на основные веб-серверы. LB01 обеспечивает простую балансировку нагрузки.

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

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

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

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

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

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

Примечание о бэкдорах 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_depre|fopen|fclose|eval)" /var/www/html/

Если Вам нужна помощь в настройке безопасности веб сервера и php обращайтесь [email protected]

Заключение

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