отсутствие объекта нападения как лучшая защита.....
понадобилось мне тут дать коллеге доступ по ssh к одному из серверов.
- Код: Выделить всё • Развернуть
host# uname -a
FreeBSD host.mydomain.ru 7.1-RELEASE FreeBSD 7.1-RELEASE #0: Tue Jan 13 16:30:18 MSK 2009
root@host.mydomain.ru:/usr/obj/usr/src/sys/m_kernell.2009-01-13 i386
казалось бы все просто - заводи юзера и пусть ковыряется...
но простой путь обычно упрощает жизнь не только юзерам, но и "врагам"
изначально доступ разрешен только определенным юзерам, подключающимся со строго определенных адресов.
Но у "новичка" был динамический адрес и простое решение разрешить в файерволле
диапазон IP адресов мне не показалось разумным, но тем не менее, задав пароль подлиннее,
на первые пару дней так и сделал.
как и ожидалось, сразу же появились попытки подбора имени и пароля из разрешенной подсети.
наморщенный мозг выдал навскидку несколько вариантов решения
- смена порта (по умолчанию 22), но это в общем то ничего не меняет, т.к. сканеры давно уже
не останавливаются только на нем.
- городить аутентификацию по DSA ключу тем более не хотелось.
в идеале хотелось иметь открытый порт 22 для подключения только тогда когда это нужно,
а в остальное время пусть его вообще не будет (о как завернул... )
поскольку, как известно, "все уже украдено до нас" ((с) операция Ы) , то ковыряние в портах навело на
- Код: Выделить всё • Развернуть
Port: knock-0.5.20051124_1
Path: /usr/ports/security/knock
Info: A flexible port-knocking server and client
Maint: shaun@FreeBSD.org
B-deps:
R-deps:
WWW: http://www.zeroflux.org/cgi-bin/cvstrac/knock/wiki/
что это за зверь ? это серверная и клиентская часть для реализации технологии port knocking
вкратце, применительно к задаче защиты порта ssh , делается это так -
изначально защищаемый порт ssh вообще закрыт в файерволле
и открывается только после того как мы "постучимся" на сервер по строго опреденным портам
и в определенной последовательности, да еще и определенного протокола (tcp или udp)
на сервере должна работать соответсвенно серверная часть и слушать по каким портам стучится юзер,
когда он "постучится" в правильном порядке, то "вдруг" появляется открытый порт 22 и далее коннект
к нему как обычно.
следуя freebsd-way ставим , естественно, только из портов, предварительно их обновив.
- Код: Выделить всё • Развернуть
host# cd /usr/ports/security/knock
host# make config
вылезет окно, в котором всего лишь две опции , первая - SERVER, а вторая - CLIENT.
поскольку подключаться собираемся к этой машине, то выбираем только SERVER
и жмем OK
затем собираем и устанавливаем эту самую серверную часть (knockd)
- Код: Выделить всё • Развернуть
host# make install clean && rehash
в /usr/local/etc/ у нас появится файл примера конфигурации knockd.conf.sample
копируем его
- Код: Выделить всё • Развернуть
host# cd /usr/local/etc/
host# cp knockd.conf.sample knockd.conf
теперь открываем в редакторе какой вам больше нравится (лично мне ee и mcedit )
- Код: Выделить всё • Развернуть
[options]
# Имя и путь к лог файлу
logfile = /var/log/knockd.log
# какой интерфейс слушаем
interface = rl0
# описываем действия для открытия порта 22
[openSSH]
# последовательность портов tcp на которые нужно "постучаться" для открытия ssh
sequence = 7007,8008,9009
# Таймаут соединения с портами
seq_timeout = 5
# команда, выполняемая при удачном "простукивании"
command = /sbin/ipfw -q add 50 allow tcp from %IP% to me 22 keep-state
tcpflags = syn
# описываем действия для закрытия порта 22
[closeSSH]
# последовательность портов tcp на которые нужно "постучаться" для закрытия ssh
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/ipfw -q delete 50
tcpflags = syn
как видим действия до безобразия просты - при "простукивании" портов 7007,8008,9009
в файерволл добавляется правило, разрешающее подключение к порту 22.
И более того !!! разрешающее подключаться только с вашего IP адреса.
ну а когда работа закончена . то после отключеня от сервера стучимся по портам 9000,8000,7000 и
правило из файерволла удаляется и только что доступный порт 22 пропадает ...
обеспечиваем запуск демона
добавляем в /etc/rc.conf строчку
- Код: Выделить всё • Развернуть
knockd_enable="YES"
и запускаем демон
- Код: Выделить всё • Развернуть
host# cd /usr/local/etc/rc.d/
host# ./knockd.sh start
Starting knockd.
проверяем его работу
- Код: Выделить всё • Развернуть
host# ps ax | grep knockd
25067 ?? Ss 0:01,01 /usr/local/bin/knockd -d
26097 p1 DL+ 0:00,01 grep knockd
все жужжуит ....
на этом настройка серверной части закончена и осталось определиться с клиентской.
поскольку большинство тут, думаю, сидит под форточками, то и пример для них...
можно использовать два варианта - knock-cygwin.zip или winknock.rar
конфиг там очень простой и содержит лишь адрес сервера (или доменное имя) и
список портов по которым нужно постучаться
теперь перед подключением к порту 22 сначала простукиваем заданные порты одной
из вышеуказаных программок, а после отключения от 22 , аналогичным простукиванием - закрываем его совсем.
результат работы всего этого безобразия в /var/log/knockd.log выглядит так
- Код: Выделить всё • Развернуть
[2009-03-03 19:51] 88.147.222.22: openSSH: Stage 1
[2009-03-03 19:51] 88.147.222.22: openSSH: Stage 2
[2009-03-03 19:51] 88.147.222.22: openSSH: Stage 3
[2009-03-03 19:51] 88.147.222.22: openSSH: OPEN SESAME
[2009-03-03 19:51] openSSH: running command: /sbin/ipfw -q add 50 allow tcp from 88.147.222.22 to me 22 keep-state
[2009-03-03 20:51] 88.147.222.22: closeSSH: Stage 1
[2009-03-03 20:51] 88.147.222.22: closeSSH: Stage 2
[2009-03-03 20:51] 88.147.222.22: closeSSH: Stage 3
[2009-03-03 20:51] 88.147.222.22: closeSSH: OPEN SESAME
[2009-03-03 20:51] closeSSH: running command: /sbin/ipfw -q delete 50
в случае если порты перебираются неверно то примерно такая запись,
т.е. до исполнения каких либо команд дело не доходит
- Код: Выделить всё • Развернуть
[2009-03-03 21:59] 88.147.222.22: openSSH: Stage 1
[2009-03-03 21:59] 88.147.222.22: openSSH: Stage 2
вот собственно и все... всевозможные доморощенные хакеры посланы далеко и надолго,
причем даже не догадываются об этом...
согласитесь, очень сложно что либо взламывать, особенно когда нечего....
(порта то открытого нет вообще)
p.s. конфиг knockd самый простой, дабы не усложнять восприятие...
почему ipfw ? да нравится он мне.. да простят меня поклонники pf, но больной синтаксис явно не преимущество...
ip - случайный...