5 надёжных способов усилить безопасность SSH-сервера на Ubuntu

В этой статье я расскажу о пяти рекомендациях для усиления безопасности SSH на сервере Ubuntu, имеющем доступ к интернету. SSH, или Secure Shell, является ключевым методом, который системные администраторы используют для входа на удаленные серверы Unix/Linux. Однако, это также один из основных способов атак для злоумышленников. Поэтому крайне важно обеспечить максимальную защиту этого сервиса.

Анализ логов SSH-сервера

Перед использованием моих рекомендаций вы можете проверить журнал SSH с помощью следующей команды. Флаг — u указывает, что будут показаны только записи, связанные с юнитом ssh.

sudo journalctl - u ssh

Нажмите J для прокрутки вниз, K для перемещения вверх. F позволяет пролистать страницу полностью вниз, а B — вверх. Для выхода нажмите Q. Чтобы мгновенно перейти к концу журнала, выполните…

sudo journalctl - eu ssh

Злоумышленники регулярно пытаются проникнуть на ваш SSH-сервер, что подтверждается следующими уведомлениями.

Apr 23 18:58:33 sshd[14505]: Неверный пароль для root с 42.7.26.60 порт 60148 ssh2 Apr 23 18:58:35 sshd[14505]: Неверный пароль для root с 42.7.26.60 порт 60148 ssh2 Apr 23 18:58:38 sshd[14507]: pam_unix(sshd:auth): ошибка аутентификации; logname= uid=0 euid=0 tty=ssh ruser= rhost=58.218.198.170 user=root Apr 23 18:58:38 sshd[14505]: Неверный пароль для root с 42.7.26.60 порт 60148 ssh2 Apr 23 18:58:40 sshd[14507]: Неверный пароль для root с 58.218.198.170 порт 63586 ssh2 Apr 23 18:58:41 sshd[14505]: Неверный пароль для root с 42.7.26.60 порт 60148 ssh2 Apr 23 18:58:42 sshd[14507]: Неверный пароль для root с 58.218.198.170 порт 63586 ssh2 Apr 23 18:58:44 sshd[14505]: Неверный пароль для root с 42.7.26.60 порт 60148 ssh2 Apr 23 18:58:45 sshd[14507]: Неверный пароль для root с 58.218.198.170 порт 63586 ssh2

Совет 1: Отключите возможность входа по SSH для пользователя Root.

Чтобы злоумышленники смогли получить доступ к вашему серверу, им необходимо знать имя пользователя. В каждой Linux-системе существует учетная запись root, поэтому разрешать вход root-пользователю через SSH — не лучшая идея. Вместо этого можно создать нового пользователя для SSH-доступа и отключить вход root. Это усложнит задачу злоумышленникам, так как им сначала потребуется узнать имя пользователя перед тем, как пытаться подобрать пароль. Создать нового пользователя в Ubuntu можно с помощью следующей команды, заменив имя пользователя на желаемое. Избегайте использования распространенных имен, таких как admin.

sudo adduser username

Вам потребуется создать пароль для нового пользователя. После этого добавьте его в группу sudo, чтобы он имел возможность администрировать сервер с использованием sudo.

sudo adduser username sudo

Проверьте, что новый пользователь имеет доступ к системе через SSH и может использовать sudo. После этого внесите изменения в файл конфигурации SSH демона.

sudo nano /etc/ssh/sshd_config

Отыщите следующую строку:

#PermitRootLogin yes

Удалите символ # и замените yes на no, чтобы запретить вход по SSH для пользователя root.

PermitRootLogin no

Сохраните и закройте файл, после чего перезапустите службу SSH, чтобы изменения были применены.

sudo systemctl restart ssh

В большинстве ситуаций я предпочитаю не использовать учетную запись root, поэтому устанавливаю длинный и сложный пароль для нее, который даже не могу запомнить. Мне не подходит сохранять пароль по умолчанию, созданный моим хостинг-провайдером. Вдруг вашу учетную запись у провайдера хостинга взломают, и злоумышленник получит возможность воспользоваться стандартным паролем root для доступа к вашему серверу через VNC-консоль?

Читайте также:  Пошаговое руководство по установке PostgreSQL на Ubuntu

Я применяю такую команду для создания случайного пароля длиной 32 знака.

openssl rand - base64 32

Чтобы сменить пароль пользователя root, выполните следующие действия.

sudo passwd root

Если мне требуется зайти в учетную запись root, я просто переключаюсь на нее с помощью следующей команды. Вводить пароль root не нужно. Достаточно ввести пароль sudo своей учетной записи.

sudo su -

Если злоумышленник попытается войти в систему под учетной записью, для которой отключен SSH (например, root), в вашем SSH журнале появится следующая запись.

Неудачный пароль для недопустимого пользователя root

В данном контексте «недопустимый» указывает на то, что указанный пользователь отсутствует в системе или не обладает правом доступа через SSH. Если пользователь, которому разрешён вход по SSH, введёт неверный пароль, на экране появится сообщение следующего вида:

Неудачный пароль для имя_пользователя

Рекомендация 2: Применяйте аутентификацию с помощью открытого ключа и отключите вход по паролю.

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

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

  • Два простых этапа для организации входа по SSH на Ubuntu без использования пароля.

Совет 3: Активируйте двухфакторную аутентификацию (2FA).

Для удаленного доступа к вашему серверу Ubuntu обычно достаточно ввести пароль или воспользоваться SSH-ключом. Однако двухфакторная аутентификация (2FA) требует ввода двух элементов информации для входа, что может значительно улучшить безопасность вашего сервера OpenSSH. В настоящее время множество веб-сайтов и сервисов, таких как Facebook, Google и Twitter, предлагают пользователям возможность активировать 2FA для защиты их аккаунтов, и включение 2FA на вашем SSH-сервере также будет разумным шагом.

Чтобы активировать двухфакторную аутентификацию для сервера OpenSSH на Ubuntu, изучите данный руководство.

  • Настройка двухфакторной аутентификации для SSH на серверах Ubuntu 18.04 и 18.10.

Совет 4: Применяйте Fail2ban для предотвращения доступа злостным нарушителям.

Fail2ban — это набор программ для серверов и клиентов, предназначенный для ограничения несанкционированных попыток аутентификации с использованием атак методом подбора паролей. Установить его можно из стандартного репозитория Ubuntu.

sudo apt install fail2ban

После установки программа запустится автоматически, что можно проверить с помощью:

sudo systemctl status fail2ban

Программа fail2ban-server, являющаяся частью fail2ban, следит за логами и отправляет команды для блокировки или разблокировки. По умолчанию она блокирует IP-адрес клиента на 10 минут, если тот 5 раз ввел неправильный пароль. Блокировка происходит путем добавления правил в брандмауэр iptables. Чтобы проверить правила iptables, выполните следующую команду.

sudo iptables - L

На приведенном ниже скриншоте удаленный клиент 54.ip-37-187-225.eu заблокирован на моем сервере. Подключение к порту 22 будет недоступно в течение 10 минут. (Тем не менее, он по-прежнему сможет подключаться к другим открытым портам сервера.)

Fail2ban с использованием iptables

Файл с правилами fail2ban расположен по пути /etc/fail2ban/jail.conf.Редактировать его не требуется, поскольку стандартные настройки обычно достаточно для защиты от атак методом подбора паролей к SSH. Если вы намерены изменить стандартные параметры, рекомендуется внести изменения в файл /etc/fail2ban/jail. local.

Читайте также:  Astra Linux Активация root пользователя

К примеру, вы можете включить следующие строки в файл jail. local.

[sshd] enabled = true maxretry = 3 bantime = 24h ignoreip = 127.0.0.1/8 ::1/128 12.34.56.78

  • maxretry: число неудачных попыток, которые должны произойти в течение последних 10 минут, чтобы заблокировать IP-адрес.
  • bantime : это время, на которое происходит блокировка. Имейте в виду, что в версии fail2ban для Ubuntu 16.04 не предусмотрена поддержка единицы измерения h (часы), поэтому следует использовать единицу s (секунды).
  • ignoreip: перечень IP-адресов, которые нужно исключить из блокаировки.

Для задания значений по умолчанию для всех тюрем разместите параметр в секции [DEFAULT], а не в [sshd]. Например, можно добавить адреса ignoreip в секцию [DEFAULT].

[DEFAULT] ignoreip = 127.0.0.1/8 ::1/128 12.34.56.78

Теперь у вас есть возможность убрать параметр ignoreip из секции [sshd]. Это значит, что если вы хотите добавить дополнительные IP-адреса в белый список, вы можете сделать это в разделе [DEFAULT]. В случае, если присутствуют два одинаковых параметра, приоритет будет отдан тому, который указан в [sshd], а не в [DEFAULT].

Сохраните файл и закройте его. После этого перезапустите fail2ban, чтобы применить изменения.

sudo systemctl reload fail2ban

Вы можете ознакомиться с журналом fail2ban, который расположен в файле /var/log/fail2ban.log. Для более детальной информации о настройках тюрем fail2ban обратитесь к странице справки man.

man jail.conf

Совет 5: Используйте белый список IP-адресов.

Применение fail2ban может оказаться неэффективным для обеспечения безопасности вашего сервера OpenSSH. А что, если сам fail2ban подвержен эксплуатации для удаленного выполнения кода? Вы можете предотвратить нежелательные атаки на свой сервер, настроив правила брандмауэра, чтобы злоумышленники не имели возможности подключаться к вашему SSH-порту.

Если вам необходимо лишь подключаться к серверу, то зачем предоставлять доступ другим IP-адресам? Вы можете ограничить доступ по SSH только своим IP-адресом и запретить все остальные. У меня динамический домашний IP-адрес, но я использую собственный VPN-сервер, расположенный в дата-центре, чтобы получать статический IP-адрес при работе через VPN. Также возможно настроить VPN-сервер на том же хосте, чтобы осуществлять подключение к серверу OpenSSH с IP-адреса этого сервера.

Сервер OpenSSH способен применять TCP Wrappers для управления списками разрешённых и запрещённых адресов. Чтобы разрешить доступ по SSH для вашего IP-адреса, необходимо внести изменения в файл /etc/hosts. allow.

sudo nano /etc/hosts. allow

Введите разрешенные IP-адреса, как указано ниже. Если IP-адреса не находятся в одном диапазоне, добавьте отдельную строку для каждого хоста.

sshd:192.168.0.0/24 sshd:127.0.0.1 sshd:12.34.56.78

Сохраните изменения и закройте файл. После этого внесите правки в файл /etc/hosts. deny. Чтобы запретить доступ всем остальным хостам, добавьте следующую строку.

sshd:ALL

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

Имейте в виду, что сначала необходимо внести изменения в файл /etc/hosts. allow, иначе существует риск, что вы будете заблокированы на своем сервере.

Спустя некоторое время вы сможете ознакомиться с журналами SSH.

sudo journalctl - eu ssh

Вы столкнётесь с сообщениями, подобными приведённым ниже, которые будут свидетельствовать о том, что TCP Wrappers заблокировали подключения к SSH-демону с этих IP-адресов.

Dec 26 07:57:42 sshd[5962]: refused connect from 37.187.92.192 (37.187.92.192) Dec 26 07:57:55 sshd[5979]: refused connect from 178.128.71.114 (178.128.71.114) Dec 26 07:58:00 sshd[5985]: refused connect from 188.120.235.20 (188.120.235.20) Dec 26 07:58:05 sshd[5991]: refused connect from 181.49.150.45 (181.49.150.45)

Применение брандмауэра iptables для ограничения доступа по IP-адресам.

Некоторые дистрибутивы Linux, например Arch Linux, изначально не имеют включенных TCP-оберток. В таком случае вы можете воспользоваться межсетевым экраном iptables для формирования белого списка IP-адресов, разрешенных для подключения к порту SSH. Создание белого списка на межсетевом экране создает ощущение, что порт SSH вашего сервера закрыт, что является для меня более предпочтительным вариантом.

Читайте также:  Защитите свой ноутбук с Ubuntu Linux от кражи, используя Prey

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

sudo iptables - A INPUT - m conntrack --ctstate ESTABLISHED, RELATED - j ACCEPT

После этого предоставьте доступ вашему IP-адресу к порту SSH, используя следующую команду. Замените your-ip-address на свой настоящий IP-адрес, например, 74.125.128.103.

sudo iptables - A INPUT - p tcp --dport 22 - s your-ip-address - j ACCEPT

  • -A INPUT служит для включения указанного правила в цепочку INPUT, предназначенную для обработки входящих данных.
  • -p tcp обозначает использование протокола TCP, поскольку демон SSH работает на TCP-порту.
  • —dport 22 обозначает, что целевой порт равен 22, который является стандартным для SSH. Если вы изменили порт SSH, необходимо будет внести соответствующие изменения и здесь.
  • -s your-ip-address задаёт начальный IP-адрес.
  • -j ACCEPT указывает на то, что соединение будет направлено к цели ACCEPT, что разрешит это SSH-соединение.

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

sudo iptables - A INPUT - p tcp --dport 22 - j REJECT

Проверьте настройки межсетевого экрана iptables, используя следующую команду.

sudo iptables - L

Если в будущем вы решите внести новый IP-адрес в белый список, вам потребуется создать новое правило.

sudo iptables - I INPUT - p tcp --dport 22 - s your-ip-address - j ACCEPT

Опция — I предназначена для добавления указанного правила межсетевого экрана в цепочку INPUT. По умолчанию данное правило будет вставлено в начало этой цепочки. Важно отметить, что если мы добавим новое правило (-A) в конец цепочки INPUT, то оно не окажет влияния, так как будет следовать за правилом «отклонить все остальные IP».

Если вы работаете с интерфейсом iptables, например, с UFW, рекомендуется ознакомиться с этим руководством по созданию белого списка.

  • Запуск работы с межсетевым экраном UFW на серверах Debian, Ubuntu и Linux Mint.

Проверка последнего IP-адреса, с которого был осуществлён вход.

PrintLastLog служит для информирования о времени последнего входа и IP-адресе, с которого он был выполнен. Вы сможете увидеть эту информацию после подключения к своему серверу через SSH. Пример отображения будет следующим:

Последний вход: Чт Июн 2 04:10:08 2016 с 12.34.56.78

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

sudo nano /etc/ssh/sshd_config

Установите значение PrintLastLog на yes.

PrintLastLog yes

Сохраните документ и перезапустите SSH-сервис.

Что произойдет, если вас заблокировали?

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

Тем не менее, если у вас есть физический доступ к серверу, использование SSH для входа не требуется. Даже если сервер находится в облаке, вы можете воспользоваться VNC-консолью для доступа к нему. К примеру, я использую свой почтовый сервер на платформе ScalaHosting, которая предлагает веб-консоль VNC в панели управления. Это VNC-соединение не зависит от SSH.

Веб-консоль VNC от Scalahosting

DigitalOcean предлагает защищённую веб-консоль VNC.

Атака методом подбора паролей для SSH

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

Следующий этап

Я надеюсь, что данный учебник способствовал укреплению безопасности вашего сервера OpenSSH на Ubuntu. Это лишь одна из публикаций в цикле материалов, посвященных безопасности. Рекомендуется ознакомиться и с другими статьями, чтобы повысить защиту вашего сервера.

  • Конфигурация автоматического обновления систем безопасности (Unattended Upgrades) в Ubuntu
  • Служба Canonical Livepatch позволяет обновлять ядро Linux в Ubuntu без необходимости перезагрузки системы.
  • Способы применения брандмауэра UFW на системах Debian, Ubuntu и Linux Mint.

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