Для повышения безопасности сервера при использовании ssh практикуют различные способы, предотвращающие деструктивные действия либо несанкционированный доступ к серверу.
Практически все эти способы подразумевают установку дополнительных приложений. Как-то:
denyhosts – небольшой демон, написанный на python, и интернет-сервис, позволяющий обмениваться заблокированными ip-адресами. Суть работы данного демона заключается в периодическом сканировании файла /var/log/auth.log (либо подобного. это все настраивается) и поиске ip-адресов, с которых идет подбор пароля. Т.е если с определенного адреса произошло некоторое количество неудачных попыток авторизации, этот ip-адрес блокируется с помощью в /etc/hosts.allow
Более параноидальный метод – Port Knocking. Суть метода в том, что по умолчанию нужный порт является заблокирован. Для того, чтобы его открыть, требуется послать определенную последовательность пакетов на заранее условленные порты для того, чтобы нужный порт открылся.
Возможно, придумали и более изощренные методы, но я с ними не знаком. Поэтому ниже пойдет речь о том, что можно сделать с помощью стандартного конфигурационного файла OpenSSH для повышения безопасности вашего сервера.
Настройки OpenSSH располагаются в файле /etc/ssh/sshd_config. В этой статье будет описано 7 параметров sshd_config, которые следует изменить.
В самом конфигурационом файле все строки, которые начинаются с символа “#” являются комментариями и не учитываются. И используются значения по умолчанию. Обратите внимание на то, что закоментированные параметры указывают как раз это значение.
К примеру, ssh_config содержит следующую строку. Она означает, что у параметра PubkeyAuthentication (авторизация по ключу) стоит значение “yes”, и оно является значением по умолчанию.
vadim@sabinich:~$ grep -i pubkey /etc/ssh/sshd_config
#PubkeyAuthentication yes
Если потребуется изменить, то можно просто удалить “решетку”, тем самым раскомментировав параметр и указать свое значение (к примеру с “yes” изменить на “no”), так как это представлено ниже:
vadim@sabinich:~$ sudo vi /etc/ssh/sshd_config
PubkeyAuthentication no
Все выше указанное было просто примером. Изменять параметр PubkeyAuthentication не требуется по причине того, что использование ключа для авторизации увеличивает безопасность и сводит на нет возможность подобрать пароль к пользователю, который имеет доступ к ssh.
И вообще, в ходе чтения этой статьи вам потребуется отредактировать всего 7 параметров, которые будут описаны. Этого вполне достаточно. И так, приступим.
1. Отключение возможность авторизации под суперпользователем (PermitRootLogin)
По умолчанию зайти на удаленный сервер под пользователем root никто не запрещает. Но это не совсем безопасно. В место этого более правильно будет авторизовываться под пользовательской учетной записью и повышать свои привилегии с помощью команды ‘su -‘, либо использовать ‘sudo’.
Если в вашей организации несколько системных администраторов и все они подключаются к серверу под суперпользователем, то не всегда можно узнать кто из администраторов находится на сервере. Поэтому после отключения возможности авторизации напрямую под пользователем root, системные администраторы сначала будут заходить под своей учетной записью и только после этого получать привилегии суперпользователя; это облегчить аудит сервера и действий, которые производят сисадмины.
Для отключения вышеописанной функции следует отключить параметр PermitRootLogin, установив значение “no”.
vadim@sabinich:~$ vi /etc/ssh/sshd_config
PermitRootLogin no
2. Предоставление доступа только указанным пользователям или группам (AllowUsers, AllowGroups)
По умолчанию авторизоваться может любой пользователь сервера. Лучше ограничить круг пользователей, которым разрешен доступ к ssh.
Это может быть полезно, когда вы создаете некоторое количество пользователей системе, но разрешить доступ по ssh хотите только некоторым.
Так же это можно использоваться совместно с NIS или openLDAP (или другие внешние приложения), которым требуется авторизация. Каждый из пользователей вашей компании может иметь учетную запись на серверах NIS, openLDAP и т.п, но на по ssh на некоторые сервера требуется пускать только определенных.
Для этого в конфигурационный файл sshd_config следует добавить определенных пользователей, существующих на сервере. В примере ниже это пользователи vasya, petya и kolya, которым разрешен вход на сервер. Имя пользователей разделены пробелами.
vadim@sabinich:~$ vi /etc/ssh/sshd_config
AllowUsers vasya petya kolya
При добавлении всех пользователей, которые присутствуют в какой-либо опроеделенной групппе следует указать так, как это представлено на примере ниже. Группы пользователей, которыи разрешен вход на сервер разделены так же пробелом.
vadim@sabinich:~$ vi /etc/ssh/sshd_config
AllowGroups deveopers administrators
3. Блокировка доступа определенным пользователям или группам (DenyUsers, DenyGroups)
В противовес параметра, разрешающего доступ определенным пользователям или группам, вы так же можете указать пользователей или группы, которым запрещен вход на сервер.
Для этого следует добавить в конфигурационный файл sshd_config параметр DenyUsers, в котором через пробел указать тех пользователей, которым запрещен доступ на сервер. На примере ниже это системные cvs и apache, а так же вполне реальный borya.
vadim@sabinich:~$ vi /etc/ssh/sshd_config
DenyUsers cvs apache borya
Существует так же параметр, с помощью которого можно запретить доступ не отдельным пользователям, а целым группам, в которые входят пользователи. Это параметр DenyGroups и группы указываются через пробел..
vadim@sabinich:~$ vi /etc/ssh/sshd_config
DenyGroups marketing staff
Обратите внимание на то, что можно использовать комбинации запрещающих и разрешающих параметров: DenyUsers, AllowUsers, DenyGroups, и AllowGroups.
4. Изменение порта SSHD (Port)
По умолчанию, ssh работает на 22 порту. Основная масса атакующих не задумываясь пытается подключиться к этому порту и, используя словарный подбор имени пользователя и пароля, получить доступ к серверу.
Если вы раскомментируете параметр Port и измените на что-либо другое, то это снизит интенсивность атак. К примеру, можно указать порт 222.
vadim@sabinich:~$ vi /etc/ssh/sshd_config
Port 222
Если журнальных файлах сервера (обычно, это /var/log/secure), вы увидете большое количество попыток авторизации, где в качестве имени пользователей указаны те, кого нет на сервере, и с тех IP-адресов, которые вам неизвестны, то будьте уверены это тот самый брут-форс о котором говорилось выше.
Так же обратите внимание на то, при использовании данного способа, всем сотрудникам придется запоминать не только IP-адрес сервера, но и номер порта к которому следует подключаться.
5. Изменение времени ожидания авторизации (LoginGraceTime)
При попытке авторизоваться по ssh на сервер у вас есть 2 минуты, чтобы ввести логин и пароль. Если вы этого не сделаете, то соединение с сервером будет разорвано.
2 минуты ожидания авторизационных данных это довольно много. Следует ограничить до 1 минуты или даже до 30 секунд.
Для этого следует изменить параметр LoginGraceTime путем редактирования файла sshd_config, и указать там требуемое время. В примере ниже это 1 минута.
vadim@sabinich:~$ vi /etc/ssh/sshd_config
LoginGraceTime 1m
6. Ограничение авторизации по интерфейсу (ListenAddress)
Если на сервере есть несколько сетевых интерфейсов, которые настроены на использования разных IP-адресов, то вы можете ограничить доступ и по этому параметру.
К примеру, на сервере следующие 4 сетевых интерфейса:
eth0 – 192.168.0.1
eth1 – 192.168.0.2
eth2 – 192.168.0.3
eth3 – 192.168.0.4
По умолчанию, ssh-сервер находится в состоянии ожидания подключения на всех IP-адресах. Если хотите, чтобы пользователи могли авторизовываться только на интерфейсах 2 и 3, то следует сделать так:
vadim@sabinich:~$ vi /etc/ssh/sshd_config
ListenAddress 192.168.0.2
ListenAddress 192.168.0.3
7. Рассоединение при отсутствии активности в шелле (ClientAliveInterval)
После того, как вы успешно авторизовались на сервер, вы можете захотеть сделать так, чтобы можно было разрывать соединение автоматически после того, как прошло некоторое время, в течение которого вы не производили никаких действий в консоли. Это обычно называется временем бездействия.
В Bash, можно использовать переменную окружения TMOUT.
В OpenSSH, это достигается путем комбинации параметров ClientAliveCountMax и ClientAliveInterval в конфигурационном файле sshd_config.
- ClientAliveCountMax – Параметр указывает на полное количество сообщений, отсылаемого ssh-сервером для распознавания активности ssh-клиента. По умолчанию это 3.
- ClientAliveInterval – Параметр указывает на время ожидания в секундах. После указанного времени ssh-сервер отошлет сообщение-запрос клиенту. По умолчанию значение этого параметра – 0. Т.е сервер не отсылает сообщение для проверки.
Для того, чтобы ваш ssh-клиент автоматически отклю
чался после 10 минут (600 секунд), следует внести изменения в конфигурационный файл sshd_config следующим образом:
vadim@sabinich:~$$ vi /etc/ssh/sshd_config
ClientAliveInterval 600
ClientAliveCountMax 0
Источник: http://www.thegeekstuff.com/2011/05/openssh-options/
У меня есть телеграм-канал, где я пишу чуть чаще и менее формально 🙂 Подписывайся!
“5. Изменение времени ожидания авторизации (LoginGraceTime)”
Не очень понятно, как время ожидания авторизации может использоваться атакующими. Казалось бы, сгенерировали комбинацию символов и сразу отослали.
“7. Рассоединение при отсутствии активности в шелле (ClientAliveInterval)”
Как атакующие могут использовать то, что у меня сессия не закрыта длительное время? Я не говорю про дни, но зачем через 10 минут надо сессию закрывать, не понятно.
Подвергся атаке, за выходные – 42000 соединений по ssh из Китая, и имя пользователя, и порты всевозможные подставляют (много запросов залогиниться под root).
Спасибо за статью. Мой хостер её запостил со ссылкой на источник, поэтому её нашел.
5-й – чтобы боты не висели на строке ввода авторизации.
7-й пункт сделан больше не из-за улучшения безопасности доступа извне, сколько из-за “нефиг висеть подключенным столько времени”. для порядку =)
Спасибо . Нашел ответ на интересующий меня вопрос. Все просто и понятно.