Защита WordPress через конфигурационные файлы: полное руководство

Конфигурационные файлы — первая линия обороны вашего 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-сайт защищён на фундаментальном уровне.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *