Атака брутфорса состоит в том, что злоумышленник вводит множество паролей или парольных фраз с надеждой на правильное угадывание.
Атакующий систематически проверяет все возможные пароли и парольные фразы, пока не будет найден правильный.
В этой статье я расскажу о различных способах предотвращения атак брута на SSH на платформе Linux.
Эта статья была написана с использованием CentOS 7, поэтому можно с уверенностью сказать, что она также полностью охватывает RHEL 7, Fedora, Oracle Enterprise Linux и вообще все семейство операционных систем Red Hat и, возможно, Novell SLES и OpenSUSE.
- Предотвращение брутфорс атак на SSH
- 1. Блокировка учетной записи после X неудачных попыток входа
- 1.1 Блокировка аккаунта используя pam_tally2
- 1.2 Блокировка аккаунта используя pam_faillock
- 2. Убедитесь, что система использует сильное хеширование
- 3. Разрешить или запретить вход по SSH с помощью hosts.allow и hosts.deny
- 4. Применение SSH Rate Control, используя IPtables
- 5. Использование /etc/ssh/sshd_config
- 6. Изменение порта SSHD
- 7. Использование Fail2Ban
- 8. Двухфакторная аутентификация с использованием Google Authenticator
Предотвращение брутфорс атак на 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
Если вы хотите исключить блокировку пользователя root после неудачных попыток входа в систему, удалите even_deny_root из выделенного раздела.
auth required pam_tally2.so deny=3 even_deny_root unlock_time=600 onerr=fail account required pam_tally2.so
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
# 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
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
[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.
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
6. Изменение порта SSHD
#Port 22
Измените это на что-то вроде этого:
Port 1101
# 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 ~]#