Поиск по сайту:

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


Введение

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

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

В этом руководстве мы настроим многофакторную аутентификацию для борьбы с этим. Многофакторная аутентификация (MFA) требует более одного фактора для аутентификации или входа в систему. Это означает, что злоумышленнику придется скомпрометировать несколько вещей, например ваш компьютер и ваш телефон, чтобы получить in. Различные типы факторов часто обобщаются следующим образом:

  1. Что-то, что вы знаете, например пароль или секретный вопрос.
  2. Что-то, что у вас есть, например приложение для аутентификации или токен безопасности.
  3. Что-то, чем вы являетесь, например отпечаток пальца или голос.

Одним из распространенных факторов является приложение OATH-TOTP, такое как Google Authenticator. OATH-TOTP (одноразовый пароль на основе времени для открытой аутентификации) — это открытый протокол, который генерирует одноразовый пароль, обычно состоящий из 6 цифр, который повторяется каждые 30 секунд.

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

Предпосылки

Чтобы следовать этому руководству, вам понадобятся:

  • Один сервер Ubuntu 16.04 с пользователем без полномочий root, ключом SSH и включенным брандмауэром, который можно настроить, следуя этому руководству по начальной настройке сервера.
  • Смартфон или планшет с установленным приложением OATH-TOTP, например Google Authenticator (Android).

Шаг 1 — Установка Google PAM

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

PAM (Pluggable Authentication Module) — это инфраструктура аутентификации, используемая в системах Linux для аутентификации пользователя. Поскольку Google создал приложение OATH-TOTP, они также создали PAM, который генерирует TOTP и полностью совместим с любым приложением OATH-TOTP, таким как Google Authenticator или Authy.

Во-первых, обновите кэш репозитория Ubuntu.

  1. sudo apt-get update

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

  1. sudo apt-get install libpam-google-authenticator

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

Запустите приложение инициализации.

  1. google-authenticator

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

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

Этот PAM позволяет использовать токены на основе времени или последовательности. Использование последовательных токенов означает, что код начинается в определенной точке, а затем увеличивается на единицу после каждого использования. Использование токенов на основе времени означает, что код изменяется случайным образом по истечении определенного времени. Мы будем придерживаться времени, потому что именно этого ожидают такие приложения, как Google Authenticator, поэтому ответьте y, если да.

После ответа на этот вопрос будет прокручиваться много вывода, включая большой QR-код. На этом этапе используйте приложение для проверки подлинности на своем телефоне, чтобы отсканировать QR-код или вручную ввести секретный ключ. Если QR-код слишком велик для сканирования, вы можете использовать URL-адрес над QR-кодом, чтобы получить уменьшенную версию. Как только он будет добавлен, вы увидите шестизначный код, который меняется каждые 30 секунд в вашем приложении.

Примечание. Обязательно запишите секретный ключ, код подтверждения и коды восстановления в надежном месте, например в диспетчере паролей. Коды восстановления — это единственный способ восстановить доступ, если вы, например, потеряли доступ к своему приложению TOTP.

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

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

При этом ключ и параметры записываются в файл .google_authenticator. Если вы скажете «нет», программа завершит работу и ничего не запишется, а значит, аутентификатор не сработает.

Output
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

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

Output
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) n

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

Output
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 в надежное место. Оттуда вы можете развернуть его на дополнительных системах или повторно развернуть после резервного копирования.

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

Шаг 2 — Настройка OpenSSH

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

Для начала откройте файл конфигурации sshd для редактирования с помощью nano или вашего любимого текстового редактора.

  1. sudo nano /etc/pam.d/sshd

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

. . .
# Standard Un*x password updating.
@include common-password
auth required pam_google_authenticator.so nullok

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

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

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

  1. sudo nano /etc/ssh/sshd_config

Найдите ChallengeResponseAuthentication и установите для него значение yes.

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

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

  1. sudo systemctl restart sshd.service

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

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

Шаг 3 — Осведомленность SSH о MFA

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

  1. sudo nano /etc/ssh/sshd_config

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

. . .
UsePAM yes
AuthenticationMethods publickey,password publickey,keyboard-interactive

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

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

  1. sudo nano /etc/pam.d/sshd

Найдите строку @include common-auth и закомментируйте ее, добавив символ # в качестве первого символа в строке. Это говорит PAM не запрашивать пароль.

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

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

  1. sudo systemctl restart sshd.service

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

Example SSH output\
. . . debug1: Authentications that can continue: publickey debug1: Next authentication method: publickey debug1: Offering RSA public key: /Users/sammy/.ssh/id_rsa debug1: Server accepts key: pkalg rsa-sha2-512 blen 279 Authenticated with partial success. debug1: Authentications that can continue: password,keyboard-interactive debug1: Next authentication method: keyboard-interactive Verification code:

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

Шаг 4 — Добавление третьего фактора (необязательно)

На шаге 3 мы перечислили утвержденные типы аутентификации в файле sshd_config:

  1. publickey (SSH-ключ)
  2. открытый ключ пароля (пароль)
  3. интерактивная клавиатура (код подтверждения)

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

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

  1. sudo nano /etc/pam.d/sshd

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

  1. sudo systemctl restart sshd.service

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

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

Совет 1 — Восстановление доступа

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

Потеря ключа SSH или секретного ключа TOTP

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

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

В противном случае вам понадобится пользователь-администратор с доступом к sudo; не включайте MFA для этого пользователя, а используйте ключ SSH. Если вы или другой пользователь потеряете свой секретный ключ и не сможете войти в систему, тогда пользователь с правами администратора может войти в систему и помочь восстановить или повторно сгенерировать ключ для любого пользователя с помощью sudo.

После входа в систему есть два способа получить секрет TOTP:

  1. Восстановить существующий ключ
  2. Создать новый ключ

В домашнем каталоге каждого пользователя секретный ключ и настройки Google Authenticator сохраняются в ~/.google-authenticator. Самая первая строка этого файла — секретный ключ. Быстрый способ получить ключ — выполнить следующую команду, которая отображает первую строку файла google-authenticator (т. е. секретный ключ). Затем возьмите этот секретный ключ и вручную введите его в приложение TOTP.

  1. head -n 1 /home/sammy/.google_authenticator

Если есть причина не использовать существующий ключ (например, невозможно безопасно передать секретный ключ пострадавшему пользователю), вы можете полностью удалить файл ~/.google-authenticator. Это позволит пользователю снова войти в систему, используя только один фактор, при условии, что вы не применяли MFA. Затем они могут запустить google-authenticator для создания нового ключа.

Потеря доступа к приложению TOTP

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

Совет 2 — Изменение настроек аутентификации

Если вы хотите изменить настройки MFA после первоначальной настройки, вместо создания новой конфигурации с обновленными настройками вы можете просто отредактировать файл ~/.google-authenticator. Этот файл устроен следующим образом:

<secret key>
<options>
<recovery codes>

Параметры, установленные в этом файле, имеют строку в разделе параметров; если вы ответили «нет» на тот или иной вариант при первоначальной настройке, соответствующая строка будет исключена из файла.

Вот какие изменения вы можете внести в этот файл:

  • Чтобы включить последовательные коды вместо кодов на основе времени, измените строку TOTP_AUTH на HOTP_COUNTER 1.
  • Чтобы разрешить многократное использование одного кода, удалите строку DISALLOW_REUSE.
  • Чтобы увеличить срок действия кода до 4 минут, добавьте строку WINDOW_SIZE 17.
  • Чтобы отключить множественные неудачные попытки входа (ограничение скорости), удалите строку RATE_LIMIT 3 30.
  • Чтобы изменить порог ограничения скорости, найдите строку RATE_LIMIT 3 30 и настройте числа. 3 в оригинале указывает количество попыток за период времени, а 30 указывает период времени в секундах.
  • Чтобы отключить использование кодов восстановления, удалите пять восьмизначных кодов внизу файла.

Совет 3. Избегайте многофакторной идентификации для некоторых учетных записей

Может возникнуть ситуация, когда одному пользователю или нескольким учетным записям служб (т. е. учетным записям, используемым приложениями, а не людьми) требуется доступ по SSH без включенной MFA. Например, некоторые приложения, использующие SSH, например некоторые FTP-клиенты, могут не поддерживать MFA. Если у приложения нет способа запросить код подтверждения, запрос может зависнуть до истечения времени ожидания подключения SSH.

Пока пара параметров в /etc/pam.d/sshd установлена правильно, вы можете контролировать, какие факторы используются для каждого пользователя.

Чтобы разрешить MFA для одних учетных записей и только SSH для других, убедитесь, что следующие настройки в /etc/pam.d/sshd активны.

# PAM configuration for the Secure Shell service

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

. . .

# Standard Un*x password updating.
@include common-password
auth required pam_google_authenticator.so nullok

Здесь @include common-auth закомментирован, поскольку пароли необходимо отключить. MFA нельзя включить принудительно, если для некоторых учетных записей предполагается отключение MFA, поэтому оставьте параметр nullok в последней строке.

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

Совет 4. Автоматизация установки с помощью управления конфигурацией

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

google-authenticator поддерживает переключатели командной строки для установки всех параметров в одной неинтерактивной команде. Чтобы просмотреть все варианты, введите google-authenticator --help. Ниже приведена команда, которая настроит все, как описано в шаге 1:

  1. google-authenticator -t -d -f -r 3 -R 30 -W

Это отвечает на все вопросы, на которые мы ответили вручную, сохраняет их в файл, а затем выводит секретный ключ, QR-код и коды восстановления. (Если вы добавите флаг -q, то никакого вывода не будет.) Если вы используете эту команду в автоматическом режиме, обязательно установите для захвата секретного ключа и/или восстановления коды и сделать их доступными для пользователя.

Совет 5. Принудительное использование MFA для всех пользователей

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

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

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

Другой способ принудительного создания секретного ключа пользователя — использование скрипта bash, который:

  1. Создает токен TOTP,
  2. Предлагает им загрузить приложение Google Authenticator и отсканировать QR-код, который будет отображаться, и
  3. Запускает для них приложение google-authenticator после проверки существования файла .google-authenticator.

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

Заключение

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