Хочу замутить такую защиту:

Защита: knocking + ssh (port: 381 & серия постукиваний открывает 22).

+ прикрутить fail2ban для защиты от подбора пароля на нестандартный порт (port 381)

Меня в последнее время стало интересовать, как можно защитить мой сервер выставленный в интернете применив к нему технологию port knocking, т.е. сервер успешно выполняет возложенный на него функционал, все подключения из вне к нему перекрыты и это хорошо. Но для безопасного подключения я его обстукиваю с заданными (известными только мне) интервалами и в случае правильной комбинации он открывает для моего IP (с которого я проделываю данную последовательность) доступ к нему по определенному порту, а после только я и закрываю к нему доступ. И это и есть технология port knocking.

Активизирую удаленные подключения на следующие порты через безопасное шифрованное соединение:

ekzorchik@srv-host:~$ sudo nano /etc/ssh/sshd_config

Port 22

Port 381

Применяю внесенные изменения:

ekzorchik@srv-host:~$ sudo /etc/init.d/ssh restart

Проверяю, что система ожидает подключения по портам объявленным выше:

ekzorchik@srv-host:~$ sudo netstat -tulpn | grep -E ':22|:381'

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2043/sshd

tcp 0 0 0.0.0.0:381 0.0.0.0:* LISTEN 2043/sshd

tcp6 0 0 :::22 :::* LISTEN 2043/sshd

tcp6 0 0 :::381 :::* LISTEN 2043/sshd

На заметку: на порту 381 повешу fail2ban который в случае подбора пароля при зафиксированных ошибках (больше 2), будет блокировать нарушителя на неделю (месяц, год).

Устанавливаю в систему утилиту посредством которой и задействует технология port knocking:

ekzorchik@srv-host:~$ sudo apt-get install knockd -y

ekzorchik@srv-host:~$ sudo nano /etc/default/knockd

START_KNOCKD=1

Настраиваю конфигурационный файл внедряемой технологии:

ekzorchik@srv-host:~$ sudo nano /etc/knockd.conf

[options]

logfile = /var/log/knockd.log

[openSSH]

sequence = 7000,8000,9000

seq_timeout = 5

command = ufw allow from %IP% to any port 22

tcpflags = syn

[closeSSH]

sequence = 9000,8000,7000

seq_timeout = 5

command = ufw delete allow from %IP% to any port 22

tcpflags = syn

ekzorchik@srv-host:~$ sudo service knockd restart

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

ekzorchik@srv-host:~$ sudo ufw enable

Command may disrupt existing ssh connections. Proceed with operation (y|n)? y

Firewall is active and enabled on system startup

ekzorchik@srv-host:~$ sudo nano /etc/default/ufw

IPV6=no

ekzorchik@srv-host:~$ sudo ufw default deny

ekzorchik@srv-host:~$ sudo ufw allow to any port 381

На заметку: если защищаемый хост имеет сервис предоставления контента, к примеру на нем поднята CMS WordPress то нужно открыть и 80 порт.

ekzorchik@srv-host:~$ sudo ufw status numbered

[sudo] password for ekzorchik:

Status: active

To Action From

— —— —-

[ 1] 381 ALLOW IN Anywhere

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

ekzorchik@navy:~$ sudo apt-get install knockd -y

ekzorchik@navy:~$ knock

knock knockd

ekzorchik@navy:~$ knock --help

usage: knock [options] <host> <port[:proto]> [port[:proto]] …

options:

-u, –udp make all ports hits use UDP (default is TCP)

-v, –verbose be verbose

-V, –version display version

-h, –help this help

example: knock myserver.example.com 123:tcp 456:udp 789:tcp

ekzorchik@navy:~$ knock -v 192.168.1.180 7000:tcp 8000:tcp 9000:tcp

hitting tcp 192.168.1.180:7000

hitting tcp 192.168.1.180:8000

hitting tcp 192.168.1.180:9000

тем временем на защищаемой системе в логах фиксируются следующие записи:

ekzorchik@srv-host:~$ sudo tail -f /var/log/knockd.log

[2016-02-29 22:06] starting up, listening on eth0

[2016-02-29 22:07] 192.168.1.181: openSSH: Stage 1

[2016-02-29 22:07] 192.168.1.181: openSSH: Stage 2

[2016-02-29 22:07] 192.168.1.181: openSSH: Stage 3

[2016-02-29 22:07] 192.168.1.181: openSSH: OPEN SESAME

[2016-02-29 22:07] openSSH: running command: ufw allow from 192.168.1.181 to any port 22
из лога видно, что порт для узла который правильно постучался открывает в фаерволе порт на подключение:

ekzorchik@navy:~$ ssh -l ekzorchik 192.168.1.180 -p 22

ekzorchik@192.168.1.180’s password:

Welcome to Ubuntu 12.04.5 LTS (GNU/Linux 3.13.0-32-generic x86_64)

* Documentation: https://help.ubuntu.com/

System information as of Mon Feb 29 22:07:47 MSK 2016

System load: 0.0 Processes: 91

Usage of /: 4.8% of 22.27GB Users logged in: 1

Memory usage: 4% IP address for eth0: 192.168.1.180

Swap usage: 0%

Graph this data and manage this system at:

https://landscape.canonical.com/

New release ‘14.04.3 LTS’ available.

Run ‘do-release-upgrade’ to upgrade to it.

Your Hardware Enablement Stack (HWE) is supported until April 2017.

Last login: Mon Feb 29 21:53:38 2016 from 192.168.1.181

ekzorchik@srv-host:~$ w

22:10:57 up 18 min, 2 users, load average: 0.00, 0.01, 0.05

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

ekzorchi tty1 21:53 10:41 0.82s 0.78s -bash

ekzorchi pts/1 192.168.1.181 22:10 1.00s 0.47s 0.00s w

я в системе, когда поработал то закрываю открытый порт:

ekzorchik@srv-host:~$ exit

logout

Connection to 192.168.1.180 closed.

Закрываю открытый для меня порт:

ekzorchik@navy:~$ knock -v 192.168.1.180 9000:tcp 8000:tcp 7000:tcp

hitting tcp 192.168.1.180:9000

hitting tcp 192.168.1.180:8000

hitting tcp 192.168.1.180:7000

, а если теперь попробовать подключиться без указания последовательности:

ekzorchik@navy:~$ ssh -l ekzorchik 192.168.1.180 -p 22 -v

OpenSSH_5.9p1 Debian-5ubuntu1.8, OpenSSL 1.0.1 14 Mar 2012

debug1: Reading configuration data /etc/ssh/ssh_config

debug1: /etc/ssh/ssh_config line 19: Applying options for *

debug1: Connecting to 192.168.1.180 [192.168.1.180] port 22.

и все соединение установить не получается.

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

Ниже пример определения, что система все же ожидает входящее подключение по порту 381 на котором как видно задействован сервис OpenSSH:

ekzorchik@navy:~$ sudo nmap -sV -p 1-65534 192.168.1.180

Starting Nmap 5.21 ( http://nmap.org ) at 2016-02-29 22:41 MSK

Nmap scan report for 192.168.1.180

Host is up (0.00055s latency).

Not shown: 65533 filtered ports

PORT STATE SERVICE VERSION

381/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1.7 (protocol 2.0)

MAC Address: 08:00:27:E8:35:23 (Cadmus Computer Systems)

Service Info: OS: Linux

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .

Nmap done: 1 IP address (1 host up) scanned in 613.08 seconds

, а именно утилиту fail2ban, о том как это сделать будет следующая развернутая (пошаговая заметка).

На заметку: а можно и не открывать дополнительный порт, как я делаю выше (port 381), я же просто хочу посредством утилиты fail2ban блокировать на неделю нарушителей да и разобрать функционал данной утилиты не помешает.

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

А по итогу прошу отметить, что заметка полностью работоспособна и на этом я прощаюсь с Вами читатели моего блога и до встречи, с уважением автор блога – ekzorchik.

От ekzorchik

Всем хорошего дня, меня зовут Александр. Я под ником - ekzorchik, являюсь автором всех написанных, разобранных заметок. Большинство вещей с которыми мне приходиться разбираться, как на работе, так и дома выложены на моем блоге в виде пошаговых инструкции. По сути блог - это шпаргалка онлайн. Каждая новая работа где мне случалось работать вносила новые знания и нюансы работы и соответственно я расписываю как сделать/решить ту или иную задачу. Это очень помогает. Когда сам разбираешь задачу, стараешься ее приподнести в виде структурированной заметки чтобы было все наглядно и просто, то процесс усвоения идет в гору. Также прошу на https://win.ekzorchik.ru https://lin.ekzorchik.ru https://net.ekzorchik.ru https://voip.ekzorchik.ru https;//home.ekzorchik.ru