Блог ИТ склеротика. Port knoking или порты, которые открываются по сигналу

Страницы

Расширенный поиск в статьях блога

18 февраля 2012 г.

Port knoking или порты, которые открываются по сигналу


Существует масса самых различных реализаций этой техники, начиная от самопальных скриптов, написанных первокурсниками, и заканчивая плагинами для iptables, но наиболее любима в народе, проста в использовании и богата на функционал система knock. О ней и поговорим.
Настроить knock нетрудно:
1 Конфигурируем брандмауэр таким образом, чтобы все незанятые реальными сервисами порты выше 1024 были открыты. Часть из них незаметно будет слушать наш демон. Порт защищаемого сервиса оставляем закрытым.
2 Создаем файл /etc/knockd.conf и пишем в него примерно следующее:
[ssh-open]
sequence = 1111,2222,3333
seq_timeout = 10
tcpflags = syn
command = /usr/sbin/iptables -A INPUT -s %IP% --dport 22 -j ACCEPT
[ssh-close]
sequence = 3333,2222,1111
seq_timeout = 10
tcpflags = syn
command = /usr/sbin/iptables -D INPUT -s %IP% --dport 22 -j ACCEPT
3 Запускаем демон:
# knockd -d
4 Берем такси, едем домой и на домашней машине выполняем команду:
$ knock my.lovely.server.com 1111 2222 3333
5 Подключаемся SSH-клиентом к серверу и делаем то, что нужно.
6 Благополучно закрываем SSH-порт:
$ knock my.lovely.server.com 3333 2222 1111
Отныне злодей даже и не догадается о том, что в наш любимый сервер можно проникнуть извне. Для него SSH-порт всегда будет закрыт (открывается он только для того IP, с которого был осуществлен «стук»). Но и это еще не все! Заказав такси прямо сейчас, ты сможешь вернуться к серверу и получить в подарок еще более надежную технику конспирации:
# vi /etc/knockd.conf
[ssh]
sequence = 1111:udp,2222:tcp,3333:udp
seq_timeout = 15
tcpflags = syn,ack
start_command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --syn --dport 22 -j ACCEPT
cmd_timeout = 10
stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --syn --dport 22 -j ACCEPT
Это более интересный способ открытия порта, использующий сразу два приема повышения безопасности. Во-первых, теперь Штирлиц должен долбить в дверь не только рукой, но и ногой, то есть «стучать» и в TCP, и в UDP-порты. А во-вторых, брандмауэр откроет SSH-порт для входящих соединений только на 10 секунд, в течение которых мы должны успеть установить SSH-соединение (естественно, iptables должен быть сконфигурирован так, чтобы он без вопросов пропускал любой трафик уже установленных соединений). Конечная команда на подключение выглядит следующим образом:
$ knock 1111:udp 2222:tcp 3333:udp & ssh my.lovely.server.com
UPD: Реализация Port knocking средствами iptables (спасибо Koffu - koffua.gmail@com):
# разрешаем установленные соединения через connection tracker.
iptables -I INPUT 1 -m state --state ESTABLISHED -j ACCEPT
# создаём новую цепочку для порядка
iptables -N SSH
# перенаправляем кнок-порт 22122 в новую цепочку
iptables -A INPUT -p tcp -m tcp --dport 22122 --syn -j SSH
# перенаправляем кнок-порт 22122 в новую цепочку
iptables -A INPUT -p tcp -m tcp --dport 22 --syn  -j SSH
# добавляем запись о удалённом адресе в таблицу ssh,заносим его TTL, сбрасываем соединение.
iptables -A SSH -p tcp -m tcp --dport 22122 --syn -m recent --set \
    --name ssh --rsource -j REJECT --reject-with tcp-reset
# разрешаем соединения на порт 22 адресам, которые есть в таблице и их timestamp<timestamp+30
iptables -A SSH -p tcp -m tcp --dport 22 --syn -m recent --rcheck \
    --seconds 30 --name ssh --rsource -j ACCEPT
# всё что не разрешилось выше попадает сюда и идёт лесом.
iptables -A SSH -p tcp --dport 22 -j REJECT --reject-with tcp-reset

.

Счетчик тИЦ и PR Яндекс.Метрика Msn bot last visit powered by MyPagerank.NetYahoo bot last visit powered by MyPagerank.Net ping fast  my blog, website, or RSS feed for Free