Двухфакторная аутентификация для сервера

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

· 5 мин.
Двухфакторная аутентификация для сервера

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

Отказ от ответственности

Если что-то сделать неправильно, то вы потеряете доступ к серверу. Поэтому все операции вы делаете на свой страх и риск.

Установка нужных компонентов

На этом этапе мы установим и настроим PAM Google.

PAM – Pluggable Authentication Module, – это инфраструктура аутентификации, используемая в системах Linux для аутентификации пользователя.

Поскольку Google создал приложение OATH-TOTP, они также создали PAM, который генерирует TOTP и совместим с любым приложением OATH-TOTP, таким как Google Authenticator или Authy.

Во-первых, нам нужно добавить репозиторий EPEL (Extra Packages for Enterprise Linux).

sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

Затем установите PAM.

sudo yum install google-authenticator

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

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

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

Для этого используйте команду:

timedatectl

System clock synchronized: yes
              NTP service: active

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

Установка Google’s PAM

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

google-authenticator

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

Do you want authentication tokens to be time-based (y/n) y

Этот PAM позволяет использовать токены с временной или последовательной привязкой.

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

Мы будем придерживаться времени, потому что это то, что ожидают такие приложения, как Google Authenticator.

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

Коды восстановления - единственный способ восстановить доступ, если вы, например, потеряете доступ к своему приложению TOTP.

Остальные вопросы сообщают PAM, как работать. Мы рассмотрим их один за другим.

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

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

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) y

Отвечая здесь «да», вы предотвращаете повторную атаку, так как срок действия каждого кода истекает сразу после использования. Это не позволяет злоумышленнику перехватить код, который вы только что использовали, и войти в систему с его помощью.

By default, tokens are good for 30 seconds. 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 +-1min (window size of 3) to about +-4min (window size of 17 acceptable tokens).
Do you want to do so? (y/n) n

Ответ «да» позволяет ввести до 8 действительных кодов в перемещающемся четырехминутном окне. Отвечая «нет», вы ограничиваете его 3 действительными кодами в скользящем окне 1:30 минут. Если вы не обнаружите проблем с окном 1:30, ответ «нет» будет более безопасным выбором.

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) y

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

После завершения этой настройки, если вы хотите создать резервную копию секретного ключа, вы можете скопировать файл ~ .google-Authenticator в надежное место. Оттуда вы можете развернуть его в дополнительных системах или повторно развернуть после резервного копирования.

Теперь, когда PAM Google установлен и настроен, следующим шагом будет настройка SSH для использования вашего ключа TOTP. Нам нужно сообщить SSH о PAM, а затем настроить SSH для его использования.

Настройка OpenSSH

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

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

Для начала отредактируем файл конфигурации sshd. Мы используем nano, который по умолчанию не установлен в CentOS. Вы можете установить его с помощью sudo yum install nano или использовать свой любимый альтернативный текстовый редактор.

sudo nano /etc/pam.d/sshd

Добавьте следующую строку в конец файла.

// ... ... ... ... ...

auth required pam_google_authenticator.so nullok

Слово nullok в конце последней строки сообщает PAM, что этот метод аутентификации является необязательным. Это позволяет пользователям без токена OATH-TOTP по-прежнему входить в систему, используя свой SSH-ключ.

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

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

Затем мы настроим SSH для поддержки такого типа аутентификации. Откройте файл конфигурации SSH для редактирования.

sudo nano /etc/ssh/sshd_config

Ищите строки ChallengeResponseAuthentication. Закомментируйте строку “no” и раскомментируйте строку “yes”.

// ... ... ... ... ...

# Change to no to disable s/key passwords
ChallengeResponseAuthentication yes
#ChallengeResponseAuthentication no

// ... ... ... ... ...

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

sudo systemctl restart sshd.service

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

Настроить SSH для работы с MFA

Снова откройте файл конфигурации sshd.

sudo nano /etc/ssh/sshd_config

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

// ... ... ... ... ...

AuthenticationMethods publickey,password publickey,keyboard-interactive

// ... ... ... ... ...

Так как я обычно полностью отключаю аутентификацию по паролю, то можно убрать этот пункт.

// ... ... ... ... ...

AuthenticationMethods publickey,keyboard-interactive

// ... ... ... ... ...

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

Затем снова откройте файл конфигурации PAM sshd.

sudo nano /etc/pam.d/sshd

Найдите строку auth substack password-auth в верхней части файла. Закомментируйте это, добавив символ в качестве первого символа в строке. Это говорит PAM не запрашивать пароль.

Сохраните и закройте файл, затем перезапустите SSH.

sudo systemctl restart sshd.service

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

Несмотря на то, что вы не видите никаких указаний на то, что ваш SSH-ключ был использован, ваша попытка входа использовала два фактора. Если вы хотите проверить, вы можете добавить -v (для подробностей) после команды SSH.

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

Трехфакторная аутентификация (Опционально)

Для самых жоских администраторов, повернутых на безопасности 😄

Несмотря на то, что мы перечислили три различных фактора, из выбранных нами вариантов они допускают только ключ SSH и код подтверждения. Если вы хотите использовать все три фактора (ключ SSH, пароль и код подтверждения), одно быстрое изменение активирует все три.

Откройте файл конфигурации PAM sshd.

sudo nano /etc/pam.d/sshd

Найдите строку, которую вы закомментировали ранее, auth substack password-auth и раскомментируйте строку, удалив символ. Сохраните и закройте файл. Теперь еще раз перезапустите SSH.

sudo systemctl restart sshd.service

Включив опцию auth substack password-auth, PAM теперь будет запрашивать пароль в дополнение к проверке ключа SSH и запросу кода подтверждения, с которым мы работали ранее. Теперь мы можем использовать то, что мы знаем (пароль), и два разных типа вещей, которые у нас есть (ключ SSH и код подтверждения) по двум разным каналам.

Рекомендуемые Статьи

Создаем блог на Ghost
· 11 мин.
Реализация JWT в Spring Boot
· 10 мин.
Что такое JWT токен?
· 9 мин.