Перейти к основному содержимому

Конфигурация безопасности PHP

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

Основной php.ini

Редактируем /etc/php/8.3/fpm/php.ini:

; Отключаем отображение ошибок
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php/error.log

; Ограничиваем информацию о PHP
expose_php = Off

; Отключаем опасные функции
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

; Ограничиваем работу с файлами
allow_url_fopen = Off
allow_url_include = Off
auto_prepend_file =
auto_append_file =

; Ограничиваем ресурсы
max_execution_time = 30
max_input_time = 30
memory_limit = 256M
post_max_size = 20M
upload_max_filesize = 20M
max_file_uploads = 20

; Настройки сессий
session.cookie_secure = 1
session.cookie_httponly = 1
session.cookie_samesite = Strict
session.use_strict_mode = 1
session.use_only_cookies = 1
session.cookie_lifetime = 0

; Отключаем register_globals (если еще не отключено)
register_globals = Off

; Включаем open_basedir
open_basedir = /var/www/html/:/tmp/

; Настройки загрузки файлов
file_uploads = On
upload_tmp_dir = /tmp

; Настройки почты
mail.add_x_header = Off

; Настройки SQL
sql.safe_mode = On

; Отключаем короткие теги
short_open_tag = Off

; Настройки User Agent
user_agent = ""

; Настройки переменных
variables_order = "GPCS"
request_order = "GP"

; Отключаем magic quotes
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off

Настройка OPcache

Добавляем в /etc/php/8.3/fpm/conf.d/10-opcache.ini:

; Включаем OPcache
opcache.enable = 1
opcache.enable_cli = 0

; Память
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 4000

; Валидация
opcache.revalidate_freq = 2
opcache.validate_timestamps = 0

; Безопасность
opcache.save_comments = 0
opcache.fast_shutdown = 1

; Оптимизация
opcache.enable_file_override = 1
opcache.optimization_level = 0x7FFFBFFF

Настройка пула FPM

Создаем безопасный пул /etc/php/8.3/fpm/pool.d/secure.conf:

[secure]
user = www-data
group = www-data

listen = /run/php/php8.3-fpm-secure.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

; Процессы
pm = ondemand
pm.max_children = 25
pm.process_idle_timeout = 30s
pm.max_requests = 1000

; Безопасность
security.limit_extensions = .php

; Переменные окружения
clear_env = yes
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

; Лимиты ресурсов
rlimit_files = 1024
rlimit_core = 0

; PHP настройки
php_admin_value[disable_functions] = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,file_get_contents,fopen,fread,fwrite,file_put_contents,fputs,fgets
php_admin_flag[allow_url_fopen] = off
php_admin_flag[allow_url_include] = off
php_admin_value[open_basedir] = /var/www/html/secure/:/tmp/
php_admin_value[upload_tmp_dir] = /var/www/html/secure/tmp/
php_admin_value[session.save_path] = /var/www/html/secure/sessions/
php_admin_value[max_execution_time] = 30
php_admin_value[max_input_time] = 30
php_admin_value[memory_limit] = 128M
php_admin_value[post_max_size] = 10M
php_admin_value[upload_max_filesize] = 10M
php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on
php_admin_value[error_log] = /var/log/php/secure-error.log

Создание директорий

sudo mkdir -p /var/www/html/secure/{tmp,sessions}
sudo chown -R www-data:www-data /var/www/html/secure/
sudo chmod 750 /var/www/html/secure/
sudo chmod 700 /var/www/html/secure/{tmp,sessions}

sudo mkdir -p /var/log/php
sudo chown www-data:www-data /var/log/php
sudo chmod 755 /var/log/php

Настройка логирования

Создаем /etc/logrotate.d/php-fpm:

/var/log/php/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 644 www-data www-data
postrotate
systemctl reload php8.3-fpm > /dev/null 2>&1 || true
endscript
}

Мониторинг FPM

Включаем статус в пуле:

pm.status_path = /fpm-status
pm.status_listen = 127.0.0.1:9001
ping.path = /fpm-ping
ping.response = pong

Nginx конфигурация для мониторинга

location ~ ^/(fpm-status|fpm-ping)$ {
access_log off;
allow 127.0.0.1;
deny all;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

Применение настроек

sudo systemctl restart php8.3-fpm
sudo systemctl reload nginx
sudo tail -f /var/log/php/error.log