Настраиваем ssh сервер

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

  • Сервер в локальной сети — доступ из интернета невозможен.
  • Используем преимущество локальной сети / статического ip для сервера находящегося в интернете.
  • Конфигурация для сценария, когда к серверу можно подключиться только из интернета.
  • Защита от брутфорса с fail2ban

Настройка #

Сервер в локальной сети #

sudoedit /etc/ssh/sshd_config
# MAIN
Port 22
ListenAddress 192.168.0.1
Protocol 2

SyslogFacility AUTH
LogLevel INFO

PrintMotd no
PrintLastLog no

Subsystem sftp /usr/lib/openssh/sftp-server

# SECURITY
UsePrivilegeSeparation yes
StrictModes yes

PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication yes

Настройки почищены от мусора, экзотики и директив первого протокола. Самый яркий и интересный ход — оставить сервер только в локальной сети. Так выглядит конфиг Добросервера.

Локальная сеть / Статический IP + Интернет #

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

Боты вынуждены будут подбирать здоровенную ключевую фразу и ник пользователя. При этом вы всё ещё сможете подключиться к серверу из локальной сети используя пароль и root.

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

Вносим необходимые изменения:

# MAIN
Port 22
Protocol 2

SyslogFacility AUTH
LogLevel INFO

PrintMotd no
PrintLastLog no

Subsystem sftp /usr/lib/openssh/sftp-server

# SECURITY
UsePrivilegeSeparation yes
StrictModes yes

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes

Match Address 192.168.0.*
PermitRootLogin yes
PasswordAuthentication yes

Внимание, директива Match включает в себя всё что идёт за ней — до конца файла или следующей Match. А из этого следует что добавлять эти директивы нужно в конец файла настроек.

Сервер в интернете #

Самый печальный сценарий, сервер находится в интернете, у вас нет статического адреса, который можно задать в Match. Несомненно придётся отключить логин через root, а вот авторизацию по паролю лучше оставить. Иначе потеряв ключ вы лишитесь доступа к серверу.

# MAIN
Port 22
Protocol 2

SyslogFacility AUTH
LogLevel INFO

PrintMotd no
PrintLastLog no

Subsystem sftp /usr/lib/openssh/sftp-server

# SECURITY
UsePrivilegeSeparation yes
StrictModes yes

PermitRootLogin no
PasswordAuthentication yes
PubkeyAuthentication yes

Применение настроек #

sudo /etc/init.d/ssh restart

Дополнительно вам необходимо прочитать:

man sshd_config

Как минимум, чтобы разобраться в текущих опциях.

Защита от брутфорса с fail2ban #

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

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

Лог в котором можно посмотреть их попытки:

sudo cat /var/log/auth.log | grep fail

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

sudo aptitude install fail2ban

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

Эти настройки оптимальны, но возможно вам захочется слегка поменять их и включить слежку за ssh явно.

Настройки хранятся в jail.conf, но напрямую его менять нельзя (чтобы конфиг не затёрся при обновлении) создайте jail.local:

sudo vim /etc/fail2ban/jail.local
[ssh]

enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 3
sudo service fail2ban restart

Добавить комментарий