wordpress security

Защита wordpress блога

Несколько важных действий для повышения безопасности вашего worpress блога, которые нужно выполнить в обязательном порядке, иначе ваш блог будет гарантировано взломан в автоматическом режиме в ближайшего пару месяцев.

Скрываем версию wordpress

Просто устанавливаем плагин Meta Generator and Version Info Remover из официального репозитория worpress, можно прямо в разделе плагинов вашего блога.

Настройки в wp-config.php

Открываем файл wp-config.php и в самое начало вставляем следующий код:

/**
 * Security
 */
// disable error reporting
error_reporting(0);
@ini_set('display_errors', 0);
// force auto update
define('WP_AUTO_UPDATE_CORE', true);
// disable file edditing
define('DISALLOW_FILE_EDIT', true);
define('DISALLOW_FILE_MODS', true);

Права доступа

Директории — 755 или 750, файлы — 644 или 640, на wp-config.php — 600.

Удалить всё лишнее

  1. Удалить все ненужные плагины и все неиспользуемые темы.
  2. Удалить файлы типо README, example и т.п.
  3. Удалить из /wp-admin файлы install.php и upgrade.php.

Настройка Nginx

В файле хоста в разделе server добавляем следующие правила nginx для защиты wordpress:

# Раскоментировать если nginx собран с модулем "ngx_http_autoindex_module"
autoindex off;

# Запрещаем доступ ко всем ULR-ам, которые ЗАКАНЧИВАЮТСЯ следующими вхождениями
location ~* /((wp-config|plugin_upload|xmlrpc).php|(readme|license|changelog).(html|txt|md)|(debug|access|error)(.|_)log)$ {
  return 444;
}

# Запрещаем доступ ко всем URL, которые СОДЕРЖАТ следующие вхождения
location ~* /.*((wp-config|xmlrpc).*(php(_bak|~|#)|txt|old|bak|save|orig(|inal)|swp|swo)).*$ {
  return 444;
}

# Запрещаем все URL-ы, в параметрах (..?a=evil) которых есть следующие вхождения
if ($query_string ~* "^(.*)(wp-config.php|dl-skin.php|xmlrpc.php|uploadify.php|admin-ajax.php|local.xml)(.*)$") {
  return 444;
}

# Для противодействия SQL-инъекциям <https://habr.com/company/xakep/blog/259843/>
if ($query_string ~* "(concat.*\(|union.*select.*\(|union.*all.*select)") {
  return 444;
}

# Запрещаем вывод информации об авторах
if ($query_string ~* "author=[0-9]") {return 301 $scheme://$host/;}

# Запрет для загруженных скриптов
location ~* /(?:uploads|files)/.*\.(php|cgi|py|pl)$ {return 444;}

# Запрещаем ссылки вида //blog.ru/wp/wp-content/.. и //blog.ru/page/wp-content/..
location ~* /(wp|page)/.*wp-.*/.*$ {return 444;}

# Активно препятствуем fingerprinting-у утилиты WPScan (http://wpscan.org/)
location = /wp-includes/css/buttons-rtl.css {
  if ($http_referer !~* "/wp-admin") {return 404;}
}

location = /wp-includes/js/tinymce/wp-tinymce.js.gz {
  if ($http_referer !~* "/wp-admin") {return 404;}
}

# И так же для WPScan (который запрашивая robots.txt посылает referer сайта, хотя его быть не
# должно) закрываем доступ к этому самому robots.txt, делая вывод тулзы ещё менее информативный
location = /robots.txt {if ($http_referer != "") {return 404;}}

# Закрываем доступ к корню следующих директорий
location = /wp-content/ {return 404;}
location = /wp-includes/ {return 404;}
location = /wp-content/plugins/ {return 404;}
location = /wp-content/uploads/ {return 404;}
location = /wp-content/themes/ {return 404;}
location = /wp-content/languages/ {return 404;}
location = /wp-content/languages/plugins/ {return 404;}
location = /wp-content/languages/themes/ {return 404;}

# Закрываем прямой доступ у содержимому корневых директорий плагинов (для предотвращения
# их ракрытия)
location ~* /wp-content/plugins/([0-9a-z\-_]+)(/|$) {return 404;}

# Закрываем доступ к файлам перевода (для невозможности раскрыть версию WP)
location ~ /wp-content/languages/(.+)\.(po|mo)$ {return 404;}

# https://habr.com/post/168739/
if ($http_user_agent ~* (nmap|nikto|wikto|sf|sqlmap|bsqlbf|w3af|acunetix|havij|appscan|nic.ru|monitoring|semalt|virusdie|indy|perl|php|python|wpscan)) {return 403;}

# Блокируем конкретные юзер-агенты, в частности - пустой и "-"
if ($http_user_agent ~ ^(|-|_)$) {return 403;}

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

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