Как защитить SSH сервер от атаки методом перебора (грубой силой – брут-форсинга) используя fail2ban. Защищаем SSH сервер Используйте нестандартный порт

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

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

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

Данное руководство поможет установить и настроить fail2ban на сервере Ubuntu 14.04.

Установка fail2ban

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

Обновите индекс пакетов и установите fail2ban с помощью этих команд:

sudo apt-get update
sudo apt-get install fail2ban

Теперь можно приступать к настройке утилиты.

Конфигурации fail2ban

Конфигурационные файлы fail2ban хранятся в каталоге /etc/fail2ban. Стандартные параметры можно найти в файле jail.conf.

Поскольку этот файл может быть изменен во время обновления пакета, не нужно редактировать его. Лучше скопировать его содержимое в другой файл и откорректировать параметры там. Чтобы эти два файла работали правильно, лучше всего оставить в новом файле только те параметры, которые нужно переопределить в файле jail.local. Все параметры по умолчанию будут читаться из файла jail.conf.

Скопируйте jail.conf и используйте его в качестве основы для файла jail.local. Для этого введите:

awk "{ printf "# "; print; }" /etc/fail2ban/jail.conf | sudo tee /etc/fail2ban/jail.local

После этого просмотрите jail.conf:

sudo nano /etc/fail2ban/jail.conf

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


. . .
ignoreip = 127.0.0.1/8
. . .

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


. . .
bantime = 600
. . .

Параметр bantime устанавливает время, в течение которого клиент будет заблокирован, если он не смог пройти аутентификацию. Его значение измеряется в секундах. По умолчанию установлено значение 600 секунд (10 минут).


. . .
findtime = 600
maxretry = 3
. . .

Следующие два параметра, на которые следует обратить внимание, — это findtime и maxretry. Вместе они определяют условия, при которых незаконные пользователи будут блокироваться.

Переменная maxretry задает количество попыток входа, а findtime – интервал времени, в течение которого пользователь должен пройти аутентификацию. Если клиент превысил любой из этих показателей, он будет заблокирован. По умолчанию сервис fail2ban блокирует клиентов, которые не смогли предоставить учетные данные 3 раза в течение 10 минут.


. . .
destemail = root@localhost
sendername = Fail2Ban
mta = sendmail
. . .

Параметры destemail, sendername и mta позволяют настроить оповещения по электронной почте. Параметр destemail определяет адрес электронной почты, который должен получать сообщения о заблокированных пользователях. Параметр sendername задает отправителя сообщения. Параметр mta определяет, какая почтовый сервис будет использоваться для отправки почты. Добавьте эти параметры в jail.local в раздел и установите соответствующие значения.


. . .
action = $(action_)s
. . .

Этот параметр настраивает действие fail2ban в случае блокировки. Значение action_ определено в файле немного до этого параметра. Действие по умолчанию заблокирует трафик злоумышленника до истечения времени бана путем перенастройки брандмауэра.

Если вы хотите настроить оповещения по электронной почте, добавьте или раскомментируйте элемент action в файл jail.local и измените его значение с action_ на action_mw. Если вы хотите, чтобы письмо включало соответствующие строки из логов, вы можете указать значение action_mwl. Если вы решили использовать электронные оповещения, убедитесь, что настройки почты их поддерживают.

Индивидуальные параметры

Поддержка отдельных сервисов включается в специальных одноименных разделах. Например, параметры сервиса ssh можно указать в разделе .

Каждый из этих разделов можно включить, раскомментировав заголовок раздела в jail.local и изменив значение строки enabled на «true»:


. . .
enabled = true
. . .

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

Эти разделы используют в качестве основы значения, установленные в разделе , и по мере необходимости корректируют их. Чтобы переопределить любые значения, добавьте раздел для соответствующего сервиса в jail.local и измените его значения.

Также здесь устанавливаются некоторые другие параметры. Параметр filter помогает определить, указывает ли строка в логе на неудачную попытку аутентификации; параметр logpath сообщает fail2ban, где находятся логи этого конкретного сервиса.

Значение параметра filter является ссылкой на файл с расширением.conf, расположенный в каталоге /etc/fail2ban/filter.d. Эти файлы содержат регулярные выражения, которые определяют, является ли строка в логе сообщением о неудачной попытке аутентификации. Эти файлы выходят за рамки данного мануала, потому что они довольно сложны, а параметры по умолчанию вполне подойдут в большинстве случаев.

Просмотреть фильтры можно в этом каталоге:

ls /etc/fail2ban/filter.d

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

Предположим, у вас есть сайт, который обслуживается с помощью Nginx. Логи веб-сервера постоянно пополняются неудачными попытками входа. Утилита fail2ban может использовать файл nginx-http-auth.conf, чтобы постоянно проверять /var/log/nginx/error.log.

Почти все необходимые для этого параметры уже есть в разделе в файле /etc/fail2ban/jail.conf. Вам нужно просто раскомментировать этот раздел в файле jail.local и указать значение true в параметре enabled.

. . .
enabled = true
. . .

После этого нужно перезапустить fail2ban.

Настройка fail2ban

Теперь вы знаете основы работы fail2ban. Попробуйте настроить политику автоматической блокировки для сервиса SSH и Nginx. Также нужно, чтобы инструмент fail2ban отправлял сообщения по электронной почте в случае блокировки IP-адреса.

Для начала установите необходимое ПО.

Вам понадобится nginx, так как fail2ban будет отслеживать его журналы, и sendmail для отправки уведомлений. Также нужен пакет iptables-persistent, чтобы сервер сохранял и автоматически загружал правила брандмауэра при загрузке сервера. Все эти пакеты можно скачать из стандартных репозиториев Ubuntu:

sudo apt-get update
sudo apt-get install nginx sendmail iptables-persistent

Остановите сервис fail2ban, чтобы настроить базовый брандмауэр.

Настройка брандмауэра

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

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -A INPUT -j DROP

Эти команды реализуют вышеуказанную политику. Чтобы просмотреть текущие правила брандмауэра, наберите:

sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT




-A INPUT -j DROP

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

sudo dpkg-reconfigure iptables-persistent

Перезапустите fail2ban:

sudo service fail2ban start

Запросите правила брандмауэра:

sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-ssh

-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
-A fail2ban-ssh -j RETURN

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

Настройка fail2ban

Теперь нужно добавить настройки fail2ban в файл jail.local:

sudo nano /etc/fail2ban/jail.local

Здесь можно установить более строгий интервал времени блокировки. Найдите и раскомментируйте заголовок . В этом разделе измените параметр bantime так, чтобы сервис блокировал клиента на полчаса:


. . .
bantime = 1800
. . .

Также необходимо настроить уведомления. Сначала найдите параметр destemail, который также должен находиться в разделе . Введите адрес электронной почты, который вы хотите использовать для сбора этих сообщений:


. . .
destemail = [email protected]
. . .

В sendername укажите любое удобное значение. Рекомендуется использовать здесь описательное значение, которое почтовый сервис сможет легко отфильтровать.

Затем нужно исправить значение action. Можно установить значение action_mw, которое блокирует клиента, а затем отправляет отчет «whois». Значение action_mwl делает то же самое, но также отправляет в сообщении соответствующие строки лога.


. . .
action = %(action_mwl)s
. . .

В разделе SSH в директиве maxretry можно изменить количество неудачных попыток аутентификации. Если вы используете нестандартный порт (не 22), укажите его в параметре port. Как говорилось ранее, этот сервер уже включен.

Затем найдите раздел nginx-http-auth. Раскомментируйте заголовок и измените значение параметра enabled на «true».

. . .

enabled = true
. . .

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

Перезапуск fail2ban

Сохраните и закройте файл.

Затем перезапустите сервис fail2ban. Иногда даже лучше остановить его, а затем запустить снова.

sudo service fail2ban stop
sudo service fail2ban start

На загрузку всех правил брандмауэра может потребоваться несколько минут. Иногда правила не добавляются до тех пор, пока не будет заблокирован первый клиент. Через некоторое время вы сможете проверить новые правила:

sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-nginx-http-auth

-N fail2ban-ssh

-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth


-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh

-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
-A fail2ban-nginx-http-auth -j RETURN

-A fail2ban-ssh -j RETURN

Красным выделены строки, созданные политикой fail2ban. Сейчас они просто направляют трафик на новые, почти пустые цепочки, а затем пропускают поток трафика обратно в цепочку INPUT.

Правила блокировки будут добавлены в эти цепочки.

Тестирование политики блокировки

Теперь можно протестировать правила, подключившись с другого сервера, у которого нет учетных данных на сервере fail2ban.

Попробуйте создать SSH-подключение к серверу с помощью несуществующих учетных данных:

ssh blah@fail2ban_server_IP

Введите случайный набор символов в качестве пароля. Повторите несколько раз. В какой-то момент fail2ban запретит доступ и выведет сообщение «Permission denied».

Вернитесь на первый сервер и просмотрите новые правила iptables:

sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-nginx-http-auth
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
-A fail2ban-nginx-http-auth -j RETURN
-A fail2ban-ssh -s 203.0.113.14/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-ssh -j RETURN

Новое правило выделено красным. Оно блокирует трафик от IP-адреса второго сервера к порту SSH. Вскоре вы получите уведомление о блокировке клиента.

Заключение

Теперь вы знакомы с основами fail2ban и можете создать базовую конфигурацию этого инструмента.

Secure Shell можно найти повсюду. С момента выпуска в 1995 году, SSH получил широкое распространение как мощный протокол удаленного доступа для Linux.

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

1. Отключаем root логин.

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

Найдем /etc/ssh/sshd_config (возможно он находиться в другом каталоге, это зависит от дистрибутива). В нем определим место PermitRootLogin и заменим значение на "no":

PermitRootLogin no

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

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

PasswordAuthentication no
ChallengeResponseAuthentication no

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

Europa ~ # emerge -pv denyhosts
These are the packages that would be merged, in order:
Calculating dependencies... done!
app-admin/denyhosts-2.5 0 kB
Total size of downloads: 0 kB
europa ~ # emerge denyhosts

Документации по программе не очень много (если чего - есть, например ), однако все опции конфигурирования нормально описаны в конфигурационном файле.

Europa $ nano -w /etc/denyhosts.conf

Не думаю, что конфигурирование DenyHosts вызовет особые проблемы - достаточно внимательно прочитать конфиг.

После конфигурирования можно запустить программу демоном или через шедулер. В Gentoo демоном:

Rc-update add denyhosts default

Через cron, скажем каждые 10 минут:

Python /usr/bin/denyhosts -c /etc/denyhosts.conf

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

4. Изменяем номер порта.

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

В конфиге стоит поменять.

Несколько правил по защите доступ к ssh серверу.

1. Добавляем в конфигурацию ssh сервера слушать еще один порт, помимо стандартного. (Для простоты запоминания можно использовать 4 повторяющихся цифры для всех своих серверов).

$ sudo vi /etc/ssh/sshd_config Port 22 Port xxxx

2. Ограничиваем обращения на 22 порт только доверенным ip адресам *например 8.8.8.8 (таких правил сделать можно несколько, работа/дом)

$ sudo vi /etc/sysconfig/iptables -A INPUT -s 8.8.8.8 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

3. Не забываем проверить не используется ли у нас ipv6, если используется, то закрываем лишнее

$ sudo vi /etc/sysconfig/ip6tables *filter:INPUT ACCEPT :FORWARD ACCEPT :OUTPUT ACCEPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p ipv6-icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT -A INPUT -j REJECT --reject-with icmp6-adm-prohibited -A FORWARD -j REJECT --reject-with icmp6-adm-prohibited COMMIT

Для того, чтобы использовать ssh только на определенном адресе достаточно в файле конфигурации sshd_config указать парметр ListenAddress (например ListenAddress 74.125.200.100). В таком случае ssh будет доступен только на этом адресе и не будет работать через ipv6

4. Используем файл конфигурация ssh на стороне клиента.

Расположение: ~/.ssh/config

# fix Write failed: broken pipe ServerAliveInterval 120 TCPKeepAlive no # для использования коротких имен Host dev-vps # ip адрес или публичное доменное имя хоста Hostname 127.0.0.3 # Под каким юзером осуществлять вход User developer # Файл ключа для авторизации (если используется) IdentityFile ~/.ssh/id_rsa.dev

И еще один пример использования файла конфигурации:
{<1>}

Host ssh-server-1 Hostname 1.2.3.4 User dev Port 1234 Host ssh-server-2 User root # Hostname 192.168.10.20 # nc without -q0 if RHEL based & with -q0 debian based IdentityFile ~/.ssh/id_rsa.work-pc ProxyCommand ssh -q0 ssh-server-1 nc -q0 192.168.10.20 22

И теперь при подключении на ssh-server-1 мы сразу прыгнем на нужны нам хост. (Удобно использовать например при разных ключах на серверах)

А так-же хипстерский прокси вариант:

{<2>}

Скачиваем клиент ngrok на сервер, который находится за файерволом. Запускаем бинарник и указываем какой порт нам нужно пробросить

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

Установите сложный пароль

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

  • Как минимум 8 символов
  • Используйте верхний и нижний регистр символов (AaBb)
  • Используйте буквы - цифры и знаки (!BasDf345$@)

Сильный пароль не только защитит от взлома по SSH протоколу, но и в целом улучшит защиту сервера.

Используйсте SSH ключи

Дополнительной защитой Вашего сервера будет использование ключа для подключения к серверу по SSH , генерировать ключ нужно на компьютере/сервере с которого будете подключаться:

Как создать SSH ключ на Windows ОС :

Чтобы создать ключ в Linux наберите команду:

Ssh-keygen -t rsa

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

Ssh-copy-id -p 22 [email protected]

  • -p 22 - порт сервера по которому работает SSH протокол (может быть изменён, подробней информация ниже)
  • admin - Логин от Вашего сервера
  • 192.168.1.1 - IP адрес Вашего сервера

Если всё сделали правильно то теперь Вы можете подключаться к серверу по ключу, при этом Вам не придется каждый раз вводить пароль.

Используйте нестандартный порт

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

Для этого откроем конфигурационный файл SSH на сервере:

Sudo nano /etc/ssh/sshd_config

Найдем в нём закомментированную строку такого вида:

# Port 22

Удалим символ # - чтобы убрать опцию комментария и изменим 22 на любые цифры начиная с 11060 и по нарастанию, для примера будем использовать 11 060 , теперь строка должна выглядеть так:

Port 11060

Сохраните конфигурацию "Ctrl +O " и выходите из редактора "Ctrl +X ".

Нужно перезагрузить SSH службу - чтобы принялись новые настройки, выполним команду:

Sudo service sshd restart

Таким образом мы поменяли порт для подключения, с этих пор - чтобы подключиться к серверу нужно указывать нестандартный порт опцией -p 11060 , например:

Ssh -p 11060 [email protected]

Оставить доступ только части пользователей

SSH подключение можно лимитировать для отдельных учетных записей, например если на сервере имеется три учетных записи: admin , sergey , alex - у Вас есть возможность разрешить удаленное подключение только для некоторых из них. Для этого откройте конфигурационный файл SSH :

В этом файле спуститесь стрелочками до последней строки и добавьте новую с таким содержанием:

AllowUsers admin alex

Сохраните конфигурацию "Ctrl +O " и выходите из редактора "Ctrl +X ".

Перезагрузите службу SSH :

Sudo service sshd restart

Этим самым Вы разрешили удалённый доступ для пользователей admin и alex , в то время как пользователь sergey удаленно подключиться уже не сможет.

Включите SSH protocol 2

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

Sudo nano /etc/ssh/ssh_config

Найдите строку:

# Protocol 2

Удалите символ # - чтобы убрать опцию комментария и задействовать эту строку, дожно получиться так:

Protocol 2

Сохраните конфигурацию "Ctrl +O " и выходите из редактора "Ctrl +X ".

Перезагрузите службу SSH :

Sudo service sshd restart

Отключить пустые пароли

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

Sudo nano /etc/ssh/ssh_config

Найдите строку PermitEmptyPasswords и убедитесь что стоит значение "no ".

PermitEmptyPasswords no

Включите подробный журнал

Чтобы служба SSH вела журнал неудачных подключений с указанием IP - адресов, откройте конфигурационный файл SSH :

Sudo nano /etc/ssh/ssh_config

Найдите строку LogLevel и вместо INFO укажите VERBOSE , строка должна получится так:

LogLevel VERBOSE

Сохраните файл "Ctrl +O " и выйдите из редактора "Ctrl +X ".

Перезагрузите службу SSH :

Sudo service sshd restart

Можно проверить, вводим команду:

Cat /var/log/secure

Система выведит нам информацию, примерно такую:

Jun 21 13:06:28 centos sshd: Failed password for root from 118.212.143.47 port 48263 ssh2

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

Спасибо за внимание, на этом всё.

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

Основные приёмы

Все действия производятся в конфигурационном файле sshd демона -- /etc/ssh/sshd_config . Ниже приведу часть своего конфигурационного файла с комментариями.

### Network ### # Используем нестандартный порт (>1024) port 5679 # Используем только IPv4 соединения # inet = IPv4, inet6 = IPv6, any = both AddressFamily inet # Можно принимать соединения только с определённых IP-адресов #ListenAddress 0.0.0.0 # Используем вторую версию протокола, т.к. первая подвержена # известным уязвимостям Protocol 2 # Отключаем перенаправление графики (X-сервер) до тех пор # пока она явно не понадобится вам X11Forwarding no # Отключаем Disable TCPKeepAlive и используем ClientAliveInterval вместо этого, # чтобы предотвратить атаки типа TCP Spoofing TCPKeepAlive no # Выкидваем пользователя через 10min (600 sec) неактивности ClientAliveInterval 600 ClientAliveCountMax 3 ### Key configuration files ### # HostKeys для протокола версии 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key # Используем непривилегированный процесс для # обработки входящего от клиента трафика # sandbox - openSSH >= 5.9 ("yes" - для младших версий) UsePrivilegeSeparation sandbox # При изменении этих значений, требует удалить старый ключ # /etc/ssh/ssh_host_rsa_key{,.pub}, и создать новый # путём перезапуска sshd. # # Время жизни ключа, т.е. через какое время будет сгененрирован новый ключ # в случае, если предыдущий был использован. KeyRegenerationInterval 1h # сила ключа ServerKeyBits 2048 # Разрешаем авторизацию по публичному ключу PubkeyAuthentication yes # Место хранения доверенных ключей в каталоге пользователя AuthorizedKeysFile .ssh/authorized_keys ### Logging ### # Префикс для syslog SyslogFacility AUTH # уровень подробности сообщений для самого sshd LogLevel INFO ### Authentication ### # список разрешённых пользователей AllowUsers ivan # ограничиваем время для ввода пароля для ssh-ключа LoginGraceTime 30s # запрещаем удалённо входить под учётной записью root PermitRootLogin no # Включаем явную проверку прав файлов и директорий с ssh-ключами StrictModes yes # Сколько раз переспрашивать пароль при неверном вводе MaxAuthTries 3 # Запрещаем вход по пустому паролю PermitEmptyPasswords no # Запрещаем вход по паролю в принципе # (Используем публичный/приватный ключ вместо этого) PasswordAuthentication no # Отключаем использование "challenge-responce" авторизацию, # т.к. она бесполезна при использовании ключей ChallengeResponseAuthentication no # Так как мы не используем пароль, то и {PAM, login(1)} нам не нужены UsePAM no UseLogin no # Позволяем клиенту передавать лишь определённый набор переменных окружения # RH BZ#CVE-2014-2532 # ShellShock exploit AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL

Это те параметры, что настраиваются в конфигурационном файле sshd. После изменения настроек требуется перезапустить сервис sshd.

Комментарии

  • При использовании авторизации по ключу, ключ требуется предварительно сгенерировать на клиентской машине и скопировать публичный ключ на сервер. Пример:
client $ ssh-keygen client $ cat ~/.ssh/id_rsa.pub | ssh -p 5679 [email protected] "cat >> ~/.ssh/authorized_keys"
  • В файле /var/log/auth.log будут находиться сообщения от sshd . В случае, если этот файл отсутствует, вам требуется настроить вашу систему логирования. пример для syslog и syslon-ng . Я использую syslog-ng , и мне потребовалось добавить следующие строки в файл /etc/syslog-ng/syslog-ng.conf:
destination authlog { file("/var/log/auth.log"); }; log { source(src); destination(authlog); };

и перезапустить сервис syslog-ng .

  • При использовании нестандартного порта может потребоваться настроить ваш firewall (iptables, firewalld, etc).
    Пример настройки для iptables:
root# iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED --dport 5679 -j ACCEPT root# service iptables save root# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED tcp dpt:5679 ...

Если этого мало

Это лишь базовые настройки. Дополнительно можно настроить

  • firewall (iptables)