PortKnocking на Linux – как защитить SSH от брута

Привет всем! Давно не писал ничего, честно говоря, желания особого не было. А тут вдруг, просматривая логи в очередной раз понял “как же задолбали эти бруты!”. Кстати, я уже описывал настройку portknocking для mikrotik и для freebsd. А как же родненький линукс?

Для справки. Port Knocking – процедура открытия себе доступа при простукивании определённых (в том числе закрытых) портов сервера. Изначально у нас доступ на SSH закрыт всем. Открыт только для “белого списка”. И если в течении 30 секунд попытаться установить соединение с портами, к примеру: 11890/tcp, 11900/tcp, 11001/tcp (именно в таком порядке), то наш IP-адрес заносится в белый список на минуту.

Возникает сразу 2 вопроса (ну у всех разное количество, но у меня 2 возникло):

  1. А что, если кто-то будет сканировать порты просто?
  2. А хватит ли нам минуты, чтобы произвести все действия административного характера?

Отвечу сразу же сам:

На случай сканирования портов, мы создадим ещё и “ловушки”. Например, если после стука на 11890 порт у нас будет, 11891 – то такая ситуация приводит к тому, что IP-источник заносится в чёрный список.

Теперь по поводу минуты. Не забывайте, что в большинстве случаев будем работать с stateful-файрволлом, который отслеживает состояния. И если установлено соединение по ssh (минуты хватит, чтобы его установить), то дальше уже все пакеты пойдут по первому правилу как established-соединение, даже если мы вылетим из белого списка.

Этапы установки PortKnocking

  1. Установим пакет knockd привычным способом:
    Для Debian-like систем:
    # apt-get install knockd

    Для CentOS-like систем:
    # yum install knockd

  2. Сконфигурируем должным образом файл /etc/knockd.conf
    [options]
    UseSyslog
    logfile = /var/log/knockd.log
    [opencloseSSH]
    sequence = 11890:tcp,11900:tcp,11001:tcp
    seq_timeout = 20
    start_command = /sbin/iptables -I INPUT 2 -s %IP% -p tcp -m tcp --dport 22 -j ACCEPT
    tcpflags = syn
    cmd_timeout = 60
    stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp -m tcp --dport 22 -j ACCEPT
  3. Добавим правила в rc.local:
    /sbin/iptables -I INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
    /sbin/iptables -I INPUT 2 -p tcp -m tcp --dport 22 -j DROP
  4. Запустим сервис и ОБЯЗАТЕЛЬНО!!! протестируем как всё работает.
    # tcpdump -i any ‘port 11890 || port 11900 || port 11001’
    при кнокинге должен “ловить” пакеты.
    В лог-файле /var/log/knockd.log должны появляться соответствующие строки:
    [2020-05-17 11:57] 188.113.#.#: opencloseSSH: Stage 1
    [2020-05-17 11:57] 188.113.#.#: opencloseSSH: Stage 2
    [2020-05-17 11:57] 188.113.#.#: opencloseSSH: Stage 3
    [2020-05-17 11:57] 188.113.#.#: opencloseSSH: OPEN SESAME
    [2020-05-17 11:57] opencloseSSH: running command: /sbin/iptables -I INPUT 2 -s 188.113.#.# -p tcp -m tcp --dport 22 -j ACCEPT

Что при это происходит

  1. Все обращения на SSH-порт у нас заблокированы правилом №2 в rc.local.
  2. В случае успешного прохождения по цепочке Stage, мы добавляем правило №2 с разрешением для нашего IP-адреса. При этом остальные правила сдвигаются вниз. И мы можем попасть на сервер с нашего адреса.
  3. Когда таймаут истекает, мы остаёмся на линии благодаря первому правилу пропускания ESTABLISHED-соединения.

Когда всё успешно протестировано, можно добавить новые правила в knockd.conf, где прописать аналогично, только сперва запрет, а потом разрешение – для правил-ловушек от сканирования портов.

Удачи!

Интересно? Поделись с другом
Litl-Admin.ru

Comments:

Leave a Reply