Защита сервера Ubuntu OpenSSH от атак грубой силы, но без брандмауэра или пары ключей SSH? [duplicate]

Я использую Ubuntu 16.04 и хочу усилить аутентификацию SSH специальным образом.

Текущая ситуация:

У меня есть машина с минимальным Ubuntu сервером, который я использую в основном для передачи файлов через локальный OpenSSH сервер. Теперь, у меня нет брандмауэра на этой машине по нескольким причинам, и я также избегаю использования пары ключей, поэтому я использую только пароль. Один из единственных способов защиты от атак грубой силы, который мне сейчас больше всего нужен, это использование механизма, который блокирует пользователя на X часов после Y попыток подключения.

Желаемая ситуация:

Я хочу иметь отдельный механизм (то есть не часть брандмауэра), который блокирует пользователя на X часов, после Y попыток соединения, как способ защиты от атак грубой силы.

Мой вопрос:

Знаете ли вы утилиту (и конкретную конфигурацию), которая позволит мне достичь желаемой ситуации?

1
задан 12 April 2017 в 15:38

3 ответа

Вы можете сделать это с помощью Fail2ban:

sudo apt-get install fail2ban

Затем:

sudo vim /etc/fail2ban/jail.conf

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

edit maxretry , чтобы установить максимальное количество неудачных попыток

, как упоминалось в других комментариях, fail2ban требует iptables.


Отдельная опция - блокировка порта:

Это требует только iptables, практически 0 памяти и эффективно скроет вашу службу от сканирование портов

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

быстрый поиск в Google показывает следующее: https://www.digitalocean.com/community/tutorials/how-to-configure-port-knocking-using-only-iptables-on-an-ubuntu-vps

Однако вам нужны iptables.

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

4
ответ дан 3 December 2019 в 06:18

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

1. Предварительное правило:

В начале вашего набора правил разрешите любой связанный трафик возвращаться на сервер:

sudo iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

2. Правила обнаружения и блокировки:

Установите динамический список Badguy. Обнаружение и удаление плохих IP-адресов, которые атакуют паролем SSH. Как только они попадают в список BADGUY, система отбрасывает все их пакеты:

sudo iptables -A INPUT -i eth0 -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
sudo iptables -A INPUT -i eth0 -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP
sudo iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT
  • В приведенном выше коде время блокировки составляет 90000 секунд (25 часов).

  • Любая попытка с заблокированного IP-адреса, даже не связанная с SSH ( в зависимости от других правил, которые у вас могут быть или нет, и порядка) сбрасывает таймер времени блока.

3. Усиление обнаружения:

Ограничьте количество неверных паролей на соединение до 2. По умолчанию 6.

Как sudo edit / etc / ssh / sshd_config , и там установите:

    MaxAuthTries 2
4
ответ дан 3 December 2019 в 06:18

Этот ответ дает возможность ответить на главный вопрос: Защитить сервер Ubuntu OpenSSH от атак грубой силы, но без брандмауэра или пары ключей SSH?

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

Защита SSH с помощью двухфакторной аутентификации

Двухфакторная аутентификация (2FA) - это тип ] многофакторная аутентификация . В этом примере 2FA подтверждает заявленную личность пользователя с помощью комбинации этих двух различных компонентов:

  • Шестизначный токен-код на основе времени - код аутентификации. По умолчанию эти токены действительны в течение 30 секунд плюс дополнительно добавленные 60 секунд, чтобы компенсировать возможный временной сдвиг.

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

Фактически, когда вы установили PermitRootLogin no , и имена пользователей выбраны правильно, для меня этот метод можно назвать 3FA.

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

Начнем:

1. Установите зависимости

sudo apt-get install libpam-google-authenticator

2. Отредактируйте файлы конфигурации

  • Отредактируйте /etc/pam.d/sshd и добавьте эту директиву:

     # Google Authenticator
    требуется авторизация pam_google_authenticator.so
     

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

  • Отредактируйте / etc / ssh / sshd_config и измените или добавьте эти директивы:

     ChallengeResponseAuthentication yes
    UsePAM да
    PasswordAuthentication no # Вы можете оставить это «да», это не имеет значения.
     

3. Активируйте двухфакторную аутентификацию для пользователя

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

$ google-authenticator Enter

Do you want authentication tokens to be time-based (y/n) yEnter
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/user@host%3Fsecret%3DE3CY3TNSNBXXXXXX


Your new secret key is: E3CY3TNSNBXXXXXX
Your verification code is 229999
Your emergency scratch codes are:
  19999711
  ...

Do you want me to update your "/home/user/.google_authenticator" file (y/n) yEnter

Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks 
(y/n) yEnter

By default, tokens are good for 30 seconds and in order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of 1:30min to about 4min. Do you want to do so 
(y/n) yEnter

If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s. Do you want to enable rate-limiting 
(y/n) yEnter

В этом диалоговом окне будет создан файл аутентификации с именем .google_authenticator размещен в домашнем каталоге пользователя. Этот файл можно использовать также для учетных записей других пользователей, если вы хотите, чтобы все они использовали одни и те же токены. Далее этот файл можно настроить, а также использовать для 2FA в Apache2 , но это уже другая история.

4. Сгенерировать коды аутентификации

Секретный ключ - E3CY3TNSNBXXXXXX - сгенерированный на предыдущем шаге, используется для генерации кодов аутентификации в некоторых приложениях как:

5. Пример использования

В этом примере используется расширение Authenticator для Chromium / Chrome:

enter image description here

6. Дополнительная литература


РЕДАКТИРОВАТЬ:

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

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

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

6
ответ дан 3 December 2019 в 06:18

Другие вопросы по тегам:

Похожие вопросы: