Как настроить многофакторную аутентификацию для SSH в Linux

В этой статье рассмотрим, что такое многофакторная аутентификация, ее важность и, наконец, как настроить многофакторную аутентификацию для SSH в Linux с помощью приложения Google Authenticator.

Безопасность - это серьезный вопрос. Количество взломов значительно растет с каждым днем, и, по оценкам, к 2025 году киберпреступность нанесет компаниям ущерб в размере 10,5 триллионов долларов США.

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

SSH, что означает Secure Shell, - это сетевой протокол, который позволяет пользователям подключаться к удаленным машинам (серверам) и получать доступ к ресурсам.

Протокол ssh реализует два типа безопасности, а именно аутентификацию на основе пароля и аутентификацию на основе ключа.

Аутентификация на основе ключа (открытый → закрытый) считается более безопасной по сравнению с аутентификацией на основе пароля, и большинство руководств по усилению SSH рекомендуют отключить аутентификацию на основе пароля и включить только аутентификацию на основе ключа.

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

Многофакторная аутентификация (сокращенно MFA) - это безопасный процесс аутентификации, который требует использования более одной техники аутентификации, выбираемых из независимых категорий идентификационных данных.

Многофакторную аутентификацию также иногда называют «двухфакторной аутентификацией (2FA)».

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

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

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

  • Приложение, установленное на мобильном устройстве, которое генерирует токены.
  • Внешнее устройство, например Yubikey.
  • Отпечаток пальца.
  • Распознавание лица.
  • OTP-пароль на основе текстового сообщения или звонка.

Для включения многофакторной аутентификации для ssh мы будем использовать приложение «Google Authenticator», которое использует протокол OATH-TOTP. Существуют и другие альтернативные инструменты, такие как Twilio Authy или FreeOTP, которые вы можете установить и опробовать.

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

Для начала установите приложение Google Authenticator на свои устройства Android или IOS через playstore/Itunes.

Теперь установите приложение Google Authenticator в Linux.

В зависимости от дистрибутива выполните следующие команды установки.

В Ubuntu и его производных дистрибутивах выполните следующую команду.

$ sudo apt install libpam-google-authenticator

В дистрибутивах на базе RHEL выполните следующую команду.

$ sudo dnf install google-authenticator -y

Для дистрибутивов на базе Arch выполните следующую команду.

$ sudo pacman -S libpam-google-authenticator

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

$ google-authenticator

Существует определенная последовательность шагов, при выполнении которых вам будет предложено выбрать вариант (y/n).

ШАГ 1 - Вам будет предложено выбрать токены аутентификации на основе времени. Токены аутентификации по времени будут генерировать новый код каждые 30 секунд. Нажмите «y», чтобы продолжить.

ШАГ 2 - Секретный токен будет сгенерирован вместе с QR-кодом. Откройте мобильное приложение Google Authenticator и отсканируйте QR-код или введите секретный ключ вручную, чтобы зарегистрировать устройство. После этого приложение начнет генерировать токены каждые 30 секунд.

ШАГ 3 - На этом этапе вам будет предложено обновить файл .google_authenticator в домашнем каталоге. В этом файле сохраняются все секретные ключи, код проверки, аварийные коды. Нажмите «y», чтобы продолжить.

ШАГ 4 - При выборе «y» на этом шаге срок действия токена истечет сразу после того, как вы использовали его для аутентификации. В этом случае, даже если хакеры получат ваш токен, он будет просрочен.

ШАГ 5 - Этот шаг определяет, сколько токенов будет разрешено, а также временные рамки. Если выбрать «n», то будет разрешено 3 токена в течение 90 секунд. Если выбрать «y», то будет разрешено 17 токенов в течение 240 секунд.

ШАГ 6 - На этом шаге вам будет предложено включить ограничение частоты. Ограничение частоты позволяет злоумышленнику предпринимать только 3 попытки входа в систему каждые 30 секунд. Если токены неверны, то ему придется ждать временной интервал N, чтобы повторить попытку.

Мы завершили первый шаг. Откройте файл ~/.google_authenticator и вы увидите все настройки и секретные коды, которые мы сделали в ходе всех этих шагов.

$ cat ~/.google_authenticator

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

$ google-authenticator -q -t -d -f -r 3 -R 30 -w 3

Обратитесь к разделу помощи аутентификатора Google, чтобы узнать, что эти аргументы означают.

$ google-authenticator --help
google-authenticator [<options>]
 -h, --help                     Print this message
 -c, --counter-based            Set up counter-based (HOTP) verification
 -t, --time-based               Set up time-based (TOTP) verification
 -d, --disallow-reuse           Disallow reuse of previously used TOTP tokens
 -D, --allow-reuse              Allow reuse of previously used TOTP tokens
 -f, --force                    Write file without first confirming with user
 -l, --label=<label>            Override the default label in "otpauth://" URL
 -i, --issuer=<issuer>          Override the default issuer in "otpauth://" URL
 -q, --quiet                    Quiet mode
 -Q, --qr-mode={NONE,ANSI,UTF8} QRCode output mode
 -r, --rate-limit=N             Limit logins to N per every M seconds
 -R, --rate-time=M              Limit logins to N per every M seconds
 -u, --no-rate-limit            Disable rate-limiting
 -s, --secret=<file>            Specify a non-standard file location
 -S, --step-size=S              Set interval between token refreshes
 -w, --window-size=W            Set window of concurrently valid codes
 -W, --minimal-window           Disable window of concurrently valid codes
 -e, --emergency-codes=N        Number of emergency codes to generate

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

Примечание:

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

Выполните следующие команды для резервного копирования файлов конфигурации SSH.

$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
$ sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.backup

Для начала разрешите SSH использовать MFA, установив в файле /etc/ssh/sshd_config опцию ChallengeResponseAuthentication в значение «yes».

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication yes

Затем отредактируйте файл /etc/pam.d/sshd:

$ sudo vi /etc/pam.d/sshd

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

auth required pam_google_authenticator.so nullok ## делает этот метод необязательным
auth required pam_permit.so ## разрешить пользователю войти в систему, если не используется MFA

Если вы хотите сделать MFA обязательным для всех пользователей, удалите слово «nullok».

Перезапустите службу ssh, чтобы изменения вступили в силу.

$ sudo systemctl restart sshd

Пришло время проверить, насколько эффективны внесенные нами изменения.

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

$ ssh username@hostname/IPaddress

После ввода пароля SSH и проверочного кода вы сможете войти в систему.

Что будет, если не включить MFA как обязательный для всех пользователей? Давайте проверим это и посмотрим, удастся ли подключиться под другим пользователем, у которого нет сгенерированных и настроенных токенов.

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

Видите? Можно войти в систему и без проверочного кода, если не озаботиться об включении MFA для всех пользователей.

Если вы настроили аутентификацию на основе ключей, то вам не будут предлагать ввести пароль или проверочные коды. Почему?

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

Вы можете использовать режим verbose, чтобы проверить это.

$ ssh -v -i ~/.ssh/id_rsa username@hostname/IPaddress
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Next authentication method: publickey
debug1: Offering public key: /home/andrey/.ssh/testserver ED25519 SHA256:K7aVJIfSsPec9gfgDbzOAnwCSAYJZxqvW/ST6fGHtUM explicit
debug1: Server accepts key: /home/andrey/.ssh/testserver ED25519 SHA256:K7aVJIfSsPec9gfgDbzOAnwCSAYJZxqvW/ST6fGHtUM explicit
Authenticated to 192.168.0.107 ([192.168.0.107]:22) using "publickey".

Добавьте следующую строку в конец файла /etc/ssh/sshd_config:

AuthenticationMethods publickey,password publickey,keyboard-interactive

Затем откройте /etc/pam.d/sshd и закомментируйте следующую строку.

# PAM configuration for the Secure Shell service

# Standard Un*x authentication.
#@include common-auth

Если не закомментировать «@include common-auth», то это позволит использовать более двух факторов для аутентификации. Сначала будет выполняться аутентификация с использованием ключей, затем пароля и токенов.

debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /home/andrey/.ssh/testserver ED25519 SHA256:K7aVJIfSsPec9gfgDbzOAnwCSAYJZxqvW/ST6fGHtUM explicit
debug1: Server accepts key: /home/andrey/.ssh/testserver ED25519 SHA256:K7aVJIfSsPec9gfgDbzOAnwCSAYJZxqvW/ST6fGHtUM explicit
Authenticated using "publickey" with partial success.
debug1: Authentications that can continue: password,keyboard-interactive
debug1: Next authentication method: keyboard-interactive
(nester@192.168.0.107) Password: 
(nester@192.168.0.107) Verification code: 
Authenticated to 192.168.0.107 ([192.168.0.107]:22) using "keyboard-interactive"

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

Перезапустим службу sshd и проверим, работают ли изменения.

$ sudo systemctl restart sshd

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

debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /home/andrey/.ssh/testserver ED25519 SHA256:K7aVJIfSsPec9gfgDbzOAnwCSAYJZxqvW/ST6fGHtUM explicit
debug1: Server accepts key: /home/andrey/.ssh/testserver ED25519 SHA256:K7aVJIfSsPec9gfgDbzOAnwCSAYJZxqvW/ST6fGHtUM explicit
Authenticated using "publickey" with partial success.
debug1: Authentications that can continue: password,keyboard-interactive
debug1: Next authentication method: keyboard-interactive
(nester@192.168.0.107) Verification code: 
Authenticated to 192.168.0.107 ([192.168.0.107]:22) using "keyboard-interactive"

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

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

Помните коды, которые генерируются на начальном этапе? Вы можете использовать аварийный скретч-код в качестве маркера для входа в систему. Каждый скретч-код можно использовать только один раз. Сохраните его в надежном месте, чтобы он мог быть использован в нужный момент.

Коды сохраняются в файле ~/.google_authenticator.

$ cat ~/.google_authenticator

Теперь вы можете снова сгенерировать свои собственные ключи, выполнив следующую команду

$ google-authenticator

и пройдя шаги раздела «Генерирование начального токена для пользователя» заново.

В этой статье мы расмотрели, как установить google authenticator и включить многофакторную аутентификацию для SSH с различными конфигурациями.

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