Написать эту статью меня сподвиг мой последний опыт, да тот факт, что в интернете, хотя уже писано – переписано об этом уже сто раз, но информация постоянно устаревает, а некоторые вещи, о которых я хотел бы поговорить, у нас в рунете – вообще не упомянуты. Поскольку я обычный пользователь, а вовсе не специалист, то и говорить я буду о защите проекта, блога, сайта и т.д. на WordPress на бытовом уровне, в основном от всякой школоты, а не от серьезных хакеров.
Итак, особой паранойей страдать не надо, вордпресс – штука в принципе неплохо защищенная. Но кое-что сделать стоит.
Первый этап – это регулярный бэкап как сайта, так и базы данных – здесь что-либо новое придумать достаточно сложно, одним из неплохих вариантов, который можно использовать, является плагин BackWPup.
О нем рассказывается очень много где, выбирайте любую ссылку, ну или можно прочитать официальную документацию, и с указанными предосторожностями им вполне можно пользоваться.
Второй этап – это защита от тупого перебора паролей в админке, он же брутфорс. Если думаете, что это никому не надо – ломать ваш несчастный блог, то вы глубоко заблуждаетесь. Я тоже так когда-то думал, но однажды решил найти и установить себе специальный плагин, который бы вел лог того, кто, в какое время, с какого адреса, используя какой логин и пароль, пытался авторизоваться на сайте. Записывал бы как неудачные попытки вместе с использующимися логинами и паролями, так и удачные, но естественно, без пароля, чтобы я увидел, что кто-то зашел на огонек.
Как оказалось, такие плагины есть. Однако, у них есть один небольшой, но существенный недостаток в том, что они логируют только имя пользователя, а меня интересовало также, какие пароли пытаются подобрать злоумышленники, чтобы сменить его, если я вдруг увижу, что кто-то близко подобрался (хотя это и очень маловероятно). К сожалению, с самого начала полноценного плагина для этого я не нашел, поэтому стал колхозить (впрочем, спустя несколько дней, нужный плагин все-таки обнаружился, но об этом – позже). Введя в гугле запрос logging failed login attempts wordpress with passwords я где-то 8-ой ссылкой обнаружил программный код, который автор предлагал самостоятельно преобразовать в плагин. Его страничка находится здесь. Как я понял, автор сам не определился, как его назвать – то ли Log Login Attempts, то-ли AW Login Logger. Но при всей своей неказистости он позволял сделать как раз то, что было необходимо – записывал лог в виде csv файла в одну из директорий сайта, который потом можно было скачать и просмотреть (на скриншоте – как раз он) – и именно cо всей необходимой информацией: дата, время, IP, используемый злоумышленником логин, используемый злоумышленником пароль.
Я преобразовал его в русский вариант, добавил некоторую информацию, файл index.php, не позволяющий прочитать каталог, в котором он лежит, а также некоторые тонкие настройки. Впрочем, поскольку в последствии я нашел более простые плагины – архив всего этого добра выкладывать не буду, кому очень захочется – сам сможет в блокнот код скопировать. Но у себя пока деактивировать не стал – уж больно удобно смотреть статистику в csv файле.
Ну а если данные об использованных при переборе паролях вам не нужны, зато важно красивое графическое представление информации, плагинов для wordpress, которые это делают, существует немало, например Simple Login Log,
который позволяет сортировать попытки входа, автоматически удалять из базы данные о входах по истечении установленного времени, выводить дату и время, а при вставке кода
1 2 3 4 5 6 |
add_filter( 'sll-output-data', 'link_location_by_ip' ); function link_location_by_ip($item){ //$item is a single row for columns with their values $item['ip'] = sprintf('<a target="_blank" href="http://infosniper.net/index.php?ip_address=%1$s&map_source=3&two_maps=1&overview_map=1&lang=1&map_type=1&zoom_level=11">%1$s</a>', $item['ip']); return $item; } |
при клике на IP дает нам возможность увидеть, откуда был этот IP на вот такой вот красивой карте:
Информация абсолютно бесполезная, зато красиво преподнесена 🙂 И при обновлении плагина – к сожалению, код необходимо вставлять заново.
Аналогичный результат, но с логгированием вообще всех действий, происходящих на проекте, дает плагин Bluetrait Event Viewer (BTEV).
А если к нему приложить руку, и исправить кое-что ( но не стоит забывать, что при обновлении плагина – все ваши изменения псу под хвост – поэтому привожу просто как пример, но если сильно упереться – несложно будет разобраться, что менять самостоятельно и в новых версиях) – то может получится совсем шоколадно. Другой вопрос – а нужно ли оно – постоянно это менять при каждом его обновлении. Поэтому убираю под спойлер.
в строчке 1200 с:
1 |
<td><?php echo esc_html($event_array['ip_address']); ?></td> |
на:
1 |
<td><?php echo '<a target="_blank" href="http://infosniper.net/index.php?ip_address=' . esc_html($event_array['ip_address']) . '&map_source=3&two_maps=1&overview_map=1&lang=1&map_type=1&zoom_level=11">' . esc_html($event_array['ip_address']) . '</a>'; ?></td> |
То он совершенно замечательно будет выводить ту же самую вышеуказанную карту при щелчке на IP.
А если еще и строчки с 2169 по 2180 поменять с
1 2 3 4 5 6 7 8 9 10 11 12 |
function btev_trigger_invalid_username($username) { btev_trigger_error('Login Failed: Unknown User "' . $username . '"', E_USER_WARNING); btev_send_alert(array('name' => 'wp_login_failed', 'description' => 'Login Failed: Unknown User "' . $username . '"')); return; } function btev_trigger_invalid_password($username) { btev_trigger_error('Login Failed: Incorrect Password For "' . $username . '"', E_USER_WARNING); btev_send_alert(array('name' => 'wp_login_failed', 'description' => 'Login Failed: Incorrect Password For "' . $username . '"')); return; } |
на
1 2 3 4 5 6 7 8 9 10 11 12 |
function btev_trigger_invalid_username($username) { btev_trigger_error('Login Failed: Unknown User "' . $username . '" with password "' . $_POST['pwd'] . '"', E_USER_WARNING); btev_send_alert(array('name' => 'wp_login_failed', 'description' => 'Login Failed: Unknown User "' . $username . '" with password "' . $_POST['pwd'] . '"')); return; } function btev_trigger_invalid_password($username) { btev_trigger_error('Login Failed: Incorrect Password "' . $_POST['pwd'] . '" For "' . $username . '"', E_USER_WARNING); btev_send_alert(array('name' => 'wp_login_failed', 'description' => 'Login Failed: Incorrect Password "' . $_POST['pwd'] . '" for "' . $username . '"')); return; } |
и с 2240 по 2248
1 2 3 4 5 6 7 8 9 10 |
if ( !$user || ($user->user_login != $username) ) { btev_send_alert(array('name' => 'wp_login_failed', 'description' => 'Login Failed: Unknown User "' . $username . '"')); btev_trigger_error('Login Failed: Unknown User "' . $username . '"', E_USER_WARNING); } else { btev_send_alert(array('name' => 'wp_login_failed', 'description' => 'Login Failed: Incorrect Password For "' . $username . '"')); btev_trigger_error('Login Failed: Incorrect Password For "' . $username . '"', E_USER_WARNING); |
поменять на
1 2 3 4 5 6 7 8 9 10 |
if ( !$user || ($user->user_login != $username) ) { btev_send_alert(array('name' => 'Login Failed: Unknown User "' . $username . '" with Password "' . $_POST['pwd'] . '"')); btev_trigger_error('Login Failed: Unknown User "' . $username . '" with Password "' . $_POST['pwd'] . '"', E_USER_WARNING); } else { btev_send_alert(array('name' => 'Login Failed: Incorrect Password "' . $_POST['pwd'] . '" For "' . $username . '"',)); btev_trigger_error('Login Failed: Incorrect Password "' . $_POST['pwd'] . '" For "' . $username . '"', E_USER_WARNING); |
то указанный плагин будет вполне себе нормально логировать и неправильные пароли как к правильным, так и неправильным логинам.
Впрочем, есть еще один вариант, также логирующий все подряд, а не только авторизации. Плагин ThreeWP Activity Monitor, который логирует практически все тоже самое, что и предыдущий, включая IP, логин и пароль, безо всякого редактирования кода, но не позволяет увидеть все на красивой карте щелчком по IP. И табличка – не столь удобная. Приводить его в чувство мне уже не хотелось, поскольку с наскока не удалось. А вот скриншот приведу:
Ну и на последок – более простой плагин Login Logger
Единственное его преимущество перед Simple Login Log – это то, что он, как и Плагин ThreeWP Activity Monitor для Вордпресс, еще выводит время, прошедшее с момента попытки авторизации. Иногда это удобно. Но вместе с тем, не имеет ни карты, ни детальной информации.
Резюме такое:
AW Login Logger – необходимо потрудиться самому для копирования кода, по результату – он создает и использует только csv файл (если его размер будет очень большим – каждый раз открывать и перезаписывать его – тоже не подарок), а не базу данных. Но его очень удобно просматривать в экселе.
Simple Login Log – не логирует использующиеся пароли, но при небольшой доработке кода открывает IP на красивой карте, впрочем – код придется дорабатывать при каждом его обновлении.
Bluetrait Event Viewer (BTEV) – логирует использующиеся пароли и открывает IP на карте только при доработке кода, что придется делать при каждом его обновлении, ну и плюс ко всему – даже при доработке пароли не логируются в отдельном столбце. Для отдельного столбца – нужна очень глубокая доработка. Но зато удобно смотреть, какие IP ломились в гости к вам, т.к. выводит их список весьма удобно.
ThreeWP Activity Monitor – логирует и IP, и логин, и пароль, безо всякого редактирования кода, но не позволяет увидеть все на красивой карте. Плюс табличный вывод – у него совсем неудобен, ее (таблицы) вообще, как таковой – нет.
Login Logger – пароль тоже не логирует, на карте ничего не выводит, зато пишет, сколько времени прошло с момента попытки авторизации, ну и табличка достаточно удобна.
Ну и конечно же, ничто не мешает Вам использовать их попарно – 1 и 2-ой, или 1-ый и 3-ий, или второй с внесенными коррективами. А я себе, возможно, как-нибудь ко второму или четвертому прикручу функционал запоминания паролей, в этом случае нужда в самом первом отпадет.
Но мы отвлеклись. Как оказалось, на мой сайт периодически кто-то ломился с испанского IP, перебирая по словарю пароли. Вот только малюсенький пример, выдернутый из лога, который создал самый первый из описанных плагинов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Дата Время IP Логин Пароль 2012-08-06 04:47:12,80.25.95.249,"Admin","redwings" 2012-08-06 04:47:13,80.25.95.249,"Admin","rock" 2012-08-06 04:47:14,80.25.95.249,"Admin","rocket" 2012-08-06 04:47:15,80.25.95.249,"Admin","rosebud" 2012-08-06 04:47:16,80.25.95.249,"Admin","runner" 2012-08-06 07:15:01,80.28.106.14,"Admin","rush2112" 2012-08-06 07:15:02,80.28.106.14,"Admin","russia" 2012-08-06 07:15:03,80.28.106.14,"Admin","saturn" 2012-08-06 07:15:03,80.28.106.14,"Admin","scooby" 2012-08-06 07:15:04,80.28.106.14,"Admin","scorpio" 2012-08-06 09:37:17,81.43.96.218,"Admin","scorpion" 2012-08-06 09:37:18,81.43.96.218,"Admin","scott" 2012-08-06 09:37:19,81.43.96.218,"Admin","sexy" 2012-08-06 09:37:19,81.43.96.218,"Admin","shaved" 2012-08-06 09:37:20,81.43.96.218,"Admin","shit" 2012-08-06 13:46:50,79.148.238.85,"Admin","sierra" 2012-08-06 13:46:51,79.148.238.85,"Admin","skippy" |
Соответственно, когда мы проверили, обнаружили и поверили, что мы (о счастье!) все-таки кому-то нужны, можно думать как раз о втором этапе – защите от перебора паролей. Такой защиты может быть три вида (принимая во внимание, что все-таки стоит сменить логин с Admin на что-нибудь другое, это как-бы очевидно):
1) Вы очень хороший человек, делаете себе сложный пароль из не менее 12 знаков, включающих набор из латинских маленьких букв + большие + цифры + спецсимволы, итого порядка 70 используемых символов. При правильно выбранном пароле из 12-ми символов, например ye$kRv7A#tWu количество вариантов составит 70^12, в ближайшее годы подобрать его в осмысленное время просто невозможно, даже зная логин к сайту (на самом деле достаточно и 9 знаков, составлненных из 70 символов, но 12 – это железный вариант). Таким образом, вы отвлекаете на себя атаку, которая все равно не приведет к успеху, а процессорное время злоумышленника потратит, чем поможет простым людям, не задумывающимся над этим. Не очень приятно только, что сайт ваш будет нагружаться под напором ботов.
2) Установить себе плагин Login Security Solution, который увеличивает время, через которое после неправильного ввода данных появляется возможность снова их ввести. При этом он не блокирует IP, с которого осуществляется ввод, и вам не грозит забанить самого себя при неправильном вводе, или всю вологодскую область, выходящую через один и тот же прокси, если вдруг найдется среди них какой злодей. Этим вы также немного отвлечете злоумышленников от чужих сайтов, а ваш они взломать не смогут из-за недостаточной скорости подбора, даже если пароль состоит из 7-8 символов. Учитывая, что IP периодически меняются при переборе – защита не ахти какая, но все же лучше, чем ничего.
3) Установить один из плагинов, которые на время блокируют IP атакующего. Опять же, при смене IP не поможет, но менять IP, скажем, каждые 15 перебранных паролей – тоже занятие не особо интересное. Из таких программ я бы мог рекомендовать Limit Login Attempts, хотя есть сведения, что она не защищает от горизонтальных атак, т.е. если идет перебор логинов при том же самом пароле, проверяется 15 штук, после чего пароль меняется, и снова прогоняется 15 логинов. Автору уже сообщили об этом, но он пока не озаботился новой версией, решающей эту проблему. Отдельно отмечу, что я крайне НЕ рекоммендую использовать очень популярные в рунете плагины Login LockDown и Login Lock из-за имеющихся в них уязвимостей (то, что я его использую – это в силу несколько иных причин, кто на них наткнется – сам поймет). Кому интересны подробности – гуглите внимательно англоязычный интернет, найдете много чего интересного. Но в тоже время, если для отслеживания активности подбора паролей используется ThreeWP Activity Monitor, то по ряду причин (продолжение записи в базу попыток входа без бана) лучше все же использовать Login LockDown.
Пока я не стал ставить ни один из них, хотя, по данным логов, перебор паролей на моем сайте идет и днем и ночью без устали со средней скоростью 1 пароль в две секунды – и Москва 91.214.97.82, и Владивосток 82.162.61.186, и даже Перу и США отметились, в результате чего (в том числе и логгирования), сайт стал притормаживать. Возможно, в один прекрасный момент это мне надоест.
Но пока – я очень хороший и добрый человек 🙂 И только после увеличения активности до десятка паролей в секунду мне все-таки это надоело, и защита была установлена 🙂 ) Однако впоследствии это никак не помогло при взломе моего сайта, выполненного через дыру в теме – в файле thimthumb.php – обязательно проверяйте его версию при установке какой-либо темы.
Ну и третий этап защиты – это установка комплексных систем защиты. Наиболее известные из них – это плагин Better WP Security и плагин 6Scan Security, которые уже включают в себя и средства бэкапа по расписанию, и блокирование подозрительных IP, и защиту от сетевых атак, а также глубокое тестирование сайта на возможные уязвимости. Также можно отметить сервис Ай-болит – но это пригодится уже после того, как появились подозрения на то, что сайт взломан.
Добавить комментарий