УСТАНОВКА И НАСТРОЙКА СИСТЕМЫ ОБНАРУЖЕНИЯ И БЛОКИРОВАНИЯ ПОПЫТОК СКАНИРОВАНИЯ ПОРТОВ PSAD


Анализируя файлы событий системы любому системному администратору не раз приходилось сталкивается с фактами сканирования портов его системы.

В данной статье рассказывается о том, как с помощью psad (Port Scan Attack Detector) автоматически регистрировать и блокировать попытки сканирования портов вашего компьютера. Сайт проекта psad находится по адресу http://www.cipherdyne.org/

Установка psad в Fedora

Пользователи дистрибутивов Fedora могут установить psad из официальных репозиториев:

# yum install psad

Сборка psad из исходных текстов

На момент написания статьи последняя версия psad была 1.4.8.

1. Загрузите последнюю версию с сайта http://www.cipherdyne.org/psad/download/:

# wget http://www.cipherdyne.org/psad/download/psad-1.4.8-1.src.rpm

2. Произведите сборку RPM-пакета под ваш дистрибутив:

# rpmbuild -rebuild psad-1.4.8-1.src.rpm

3. Установите psad:

# rpm -ihv /usr/src/redhat/RPMS/i386/psad-1.4.8-1.i386.rpm

Настройка psad

1. Отредактируйте файл /etc/sysconfig/iptables, вставив первой строкой правил:

-A INPUT -i eth0 -j LOG --log-level info -log-prefix "Inbound:"

2. Перезапустите iptables:

# service iptables restart

3. Отредактируйте файл /etc/syslog.conf, добавив строку:

kern.info       /var/lib/psad/psadfifo

4. Перезапустите службу syslog:

service syslog restart

5. Отредактируйте файл /etc/psad/psad.conf:

# Данная директива описывает получателей уведомлений о событиях psad.
# Поддерживается указание нескольких email адресов, отделенных друг от друга запятой.
EMAIL_ADDRESSES root@localhost;

# Опция определяет доменное имя компьютера.
HOSTNAME                    _CHANGEME_;

# Директива HOME_NET определяет локальную сеть.
# В данной директиве вы должны указать сети которые проходят через цепочку FORWARD iptables.
# Если защищаемый компьютер имеет только один сетевой интерфейс, установите данный параметр
# равным NOT_USED
HOME_NET                    _CHANGEME_;

# Данный параметр указывает какая служба syslog используется в системе.
# Возможные значения параметра syslogd, syslog-ng, ulogd, metalog.
SYSLOG_DAEMON               syslogd;

# Директивы, описанные ниже, определяют уровни, по которым будет происходить классификация событий.
# Значения после параметра определяют количество пакетов, которые должны прийти с атакующего узла
# прежде чем psad установит тот или иной уровень важности собития.
DANGER_LEVEL1               5;
DANGER_LEVEL2               15;
DANGER_LEVEL3               150;
DANGER_LEVEL4               1500;
DANGER_LEVEL5               10000;

# Параметр определяет промежуток времени в секундах,
# через который psad будет просматривать новые сообщения от iptables.
CHECK_INTERVAL              5;

# Определяет количество сетевых портов защищаемого компьютера, которые должны быть сканированы
# прежде чем psad пошлет уведомление тревоги. По умолчанию значение 1 означает, что должно быть
# сканировано более 1 порта (т.е. 2 и более) прежде чем сработает тревога.  Можно установить
# значение в 0 , но тогда любой пакет пришедший на порт будет генерировать сигнал тревоги.
PORT_RANGE_SCAN_THRESHOLD   1;

# Если данный параметр установлен в Y, тогда информация о сканировании вашего компьютера
# никогда не устаревает. Данная опция полезна в случае когда атакующий пытается сканировать каждый
# из портов через достаточно длительный промежуток времени.
# Стоит учесть, что при установке данного параметра в Y вы заносите атакующего в «черный» список
# до перезагрузки psad.
ENABLE_PERSISTENCE          Y;

# Данная опция имеет смысл только при параметре ENABLE_PERSISTENCE равным N.
# С помощью данной опции задается интервал в секундах через который информация о сканировании
# обнуляется. По умолчанию данный параметр установлен в значение 3600 секунд,
# что означает «Если с момента последнего события о сканировании порта атакующим прошло более 1 часа
# и более событий сканирования не было, тогда сбросить результаты сканирования»
SCAN_TIMEOUT                3600;

# Если данный параметр установлен в Y тогда показывать все сигнатуры с момента начала сканирования,
# а не только последнюю сигнатуру.
SHOW_ALL_SIGNATURES         N;

# Будут учитываться только те пакеты, число хопов при прохождении через сеть у которых
# не превышает значения в 20.
MAX_HOPS                    20;

# Данный параметр пытается уменьшить вероятность ошибки в установленных соединениях путем
# игнорирования TCP-пакетов с установленным битом ACK.
# Подробнее можно почитать http://www.cipherdyne.org/fwsnort/.
IGNORE_CONNTRACK_BUG_PKTS   Y;

# Данный параметр задает порты, сканирование которых не будет учитываться.
# Формат параметра таков «протокол/порт,[протокол/порт]».
# Например tcp/25, udp/53.
IGNORE_PORTS                NONE;

# Данный параметр задает протоколы которые будут игнорироваться psad при попытках сканирования.
IGNORE_PROTOCOLS            NONE;

# В данном параметре можно указать интерфейсы которые не будут учитываться psad
# при попытке сканирования портов на этих интерфейсах.
IGNORE_INTERFACES           NONE;

# Указывает psad игнорировать параметр --log-prefix
IGNORE_LOG_PREFIXES         NONE;

# Задает значение при достижении которого администратору будет послано уведомление,
# о сканировании портов на его машине.
EMAIL_ALERT_DANGER_LEVEL    1;

# Включать в отчет информацию о MAC-адресе сканирующего хоcта.
ENABLE_MAC_ADDR_REPORTING   N;

# Включить ограничение на количество уведомлений для  каждого сканирующего хоста.
# Внимание! Если вы все-таки решите выставить ограничение, вполне возможна ситуация при которой
# вы не получите уведомление о важном событии, т.к. уже будет исчерпано количество попыток.
# По умолчанию значение 0 задает отсутствие ограничений на количество сообщений.
EMAIL_LIMIT                 0;

# Посылать администратору уведомление когда будет достигнуто значение EMAIL_LIMIT
EMAIL_LIMIT_STATUS_MSG      Y; 

# Посылать уведомление системному администратору при изменении уровня важности событий от
# атакующего ваш компьютер хоста.
ALERT_ALL                   Y; 

# Указывает посылать уведомление о сканировании вашего компьютера на dshield.org.
# Там хранится база «черного» списка сканирующих хостов.
# Лично мне кажется, что ведение такой  базы данных не имеет большого смысла и я рекомендую не
# устанавливать данную опцию в Y.
# Описание дальнейших опций связанных с  dshield.org не считаю нужным приводить здесь.
ENABLE_DSHIELD_ALERTS       N;

# Пожалуй самая полезная опция во всем конфигурационном файле.
# При установке данного параметра в Y psad автоматически будет блокировать сканирующий хост.
ENABLE_AUTO_IDS             N;

# Задает значение уровня/важности, при наступлении которого psad будет блокировать атакующего.
AUTO_IDS_DANGER_LEVEL       5;

# Задает значение времени в секундах, на которое будет заблокирован сканирующий хост.
AUTO_BLOCK_TIMEOUT          3600;

# Включить проверку на совпадение с регулярным выражением в log prefixes для активного ответа.
ENABLE_AUTO_IDS_REGEX       N; 

# Блокировать атакующего только в случае если состояние пакетов от атакующего хоста совпадают
# с регулярным выражением, заданным в данном параметре. Если параметр ENABLE_AUTO_IDS_REGEX
# равен N, то данная опция не имеет смысла.
AUTO_BLOCK_REGEX            ESTABLISHED; 

# Параметр задает метод, которым будет заблокирован трафик от атакующего, в случае
# параметра ENABLE_AUTO_IDS равного Y. В данном случае трафик от атакующего будет заблокирован
# средствами iptables, что, по моему мнению, кажется наиболее оптимальным способом.
IPTABLES_BLOCK_METHOD       Y;

# Следующие директивы имеют смысл только при установленном параметре IPTABLES_BLOCK_METHOD Y.
# Они задают правила, которые будут выполняться при осуществлении автоматического блокирования
# средствами iptables. Формат правил такой:
# Target,Direction,Table,From_chain,Jump_rule_position,To_chain,Rule_position
# Для осмысленного понимания этих, на первый взгляд непонятных, правил советую порочитать
# iptables tutorial http://gazette.linux.ru.net/rus/articles/iptables-tutorial.html.
IPT_AUTO_CHAIN1             DROP, src, filter, INPUT, 1, PSAD_BLOCK_INPUT, 1;
IPT_AUTO_CHAIN2             DROP, dst, filter, OUTPUT, 1, PSAD_BLOCK_OUTPUT, 1;
IPT_AUTO_CHAIN3             DROP, both, filter, FORWARD, 1, PSAD_BLOCK_FORWARD,1;

# Данная опция задает поведение psad при запуске, указывая нужно ли обновлять правила для iptables
FLUSH_IPT_AT_INIT           Y;

# При включении данная опция задает альтернативный метод блокировки сканирующего хоста
# на основе tcpwrappers.
TCPWRAPPERS_BLOCK_METHOD    N;

# Параметр задает максимальное время на получение ответа от сервиса whois.
# Дело в том, что при обнаружении попыток сканирования портов psad определяет, к чьей сети
# принадлежит ip адрес атакующего хоста, и данную информацию включает в email-отчет.
WHOIS_TIMEOUT               60;

# Задает количество, определяющее сколько раз psad возьмет данные о whois сервисе из буфера
# прежде чем сделает повторный whois запрос. Данный параметр позволяет экономить время и трафик при
# определении информации о сети к которой принадлежит атакующий.
WHOIS_LOOKUP_THRESHOLD      20;

# Задает количество определяющее сколько раз psad возьмет данные о DNS имени атакующего  из буфера
# прежде чем сделает повторный  запрос в DNS серверу. Так же, как и параметр WHOIS_LOOKUP_THRESHOLD
# данный параметр позволяет экономить время и трафик при определении информации о хосте атакующего.
DNS_LOOKUP_THRESHOLD        20; 

# Если установить данный параметр в Y, тогда psad при обнаружении попытки сканирования вашего сервера
# будет выполнять скрипт, либо внешнюю команду.
ENABLE_EXT_SCRIPT_EXEC      N; 

# Данный параметр имеет смысл только при ENABLE_EXT_SCRIPT_EXEC Y и задает скрипт который будет
# выполняться при обнаружении попытки сканирования.
EXTERNAL_SCRIPT             /bin/true;

# Данный параметр также имеет смысл только при опции ENABLE_EXT_SCRIPT_EXEC установленной Y и
# определяет, будет ли внешний скрипт выполняться единожды при обнаружении какого либо
# события для хоста или каждый раз.
EXEC_EXT_SCRIPT_PER_ALERT   N;

Остальные параметры файла psad.conf существенным образом не влияют на поведение psad а задают стандартные пути файлов конфигурации. Я рекомендую оставить их без изменений.

В приведенном ниже примере файла psad.conf предполагается, что защищаемый компьютер имеет один сетевой интерфейс, доменное имя example.ru, должен автоматически блокировать сканирующий хост средствами iptables на 1 час при достижении атакующим 3 уровня опасности (Danger level) и посылать администратору на email admin@example.ru административные сообщения в случае блокирования атакующего хоста.

EMAIL_ADDRESSES             admin@example.ru;
HOSTNAME                    example.ru;
HOME_NET                    NOT_USED;
SYSLOG_DAEMON               syslogd;
DANGER_LEVEL1               5;    ### Number of packets.
DANGER_LEVEL2               15;
DANGER_LEVEL3               150;
DANGER_LEVEL4               1500;
DANGER_LEVEL5               10000;
CHECK_INTERVAL              5;
SNORT_SID_STR               SID;
PORT_RANGE_SCAN_THRESHOLD   20;
ENABLE_PERSISTENCE          Y;
SCAN_TIMEOUT                3600;
SHOW_ALL_SIGNATURES         Y;
MAX_HOPS                    20;
IGNORE_CONNTRACK_BUG_PKTS   Y;
IGNORE_PORTS                NONE;
IGNORE_PROTOCOLS            NONE;
IGNORE_INTERFACES           NONE;
IGNORE_LOG_PREFIXES         NONE;
EMAIL_ALERT_DANGER_LEVEL    3;
ENABLE_MAC_ADDR_REPORTING   Y;
ENABLE_FW_LOGGING_CHECK     Y;
EMAIL_LIMIT                 0;
EMAIL_LIMIT_STATUS_MSG      Y;
ALERT_ALL                   Y;
IMPORT_OLD_SCANS            N;
ENABLE_DSHIELD_ALERTS       N;
DSHIELD_ALERT_EMAIL         reports@dshield.org;
DSHIELD_ALERT_INTERVAL      6;
DSHIELD_USER_ID             0;
DSHIELD_USER_EMAIL          NONE;
DSHIELD_DL_THRESHOLD        0;
ENABLE_AUTO_IDS             Y;
AUTO_IDS_DANGER_LEVEL       3;
AUTO_BLOCK_TIMEOUT          3600;
ENABLE_AUTO_IDS_REGEX       N;
AUTO_BLOCK_REGEX            ESTABLISHED;
ENABLE_RENEW_BLOCK_EMAILS   N;
ENABLE_AUTO_IDS_EMAILS      Y;
IPTABLES_BLOCK_METHOD       Y;
IPT_AUTO_CHAIN1             DROP, src, filter, INPUT, 1, PSAD_BLOCK_INPUT, 1;
IPT_AUTO_CHAIN2             DROP, dst, filter, OUTPUT, 1, PSAD_BLOCK_OUTPUT, 1;
IPT_AUTO_CHAIN3             DROP, both, filter, FORWARD, 1, PSAD_BLOCK_FORWARD, 1;
FLUSH_IPT_AT_INIT           Y;
IPTABLES_PREREQ_CHECK       1;
TCPWRAPPERS_BLOCK_METHOD    N;
WHOIS_TIMEOUT               60;
WHOIS_LOOKUP_THRESHOLD      20;
DNS_LOOKUP_THRESHOLD        20;
ENABLE_EXT_SCRIPT_EXEC      N;
EXTERNAL_SCRIPT             /bin/true;
EXEC_EXT_SCRIPT_PER_ALERT   N;
DISK_CHECK_INTERVAL         300;
DISK_MAX_PERCENTAGE         95;
DISK_MAX_RM_RETRIES         10;
ENABLE_SCAN_ARCHIVE         N;
TRUNCATE_FWDATA             Y;
MIN_ARCHIVE_DANGER_LEVEL    1;
MAIL_ALERT_PREFIX           [psad-alert];
MAIL_STATUS_PREFIX          [psad-status];
MAIL_ERROR_PREFIX           [psad-error];
MAIL_FATAL_PREFIX           [psad-fatal];
PSAD_DIR                    /var/log/psad;
PSAD_RUN_DIR                /var/run/psad;
PSAD_LIB_DIR                /var/lib/psad;
SCAN_DATA_ARCHIVE_DIR       /var/log/psad/scan_archive;
ERROR_DIR                   /var/log/psad/errs;
ANALYSIS_MODE_DIR           /var/log/psad/ipt_analysis;
SNORT_RULES_DIR             /etc/psad/snort_rules;
FW_DATA_FILE                /var/log/psad/fwdata;
ULOG_DATA_FILE              /var/log/psad/ulogd.log;
FW_CHECK_FILE               /var/log/psad/fw_check;
DSHIELD_LATEST_EMAIL        /var/log/psad/dshield.email;
PID_FILE                    /var/run/psad/psad.pid;
CMDLINE_FILE                /var/run/psad/psad.cmd;
SIGS_FILE                   /etc/psad/signatures;
ICMP_TYPES_FILE             /etc/psad/icmp_types;
AUTO_DL_FILE                /etc/psad/auto_dl;
SNORT_RULE_DL_FILE          /etc/psad/snort_rule_dl;
POSF_FILE                   /etc/psad/posf;
P0F_FILE                    /etc/psad/pf.os;
PSAD_FIFO                   /var/lib/psad/psadfifo;
ETC_HOSTS_DENY              /etc/hosts.deny;
ETC_SYSLOG_CONF             /etc/syslog.conf;
ETC_SYSLOGNG_CONF           /etc/syslog-ng/syslog-ng.conf;
ETC_METALOG_CONF            /etc/metalog/metalog.conf;
KMSGSD_PID_FILE             /var/run/psad/kmsgsd.pid;
PSADWATCHD_PID_FILE         /var/run/psad/psadwatchd.pid;
AUTO_BLOCK_IPT_FILE         /var/log/psad/auto_blocked_iptables;
AUTO_BLOCK_TCPWR_FILE       /var/log/psad/auto_blocked_tcpwr;
AUTO_IPT_SOCK               /var/run/psad/auto_ipt.sock;
FW_ERROR_LOG                /var/log/psad/errs/fwerrorlog;
PRINT_SCAN_HASH             /var/log/psad/scan_hash;
PROC_FORWARD_FILE           /proc/sys/net/ipv4/ip_forward;
PACKET_COUNTER_FILE         /var/log/psad/packet_ctr;
DSHIELD_COUNTER_FILE        /var/log/psad/dshield_ctr;
IPT_PREFIX_COUNTER_FILE     /var/log/psad/ipt_prefix_ctr;
IPT_OUTPUT_FILE             /var/log/psad/psad.iptout;
IPT_ERROR_FILE              /var/log/psad/psad.ipterr;
iptablesCmd      /sbin/iptables;
mknodCmd         /bin/mknod;
psCmd            /bin/ps;
mailCmd          /bin/mail;
sendmailCmd      /usr/sbin/sendmail;
ifconfigCmd      /sbin/ifconfig;
killallCmd       /usr/bin/killall;
netstatCmd       /bin/netstat;
unameCmd         /bin/uname;
whoisCmd         /usr/bin/whois_psad;
dfCmd            /bin/df;
fwcheck_psadCmd  /usr/sbin/fwcheck_psad;
psadwatchdCmd    /usr/sbin/psadwatchd;
kmsgsdCmd        /usr/sbin/kmsgsd;
psadCmd          /usr/sbin/psad;

Запуск psad

Запустите службу psad:

# service psad start

Тестирование работы psad

Для проверки правильности настройки psad просканируйте порты защищаемого вами компьютера при помощи сетевых сканеров безопасности nmap или nessus.