Системное администрирование Пять простых шагов для защиты ssh в Ubuntu. Часть II — Port knocking

В одной из предыдущих статей по защите ssh я обещал рассказать про технологию port knocking. Ее суть заключается в том, что на сервере запускается специальная служба knockd, которая «слушает» подключения по всем портам, и при получении некоей ожидаемой последовательности подключений выполняет заранее заданную администратором команду. Такая технология дает дополнительную возможность по удаленному управлению сервером. Остается только закрыть порт ssh и задать службе knockd такую команду, которая заставит файерволл открыть порт ssh при получении определенной последовательности подключения к портам сервера. Далее я опишу как максимально просто и быстро сделать это в Ubuntu.

Шаг пятый

На удаленном сервере все нижеперечисленные действия следует производить с особой осторожностью, так как есть риск потерять связь с сервером в случае ошибки.

Сначала нужно установить пакет knockd. Вместе с ним также установится утилита knock, с помощью которой можно будет «простукивать» порты на удаленном сервере.

sudo aptitude install knockd

В составе Ubuntu есть упрощенный файерволл ufw, который значительно легче в понимании, чем iptables. Поэтому для открытия порта ssh службой knockd мы будем использовать именно ufw, который по своей сути является надстройкой для iptables. Пакет ufw установлен в Ubuntu по умолчанию. Если пакета ufw нет, то его можно установить. Однако должен предупредить, что если пакета ufw нет на виртуальном выделенном сервере (VPS/VDS), то его лучше не устанавливать. На таких серверах обычно используются специальные ядра linux, некоторые из которых несовместимы с файерволлом ufw.

И так, при включении файерволла ufw все порты закроются. Поэтому перед стартом ufw следует открыть порт, на котором у нас находится ssh. В большинстве случаев это порт 22, но в предыдущей статье мы использовали порт 4117 для этих целей.

sudo ufw allow 22
sudo ufw enable

Затем нужно настроить конфигурационные файлы службы knockd. Ниже я привожу пример конфигурационного файла для открытия порта 22 на удаленном сервере.

[options]
	logfile		= /var/log/knockd.log
 
[openSSH]
	sequence	= 4561:tcp,7127:udp,5934:tcp,3901:udp
	seq_timeout	= 30
	tcpflags	= syn
	start_command	= ufw allow from %IP% to any port 22
	cmd_timeout	= 30
	stop_command	= ufw delete allow from %IP% to any port 22

Таким образом, удаленный сервер, получив последовательность подключений по портам 4561:tcp,7127:udp,5934:tcp,3901:udp, выполнит команду по открытию порта 22 для ip-адреса, с которого производился запрос. По истечении 30 секунд, возможность подключения по порту 22 для текущего ip-адреса исчезнет, так как будет выполнена команда stop_command, которая удалит правило, разрешающее подключение по ssh для ip-адреса из списка.

Предупреждаю, что при тестировании службы knockd лучше указывать порт, отличный от 22, так как в случае ошибки в конфигурационном файле можно потерять связь с сервером.

После этого перезапускаем службу knockd. Сначала внесем изменения в файл /etc/default/knockd:

# control if we start knockd at init or not
# 1 = start
# anything else = don't start
#
# PLEASE EDIT /etc/knockd.conf BEFORE ENABLING
START_KNOCKD=1

Затем перезапустим саму службу:

sudo service knockd restart

На компьютере, с которого мы будем подключаться к удаленному серверу, также установим службу knockd и выполним команду, которая добавит в файерволл новое правило:

sudo aptitude install knockd
knock 4561:tcp 7127:udp 5934:tcp 3901:udp

Чтобы проверить, добавилось ли новое правило, нужно в течение 30 секунд выполнить на удаленном сервере команду:

sudo ufw status

Если в списке будет присутствовать правило, разрешающее доступ к порту с ip-адреса, с которого выполнялась команда knock, то значит служба knockd успешно настроена. После этого можно закрывать порт 22 и открывать его только при необходимости и только для определенного ip-адреса. Порт 22 можно закрыть на удаленном сервере следующей командой:

sudo ufw delete allow 22

Таким образом, технологию Port knocking можно использовать в качестве еще одного способа защитить свой выделенный сервер от недоброжелателей. Однако настраивать службу knockd нужно внимательно, так как возможна ситуация, при которой мы закроем себе доступ к управлению сервером.