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 могут сталкиваться с различными типами атак. Я заметил разные типы атак:
- 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 ().
- 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/itfb.com.ua/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, сервер электронной почты и т. д.). Но в приведенном выше примере контент обслуживается следующим образом:
- static.lan.itfb.com.ua — используйте сервер lighttpd или nginx для статических ресурсов, таких как js / css / images.
- phpcgi1.lan.itfb.com.ua и phpcgi2.lan.itfb.com.ua — веб-сервер Apache с php, используемый для генерации динамического контента.
- mysql1.lan.itfb.com.ua — сервер базы данных MySQL.
- mcache1.lan.itfb.com.ua — Сервер Memcached — это очень быстрая система кеширования для MySQL. Он использует libevent или epoll (среда выполнения Linux) для масштабирования до любого количества открытых подключений и использует неблокирующий сетевой ввод-вывод.
- LB01 — веб-сервер nginx и обратный прокси-сервер перед веб-серверами Apache. Все соединения, поступающие из Интернета и адресованные одному из веб-серверов, маршрутизируются через прокси-сервер nginx, который может либо обрабатывать сам запрос, либо передавать его полностью или частично на основные веб-серверы. LB01 обеспечивает простую балансировку нагрузки.
26. Дополнительные инструменты
Со страницы проекта :
PHPIDS (PHP-система обнаружения вторжений) — это простой в использовании, хорошо структурированный, быстрый и современный уровень безопасности для вашего веб-приложения на основе PHP. IDS не удаляет, не дезинфицирует и не фильтрует вредоносный ввод, он просто распознает, когда злоумышленник пытается взломать ваш сайт, и реагирует именно так, как вы этого хотите.
Вы можете использовать PHPIDS для обнаружения злоумышленников и регистрации любых обнаруженных атак для последующего просмотра.
Со страницы проекта :
PhpSecInfo предоставляет эквивалент функции phpinfo (), которая сообщает информацию о безопасности среды PHP и предлагает предложения по улучшению. Это не замена безопасным методам разработки и не выполняется какой-либо аудит кода или приложений, но может быть полезным инструментом в многоуровневом подходе к безопасности.