Конфигурационные файлы — первая линия обороны вашего WordPress-сайта. Правильная настройка wp-config.php, .htaccess и других файлов может предотвратить до 80% типичных атак. В этом руководстве мы разберём все аспекты защиты WordPress через конфигурационные файлы: от базовых настроек до продвинутых техник безопасности.
Почему конфигурационные файлы критичны для безопасности
Конфигурационные файлы содержат критическую информацию и управляют поведением сайта на уровне сервера. Они выполняются до загрузки WordPress, что даёт возможность блокировать атаки на самом раннем этапе.
Основные файлы безопасности:
wp-config.php — главный конфигурационный файл WordPress. Содержит учётные данные базы данных, секретные ключи, настройки безопасности.
.htaccess — файл конфигурации веб-сервера Apache. Управляет доступом к файлам, редиректами, защитой директорий.
php.ini или .user.ini — настройки PHP для сайта. Ограничивают выполнение PHP-кода, управляют загрузками файлов.
wp-config.php: укрепление главного файла конфигурации
Файл wp-config.php — сердце безопасности WordPress. Здесь хранятся данные для доступа к базе данных и критические настройки.
Перемещение wp-config.php за пределы корневой директории
Первый шаг — переместить wp-config.php на уровень выше корневой директории сайта:
Текущая структура:
/public_html/
├── wp-config.php
├── wp-content/
└── wp-includes/
Безопасная структура:
/home/username/
├── wp-config.php
└── public_html/
├── wp-content/
└── wp-includes/
Переместите файл:
mv /home/username/public_html/wp-config.php /home/username/
WordPress автоматически найдёт wp-config.php на уровень выше корневой директории.
Изменение префикса таблиц базы данных
Стандартный префикс wp_ делает вашу базу данных предсказуемой для атакующих.
Откройте wp-config.php:
nano /home/username/wp-config.php
Найдите строку с префиксом таблиц:
$table_prefix = 'wp_';
Измените на уникальный префикс:
$table_prefix = 'x7k9m_';
Важно: это работает только для новой установки. Для существующего сайта используйте плагин Change Table Prefix или измените вручную через SQL.
Изменение префикса через SQL для существующего сайта:
RENAME TABLE wp_commentmeta TO x7k9m_commentmeta;
RENAME TABLE wp_comments TO x7k9m_comments;
RENAME TABLE wp_links TO x7k9m_links;
RENAME TABLE wp_options TO x7k9m_options;
RENAME TABLE wp_postmeta TO x7k9m_postmeta;
RENAME TABLE wp_posts TO x7k9m_posts;
RENAME TABLE wp_terms TO x7k9m_terms;
RENAME TABLE wp_termmeta TO x7k9m_termmeta;
RENAME TABLE wp_term_relationships TO x7k9m_term_relationships;
RENAME TABLE wp_term_taxonomy TO x7k9m_term_taxonomy;
RENAME TABLE wp_usermeta TO x7k9m_usermeta;
RENAME TABLE wp_users TO x7k9m_users;
Обновите мета-данные пользователей:
UPDATE x7k9m_usermeta SET meta_key = REPLACE(meta_key, 'wp_', 'x7k9m_');
UPDATE x7k9m_options SET option_name = REPLACE(option_name, 'wp_', 'x7k9m_') WHERE option_name LIKE 'wp_%';
Отключение редактора файлов в админ-панели
Встроенный редактор файлов — огромная дыра в безопасности. Если злоумышленник получит доступ к админ-панели, он сможет редактировать PHP-файлы.
Добавьте в wp-config.php перед строкой "That's all, stop editing!":
define('DISALLOW_FILE_EDIT', true);
Это отключит редактор тем и плагинов в админке.
Для полного запрета установки/обновления плагинов:
define('DISALLOW_FILE_MODS', true);
Внимание: DISALLOW_FILE_MODS также отключает установку плагинов и тем. Используйте только если обновления делаются через SSH.
Ограничение ревизий постов
WordPress сохраняет каждую ревизию поста, что раздувает базу данных.
Ограничьте количество ревизий:
define('WP_POST_REVISIONS', 3);
Или отключите ревизии полностью:
define('WP_POST_REVISIONS', false);
Отключение автосохранения
Автосохранение создаёт временные копии постов каждые 60 секунд.
Увеличьте интервал до 300 секунд:
define('AUTOSAVE_INTERVAL', 300);
Изменение лимита памяти PHP
Увеличьте лимит памяти для WordPress:
define('WP_MEMORY_LIMIT', '256M');
Для админ-панели можно установить отдельный лимит:
define('WP_MAX_MEMORY_LIMIT', '512M');
Отключение отладочного режима в продакшене
Убедитесь, что отладка отключена на боевом сайте:
define('WP_DEBUG', false);
define('WP_DEBUG_DISPLAY', false);
define('WP_DEBUG_LOG', false);
Для разработки можно включить логирование без вывода на экран:
define('WP_DEBUG', true);
define('WP_DEBUG_DISPLAY', false);
define('WP_DEBUG_LOG', true);
Логи будут сохраняться в /wp-content/debug.log.
Принудительное использование SSL для админки
Заставьте WordPress использовать HTTPS для входа в админку:
define('FORCE_SSL_ADMIN', true);
Это защищает учётные данные от перехвата.
Изменение URL админ-панели через wp-config.php
Хотя полное изменение URL админки требует плагина, можно изменить некоторые пути:
define('WP_SITEURL', 'https://example.com');
define('WP_HOME', 'https://example.com');
Включение режима восстановления базы данных
Для автоматического восстановления БД при сбоях:
define('WP_AUTO_UPDATE_CORE', true);
define('AUTOMATIC_UPDATER_DISABLED', false);
Секретные ключи и соли
WordPress использует секретные ключи для шифрования cookie и паролей.
Сгенерируйте новые ключи на https://api.wordpress.org/secret-key/1.1/salt/
Замените стандартные ключи в wp-config.php:
define('AUTH_KEY', 'сгенерированный ключ');
define('SECURE_AUTH_KEY', 'сгенерированный ключ');
define('LOGGED_IN_KEY', 'сгенерированный ключ');
define('NONCE_KEY', 'сгенерированный ключ');
define('AUTH_SALT', 'сгенерированный ключ');
define('SECURE_AUTH_SALT', 'сгенерированный ключ');
define('LOGGED_IN_SALT', 'сгенерированный ключ');
define('NONCE_SALT', 'сгенерированный ключ');
Меняйте ключи каждые 3-6 месяцев для дополнительной безопасности.
Ограничение доступа к wp-config.php
Установите строгие права доступа:
chmod 600 /home/username/wp-config.php
Это разрешает чтение и запись только владельцу файла.
Полная конфигурация wp-config.php для максимальной безопасности
Вот полный пример защищённого wp-config.php:
<?php
define('DB_NAME', 'database_name');
define('DB_USER', 'database_user');
define('DB_PASSWORD', 'strong_password_here');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', '');
$table_prefix = 'x7k9m_';
define('AUTH_KEY', 'your_unique_key_here');
define('SECURE_AUTH_KEY', 'your_unique_key_here');
define('LOGGED_IN_KEY', 'your_unique_key_here');
define('NONCE_KEY', 'your_unique_key_here');
define('AUTH_SALT', 'your_unique_key_here');
define('SECURE_AUTH_SALT', 'your_unique_key_here');
define('LOGGED_IN_SALT', 'your_unique_key_here');
define('NONCE_SALT', 'your_unique_key_here');
define('WP_DEBUG', false);
define('WP_DEBUG_DISPLAY', false);
define('WP_DEBUG_LOG', false);
define('DISALLOW_FILE_EDIT', true);
define('DISALLOW_FILE_MODS', false);
define('FORCE_SSL_ADMIN', true);
define('WP_POST_REVISIONS', 3);
define('AUTOSAVE_INTERVAL', 300);
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M');
define('WP_AUTO_UPDATE_CORE', 'minor');
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}
require_once ABSPATH . 'wp-settings.php';
.htaccess: защита на уровне веб-сервера
Файл .htaccess управляет поведением Apache на уровне директорий. Это мощный инструмент для блокировки атак.
Проверка наличия .htaccess
Проверьте, есть ли файл .htaccess в корне сайта:
ls -la /home/username/public_html/.htaccess
Если файла нет, создайте его:
touch /home/username/public_html/.htaccess
Базовая структура .htaccess для WordPress
WordPress создаёт базовый .htaccess для ЧПУ:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Все дополнения делайте ДО или ПОСЛЕ блока WordPress.
Защита wp-config.php через .htaccess
Запретите доступ к wp-config.php:
<files wp-config.php>
order allow,deny
deny from all
</files>
Защита .htaccess от просмотра
Запретите доступ к самому .htaccess:
<files .htaccess>
order allow,deny
deny from all
</files>
Блокировка доступа к wp-includes
Директория wp-includes должна быть недоступна напрямую:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>
Запрет выполнения PHP в директории загрузок
Папка uploads не должна выполнять PHP-код:
<Directory "/home/username/public_html/wp-content/uploads">
<Files *.php>
deny from all
</Files>
</Directory>
Или через отдельный .htaccess в /wp-content/uploads/:
<Files *.php>
deny from all
</Files>
Отключение отображения содержимого директорий
Запретите листинг файлов в директориях:
Options -Indexes
Защита от инъекций и XSS атак
Блокируйте подозрительные запросы:
<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule ^(.*)$ index.php [F,L]
</IfModule>
Блокировка SQL-инъекций
Защита от популярных паттернов SQL-инъекций:
<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC,OR]
RewriteCond %{QUERY_STRING} \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC,OR]
RewriteCond %{QUERY_STRING} (\.\./|\.\.) [OR]
RewriteCond %{QUERY_STRING} ftp\: [NC,OR]
RewriteCond %{QUERY_STRING} http\: [NC,OR]
RewriteCond %{QUERY_STRING} https\: [NC,OR]
RewriteCond %{QUERY_STRING} \=\|w\| [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(union|select|insert|drop|delete|update|replace|cast|declare|convert)(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} \.\./\.\./\.\./
RewriteRule ^(.*)$ - [F,L]
</IfModule>
Ограничение размера загружаемых файлов
Установите лимит на размер файлов:
LimitRequestBody 10240000
Это ограничит загрузки до 10MB.
Блокировка доступа по User-Agent
Заблокируйте известные вредоносные боты:
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} ^(.*)(HTTrack|wget|curl|libwww|python)(.*)$ [NC]
RewriteRule ^(.*)$ - [F,L]
</IfModule>
Внимание: это заблокирует легитимные сервисы вроде мониторинга аптайма. Используйте осторожно.
Защита от hotlinking изображений
Запретите встраивание ваших изображений на чужих сайтах:
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp)$ - [NC,F,L]
Замените example.com на ваш домен.
Принудительное использование HTTPS
Редирект всех HTTP-запросов на HTTPS:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
Защита wp-login.php от брутфорса
Ограничьте доступ к странице входа по IP:
<Files wp-login.php>
Order Deny,Allow
Deny from all
Allow from 203.0.113.50
Allow from 198.51.100.25
</Files>
Замените IP-адреса на ваши.
Или ограничьте количество запросов с помощью mod_evasive (требует установки на сервере).
Блокировка доступа к xmlrpc.php
XML-RPC часто используется для брутфорс-атак:
<Files xmlrpc.php>
order deny,allow
deny from all
</Files>
Кэширование статического контента
Ускорьте сайт через заголовки кэширования:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType text/jаvascript "access plus 1 month"
ExpiresByType application/jаvascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresDefault "access plus 7 days"
</IfModule>
Сжатие контента GZIP
Включите сжатие для ускорения загрузки:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/jаvascript
AddOutputFilterByType DEFLATE application/x-jаvascript
</IfModule>
Полная конфигурация .htaccess для максимальной безопасности
Вот комплексный .htaccess с максимальной защитой:
# Безопасность WordPress
# Защита конфигурационных файлов
<files wp-config.php>
order allow,deny
deny from all
</files>
<files .htaccess>
order allow,deny
deny from all
</files>
<files readme.html>
order allow,deny
deny from all
</files>
<files license.txt>
order allow,deny
deny from all
</files>
# Отключение листинга директорий
Options -Indexes
# Защита wp-includes
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>
# Блокировка xmlrpc.php
<Files xmlrpc.php>
order deny,allow
deny from all
</Files>
# Ограничение размера загрузок
LimitRequestBody 10240000
# Защита от SQL-инъекций и XSS
<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} ^(.*)(union|select|insert|drop|delete|update)(.*)$ [NC]
RewriteRule ^(.*)$ index.php [F,L]
</IfModule>
# Принудительный HTTPS
<IfModule mod_rewrite.c>
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
# Защита от hotlinking
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp)$ - [NC,F,L]
# Кэширование
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/jаvascript "access plus 1 month"
ExpiresDefault "access plus 7 days"
</IfModule>
# GZIP сжатие
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/jаvascript
</IfModule>
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
php.ini и .user.ini: настройка PHP
Настройки PHP влияют на безопасность выполнения кода.
Создание .user.ini для WordPress
На серверах с PHP-FPM создайте файл .user.ini в корне сайта:
nano /home/username/public_html/.user.ini
Отключение опасных PHP-функций
Запретите выполнение опасных функций:
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
Внимание: некоторые плагины могут использовать эти функции. Тестируйте после применения.
Ограничение загрузки файлов
Установите лимиты на загружаемые файлы:
upload_max_filesize = 10M
post_max_size = 10M
max_execution_time = 300
max_input_time = 300
memory_limit = 256M
Отключение отображения ошибок
Скройте ошибки PHP от посетителей:
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /home/username/logs/php_errors.log
Ограничение доступа к файловой системе
Ограничьте доступ PHP только к директории сайта:
open_basedir = /home/username/public_html:/tmp
Отключение удалённых файлов
Запретите загрузку удалённых файлов:
allow_url_fopen = Off
allow_url_include = Off
Внимание: некоторые плагины (например, для импорта) могут потребовать allow_url_fopen = On.
Включение безопасного режима cookies
Защитите cookies от XSS:
session.cookie_httponly = 1
session.cookie_secure = 1
session.use_only_cookies = 1
Полная конфигурация .user.ini для безопасности
upload_max_filesize = 10M
post_max_size = 10M
max_execution_time = 300
max_input_time = 300
memory_limit = 256M
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /home/username/logs/php_errors.log
disable_functions = exec,passthru,shell_exec,system,proc_open,popen
allow_url_fopen = Off
allow_url_include = Off
open_basedir = /home/username/public_html:/tmp
session.cookie_httponly = 1
session.cookie_secure = 1
session.use_only_cookies = 1
expose_php = Off
robots.txt: управление индексацией
Файл robots.txt не защищает напрямую, но скрывает административные области от поисковых систем.
Создание robots.txt
Создайте файл в корне сайта:
nano /home/username/public_html/robots.txt
Базовая конфигурация robots.txt для WordPress
User-agent: *
Disallow: /wp-admin/
Disallow: /wp-includes/
Disallow: /wp-content/plugins/
Disallow: /wp-content/themes/
Disallow: /wp-content/cache/
Disallow: /wp-login.php
Disallow: /xmlrpc.php
Allow: /wp-admin/admin-ajax.php
Sitemap: https://example.com/sitemap.xml
Замените example.com на ваш домен.
wp-content/uploads/.htaccess: защита загрузок
Отдельный .htaccess в директории загрузок блокирует выполнение PHP.
Создайте файл:
nano /home/username/public_html/wp-content/uploads/.htaccess
Добавьте содержимое:
<Files *.php>
deny from all
</Files>
<FilesMatch "\.(php|php3|php4|php5|phtml)$">
Order Deny,Allow
Deny from all
</FilesMatch>
Примените изменения:
chmod 644 /home/username/public_html/wp-content/uploads/.htaccess
wp-admin/.htaccess: защита административной панели
Дополнительная защита директории wp-admin.
Создайте файл:
nano /home/username/public_html/wp-admin/.htaccess
Ограничьте доступ по IP:
Order Deny,Allow
Deny from all
Allow from 203.0.113.50
Allow from 198.51.100.25
Или защитите паролем (HTTP Basic Auth):
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /home/username/.htpasswd
Require valid-user
Создайте файл паролей:
htpasswd -c /home/username/.htpasswd admin_username
Введите пароль при запросе.
index.php: заглушки для защиты
Пустые index.php файлы предотвращают листинг директорий.
Создайте заглушку:
echo "<?php // Silence is golden" > /home/username/public_html/wp-content/index.php
Скопируйте в критичные директории:
cp /home/username/public_html/wp-content/index.php /home/username/public_html/wp-content/plugins/
cp /home/username/public_html/wp-content/index.php /home/username/public_html/wp-content/themes/
cp /home/username/public_html/wp-content/index.php /home/username/public_html/wp-content/uploads/
Права доступа к файлам и директориям
Правильные права доступа — фундамент безопасности.
Рекомендуемые права доступа
Установите права для всех файлов:
find /home/username/public_html/ -type f -exec chmod 644 {} \;
Установите права для всех директорий:
find /home/username/public_html/ -type d -exec chmod 755 {} \;
Особые права для wp-config.php:
chmod 600 /home/username/wp-config.php
Права для .htaccess:
chmod 644 /home/username/public_html/.htaccess
Владелец файлов
Установите правильного владельца (замените username на ваше имя пользователя):
chown -R username:username /home/username/public_html/
Для серверов с PHP-FPM владелец должен совпадать с пользователем PHP-FPM.
Проверка прав доступа
Проверьте права критичных файлов:
ls -la /home/username/public_html/ | grep -E "wp-config|\.htaccess"
Мониторинг изменений в конфигурационных файлах
Отслеживайте несанкционированные изменения в файлах.
Создание контрольных сумм
Сохраните контрольные суммы важных файлов:
md5sum /home/username/wp-config.php > /home/username/checksums.txt
md5sum /home/username/public_html/.htaccess >> /home/username/checksums.txt
md5sum /home/username/public_html/wp-admin/.htaccess >> /home/username/checksums.txt
Периодически проверяйте:
md5sum -c /home/username/checksums.txt
Автоматизация проверки через cron
Создайте скрипт проверки:
nano /home/username/check_files.sh
Содержимое скрипта:
#!/bin/bash
CHECKSUM_FILE="/home/username/checksums.txt"
ALERT_EMAIL="[email protected]"
if ! md5sum -c $CHECKSUM_FILE > /dev/null 2>&1; then
echo "ALERT: Configuration files have been modified!" | mail -s "WordPress Security Alert" $ALERT_EMAIL
fi
Сделайте скрипт исполняемым:
chmod +x /home/username/check_files.sh
Добавьте в cron для ежедневной проверки:
crontab -e
Добавьте строку:
0 3 * * * /home/username/check_files.sh
Скрипт будет запускаться каждый день в 3:00.
Резервное копирование конфигурационных файлов
Всегда имейте бэкапы перед изменениями.
Создание резервных копий
Скопируйте важные файлы:
cp /home/username/wp-config.php /home/username/backups/wp-config.php.backup
cp /home/username/public_html/.htaccess /home/username/backups/.htaccess.backup
С датой в имени файла:
cp /home/username/wp-config.php /home/username/backups/wp-config.php.$(date +%Y%m%d)
cp /home/username/public_html/.htaccess /home/username/backups/.htaccess.$(date +%Y%m%d)
Автоматическое резервное копирование
Создайте скрипт бэкапа:
nano /home/username/backup_configs.sh
Содержимое:
#!/bin/bash
BACKUP_DIR="/home/username/backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
cp /home/username/wp-config.php $BACKUP_DIR/wp-config.php.$DATE
cp /home/username/public_html/.htaccess $BACKUP_DIR/.htaccess.$DATE
cp /home/username/public_html/.user.ini $BACKUP_DIR/.user.ini.$DATE
find $BACKUP_DIR -type f -mtime +30 -delete
echo "Backup completed: $DATE"
Сделайте исполняемым:
chmod +x /home/username/backup_configs.sh
Добавьте в cron для еженедельного бэкапа:
crontab -e
Добавьте:
0 2 * * 0 /home/username/backup_configs.sh
Тестирование безопасности конфигурации
После применения настроек протестируйте сайт.
Проверка доступа к защищённым файлам
Попробуйте открыть в браузере:
https://example.com/wp-config.php
https://example.com/.htaccess
https://example.com/readme.html
https://example.com/wp-content/uploads/test.php
Все должны возвращать ошибку 403 Forbidden.
Проверка редиректа на HTTPS
Откройте HTTP-версию сайта:
http://example.com
Должен автоматически перенаправить на HTTPS.
Проверка прав доступа
Проверьте права критичных файлов:
ls -l /home/username/wp-config.php
ls -l /home/username/public_html/.htaccess
wp-config.php должен иметь права 600, .htaccess — 644.
Проверка работоспособности сайта
Убедитесь, что сайт работает:
- Главная страница загружается
- Можно войти в админку
- Загрузка изображений работает
- Формы отправляются
Если что-то сломалось, откатите последние изменения из бэкапа.
Troubleshooting: решение проблем
Проблема: Internal Server Error 500
Причина: ошибка в .htaccess.
Решение:
Переименуйте .htaccess:
mv /home/username/public_html/.htaccess /home/username/public_html/.htaccess.bak
Проверьте, заработал ли сайт. Если да — ошибка в .htaccess.
Добавляйте правила постепенно, проверяя после каждого.
Проблема: не загружаются изображения
Причина: слишком строгие права или блокировка PHP в uploads.
Решение:
Проверьте права на директорию uploads:
ls -ld /home/username/public_html/wp-content/uploads/
Должно быть 755. Исправьте:
chmod 755 /home/username/public_html/wp-content/uploads/
Проверьте .htaccess в uploads — убедитесь, что блокируется только PHP, не изображения.
Проблема: не работает админка
Причина: блокировка по IP или HTTP Basic Auth.
Решение:
Проверьте .htaccess в wp-admin:
cat /home/username/public_html/wp-admin/.htaccess
Если есть ограничение по IP, добавьте свой IP в Allow from.
Или временно отключите защиту:
mv /home/username/public_html/wp-admin/.htaccess /home/username/public_html/wp-admin/.htaccess.bak
Проблема: плагины не устанавливаются
Причина: включен DISALLOW_FILE_MODS.
Решение:
Закомментируйте в wp-config.php:
// define('DISALLOW_FILE_MODS', true);
Или устанавливайте плагины через SSH:
cd /home/username/public_html/wp-content/plugins/
wget https://downloads.wordpress.org/plugin/plugin-name.zip
unzip plugin-name.zip
rm plugin-name.zip
Чеклист безопасности конфигурационных файлов
Пройдитесь по этому списку для проверки защиты:
wp-config.php:
- Файл перемещён за пределы public_html
- Права доступа 600
- Уникальный префикс таблиц БД
- DISALLOW_FILE_EDIT включен
- Секретные ключи обновлены
- FORCE_SSL_ADMIN включен
- WP_DEBUG отключен на продакшене
.htaccess:
- Защита wp-config.php
- Защита .htaccess
- Блокировка wp-includes
- Отключен листинг директорий
- Заблокирован xmlrpc.php
- Защита от SQL-инъекций
- Принудительный HTTPS
- Кэширование настроено
.user.ini:
- display_errors = Off
- Опасные функции отключены
- Лимиты загрузки установлены
- open_basedir настроен
Права доступа:
- Файлы: 644
- Директории: 755
- wp-config.php: 600
Дополнительно:
- robots.txt создан
- index.php заглушки в критичных директориях
- Резервные копии настроены
- Мониторинг изменений включен
Заключение
Защита WordPress через конфигурационные файлы — это первая и самая важная линия обороны. Правильная настройка wp-config.php, .htaccess и других конфигурационных файлов блокирует большинство автоматических атак и усложняет жизнь потенциальным взломщикам.
Ключевые принципы:
Защита в глубину. Комбинируйте несколько уровней защиты — на уровне PHP, веб-сервера и файловой системы.
Регулярные обновления. Меняйте секретные ключи каждые 3-6 месяцев, обновляйте правила безопасности.
Мониторинг. Отслеживайте изменения в конфигурационных файлах, проверяйте логи.
Резервное копирование. Всегда имейте актуальные бэкапы перед внесением изменений.
Тестирование. После каждого изменения проверяйте работоспособность сайта.
Инвестируйте время в правильную настройку конфигурационных файлов один раз — и спите спокойно, зная что ваш WordPress-сайт защищён на фундаментальном уровне.