Конфигурация безопасности 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