Хочу замутить такую защиту:
Защита: 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.