Защита от сканирования портов Xtables-addons

xtables-logoНедавно на роботе столкнулись с проблемой безопасности сервером, а именно сканированием портов. В связи с этим, решил написать короткую статью, в которой хочу выложить свой пока маленький опыт в защите сервера от сканирования портов. Пересмотрел кучу решений по данной теме и сначала испробовал PSAD. Это весьма мощный инструмент, работает отлично, но имеет одно большое НО – очень ресурсоемкий, поскольку базируется на записи и сканировании логов Iptables. Если проблем с ресурсами у Вас нет – то это то, что нужно.

Следующий инструмент, про который я хочу описать и рассказать – это пакет Xtables-addons. Это набор дополнений к Xtables фильтру пакетов, который изначально присутствует в ядре Linux. Данные дополнения включат в себя нужный нам фильтр, позволяющий обнаружить сканирование TCP и UDP портов – psd.

Все, что нужно сделать – это добавить этот фильтр в цепочку iptables.

Для начала установим Xtables-addons на Ubuntu 12.04 (x86_64).
Так как мы будем использовать установку из исходного кода, нужно установить дополнительные пакеты и скачать исходники.

apt-get -y install linux-headers-`uname -r` module-assistant iptables-dev pkg-config build-essential
wget <a href="http://freefr.dl.sourceforge.net/project/xtables-addons/Xtables-addons/2.4/xtables-addons-2.4.tar.xz">http://freefr.dl.sourceforge.net/project/xtables-addons/Xtables-addons/2.4/xtables-addons-2.4.tar.xz</a>

Теперь нужно распаковать архив и начать компиляцию.

tar -Jxvf xtables-addons-2.4.tar.xz
cd xtables-addons-2.4/
./configure || (echo "configure failed" ; exit 1)
make || (echo "make failed" ; exit 1)
make install || (echo "make install failed" ; exit 1)

Если все прошло успешно (не тестировалось на других ОС) нужно для начала обновить зависимости между новыми и старыми модулями (modules.dep) и загрузить psd и xtables модули.

depmod -a
modprobe xt_psd

Далее проверяем или загрузились модули и если все ок – добавляем их в автозагрузку.

root@iptables:~# lsmod | grep psd
xt_psd                 45671  1
x_tables               34194  3 iptable_filter,ip_tables,xt_psd
root@iptables:~# echo "x_tables" >> /etc/modules
root@iptables:~# echo "xt_psd" >> /etc/modules

Как видим, модули загрузились. Осталось только добавить цепочку iptables и проверить работу.

root@iptables:~# iptables -A INPUT -m psd -j DROP
root@iptables:~# iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere             -m psd --psd-weight-threshold 21 --psd-delay-threshold 300 --psd-lo-ports-weight 3 --psd-hi-ports-weight 1

Так же добавим правило iptables в автозагрузку.

root@iptables:~# sh -c "iptables-save > /etc/iptables.rules"
root@iptables:~# vim /etc/network/if-pre-up.d/iptablesup
#!/bin/sh
iptables-restore < /etc/iptables.rules
exit 0

Теперь нужно проверить или оно действительно работает. Для этого я установил дополнительно сервер apache2 (порт 80), proftpd(порт 21) и mysql(порт 3306). Далее будем сканировать наш хост на наличие открытых портов использую nmap.
Переходим на другой сервер и запускаем простой скан.

root@templ:~# nmap -sV 192.168.0.103
Starting Nmap 6.46 ( http://nmap.org ) at 2014-07-25 14:44 EEST
Nmap scan report for 192.168.0.103
Host is up (0.0014s latency).
Not shown: 992 filtered ports

PORT     STATE  SERVICE          VERSION
113/tcp  closed ident
135/tcp  closed msrpc
256/tcp  closed fw1-secureremote
443/tcp  closed https
554/tcp  closed rtsp
993/tcp  closed imaps
3306/tcp closed mysql
8888/tcp closed sun-answerbook
MAC Address: 08:00:27:80:2F:78 (Cadmus Computer Systems)

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 4.99 seconds

Как видим, скан ничего не выдал о нашей системе, даже больше того, он выдал много ложной информации о сервисах, которые даже не установлены на нашем сервере.
Про остальные дополнение, которые входят в пакет можно почитать на ман странице:

man xtables-addons

Хочу сражу сказать о недостатке этого аддона, которые я обнаружил на данные момент:

  1. Иногда из всех сервисов только FTP перестает работать на пару минут
  2. Если запускать скан портов по 5-6 раз, можно получить правдивую информацию о сервисе. К примеру:
root@templ:~# nmap -sV 192.168.0.103
Starting Nmap 6.46 ( http://nmap.org ) at 2014-07-25 14:52 EEST
Nmap scan report for 192.168.0.103
Host is up (0.00062s latency).
Not shown: 990 filtered ports

PORT     STATE  SERVICE          VERSION
21/tcp   open   ftp              ProFTPD 1.3.4a
25/tcp   closed smtp
139/tcp  closed netbios-ssn
199/tcp  closed smux
256/tcp  closed fw1-secureremote
1025/tcp closed NFS-or-IIS
1723/tcp closed pptp
5900/tcp closed vnc
8080/tcp closed http-proxy
8888/tcp closed sun-answerbook

MAC Address: 08:00:27:80:2F:78 (Cadmus Computer Systems)
Service Info: OS: Unix
Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 5.51 seconds

Выдало информацию про FTP. В таких случаях я стараюсь прятать версии всех сервисов, которые это могут сделать.
Спрятать версию proftpd:

root@iptables:~# vim /etc/proftpd/proftpd.conf
....
ServerIdent off
....

Спрятать версию apache:

root@iptables:~# vim /etc/apache2/conf.d/security
...
ServerSignature Off
ServerTokens Prod
...

Также можно закрыть все методы apache, кроме GET и POST:

# Включаем AllowOverride для .htaccess
root@iptables:~# vim /etc/apache2/sites-enabled/000-default
<VirtualHost *:80>
...
<Directory /var/www/>
...
AllowOverride All
...
# Обрезаем все методы, кроме GET и POST
root@iptables:~# cat /var/www/.htaccess
<LimitExcept GET POST>
Order Allow,Deny
Deny from all
</LimitExcept>

Также можно ограничить server-status модуль apache.

root@iptables:~# cat  /etc/apache2/conf.d/security
...
<Location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from monitoring.system.com
</Location>
...

Так же можно защитить cookie, т.е. заставить всех пользоваться https протоколом вместо http и запретить все другие “не-http” API, к примеру JavaScript.

root@iptables:~# cat  /etc/apache2/conf.d/security
...
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
...

Для этой опции нужно добавить модуль apache – head.

#Проверить или не загружен
root@iptables:~# apache2ctl -M | grep -i head
root@iptables:~# ls /etc/apache2/mods-enabled/
# Включить
root@iptables:~# a2enmod headers
root@iptables:~# service apache2 restart

Чтобы спрятать версию openSSH нужно либо собирать пакет с исходников, после поправки или же править бинарник. Я не советую делать ни одно ни другое, так как это очень критический сервис. Но я правил бинарник и все работало ок. Вот как это делается.

# До редактирования
root@iptables:~# ncat 192.168.0.103 22
SSH-2.0-OpenSSH_5.1p1 Debian-3ubuntu1

# Копируем бинарник и редактируем
root@iptables:~# cp /usr/sbin/sshd .
root@iptables:~# hexedit sshd
# В hexedit переходим TAB-ом на вкладку данных и ищем(нажимаем ”/”) OpenSSH слово

Далее нужно заменить строку с версией на что-то другое.

0005A960   6B 65 79 20  25 64 20 2B  20 53 53 48  5F 4B 45 59  5F 42 49 54  53 5F 52 45  key %d + SSH_KEY_BITS_RE
0005A978   53 45 52 56  45 44 20 25  64 00 00 00  00 00 00 00  4F 70 65 6E  53 53 48 5F  SERVED %d.......OpenSSH_
0005A990   35 2E 39 70  31 20 44 65  62 69 61 6E  2D 35 75 62  75 6E 74 75  31 2E 34 00  5.9p1 Debian-5ubuntu1.4.

# Заменить на
0005A960   6B 65 79 20  25 64 20 2B  20 53 53 48  5F 4B 45 59  5F 42 49 54  53 5F 52 45  key %d + SSH_KEY_BITS_RE
0005A978   53 45 52 56  45 44 20 25  64 00 00 00  00 00 00 00  4F 70 65 6E  53 53 48 5F  SERVED %d.......OpenSSH_
0005A990   35 2E 39 70  31 20 44 65  62 69 61 6E  2D 35 75 62  75 6E 74 75  31 2E 34 00 .NEW..SSH................

Теперь просто убиваете старый sshd и запускаете новый и результат буде таким:

root@iptables:~# ncat 192.168.0.103 22
SSH-2.0-OpenSSH.NEW..SSH...............

Таким образом ми закрыли информацию по основным сервисам на внешку.
В следующей статье я напишу еще один простой способ защититься от сканирования портов – используя только iptalbes для создание DMZ.

Автор: admin, 25 июля 2014
Рубрики: Linux, Безопасность
Метки: ,
Один комментарий к сообщению: “Защита от сканирования портов Xtables-addons”
  1. Виктор:

    По поводу редактирования бинарника.
    Странно, что цифра «5» не отображается перед «NEW». Hex код 0х35 (первый в третьей строке) — код цифры «5». Наверное, нужно было пробелом заменить. Ну и дальше после «NEW» и «SSH» идут какие-то символы. Правильно будет после «SSH» записать нуль 0x00 — символ завершения строки.

Написать комментарий

Последние статьи

Яндекс.Метрика
?>