Linux: psad – обнаружение и блокировка сканирования портов

Автор: | 07/12/2014

Linux SecurePSAD – утилита для определения попыток сканирования открытых портов, при обнаружении таковых – отправляет оповещение на почту и может заблокировать атакующий хост.

Для определения сканирования – использует указанную в конфигурации службу логирования, в данном случае – rsyslog.

Устанавливаем:

# yum -y install psad

Редактируем /etc/rsyslog.conf.

Добавляем строку:

# for PSAD
kern.info       |                                       /var/lib/psad/psadfifo

IPTABLES генерирует очень много записей, поэтому, что бы не забивать /var/log/messages – настроим логирование в отдельный файл.

Создаём файл /etc/rsyslog.d/iptables.conf с таким содержимым:

:msg, contains, "Iptables: " /var/log/iptables.log
& ~

Перезапускаем:

# service rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]

Проверяем содержимое в файле /var/log/iptables.log – идут ли записи.

Редактируем /etc/psad/psad.conf.

# устанавливаем ящик, на который будут отправляться уведомления
EMAIL_ADDRESSES             [email protected];

# имя хоста
HOSTNAME                    venti;

# если только один интерфейс - ставим none
HOME_NET                    NOT_USED

# Данный параметр указывает какая служба 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;

# Данный параметр задает порты, сканирование которых не будет учитываться.
# Формат параметра таков «протокол/порт,[протокол/порт]».
# Например 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;

# если установлено в Y - будет оправлять уведомления о каждом подозрительного пакете
# для каждого конкретного IP
# иначе - только при достижении этим IP нового DANGER_LEVEL
ALERT_ALL                   Y;

# если установлено в Y - psad после перезагрузки будет импортировать
# старые записи для IP
# а не создавать новые
IMPORT_OLD_SCANS           Y;

# отправлять ли сообщения о новых сканирующих хостаз
# на сервис http://www.dshield.org/
ENABLE_DSHIELD_ALERTS      N;

# автоматически блокировать сканирующий хост
# на время тестирования - лучше установить в N
# и подождать хотя бы пару часов, что бы определить все
# "чистые" хосты, на пакеты которых реагирует psad
# и добавить их в whitelist
ENABLE_AUTO_IDS             N;

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

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

# метод блокировки - через IPTABLES
IPTABLES_BLOCK_METHOD       Y;

# номер правила в цепочках INPUT, OUTPUT, и  FORWARD, которое будет присваиваться новым правилам
# добавленным psad
IPTABLES_AUTO_RULENUM

# меняем /var/log/messages на наш отдельный файл
IPT_SYSLOG_FILE             /var/log/iptables.log;

# Если установить данный параметр в 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;

Запускаем:

# service psad start
[  OK  ]

Добавляем правила в фаервол:

# iptables -I INPUT 1 -j LOG --log-prefix "Iptables: "
# iptables -I FORWARD 1 -j LOG --log-prefix "Iptables: "

Обратите внимание на порядок правил – LOG должен быть перед всеми DROP или REJECT.

Сохраняем:

# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]

Обновляем сигнатуры psad:

# psad --sig-update

Перезапускаем:

# service psad restart
Stopping psad:                                             [  OK  ]
Starting psad:                                   [  OK  ]

С другой машины сканируем

# nmap -PN -sS 77.***.***20
Starting Nmap 5.51 ( http://nmap.org ) at 2014-10-05 17:22 EEST
Nmap scan report for 77.***.***20
Host is up (0.0010s latency).
Not shown: 999 filtered ports
PORT   STATE SERVICE
22/tcp open  ssh
MAC Address: 08:00:27:BD:FA:D9 (Cadmus Computer Systems)

Nmap done: 1 IP address (1 host up) scanned in 5.26 seconds

Проверяем статус psad:

# psad -S
[-] psad: pid file /var/run/psad/psadwatchd.pid does not exist for psadwatchd on localhost
[+] psad (pid: 1961)  %CPU: 1.3  %MEM: 1.8
Running since: Sun Oct  5 17:22:48 2014
Command line arguments: [none specified]
Alert email address(es): root@localhost

[+] Version: psad v2.2.3

[+] Top 50 signature matches:
[NONE]

[+] Top 25 attackers:
[NONE]

[+] Top 20 scanned ports:
[NONE]

[+] iptables log prefix counters:
[NONE]

Total protocol packet counters:

[+] IP Status Detail:

SRC:  77.***.***40, DL: 3, Dsts: 1, Pkts: 289, Total protocols: 1, Unique sigs: 0, Email alerts: 0, Local IP

DST: 77.***.***40, Local IP
Scanned ports: TCP 4-61900, Pkts: 289, Chain: INPUT, Intf: eth1
Total scanned IP protocols: 1, Chain: INPUT, Intf: eth1

Total scan sources: 1
Total scan destinations: 1

[+] These results are available in: /var/log/psad/status.out

Что бы добавить исключения – отредактируйте файл /etc/psad/auto_dl.

Например, что бы “забыть” про адрес 77.***.***.40 (на котором находится Nagios, использующий Nmap, и psad его считает “атакующим” из-за постоянной передачи пакетов):

77.***.***.40    0;

Что бы игнорировать подсеть – добавляем:

77.***.***.0/24  0;

Ссылки по теме

http://cipherdyne.org

https://www.digitalocean.com

http://redhat-club.org