[Инфо] Maniacally Secured Wordpress (Мануал)

Тема в разделе "Wordpress", создана пользователем ShadowDamballah, 28 сен 2009.

Статус темы:
Закрыта.
Модераторы: Sorcus
  1. ShadowDamballah

    ShadowDamballah Постоялец

    Регистр.:
    18 сен 2009
    Сообщения:
    56
    Симпатии:
    10
    Защита Вашего блога зависит и от выбранного Вами хостера и от Ваших действий (или бездействий). Вот как раз второй случай, а именно то, что Вы можете предпринять и обсудим. Ниже будет представлено подобие checklist'а, который я создавал для себя. Всю информацию я собирал в Буржнете, так что за перевод сильно не ругайте.
    Если есть что добавить или исправить, в общем любые замечания Welcome!.
    И пожалуйста без флуда.

    Секъюрность, зависящая от пользователя
    1. Перед инсталляцией;
    2. После инсталляции;
    3. Периодические проверки и обновления.
    1. Перед инсталляцией
    1.1. Удаляем все ненужные файлы:
    readme.html, license.txt, hello.php, ненужные темы и плагины.
    1.2. Правильно отредактируем wp-config.php файл:
    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''');
    Меняем секретный ключ с дефолтного:
    PHP:
    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/
    PHP:
    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');
    Делаем таблицы более защищенными:
    PHP:
    $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:
    HTML:
    <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. После инсталляции
    2.1. Меняем пароль Администратора по умолчанию
    Поменяйте сгенерированный на этапе установки пароль Администратора
    2.2. Удаляем версию Wordpress
    В файле functions.php в папке с Вашей темой добавляем строку:
    PHP:
    remove_action ('wp_head''wp_generator'); 
    В файле header.php в папке с Вашей темой удаляем строку:
    PHP:
    <meta name="generator" content="WordPress<?php
    bloginfo
    ('version'); ?>" />
    Для Wordpress версии 2.8.4 находим имплементацию функции get_the_generator($type) и изменяем ее:
    PHP:
    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, так как эти роли дают пользователям большие полномочия.
    Ограничиваем доступ к папкам 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 строчки:
    PHP:
     define('WP_CONTENT_DIR',$_SERVER['DOCUMENT_ROOT'].'/blog/wp-content');
     
    define('WP_CONTENT_URL','http://domain.ru/blog/wp-content');
    И, чтобы не было проблем с плагинами:
    PHP:
     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 уберите комментарии в строчке:
    PHP:
    define(’FORCE_SSL_ADMIN’true);
    2.12. Удалите вывод логов Wordpress
    В файле functions.php в папке с Вашей темой добавляем строку:
    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. Периодические проверки и обновления
    3.1. Следите за обновлением Wordpress
    3.2. Следите за обновлением плагинов
    3.3. Следите за обновлениями безопасности
    Например - http://secunia.com/advisories/search/?search=WordPress
    3.4. Проверяйте код темы и плагинов, которые Вы хотите добавить, на «дырявость»
    3.5. Боритесь со спамом
    3.6. Регулярно делайте полный backup базы данных Вашего блога
    3.7. Читайте девелоперские блоги
    Небольшой список:

    Если Вы дочитали и Вам понравилось, не стесняйтесь жмите на кнопку ------------------------------------------->> Спасибо
     
    MasterMarti, whitewolff, vbnm070 и 2 другим нравится это.
  2. FastByte

    FastByte

    Регистр.:
    17 апр 2007
    Сообщения:
    267
    Симпатии:
    13
    Дочитал я прямо-таки прифигев...:eek:

    Блин не каждый впс народ так засекуривает...

    Чтоб стока гемора имело смысл - он точно должен быть мультисайтовый, иначе охренеешь каждый сплог секурить...

    Может есть вп мультисайтовый?
     
  3. t3s

    t3s

    Регистр.:
    16 фев 2008
    Сообщения:
    719
    Симпатии:
    290
    просто здраво и разумно
    ShadowDamballah, на ВП не только сплоги делают

    а некоторые советы достаточно сделать всего один раз - например описанные в первой части
    так что частично и для сплогов подходит
     
  4. ShadowDamballah

    ShadowDamballah Постоялец

    Регистр.:
    18 сен 2009
    Сообщения:
    56
    Симпатии:
    10
    Ну так на тему посмотрите :)

    t3s
    Так я про блоги, а не сплоги писал :)

    To All:
    Конструктивная критика, предложения принимаются :)
     
  5. FastByte

    FastByte

    Регистр.:
    17 апр 2007
    Сообщения:
    267
    Симпатии:
    13
    А для сервера - впса столь же детального секура случайно не создавал?
    То же пригодилось бы,:ah: а то wp с таким подходом будет круче защищен чем сам сервак :)
    Или на заставке при логине в шелл вместо обычных "админ уведомен, действия записываются... " писать - а ну брысь отсюда, это не считается! ЗачОт тока через wp!
     
  6. vbnm070

    vbnm070

    Регистр.:
    13 май 2008
    Сообщения:
    370
    Симпатии:
    193
  7. ShadowDamballah

    ShadowDamballah Постоялец

    Регистр.:
    18 сен 2009
    Сообщения:
    56
    Симпатии:
    10
    FastByte

    Для сервера еще нет, да и тут всё от деталей зависит: система и пр.

    А на счет виртуальных серверов, смотрите соседей, если на сервере будет "дырявый" сосед, могут через него поломать.
     
  8. FastByte

    FastByte

    Регистр.:
    17 апр 2007
    Сообщения:
    267
    Симпатии:
    13
    Ну если еще у всех соседей за секурностью приглядывать - дешевле уж выделенный сервак брать:D

    А так у меня например Xen, у него насколько я знаю ломануть от соседа по сложности близко к отдельному серваку.

    А для FreeBSD по секурности мануала нету?
     
Статус темы:
Закрыта.