Недавно на роботе столкнулись с проблемой безопасности сервером, а именно сканированием портов. В связи с этим, решил написать короткую статью, в которой хочу выложить свой пока маленький опыт в защите сервера от сканирования портов. Пересмотрел кучу решений по данной теме и сначала испробовал 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
Хочу сражу сказать о недостатке этого аддона, которые я обнаружил на данные момент:
- Иногда из всех сервисов только FTP перестает работать на пару минут
- Если запускать скан портов по 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.
По поводу редактирования бинарника.
Странно, что цифра «5» не отображается перед «NEW». Hex код 0х35 (первый в третьей строке) — код цифры «5». Наверное, нужно было пробелом заменить. Ну и дальше после «NEW» и «SSH» идут какие-то символы. Правильно будет после «SSH» записать нуль 0x00 — символ завершения строки.