Возможность подключиться к серверу либо компьютеру, физически находясь на другом конце города, страны, земного шара, является неоспоримым благом. Однако, как это часто бывает, преимущества получают не только законные пользователи, но и злоумышленники. Удаленный доступ с помощью SSH подключения не стал исключением.

Что же представляет собой этот способ связи с сервером и как сделать подключение максимально безопасным?

Что собой являет SSH соединение

SSH (Secure shell) — сетевой протокол, предназначенный для получения безопасного удаленного доступа к операционной системе и управления ею.

В Linux системах подключение по защищенному протоколу осуществляется с помощью следующей команды:

ssh user_name@remote_host

Под удаленным хостом в данном случае подразумевается IP-адрес либо домен, к которому хотите подключиться. Для входа на сервер система запросит ввести пароль авторизации. После успешного подключения вы получите доступ к управлению устройством через командную оболочку.

Для того, чтобы прервать соединение и вернуться к локальной сессии, достаточно ввести в консоли exit.

В случае использования операционной системы Windows, можно воспользоваться SSH-клиентом PuTTy, работа с которым описана в нашей статье.

Настройка параметров подключения к SSH

Необходимо понимать, что использование такого блага как ssh-соединение влечет за собой и риск подвергнуться хакерской атаке. Злоумышленники могут попытаться проникнуть на ваш удаленный сервер, используя логин и пароль. Чтобы свести вероятность успешной атаки к минимуму, воспользуемся доступными нам средствами, а именно – изменением настроек подключения.

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

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

cp /etc/ssh/sshd_config{,.bak}

Приставка {,.bak} позволяет скопировать файл с указанным именем и расширением bak, которое присваивается резервным копиям.

Теперь через текстовый редактор, например, vim, emacs, nano, открываем файл /etc/ssh/sshd_config и вносим в него основные правки. В целях повышения безопасности SSH соединения нас интересуют следующие параметры:

  1. PermitRootLogin
  2. AllowUsers, AllowGroups
  3. DenyUsers, DenyGroups
  4. Port
  5. ListenAddress
  6. Login GraceTime
  7. ClientAliveInterval
  8. HostbasedAuthentication.

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

PermitRootLogin
Этот параметр устанавливает разрешение на вход в систему как root пользователь. Для повышения безопасности соединения рекомендуется отключить такую возможность, т.е. изменить установленное в файле значение “Yes” на “No”:

PermitRootLogin no

При таких условиях выполнять команды с правами суперпользователя после входа на сервер можно будет с помощью функций su либо sudo.

AllowUsers, AllowGroups
Когда в системе создано много пользователей, то, согласно первоначальных настроек, каждый из них имеет возможность удаленного доступа по SSH. Чтобы разрешить доступ только для определенного круга лиц (и, соответственно, запретить его для всех остальных), существуют параметры AllowUsers и AllowGroups. Запись в конфигурационном файле имеет, соответственно, вид:

AllowUsers user1 user2 user3
AllowGroups group1 group2 group3

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

DenyUsers, DenyGroups
Когда пользователей в системе много и нужно предоставить удаленный доступ большинству из них, при этом запретив его отдельным лицам и группам, в sshd_config файле вносят правки в параметры DenyUsers, DenyGroups. Напротив этих параметров, аналогично примеру с AllowUsers, AllowGroups, перечисляем имена пользователей и групп, которым будет отказано в доступе на сервер по SSH.

DenyUsers user1 user2
DenyGroups group1 group2

В предыдущих пунктах речь шла о настройках, которые позволят распознать неавторизованного пользователя и запретить подключение. Однако злоумышленники часто используют метод подбора логина и пароля, пытаются попасть на сервер путем ввода ранее украденных данных.

Port
Чтобы усложнить задачу хакерам, стоит позаботиться о хорошей маскировки своего ssh-порта.

По умолчанию ssh-соединение осуществляться через 22-й порт. Чтобы порт для подключения не был так очевиден, смените порт SSH на любой другой, желательно наименее стандартный, например:

Port 22540

ListenAddress
Кроме того, что ssh-соединения настроено на определенном порте, подключение осуществляется на различных сетевых интерфейсах. Иными словами сервер слушает множество IP-адресов. Есть возможность указать в конфигурационном файле конкретные адреса интерфейсов для входа на сервер с помощью параметра ListenAddress. Например:

ListenAddress 192.168.1.2

Login GraceTime
По умолчанию, при подключении к серверу по ssh у пользователя есть 2 минуты для ввода логина и пароля. Такого промежутка более чем достаточно, причем не только для авторизованного пользователя, но и для хакера. Поэтому время ожидания ввода этих данных стоит ограничить до 30-60 секунд, в зависимости от ваших предпочтений.

Login GraceTime 30

ClientAliveInterval
Этот параметр призван определить время бездействия пользователя, по истечении которого соединение автоматически разрывается. Период ожидания необходимо указать в секундах, например:

ClientAliveInterval 300

HostbasedAuthentication
Также стоит отключить авторизацию пользователя на основе хоста с помощью директивы:

HostbasedAuthentication no

Лучше воспользоваться аутентификацией на основе ключей.

Кроме перечисленных в конфигурационном файле настроек, защитить свое openSSH-соединение поможет хороший пароль, не связанный с персональными данными, но содержащий при этом большие и маленькие буквы, цифры и знаки. Сменить пароль на сервере можно множеством способов. Если не хотите составлять пароль самостоятельно, используйте генератор случайных паролей.

Закрытие порта SSH

Еще одной преградой для взлома вашего сервера является закрытие SSH-порта, или port knocking. Особенно актуально использовать данную технологию для серверов, не предназначенных для всеобщего доступа (например, серверы хранения конфиденциальных данных компании и т.п.).

Суть port knocking заключается в том, что изначально все порты сервера закрыты для внешних подключений. Открытие порта и возможность доступа к нему осуществляется за счет применения определенной последовательности стуков. Эта технология используется как дополнение к приведенным выше настройкам, применению паролей и ключей.

Механизм работы port knocking довольно прост. Вы устанавливаете на сервер демон knockd, настраиваете необходимую последовательность стуков в файле /etc/knockd.conf и получаете незамысловатый в использовании, но надежный на практике инструмент противодействия хакерам. Дело в том, что в интернет-пространстве насчитывается около 60000 свободных портов, через которые можно осуществить SSH-подключение. Для доступа к порту используют, как правило, последовательность из 3 стуков. Это означает, что подобрать правильный набор портов случайным образом или как-либо их просчитать становится очень сложно, а это именно то, чего мы добиваемся.

Итак, устанавливаем knockd демон:

sudo apt-get install knockd – для Ubuntu
sudo aptitude install knockd – для Debian

Теперь в конфигурационном файле /etc/knockd.conf настраиваем последовательность стуков, которая будет открывать наш порт. Для этого в секции sequence перечисляем через запятую без пробела номера портов, например:

sequence= 6240,7000,8490

Когда вы пытаетесь “достучаться” до порта, передача данных осуществляется по протоколу TCP. Однако, для повышения уровня безопасности соединения можно добавить другие протоколы, например, UDP:

sequence= 6240,7000:udp,8490

Пакеты TCP, которые приходят на сервер, требуют различных действий со стороны системы. Чтобы избежать ненужной нагрузки и отфильтровать лишнее, используют параметр TCPFlags, который также прописывают в файле /etc/knockd.conf:

tcpflags= syn

Флаг SYN означает запрос на соединение. Т.е. демон knockd будет сканировать только те приходящие пакеты, которые содержат запрос на соединение с сервером.

Выше мы говорили о том, что SSH-подключение осуществляется на различных сетевых интерфейсах. По умолчанию, knockd рассчитан на работу с eth0. Чтобы дать возможность демону контролировать другие интерфейсы, например, eth1, в файл /etc/knockd.conf добавим строчку:

Interface=eth1

Чтобы “постучать” в порт, нужно определенное время. Если вы точно знаете, какую последовательность требуется ввести, достаточно 15-30 секунд. Именно этим пределом стоит ограничить максимальное время, необходимое для завершения последовательности стуков:

seq_timeout= 20

Согласно примеру, по истечении 20 секунд система считывает введенную информацию. Соответственно, если правильная последовательность не была завершена до истечения этого времени, вам будет отказано в доступе и порт не откроется.

Поскольку логин и пароль авторизации могут быть похищены злоумышленниками, будет не лишним по аналогии с seq_timeout установить ограничение на время их ввода:

cmd_timeout= 30

Соответственно, через 30 секунд порт закроется, если данные для авторизации не будут успешно введены.

Мы уже настроили последовательность стуков для открытия нужного SSH порта, указали ограничения по времени. Однако, чтобы корректно работать, knockd должен знать, какие действия ему необходимо выполнить, если стуки были правильными, а также, если в доступе нужно отказать.

Для этого существуют команды start_command и stop_command, соответственно.

Если последовательность стуков верна, демон должен открыть порт SSH, через который необходимо осуществить подключение. Для этого в конфигурационном файле /etc/knockd.conf прописываем команду для start_command:

start_command= /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22716 -j ACCEPT

В случае, когда стуки были неправильными либо пользователь не успел ввести ее полностью до истечения отведенного времени, knockd делает порт недоступным (невидимым).

stop_command= /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22716 -j ACCEPT

Фактически, мы настраиваем правила iptables (брандмауэра), где:

– INPUT означает входящий пакет
– A и D – добавление и удаление правила, соответственно
– s – IP источника пакета
– %IP% – адрес, с которого идет запрос на открытие порта
– p – протокол (в данном случае tcp)
– dport – SSH-порт, который мы хотим открыть
– j – ключ, указывающий на действие над пакетом (accept – принять)

Когда все настроено и готово к работе, запускаем демон в фоновом режиме с помощью команды knockd -d.

Теперь мы можем получить удаленный доступ к серверу по SSH, указав в консоли правильную последовательность портов через пробел. После этого вы увидите открывшийся порт и предложение ввести пароль своей учетной записи:

knock адрес_сервера 6240 7000:udp 8490
ssh адрес_сайта -p 22716 -o ConnectTimeout=30
Password:

Как видите, на ввод данных дается 30 секунд.

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

– IP-адресом
– хостнеймом.

В первом случае запрос на подключение будет выглядеть следующим образом:

ssh -p 22716 username@1.1.1.1

Если подключение идет к серверу через hostname, запрос имеет следующий вид:

ssh -p 22716 username@server.vps.ua

Часто доступность системы для хакеров связана с уязвимостью самой операционной системы. Разработчики регулярно проверяют наличие слабых мест в своем продукте и выпускают более совершенные версия, закрывая подобные лазейки для злоумышленников. Поэтому не забывайте своевременно обновлять ПО и утилиты.