Ну что. Начнем решать практические задачи. Задача №1. Обеспечить безопасность собственного сайта.

Когда сайт создан и работает прибегают разные говнохакеры и пытаются сайт сломать. Оставим в стороне ответ на вопрос для чего они это делают. У нас задача простая – защита.

Опять же оставим в стороне классические вариант типа сложного пароля и т.п. Просто ограничим доступ к сайту по IP адресу. Для этого у нас в корне сайта лежит файл .htaccess. В нем можно прописать директиву Deny и указать IP адреса с которых доступ к сайту запрещен. Что-то подобное:

## Deny
Order Deny, Allow
Deny from 109.162.121.92
Deny from 178.33.23.156
Deny from 46.185.123.9

И доступ с адресов 109.162.121.92, 178.33.23.156, 46.185.123.9 будет запрещен. Остается только собрать список этих самых адресов. Для этого берем лог-файлы доступа. Они имеют вид:

2018-05-20T21:49:06+00:00 INFO 178.132.78.54 joomlafailure Username and password do not match or you do not have an account yet.
2018-05-20T22:55:15+00:00 INFO 159.224.139.35 joomlafailure Username and password do not match or you do not have an account yet.

Это небольшой фрагмент лога. Из него видно, что супостаты с адресами 178.132.78.54 и 159.224.139.35 пытаются подобрать пароль к административной части сайта.

IP адрес имеет вид: ххх.ххх.ххх.ххх Четыре числа от 0 до 255 разделенные между собой тремя точками. Соответственно числа в адресе могут иметь одну, две или три цифры. Описать одну из четырех частей адреса можно как \d{1,3}. Такая конструкция пропустит адреса больше 255, но для нас это не принципиально. Т.к. символ . – в регулярных выражениях означает любой символ, добавим перед ней \. Теперь конструкция \. будет обозначать только точку.

Получаем регулярное выражение для IP адреса —  (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) 

Предварительный этап. Реальные логи в конце строки имеют так называемый мягкий перенос строки обозначаемый символом ¬ Поэтому в начале я поставил поиск и замену ¬ на ¶. 

Основной этап. Нам надо извлечь IP адреса. Берем фильтр из группы замена (Replace) Схема языка Perl (Find Pattern Perl Style). Пишем (.*)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (.*)¶ в окне замены - $2. И собираем урожай IP адресов. Напомню. Все, что до IP адреса $1, все что после IP адреса и до символа ¶ - $3. Но эти части нам не нужны и мы их отбрасываем.

Чтобы не напрягаться после фильтра Схема языка Perl я добавил фильтр Счет строк-дубликатов. В итоге было получено:

137 149.154.69.238
30 159.224.139.35
7 178.132.78.36
6 178.132.78.37
29 178.132.78.54
2 178.132.78.55
2 185.45.13.162
21 5.188.62.11
33 77.72.84.18

Т.е. кто-то пытался подобрать пароль 137 раз, кто-то 30 и т.д. Я ограничил только победителей с самым высоким результатом от 300 попыток (на практике были встречены результаты более 10000). Те, кто сделал более 300 попыток подбора пароля были добавлены в файл .htaccess и надеюсь никогда больше не попадут на сайт. Конечно они могут изменить IP адрес и предпринять новые попытки - поживем - увидим. Фильтр мы ведь сохранили, да?

Примечание

Если у вас что-то не получается при написании регулярного выражения можно пойти таким путем отладки регулярки. 

Берем нашу строку. У нас есть 3 объекта ограниченных круглыми скобками. Все, что до IP адреса - (.*) или $1. Сам IP (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) это - $2 и все, что после (.*)¶ - $3. 

При отладке я (в случае возникновения проблем) пишу в окне замены:

1 - $1¶ 
2 - $2¶
3 - $3¶

И после прогона получаю:

1 - 2018-05-20T19:31:48+00:00 INFO
2 - 178.132.78.54
3 - joomlafailure Username and password do not match or you do not have an account yet.

Теперь прекрасно видны все значения! Мы для себя выбираем и оставляем только нужные.

Дополнение

К сайту многократно могут обращаться полезные боты. Я о Googlebot, YandexBot и подобных. Они индескируют написанные статьи, рисунки и фотографии. Соответственно, если на сайте много статей, будет много обращений от них.

Небольшой пример обращения Googlebot, который собирает фотографии:

digitblog.ru  66.249.66.4 - - [07/Jun/2018:11:28:58 +0300] "GET /images/birds/owl/_DSC4425.jpg HTTP/1.1" 304 - "-" "Googlebot-Image/1.0"

Для нас они несут только пользу. Поэтому запрещать доступ к сайту для них не стоит. Самое простое: перед нашим основным фильтром поставить проверку. Если в строке есть Googlebot, YandexBot и подобное, то эти строки лучше удалить. Фильтр из группы Remove Удалить совпадающие строки (Remove Matching Lines) прекрасно сделает это. Значение будет Googlebot|YandexBot и можно еще добавить другие сигнатуры