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

Вступление

authentication factor - это единичная информация, используемая для доказательства того, что у вас есть права на выполнение действия, например, входа в систему. authentication channel - это способ, которым система аутентификации сообщает фактор пользователю или требует от пользователя ответа. Пароли и токены безопасности являются примерами факторов аутентификации; компьютеры и телефоны являются примерами каналов.

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

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

  1. Что-то, что выknow, например пароль или секретный вопрос

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

  3. Что-то, что выare, например отпечаток пальца или голос

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

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

Предпосылки

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

  • Один сервер Ubuntu 16.04 с пользователем sudo без полномочий root, ключом SSH и включенным брандмауэром, который вы можете настроить, выполнивthis Initial Server Setup tutorial.

  • Смартфон или планшет с установленным приложением OATH-TOTP, например Google Authenticator (iOS,Android).

[[step-1 -—- install-google-39-s-pam]] == Шаг 1. Установка PAM от Google

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

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

Сначала обновите кеш репозитория Ubuntu.

sudo apt-get update

Далее установите PAM.

sudo apt-get install libpam-google-authenticator

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

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

google-authenticator

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

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

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

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

[.Примечание]##

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

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

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

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

OutputDo 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

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

OutputBy 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, ответ «нет» - более безопасный выбор.

OutputIf 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, то теперь это отличная техника защиты.

[.Примечание]##

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

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

[[step-2 -—- configuring-openssh]] == Шаг 2 - Настройка OpenSSH

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

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

sudo nano /etc/pam.d/sshd

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

/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 для редактирования.

sudo nano /etc/ssh/sshd_config

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

/etc/ssh/sshd_config

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

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

sudo systemctl restart sshd.service

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

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

[[step-3 -—- Making-ssh-known-of-mfa]] == Шаг 3. Как сделать SSH осведомленным о MFA

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

sudo nano /etc/ssh/sshd_config

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

/etc/ssh/sshd_config

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

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

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

sudo nano /etc/pam.d/sshd

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

/etc/pam.d/sshd

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

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

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 -—- добавление-третьего-фактора-необязательно]] == Шаг 4 - Добавление третьего-фактора (необязательно)

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

  1. publickey (ключ SSH)

  2. password publickey (пароль)

  3. keyboard-interactive (проверочный код)

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

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

sudo nano /etc/pam.d/sshd

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

sudo systemctl restart sshd.service

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

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

[[tip-1 -—- recovery-access]] == Совет 1. Восстановление доступа

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

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

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

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

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

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

  1. Восстановить существующий ключ

  2. Создать новый ключ

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

head -n 1 /home/sammy/.google_authenticator

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

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

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

[[tip-2 -—- change-authentication-settings]] == Совет 2 - изменение настроек аутентификации

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

макет гугл-аутентификатора


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

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

  • Чтобы включить последовательные коды вместо кодов на основе времени, измените строку" TOTP_AUTH на" HOTP_COUNTER 1.

  • Чтобы разрешить многократное использование одного кода, удалите строку" DISALLOW_REUSE.

  • Чтобы продлить срок действия кода до 4 минут, добавьте строку" WINDOW_SIZE 17.

  • Чтобы отключить несколько неудачных попыток входа в систему (ограничение скорости), удалите строку" RATE_LIMIT 3 30.

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

  • Чтобы отключить использование кодов восстановления, удалите пять 8-значных кодов внизу файла.

[[tip-3 -—- escape-mfa-for-some-accounts]] == Совет 3. Избегайте MFA для некоторых учетных записей

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

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

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

/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.

[[tip-4 -—- automating-setup-with-configuration-management]] == Совет 4. Автоматизация установки с помощью управления конфигурацией

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

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

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

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

[[tip-5 -—- forcing-mfa-for-all-users]] == Совет 5. Принудительное использование MFA для всех пользователей

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

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

[.предупреждение]##

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

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

  1. Создает токен TOTP,

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

  3. Запускает для них приложениеgoogle-authenticator после проверки, существует ли уже файл.google-authenticator.

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

Заключение

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

Related