🖧 8 способов предотвратить атаки брутфорс на SSH на Linux (CentOS / RHEL)

Мануал

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

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

В этой статье я расскажу о различных способах предотвращения атак брута на SSH на платформе Linux.

Эта статья была написана с использованием CentOS 7, поэтому можно с уверенностью сказать, что она также полностью охватывает RHEL 7, Fedora, Oracle Enterprise Linux и вообще все семейство операционных систем Red Hat и, возможно, Novell SLES и OpenSUSE.

Предотвращение брутфорс атак на SSH

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

Я постараюсь рассказать о некоторых из них в этой статье.

1. Блокировка учетной записи после X неудачных попыток входа

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

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

1.1 Блокировка аккаунта используя pam_tally2

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

pam_tally2 – это (необязательное) приложение, которое можно использовать для опроса и манипулирования файлом счетчика.

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

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

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

/etc/pam.d/system-auth
/etc/pam.d/password-auth
Добавьте следующую строку в ваши /etc/pam.d/system-auth и /etc/pam.d/password-auth
Если вы хотите исключить блокировку пользователя root после неудачных попыток входа в систему, удалите even_deny_root из выделенного раздела.
auth        required      pam_tally2.so deny=3 even_deny_root unlock_time=600 onerr=fail
account     required      pam_tally2.so
Пример файла system-auth и password-auth с данными изменениями
auth        required      pam_env.so
auth        required      pam_tally2.so deny=3 even_deny_root unlock_time=600 onerr=fail
auth        required      pam_faildelay.so delay=2000000
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_tally2.so
account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
Синтаксис должен быть добавлен в указанном порядке с onerr = fail в конце, иначе изменения не будут работать.
Далее вы можете попробовать выполнить вход по SSH на этом хосте.
Как говорит rsyslog, пользователь ‘deepak’ был заблокирован
# journalctl -f
Aug 31 15:49:31 rhel-7.example unix_chkpwd[25921]: password check failed for user (deepak)
Aug 31 15:49:31 rhel-7.example sshd[25919]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.0.2.2  user=deepak
Aug 31 15:49:34 rhel-7.example sshd[25919]: Failed password for deepak from 10.0.2.2 port 61020 ssh2
Aug 31 15:49:34 rhel-7.example unix_chkpwd[25922]: password check failed for user (deepak)
Aug 31 15:49:37 rhel-7.example sshd[25919]: Failed password for deepak from 10.0.2.2 port 61020 ssh2
Aug 31 15:49:38 rhel-7.example unix_chkpwd[25923]: password check failed for user (deepak)
Aug 31 15:49:39 rhel-7.example sshd[25919]: Failed password for deepak from 10.0.2.2 port 61020 ssh2
Aug 31 15:49:41 rhel-7.example sshd[25919]: pam_tally2(sshd:auth): user deepak (1000) tally 4, deny 3

1.2 Блокировка аккаунта используя pam_faillock

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

Этот модуль также использует те же файлы pam.d для блокировки учетной записи.

/etc/pam.d/system-auth
/etc/pam.d/password-auth

Добавьте следующую строку в ваши /etc/pam.d/system-auth и /etc/pam.d/password-auth

auth        required      pam_faillock.so preauth silent deny=3 even_deny_root fail_interval=900 unlock_time=600
auth        required      pam_faillock.so authfail deny=3 even_deny_root fail_interval=900 unlock_time=600

account     required      pam_faillock.so

Пример файла system-auth и password-auth с нашими изменениями:

auth        required      pam_env.so
auth        required      pam_faillock.so preauth silent audit deny=3 unlock_time=600
auth        sufficient    pam_unix.so nullok try_first_pass
auth        required      pam_faillock.so authfail audit deny=3 fail_interval=900 unlock_time=600
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_faillock.so
account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     optional      pam_oddjob_mkhomedir.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

2. Убедитесь, что система использует сильное хеширование

Убедитесь, что ваша система уже использует хеширование SHA-256 или SHA-512, что усилит хеши в нашем файле /etc/shadow и предотвратит атаки SSH методом брута.

Проверьте существующий алгоритм хеширования

# authconfig --test | grep algo
 password hashing algorithm is sha512

Чтобы проверить поддерживаемые алгоритмы хеширования

# authconfig --help | grep passalgo
  --passalgo=<descrypt|bigcrypt|md5|sha256|sha512>

Чтобы изменить текущий алгоритм хеширования

# authconfig --passalgo=sha512 --update

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

# for u in $(awk -F: '{if ( $1 != "root" && $2 ~ /^!?[[:alnum:]./$]/ ) print $1}' /etc/shadow); do chage -d0 $u; done

3. Разрешить или запретить вход по SSH с помощью hosts.allow и hosts.deny

tcpwrappers настраиваются через файлы /etc/hosts.allow и /etc/hosts.deny.

Чтобы полностью запретить доступ к демону SSH, добавьте следующий текст в /etc/hosts.deny:

sshd: ALL

Система полностью отключит доступ к демону SSH с любого клиента.

Если есть несколько хостов, которым нужно разрешить подключение, добавьте следующие строки в /etc/hosts.allow:

sshd: 192.168.0.1, trusted.one-domain.com, 192.168.23.0/24, *.trusted.net
Это позволит подключаться с IP-адреса 192.168.0.1, хоста trust.one-domain.com, сети 192.168.23.0/24 и домена * .trusted.net при запрещении любых других подключений.

4. Применение SSH Rate Control, используя IPtables

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

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

Все логи этого правила появятся в файле /var/log/messages, префикс «SSH-HIT-RATE» используется для облегчения поиска связанных записей.

[root@rhel-7 ~]# iptables -A INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
[root@rhel-7 ~]# iptables -A INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j LOG --log-prefix 'SSH-HIT-RATE: '
[root@rhel-7 ~]# iptables -A INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j DROP
Последнее правило – ACCEPT для SSH на порту 22.
Это правило по умолчанию существует в системе.
[root@rhel-7 ~]# iptables -A INPUT  -p tcp --dport 22 -m state --state NEW -j ACCEPT

Проверьте внедренные правила iptables

[root@rhel-7 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
           tcp  --  anywhere             anywhere             tcp dpt:ssh state NEW recent: SET name: SSH side: source mask: 255.255.255.255
LOG        tcp  --  anywhere             anywhere             tcp dpt:ssh state NEW recent: UPDATE seconds: 60 hit_count: 5 TTL-Match name: SSH side: source mask: 255.255.255.255 LOG level warning prefix "SSH-HIT-RATE: "
DROP       tcp  --  anywhere             anywhere             tcp dpt:ssh state NEW recent: UPDATE seconds: 60 hit_count: 5 TTL-Match name: SSH side: source mask: 255.255.255.255
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh state NEW

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Проверьте, работают ли правила iptables

Aug 31 17:42:07 rhel-7.example systemd[1]: Started Session 37 of user root.
Aug 31 17:43:59 rhel-7.example systemd[1]: Started Session 38 of user root.
Aug 31 17:44:04 rhel-7.example systemd[1]: Started Session 39 of user root.
Aug 31 17:44:08 rhel-7.example systemd[1]: Started Session 40 of user root.
Aug 31 17:44:10 rhel-7.example systemd[1]: Started Session 41 of user root.
После 5 успешных сеансов за одну минуту шестой сеанс был заблокирован нашим правилом IPtables.
Aug 31 17:44:11 rhel-7.example kernel: SSH-HIT-RATE: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=10.0.2.11 DST=10.0.2.11 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=52655 DF PROTO=TCP SPT=58974 DPT=22 WINDOW=43690 RES=0x00 SYN URGP=0

5. Использование /etc/ssh/sshd_config

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

Для этого вам нужно изменить строку, которая гласит:

#PermitRootLogin yes

на

PermitRootLogin no

Кроме того, вы можете настроить ssh-ключи для пользователя root и использовать

PermitRootLogin without-password
Рекомендуется использовать PasswordAuthentication no в sshd_config, чтобы убедиться, что ввод пароля всегда проходит через PAM.
Но перед внесением этого изменения убедитесь, что вы включили аутентификацию на основе ключей для подключения к вашему хосту.

6. Изменение порта SSHD

По умолчанию все мы знаем, что SSHD использует порт 22, поэтому любому злоумышленнику очень просто попытаться подключиться к вашей Linux-системе, что увеличит вероятность SSH-атак методом перебора.
Таким образом, для повышения безопасности и предотвращения перебора паролей SSH вы можете изменить номер порта SSH на любое случайное число в диапазоне от 1025 до 65535, поскольку злоумышленники предположят, что порт 22 будет использоваться для протокола ssh.
Найдите эту строку в /etc/sshd/sshd_config:
#Port 22

Измените это на что-то вроде этого:

Port 1101
Номер порта 1101 является примером.
Теперь вам нужно получить доступ к этому серверу через порт 1101 при подключении по ssh:
# ssh someuser@ssh-server:1101

7. Использование Fail2Ban

Fail2ban сканирует файлы логов и блокирует IP-адреса, которые показывают вредоносные признаки – слишком много сбоев паролей, поиск эксплойтов и т. д.

Обычно Fail2Ban затем используется для обновления правил брандмауэра, чтобы отклонять IP-адреса в течение указанного периода времени, хотя другие полезные действия (например, отправка электронного письма) также могут быть настроены в вашей системе.

🔒 Как установить Fail2Ban для защиты SSH на CentOS / RHEL 8

♟ Как установить Fail2Ban на CentOS 7

Как включить белый список в Fail2ban в Debian Linux

Fail2ban установка и настройка. Дефолтные настройки

8. Двухфакторная аутентификация с использованием Google Authenticator

Вы можете использовать Google Authenticator с открытым исходным кодом, чтобы включить двухфакторную аутентификацию с помощью модуля pam_google_authenticator.so.

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

Ниже приведен фрагмент такой двухфакторной аутентификации.

login as: root
Using keyboard-interactive authentication.
Verification code:      <--- Provide the OTP from your Google Authenticator App
Using keyboard-interactive authentication.
Password:               <-- provide the password of user "root"

Last login: Sat Mar 28 16:09:48 2020 from 10.0.2.2
[root@centos-8 ~]#

 

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