Мне требовалось поднять на своём домашнем Linux сайт для проверки переносимости (не мой! попросили). И параллельно отработать некоторые детали.
Поднял Tomcat, сконфигурировал как виртуальный хост (там ещё тестовый мой болтается - для отработки всякой всячины). Поставил копию нашего совместного, запустил. Всё заработало. Тесты затянулись, как это водится. И почти сразу после подъёма сайта начались попытки его ломать. В основном китаёзы и малазийцы.
Возникала проблема безопасности. Решал так: закидывал очередного любителя что-то поломать в файл server.xml с запретом на доступ. В начале ещё культурно пытался таким возвращать ценный код из 40x, а потом подумал: -Tomcat это вам не Apache! На нём можно больше. И вместо вразумительного кода из разряда 40x/50x, чтобы дурить было проще, стал возвращать в качестве кода год Победы. Благо, Tomcat - это не Apache! Там можно вернуть принципиально любой код, а так как большинство сканеров и программ взлома привыкли общаться по стандарту (всё-таки!), то да будет им нестандартное счастье!
Но любителей посканить много, а генерация листа руками... Влом, словом. Сделал так: egrep выбирал из логов Tomcat коды с 40x/50x и закидывал их во временный файл. Потом этот файл разбирал sed-ом, генерируя уже списки доступа.
1. шаг: Выборка хамов из логов Tomcat:
egrep ' [45][0-9][0-9] ' /var/log/tomcat/*access*{txt,log} | egrep -v 127.0.0\|favicon.ico | awk '{print $1}' | awk -F: '{print $2}' | sort | uniq > /tmp/aaa
в файле /tmp/aaa надо только просмотреть самый верх (там две строки лишние), выкинуть эти строки редактором. Мне было просто лень разбираться откуда они.
2. шаг: Обработка sed-ом:
sed -f AccessValve.sed /tmp/aaa >/tmp/bbb
даёт ПОЧТИ готовый файл для вставки в /etc/tomcat/server.xml (или где он у Вас лежит). Почти. Потому, что если количество строк не кратно шести надо будет исправлять последнюю строку (она не будет корректной).
Файл AccessValve.sed:
# 5 lines to one.
i\
<Valve className="org.apache.catalina.valves.RemoteAddrValve" denyStatus="1945"
{N;s/\n/|/;Te;};
{N;s/\n/|/;Te;};
{N;s/\n/|/;Te;};
{N;s/\n/|/;Te;};
{N;s/\n/|/;Te;};
:e
s/^/ deny="/;s/$/\"\/>/
# Not working Te - branch on false substituion to :e. Why? I did not understand.
Опытным путём выяснил, что по шесть IP в ряд удобнее всего. А вот как выглядит кусок который надо исправлять редактором:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" denyStatus="1945"
deny="93.158.158.73|93.158.158.76|93.174.95.106|93.51.11.154|93.82.100.184|94.176.165.160"/>
<Valve className="org.apache.catalina.valves.RemoteAddrValve" denyStatus="1945"
94.191.50.205|94.244.138.21|95.110.227.199|95.13.70.103|95.96.109.93
Выделенный внизу кусок надо исправить как кусок, который приведён выше (с deny="..."). Комментарий Not working Te - branch on false substituion to :e также относится именно к этому куску. Команда Te, которая должна была перекинуть по отсутствии замены на метку e, не отработала. Или я чего-то не понимаю!
После обработки /tmp/bbb открываешь текстовым редактором /etc/tomcat/server.xml, находишь строку в нужным <Host name=... и вставляешь туда содержимое файла /tmp/bbb после соответствующего <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"...
Всё! Рестарт Tomcat. Можно смотреть на логи и видеть хамов получающих вместо 40x/50x кодов код Победы - 1945. Естественно, что получат такой код только те, кто в листе, но я уже убедился, что в большинстве случаев идут из-под NAT, а NAT держат публичные маршрутизаторы у которых адрес не меняется. Вот пример:
Прямо от сейчас!!!
185.128.41.50 - - [29/Aug/2019:13:30:15 +0400] "GET /manager/html HTTP/1.1" 1945 -
185.128.41.50 - - [29/Aug/2019:13:30:15 +0400] "GET /manager/html HTTP/1.1" 1945 -
185.128.41.50 - - [29/Aug/2019:13:30:16 +0400] "GET /manager/html HTTP/1.1" 1945 -
185.128.41.50 - - [29/Aug/2019:13:30:16 +0400] "GET /manager/html HTTP/1.1" 1945 -
В процессе отладки сканировал адреса с которых ко мне приходили - законом не запрещено! Выяснил, что ломают обычно незакрытые снаружи маршрутизаторы марок NetGear. Вот, кстати!, пример именно от маршрутизатора с адресом выше! Сканировал то ли вчера, то ли позавчера.
Nmap scan report for 185.128.41.50
Host is up (0.088s latency).
Not shown: 998 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.6.1 (protocol 2.0)
|_ssh-hostkey: 2048 fc:6c:b8:19:3a:e5:13:16:60:8e:41:ca:23:e7:10:d6 (RSA)
179/tcp filtered bgp
Device type: WAP|general purpose|specialized
Running (JUST GUESSING): Netgear embedded (92%), Linux 2.6.X|2.4.X (91%), Linksys Linux 2.4.X (90%), Asus Linux 2.6.X (88%), Crestron 2-Series (88%), Ruckus embedded (87%), TP-Link embedded (87%), D-Link embedded (87%)
Aggressive OS guesses: Netgear DG834G WAP (92%), OpenWrt Kamikaze 7.09 (Linux 2.6.22) (91%), Linux 2.6.22 (Fedora Core 6) (90%), OpenWrt White Russian 0.9 (Linux 2.4.30) (90%), OpenWrt 0.9 - 7.09 (Linux 2.4.30 - 2.4.34) (90%), Linux 2.6.32 (89%), Linux 2.6.34 (89%), Asus RT-N16 WAP (Linux 2.6) (88%), Crestron XPanel control system (88%), Linux 2.6.9 - 2.6.18 (87%)
No exact OS matches for host (test conditions non-ideal).
Как видим, открытый снаружи порт ssh поспособствовал взлому. И это при том, что на этом раутере ещё и BGP есть!!! Потому просьба ко всем админам сетей - ЗАКРЫВАЙТЕ СВОИ РАУТЕРЫ ОТ ДОСТУПА СНАРУЖИ! Пожалуйста!