URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 63049
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Защищаем SSH при помощи технологии ..."

Отправлено auto_tips , 19-Янв-10 15:27 
Реализация идеи динамического открытия доступа к 22 порту, при предварительном обращении telnet-ом на определенный сетевой порт (в примере 333 - открыть доступ и 334 - закрыть). Идея реализована средствами iptables, без привлечения дополнительных утилит и анализаторов логов.

   # Создаю цепочку с именем SSH
   iptables -N SSH
   # Правило по умолчанию в INPUT - DROP
   iptables -P INPUT DROP
   # Всё что пришло на 22 порт - в цепочку SSH
   iptables -A INPUT -p tcp --dport 22 -j SSH
   # Всё что пришло на 333 порт - в цепочку SSH
   iptables -A INPUT -p tcp --dport 333 -j SSH
   # Всё что пришло на 334 порт - в цепочку SSH
   iptables -A INPUT -p tcp --dport 334 -j SSH

Разделения на цепочки сделано для своего удобства, от этого можно и отказаться.

Теперь заполняем цепочку SSH.

   # Проверяем на наличие имени "SSH" у IP адреса устанавливающего соединение на 22 порт.
   # И если оно присутствует - то ACCEPT
   iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 22 -m recent --rcheck --name SSH --rsource -j ACCEPT

   # Устанавливает имя SSH любому IP адресу с которого пришло новое TCP соединение на указанный порт. (порт 333)
   iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 333 -m recent --set --name SSH --rsource -j DROP

   # Удаляет имя "SSH" с IP адреса установившего соединение на этот порт. (порт 334)
   iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 334 -m recent --remove --name SSH --rsource -j DROP

Насладимся итоговым результатом:

Делаем:
   telnet ip_address_or_domain_name 333
После чего спокойно подключаемся по SSH.

Когда прекращаем работу закрываем за собой 22 порт:
   telnet ip_address_or_domain_name 334


URL: http://main-server.blogspot.com/2009/04/port-knocking.html
Обсуждается: http://www.opennet.me/tips/info/2265.shtml


Содержание

Сообщения в этом обсуждении
"Защищаем SSH при помощи технологии 'Port Knocking'"
Отправлено pavlinux , 19-Янв-10 15:27 
Допиши самое главное - port < open_port < close_port
Хотя не... от обратного сканирования не спасёт.

Лучше так:

close_port
port
close_port
open_port

т. е.  при линейном сканировании слева или справа, наш порт всегда будет закрыт.

порт закрытия, на 10011 порт
ssh  на 10022
порт закрытия на 10033
открыть на любой

И ещё бы таймаут на ожидание соединения, между telnet host.org open_port  и ssh host.org


"Защищаем SSH при помощи технологии 'Port Knocking'"
Отправлено Аноним , 19-Янв-10 17:38 
А если будут сканировать во время активной сессии ssh?....

"Защищаем SSH при помощи технологии 'Port Knocking'"
Отправлено Дмитрий , 19-Янв-10 18:08 
Там запоминается IP, если я сижу с IP 1.1.1.1 а скан идёт с 2.2.2.2 то 2.2.2.2 просто откроет/закроет себе порт.

Кстати: Безопасность - это комплексное решение (С)Мой друг.

Port-knoking не панацея, но избавиться от ботовбрутфорсеров реально помогает. А за iptables находится ssh там где авторизация по ключам и т.д.
Анализ логов, также никто не отменял, и если в логах обнаружится брутфорс, то как минимум можно сменить порты.


P.S>
Не считайте, что эта технология на 100% защищает Ваш порт от стороннего проникновения.


"Защищаем SSH при помощи технологии 'Port Knocking'"
Отправлено splat_pack , 21-Янв-10 17:57 
параноик?

"Защищаем SSH при помощи технологии 'Port Knocking'"
Отправлено Дмитрий , 19-Янв-10 16:35 
Прикольно, это мой блог :) я там всякую фигню пишу... :):):)

Ну раз тут есть, то скажу ещё пару слов :)
Во первых, идея не совсем моя, я её чуть чуть переделал. В блоге авторство указано.

Считывая файл cat /proc/net/ipt_recent/SSH (SSH в данном случае - имя цепочки) можно просматривать кто имеет доступ, или не закрыл его за собой. Естественно вся информация до перезагрузки.


"Защищаем SSH при помощи технологии 'Port Knocking'"
Отправлено Andrey Mitrofanov , 19-Янв-10 17:54 
>Прикольно, это мой блог :) я там всякую фигню пишу... :):):)

А-га, вот ещё один блоггер:
http://roland.entierement.nu/blog/2008/08/19/netfilter-based...

Порт-нокер _без_ демона или сканирования логов -- средствами "того самого" -m recent.


"Защищаем SSH при помощи технологии 'Port Knocking'"
Отправлено reminux , 21-Янв-10 16:44 
Спасибо за идею.
Изначально почерпнул ее из твоего блога, потом сходил на сайт разработчика и дополнительно почерпнул кое-что оттуда. :)

Мне кажется, что лучше и проще делать так:

-A INPUT -p tcp --dport 3333 -m recent --rcheck --seconds 30 --name SSH -j ACCEPT
-A INPUT -p tcp --dport 64444 -m recent --set --name SSH -j REJECT --reject-with tcp-reset

здесь SSH-демон слушает на порту 3333/tcp, а порт 64444/tcp используется для "открывания двери".
дверь открывается только на 30 сек. если в течение этого времени подключение не произойдет, она закроется. поэтому можно не беспокоиться о том, что нужно закрыть ее после себя.
при таком сильном разнесении портов и таком таймауте вероятность попадания "врага" в "порт открывания двери", а затем в порт ssh-демона почти нулевая.
-j REJECT --reject-with tcp-reset нужно для того, чтобы удобнее было "стукаться" в "порт открывания двери, например, telnet-клиентом (не будет висеть, сразу выйдет).

P.S. минус всего этого дела в том, что не изо всяких мест могут быть доступны порты 3333/tcp и 64444/tcp.


"Защищаем SSH при помощи технологии 'Port Knocking'"
Отправлено pavlinux , 22-Янв-10 01:15 
Я придумал круче

#!/bin/bush
name() {
        local l=$1
        [ "$l" == "" ] && l=20
        tr -dc "A-Za-z0-9_.,:-" < /dev/urandom | head -c ${l} | xargs
}

TABLE=`name`;

iptables -N "$TABLE";
iptables -A INPUT -p tcp --dport $(( 1025 + ( $RANDOM % (65534-1025)))) -m recent --rcheck --seconds $((( 10 + $RANDOM ) % 180)) --name "$TABLE" -j ACCEPT;
iptables -A INPUT -p tcp --dport $(( 1025 + ( $RANDOM % (65534-1025)))) -m recent --set --name "$TABLE" -j REJECT --reject-with tcp-reset;


iptables -L -n | gpg -ae -r sEcREtUSer@c00lADmiN.рф | mail -s "Penis Enlager" sEcREtUSer@c00lADmiN.рф

#/*-----*/

# iptables -L

ACCEPT tcp  --  0.0.0.0/0  0.0.0.0/0  tcp dpt:23377 recent: CHECK seconds: 86 name: u0MPqLRJvborre.FNgye side: source                                                                                                              
REJECT tcp  --  0.0.0.0/0  0.0.0.0/0  tcp dpt:1742 recent: SET name: u0MPqLRJvborre.FNgye side: source reject-with tcp-reset                                                                                                      
Chain u0MPqLRJvborre.FNgye (0 references)
target     prot opt source               destination


:)

> минус всего этого дела в том, что не изо всяких мест
> могут быть доступны порты 3333/tcp и 64444/tcp.

например?


"Защищаем SSH при помощи технологии 'Port Knocking'"
Отправлено reminux , 23-Янв-10 13:14 
>> минус всего этого дела в том, что не изо всяких мест
>> могут быть доступны порты 3333/tcp и 64444/tcp.
>
>например?

существует масса сетей (от сетей мелких районных провайдеров до корпоративных сетей), в которых наружу закрыто все, кроме нескольких самых популярных портов вроде 80/tcp, 110/tcp, 5190/tcp и некоторых других. из таких мест в свою хитрую дверь не попадешь.


"Защищаем SSH при помощи технологии 'Port Knocking'"
Отправлено Michael Shigorin , 24-Янв-10 15:34 
Занятно, но если не бояться насчёт возможности установления фактов соединений с секретными портами -- то заметно проще, заодно эффективней от сканов отодвинуть ssh на левый порт.  А если бояться, то лучше даже не port knocking в классическом виде (например, http://zeroflux.org/knock умеет и последовательности tcp/udp-портов), а реализации SPA (single packet auth -- авторизация по одному криптопакету).

"Защищаем SSH при помощи технологии 'Port Knocking'"
Отправлено enchant , 28-Янв-10 13:38 
Более подробная и расширенная информация есть здесь - http://wiki.enchtex.info/howto/iptables/ssh-guard