Сегодня на нулледе прочитал довольно не плохую статью про улучшения безопасности сайта на WordPress. По скольку на нулледе текст виден только зарегистрированным пользователям с определенным количеством постов, выложу статью у себя на блоге, для общественного пользования 😉 В общем всем также предлагаю ознакомиться и внести свои предложения и исправления (если конечно они будут).
1. Перед инсталляцией;
2. После инсталляции;
3. Периодические проверки и обновления.
1.1. Удаляем все ненужные файлы:
readme.html, license.txt, hello.php, ненужные темы и плагины.
1.2. Правильно отредактируем wp-config.php файл:
define('DB_NAME', 'wpdb'); // Вместо 'wpdb' нужно придумать сильное имя, например, wp433Fd6HW
define('DB_USER', 'wpuser'); // Например, UserFB56SKl
define('DB_PASSWORD', 'strongpassword'); // Тут должен быть сильный пароль, например, ‘FE876!8e#fh#9fDfds9f’
define('DB_HOST', 'localhost'); // В 99% случаях это значение не нужно менять
define('DB_CHARSET', 'utf8'); define('DB_COLLATE', '');
Меняем секретный ключ с дефолтного:
define('AUTH_KEY', 'izmenite eto na unikalnuyu frazu');
define('SECURE_AUTH_KEY', 'izmenite eto na unikalnuyu frazu');
define('LOGGED_IN_KEY', 'izmenite eto na unikalnuyu frazu');
define('NONCE_KEY', 'izmenite eto na unikalnuyu frazu');
на сгенерированный, с помощью сервиса http://api.wordpress.org/secret-key/1.1/
define('AUTH_KEY', 'M.uFL(R<FxXDJ8(TQ.V?YE}MB;XMTECTwxt6;7PD*=1_xlz^FL8;<>B[PX0IoKLR');
define('SECURE_AUTH_KEY', '/SD?GeMiI&?yb5l(Tb|pDLo=ZA^dkD;@GYlDB :dM=Ax$>9-DMI,0&AwT50`%f2s');
define('LOGGED_IN_KEY', 'yc,:[tN_cMmwP }wk]w5UkRw%P&+>E*jJZBikz3-OV7sO*-_g*{9z,PnM,T&LPAE');
define('NONCE_KEY', 'd2<?G|=9LRD$M]|B/f-<K$ RdAwCP4aAp,>A~8NBb%2?+6`z}?nWoD0`f]-.gUOC);
Делаем таблицы более защищенными:
$table_prefix = 'wp_4i32aK_'; // Используйте только буквы, числа и символы подчерка, чтобы сделать свой table_prefix уникальным. По крайней мере, это защитит Вас от части public эксплоитов.
1.3. Создаём пользователя и базу данных для блога в консоле MySQL:
Сначала, заходим под root’ом и создаем базу данных для блога:
$ mysql -u root
mysql> CREATE database wpdb;
Query OK, 1 row affected (0.00 sec)
В нашем примере это будет выглядеть так:
$ mysql -u root
mysql> CREATE database wp433Fd6HW;
Query OK, 1 row affected (0.00 sec)
Затем создаём пользователя: этот аккаунт будет иметь доступ только в базе данных WordPress. Также мы можем быть уверены, что пользователь используется только с локального сервера, а не удаленно.
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON wpdb.*
-> TO 'wpuser'@'localhost'
-> IDENTIFIED BY 'strongpassword'; Query OK, 0 rows affected (0.01 sec)
В нашем примере это будет выглядеть так:
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON wp433Fd6HW.*
-> TO 'UserFB56SKl'@'localhost'
-> IDENTIFIED BY 'FE876!8e#fh#9fDfds9f';
Query OK, 0 rows affected (0.01 sec)
1.4. Уберите блок meta из кода Вашей темы
В стандартной теме кусок кода, отвечающего за вывод блока meta:
<li><h2>Meta</h2>
<ul>
<?php wp_register(); ?>
<li><?php wp_loginout(); ?></li>
<li><a href="http://validator.w3.org/check/referer" title="This page validates as XHTML 1.0 Transitional">Valid <abbr title="eXtensible HyperText Markup Language">XHTML</abbr></a></li>
<li><a href="http://gmpg.org/xfn/"><abbr title="XHTML Friends Network">XFN</abbr></a></li>
<li><a href="http://mywordpress.ru/" title="<?php _e('Powered by WordPress, state-of-the-art semantic personal publishing platform.', 'kubrick'); ?>">WordPress</a></li>
<?php wp_meta(); ?>
</ul>
</li>
2.1. Меняем пароль Администратора по умолчанию
Поменяйте сгенерированный на этапе установки пароль Администратора
2.2. Удаляем версию WordPress
В файле functions.php в папке с Вашей темой добавляем строку:
remove_action ('wp_head', 'wp_generator');
В файле header.php в папке с Вашей темой удаляем строку:
<meta name="generator" content="WordPress <?php bloginfo('version'); ?>" />
Для WordPress версии 2.8.4 находим имплементацию функции get_the_generator($type) и изменяем ее:
function get_the_generator( $type ) {
$gen = '<!-- -->';
return apply_filters( "get_the_generator_{$type}", $gen, $type );
}
2.3. Пустой index.php
Поместите в папки wp-includes/, wp-content/, /plugins/ пустой файл index.php
2.4. Меняем имя пользователя Admin на нечто более неочевидное
Изменяем имя через MySQL консоль:
wp $ mysql -u UserFB56SKl –p
mysql> use wp;
UPDATE wp_users SET user_login='adm' where user_login='admin';
Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0
В нашем примере это будет выглядеть так:
wp $ mysql -u wpuser –p
mysql> use wp433Fd6HW;
UPDATE wp_4i32aK_users SET user_login='adm234Df' where user_login='admin';
Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0
Или, если не хотите копаться с запросами, можно сделать следующее:
1. Cоздайте новый аккаунт. Имя пользователя должно быть уникальным;
2. Назначьте новому пользователю роль Администратора;
3. Перелогинтесть как новый Администратор;
4. Удалите учетку старого Администратора.
2.5. Создаём новые роли пользователей
Для этого необходимо сначала установить на Ваш блог плагин Role Manager. Этот плагин даст Вам возможность скрупулезно и точечно устанавливать права пользователей. После активации плагина Вам, для начала нужно создать пользователя для себя. Удалите все права пользователя и затем внимательно выберите только те права, которые понадобятся Вам для ежедневной активности (писать посты, модерировать комментарии и тд). Удостоверьтесь, что только админский аккаунт имеет привилегии для активации / дезактивации плагинов, загрузки файлов, управлении опциями, переключении тем, импорт и тд.
Если в Вашем блог будет многопользовательским, то необходимо подумать о том, какие права действительно нужны пользователям и создать на основе этого свои собственные роли.
При создании ролей будьте осторожны, раздавая пользователям такие права как: аплоад файлов, доступ к редактированию исходного кода плагинов, активации плагинов, редактировании файлов / постов / страниц, импорт, нефильтрованный HTML, так как эти роли дают пользователям большие полномочия.
2.6. Ограничиваем доступ к папкам wp-content и wp-includes
С помощь файла .htaccess и специальных правил, мы запретим всё, кроме запросов на картинки, CSS и JavaScript. Файлы .htaccess необходимо положить с соответствующие директории.
Order Allow, Deny
Deny from all
<Files ~”.(css|jpe?g|png|gif|js)$”>
Allow from all
</Files>
Вы также можете добавить специфические PHP файлы для определенных шаблонов и плагинов.
2.7. Прячем директорию wp-content
Начиная с версии WordPress 2.6, появилась возможность переместить директорию wp-content.
Меняем в wp-settings.php строчки:
define('WP_CONTENT_DIR',$_SERVER['DOCUMENT_ROOT'].'/blog/wp-content');
define('WP_CONTENT_URL','http://domain.ru/blog/wp-content');
И, чтобы не было проблем с плагинами:
define('WP_PLUGIN_DIR',$_SERVER['DOCUMENT_ROOT'].'/blog/wp-content/plugins');
define('WP_PLUGIN_URL','http://domain.ru/blog/wp-conten/plugins');
2.8. Ограничиваем доступ к папке wp-admin
Если у Вас статический IP
Этот шаг легко осуществим для однопользовательского блога, но может принести настоящую головную боль для многопользовательского варианта. Этот трюк подходит только, если у Вас статический IP. Файл .htaccess для директории wp-admin должен содержать следующие правила:
AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName "Example Access Control"
AuthType Basic
<LIMIT GET>
order deny,allow
deny from all
allow from a.b.c.d. #Ваш статический IP
</LIMIT>
Положите файл в директорию wp-admin и попробуйте зайти в эту папку через прокси. Если всё работает правильно, в доступе будет отказано. После этого попробуйте зайти со своего IP.
Ограничиваем доступ по паролю
Более предпочтительным может оказаться доступ к папке wp-admin по паролю. А это означает, что Вы можете заходить в админскую панель, откуда угодно. Также это вариант, если у Вас динамический IP.
Файл .htaccess для директории wp-admin должен содержать следующие правила:
#Файл .htpasswd находиться за пределами root директории Вашего блога
ErrorDocument 401 default
AuthUserFile /srv/www/user1/.htpasswd
AuthType Basic
AuthName "WordPress Dashboard"
<Files "wp-login.php">
require user adminuser #Создайте секъюрный username
</Files>
<Files "xmlrpc.php">
require valid-user
</Files>
Сгенерируйте пароль командой:
$ htpasswd -cm .htpasswd adminuser
Или для генерации пароля воспользуйтесь сервисом http://www.htaccesstools.com/htaccess-authentication/ . Вот пример для user: admin , password: test
admin:$apr1$t3qLL...$uUmj9Wm/WbJk7YNza6ncM/
Файл .htpasswd лучше расположить директорией выше корня блога.
2.9. Файл wp-config.php
Вариант первый: для защиты Ваших данных необходимо перебросить на папку выше, WordPress автоматически проверит директорию выше если не найдет у себя в корне wp-config.php.
Если по каким-то причинам Вы не можете проделать того, что описано выше, то существует еще один вариант. А именно – защитить Ваш wp-config.php с помощью .htaccess :
# protect wpconfig.php
<files wp-config.php>
Order deny,allow
deny from all
</files>
2.10. Устанавливаем правильные права на файлы и папки
Основное правило:
1. Для файлов - 644
2. Для папок - 755
Из шелла эти операции можно проделать с помощью:
cd <wp-root-folder>
find (your path) -type d -exec chmod 755 ‘{}’ \
find (your path) -type f -exec chmod 644 ‘{}’ \
2.11. SSL для админов
Если Ваш сервер поддерживает SSL, то лучше сделать доступ в админку защищенной. Для этого в файле wp-config.php уберите комментарии в строчке:
define(’FORCE_SSL_ADMIN’, true);
2.12. Удалите вывод логов WordPress
В файле functions.php в папке с Вашей темой добавляем строку:
add_filter('login_errors',create_function('$a', "return null;"));
2.13. Запрещаем индексации с помощью Robots.txt
Проверить правильность можно по адресу http://www.yandex.ru/cgi-bin/test-robots
2.14. Плагины для Вашей безопасности
Login LockDown - Устанавливаем количество ложных логинов
Для этого есть два решения в виде плагинов Login LockDown and Limit Login Attempts. После того, как плагин активирован, он записывает все попытки залогиниться. Плагин позволяет запретить посетителю логиниться определенное время, после того как посетитель несколько раз неправильно ввёл пароль.
Belavir – Следим за изменениями в ключевых php файлах
http://blog.portal.kharkov.ua/2008/06/27/belavir/
WPIDS – Определяем признаки внедрения
http://blogsecurity.net/wordpress/wpids-wordpress-intruder-detection-system
WordPress Online Security Scanner – Сканируем блог на уязвимости
http://blogsecurity.net/wordpress/news-140707/
Akismit – Противоборство СПИДу СПАМу
http://akismet.com/
SpamBam – Определяем валидный ли браузер пользует клиент
http://blogsecurity.net/wordpress/spambam-comment-anti-spam-plugin
3.1. Следите за обновлением WordPress
3.2. Следите за обновлением плагинов
3.3. Следите за обновлениями безопасности
http://secunia.com/advisories/search/?search=WordPress
3.4. Проверяйте код темы и плагинов, которые Вы хотите добавить, на «дырявость»
3.5. Боритесь со спамом
3.6. Регулярно делайте полный backup базы данных Вашего блога
3.7. Читайте девелоперские блоги
Небольшой список:
1. http://lorelle.wordpress.com
2. http://blogsecurity.net
3. http://wordpress.org/development/
Также можете прочитать неплохой Guide на англ. яз. - http://www.nercomp.org/data/media/WordPress%20Security-Rode.pdf
Отличный список. Походу самый развернутый. Автору надо ящик пива за труды. А безопасность, так же как и бэкапы, вещь которую не стоит игнорировать.
Интересно а вот если сделать все эти пункты и опять возникнит эпидемия червя :-! как в прошлый раз, ее можно будет избежать, или все равно червь сможет зарозить блог?
и просто "с лету" не берутся в расчет пользователи, которые хостятся на виртуалках и которые даже не знают, что такое консоль =)
Знаток, от червя по логике уже спасет ограничение по .htaccess на админскую папку...наверно 😀
Отличный пост, есть советы, которые раньше нигде не встречал.
Ну ты даешь!!! Самый круто-безопасный список, который я когда-либо видел. Спасибо - исправим...
Полезный пост. Повесил себе в закладки, на досуге пороюсь в своих скриптах.
как говорится, знаменитая «установка wordpress за 5 минут» 😀
Спасибо за перевод! Кое что новое было найдено и тут же использовано 🙂
А вообще - начало с сервера.. а тут конечно большинству облом...
Спасибо за интересную статью!
Извините. Но я поступил, как лопух: внёс все изменения, что написаны в статье. А теперь в разделе админки «Создать новую запись» у меня пропал правый сайдбар. Тот, где выбирается рубрика и, самое главное, кнопка «Опубликовать».
Я всё тут же вернул назад. Но ситуация не изменилась. Два варианта: 1) либо я где-то ошибся, 2) либо дело не во мне.
Не подскажете, в какую сторону рыть?
Заранее спасибо!
А если просто переписать папку wp-admin? Залить поверх неё такуюже из дистрибутива и сказать «заменить всё»?
1. У меня часто перестает работать блог из-за так званых синтаксических ошибок в файлах:
index.php; default-widgets.php; default-filters;
Оказывается это всегда 2 строчки инородного JS, который подгружает вирусы на мой хост.
Бороться с этим приходится с помощью полной переустановки БЛОГА (очень накладно).
_____________________________
Решил попробовать побороться с этим, как сказано в пункте 2.6., но при размещении в папке wp-content файла .htaccess с приведенным кодом у меня не грузится тема и картинки, по этому разместил .htaccess только в wp-includes.
Посмотрим, что из этого выйдет.
_____________________________
Может кто сталкивался с такой проблемой и знает конкретный метод решения?
Огромное спасибо
действительно,полезная инфо,спасибо.У меня в блогу все открыто было,никто не взламывал-но-береженого Бог бережет...
Спасибо за пост, а зачем пустые index.php в эти папки ложить, подскажите плиз! Спасибо
Евгений, чтобы не было возможности получить список файлов в, например, папке /themes.
Спасибо!
Да, стайтейка хоть и не новая уже, однако весьма достойно написанная и очень полезная. Даже я кое-что для себя освежил, спасибо.
Bubblebabe WordPress, не совсем понял тебя *UNKNOWN* Что ты имел в виду? Тут 95% (даже 100% просто у некоторых база данных создается только через панель, через phpMyAdmin только просмотр, ну таких мало) советов подходят для людей которые на шаред хостинге.