Настройка многофакторной аутентификации SSH на Ubuntu 16.04

Фактор аутентификации – это единица информации, используемая для подтверждения того, что пользователь имеет право выполнять определённые действия (например, входить в систему). Канал аутентификации используется системой для передачи фактора или запроса информации пользователя. Например, пароли и токены безопасности (англ. token) являются факторами аутентификации, а компьютеры и телефоны – каналами.

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

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

Типы факторов:

  • Что-то, что мы знаем (например, пароль).
  • Что-то, что мы имеем (устройство аутентификации или токен безопасности).
  • Что-то, что является частью нас (биометрика: отпечаток пальца, голос, и т.п.).

Как правило, в качестве одного из факторов используются приложения OATH-TOTP, к которым относится Google Authenticator. OATH-TOTP (Open Authentication Time-Based One-Time Password) – это открытый протокол, генерирующий одноразовые пароли (обычно это 6-значный номер, который обновляется каждые 30 секунд).

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

Требования

1: Установка PAM

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

Для начала обновите индекс пакетов Ubuntu:

sudo apt-get update

Установите PAM:

sudo apt-get install libpam-google-authenticator

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

Запустите инициализацию:

google-authenticator

После этого программа задаст несколько вопросов. Сначала нужно указать, нужно ли синхронизировать токены авторизации по времени.

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

PAM позволяет создавать токены, синхронизированные по времени, и токены на основе математического алгоритма.

Токены на основе математического алгоритма создаются сериями на основе секретного ключа; ни один из таких токенов невозможно угадать, даже если предыдущие токены известны. Синхронизированные по времени токены постоянно меняются в установленный интервал времени (например, раз в 30 секунд). В данном руководстве будут использоваться синхронизированные по времени токены, поскольку такие обычно используются в приложениях типа Google Authenticator. Выберите y.

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

Примечание: Сохраните секретный ключ, проверочный код и аварийные скретч-коды в надежном месте (например, в менеджере паролей). Эти коды – единственный способ восстановить доступ к TOTP-приложению.

Остальные вопросы настраивают работу PAM. Рассмотрим их по очереди.

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

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

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

Это предотвратит атаки повторного воспроизведения (replay), так как каждый код будет недействителен после использования. Таким образом, злоумышленник не сможет перехватить использованный код.

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 валидных кодов в течение 4 минут в скользящем окне. Если выбрать no, количество действительных кодов будет ограничено до 3 за полторы минуты. Это гораздо более безопасный вариант.

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

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

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

2: Настройка OpenSSH

После этого нужно настроить SSH для поддержки TOTP-ключа.

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

Для начала откройте конфигурационный файл sshd в текстовом редакторе:

sudo nano /etc/pam.d/sshd

В конец файла вставьте:

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

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

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

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

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

sudo systemctl restart sshd.service

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

Теперь нужно настроить поддержку многофакторной аутентификации.

3: Поддержка MFA

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

sudo nano /etc/ssh/sshd_config

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

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

Она настраивает методы аутентификации SSH. Сохраните и закройте файл.

Затем откройте настройки PAM sshd:

sudo nano /etc/pam.d/sshd

Найдите строку @include common-auth и закомментируйте её (добавьте символ диеза в начало строки). Теперь PAM тоже не будет запрашивать пароль.

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

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

sudo systemctl restart sshd.service

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

. . .
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/8host/.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 поддерживает многофакторную аутентификацию. При желании можно добавить третий фактор аутентификации.

4: Добавление третьего фактора (опционально)

В предыдущем разделе в файле sshd_config были перечислены все факторы аутентификации:

  1. publickey (SSH-ключ);
  2. password publickey (пароль);
  3. keyboard-interactive (код подтверждения).

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

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

sudo nano /etc/pam.d/sshd

Найдите закомментированную строку:

#@include common-auth

И раскомментируйте её, удалив символ #. Сохраните и закройте файл. Перезапустите SSH.

sudo systemctl restart sshd.service

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

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

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

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

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

Если вы потеряли SSH-ключ или ключ TOTP, восстановление можно разделить на два этапа:

  1. Вход без кода подтверждения;
  2. Поиск или восстановление ключа.

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

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

Получить секретный ключ TOTP можно так:

  • Восстановить утерянный ключ;
  • Сгенерировать новый ключ.

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

head -n 1 /home/8host/.google_authenticator

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

Восстановление доступа к TOTP-приложению

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

Важно! Эти коды восстановления одноразовые.

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

Если вы решили изменить настройки MFA, отредактируйте файл ~/.google-authenticator. Он имеет такую структуру:

<secret key>
<options>
<recovery codes>

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

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

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

Совет 3: Избирательное отключение MFA

В некоторых случаях отдельным пользователям или аккаунтам сервисов (которые используются только приложениями, а не людьми) необходим SSH-доступ, но без MFA. К примеру, некоторые приложения (например, FTP-клиенты) используют подключения SSH, но не поддерживают 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 не может быть обязательной, если некоторые аккаунты не могут её использовать, потому нужно добавить nullok в конец файла.

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

Совет 4: Автоматизация настройки многофакторной аутентификации

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

Читайте также: Основы управления конфигурациями

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

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

google-authenticator --help

Эта команда автоматически выполнит все действия, описанные в разделе 1:

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

Она ответит на все вопросы программы, сохранит настройки в файл, выведет секретный ключ, QR-код и коды восстановления. Для подавления вывода можно использовать флаг –q.

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

Совет 5: Обязательная MFA

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

После начальной настройки скопируйте этот файл в root каждого домашнего каталога и измените права на файл (для этой операции необходимы привилегии root). Также можно скопировать файл в /etc/skel/, откуда он будет автоматически скопирован в домашний каталог нового пользователя.

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

Также можно сделать MFA обязательной с помощью сценария bash, который:

  • Создаст TOTP-токен;
  • Загрузит приложение Google Authenticator и просканирует QR-код;
  • Запустит google-authenticator и проверит, существует ли файл .google-authenticator.

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

Заключение

Двухфакторная аутентификация (SSH-ключ + токен), выполняемая по двум разным каналам (компьютер + телефон), почти полностью исключает возможность взлома и brute force атак и значительно увеличивает защиту машины от злоумышленников.

Помните: повышая уровень безопасности системы, вы отвечаете за управление этой безопасностью. Будьте очень внимательны. Следите за сохранностью ключей SSH и секретных ключей TOTP.

Tags: , , , ,

Добавить комментарий