The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Защищаем SSH при помощи технологии "Port Knocking"
Реализация идеи динамического открытия доступа к 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
 
19.01.2010 , Автор: Дмитрий , Источник: http://main-server.blogspot.com/200... (доп. ссылка 1)
Ключи: ssh, security, iptables, limit, port
Раздел:    Корень / Безопасность / SSH

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, pavlinux (ok), 15:27, 19/01/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Допиши самое главное - port < open_port < close_port
    Хотя не... от обратного сканирования не спасёт.

    Лучше так:

    close_port
    port
    close_port
    open_port

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

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

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

     
     
  • 2.3, Аноним (-), 17:38, 19/01/2010 [^] [^^] [^^^] [ответить]  
  • +/
    А если будут сканировать во время активной сессии ssh?....
     
     
  • 3.5, Дмитрий (??), 18:08, 19/01/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Там запоминается IP, если я сижу с IP 1.1.1.1 а скан идёт с 2.2.2.2 то 2.2.2.2 просто откроет/закроет себе порт.

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

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


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

     
     
  • 4.8, splat_pack (ok), 17:57, 21/01/2010 [^] [^^] [^^^] [ответить]  
  • +/
    параноик?
     

  • 1.2, Дмитрий (??), 16:35, 19/01/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Прикольно, это мой блог :) я там всякую фигню пишу... :):):)

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

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

     
     
  • 2.4, Andrey Mitrofanov (?), 17:54, 19/01/2010 [^] [^^] [^^^] [ответить]  
  • +/
    >Прикольно, это мой блог :) я там всякую фигню пишу... :):):)

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

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

     
  • 2.7, reminux (?), 16:44, 21/01/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Спасибо за идею.
    Изначально почерпнул ее из твоего блога, потом сходил на сайт разработчика и дополнительно почерпнул кое-что оттуда. :)

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

    -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.

     
     
  • 3.9, pavlinux (ok), 01:15, 22/01/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Я придумал круче

    #!/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.

    например?

     
     
  • 4.10, reminux (?), 13:14, 23/01/2010 [^] [^^] [^^^] [ответить]  
  • +/
    >> минус всего этого дела в том, что не изо всяких мест
    >> могут быть доступны порты 3333/tcp и 64444/tcp.
    >
    >например?

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

     

  • 1.11, Michael Shigorin (ok), 15:34, 24/01/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Занятно, но если не бояться насчёт возможности установления фактов соединений с секретными портами -- то заметно проще, заодно эффективней от сканов отодвинуть ssh на левый порт.  А если бояться, то лучше даже не port knocking в классическом виде (например, http://zeroflux.org/knock умеет и последовательности tcp/udp-портов), а реализации SPA (single packet auth -- авторизация по одному криптопакету).
     
  • 1.12, enchant (ok), 13:38, 28/01/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Более подробная и расширенная информация есть здесь - http://wiki.enchtex.info/howto/iptables/ssh-guard
     


     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру