Настройка многофакторной аутентификации SSH в Ubuntu
SSH, Ubuntu | Комментировать запись
Для аутентификации SSH по умолчанию использует пароли, но для большей защиты рекомендуется использовать не пароли, а SSH-ключи. Однако, аутентификация по ключам – это все еще только один фактор, пусть и гораздо более надежный, чем пароль. Здесь единственный канал – это терминал на вашем компьютере, отправляющий данные через зашифрованный туннель на удаленный компьютер. Конечно, если злоумышленник взломает компьютер, он сможет получить доступ к вашим паролям или ключам и использовать их, чтобы получить доступ к удаленной системе.
Это руководство поможет вам предотвратить подобные ситуации путем настройки многофакторной аутентификации. Многофакторная аутентификация (англ. Multi-factor authentication, или MFA, также двухфакторная аутентификация, 2FA) открывает доступ к информации только при наличии нескольких факторов разного типа. Существуют такие типы факторов:
- Что-то, что вы знаете (это пароль).
- Что-то, что вы имеете (приложение аутентификации или токен безопасности).
- Что-то, что является частью вас (это биометрические данные: отпечаток пальца, голос и т.п.).
Обычно в качестве одного из факторов используется приложение OATH-TOTP. Таким приложением является Google Authenticator.
OATH-TOTP (Open Authentication Time-Based One-Time Password) – это открытый протокол, который создает одноразовые пароли; как правило, это 6-значный номер, который обновляется в течение 30 секунд.
Наш мануал поможет вам настроить многофакторную аутентификацию SSH при помощи приложения OATH-TOTP и SSH-ключей. Следовательно, чтобы войти на сервер, вы должны будете предоставить два фактора для двух разных каналов. А в конце руководства вы найдёте несколько полезных советов и подсказок по настройте безопасности системы.
Требования
- Сервер Ubuntu 20.04, предварительно настроенный по этому руководству (включая пользователя с доступом к sudo, SSH-ключи и настроенный брандмауэр).
- Смартфон или планшет (iOS, Android) с установленным приложением OATH-TOTP (мы используем Google Authenticator).
- В качестве альтернативы Google Authenticator для создания кода OATH-TOTP вы можете использовать приложение командной строки Linux под названием oathtool. Его можно найти в различных репозиториях.
1: Установка PAM
Сначала давайте установим PAM от Google, или Pluggable Authentication Module – это инфраструктура для аутентификации пользователей, которая используется в системах Linux. Поскольку приложение OATH-TOTP разработано Google, компании понадобилось создать и модуль PAM для быстрой генерации одноразовых паролей, совместимый с любым TOTP-приложением (в том числе с Google Authenticator или Authy).
Обновите индекс пакетов системы:
sudo apt-get update
Затем установите PAM:
sudo apt-get install libpam-google-authenticator
Дальше вы можете использовать вспомогательное приложение, которое устанавливается вместе с модулем PAM, и создать TOTP-ключ для пользователя, который в дальнейшем будет поддерживать двухфакторную аутентификацию. Имейте в виду: каждый такой ключ индивидуален для каждого аккаунта, TOTP-ключи не используются общесистемно; следовательно, чтобы настроить двухфакторную аутентификацию для нескольких пользователей, вы должны запустить вспомогательное приложение на каждом аккаунте и сгенерировать уникальный TOTP-ключ для каждого из них.
Запустите приложение:
google-authenticator
Сейчас оно задаст вам несколько вопросов. Сначала укажите, нужно ли синхронизировать токены аутентификации по времени.
Do you want authentication tokens to be time-based (y/n) y
Модуль PAM позволяет создавать токены, синхронизированные по времени или на основе математического алгоритма.
Токены на основе математического алгоритма берут определенное число как исходный код, и после каждого использования токена следующий токен увеличивается на единицу. Синхронизированные по времени токены обновляются в заданный период времени. В этом мануале мы остановимся на токенах, синхронизированных по времени, поскольку именно такие обычно используют приложения типа Google Authenticator. Нажмите y.
На экране появится очень объемный результат, в котором будет QR-код. Используйте смартфон, чтобы просканировать QR-код, или введите секретный ключ в ваше приложение вручную. Если QR-код слишком большой для сканирования, откройте его уменьшенную версию, которая доступна по ссылке над кодом. В результате в вашем приложении появится шестизначный код, который будет обновляться каждые 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
Этот параметр позволяет предотвратить навязывание пакетов, потому что каждый код станет недействителен после использования, и злоумышленник не сможет ввести уже использованный код (если даже ему удастся его перехватить).
By default, a new token is generated every 30 seconds by the mobile app.
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. This allows for a
time skew of up to 30 seconds between the authentication server and client. Suppose you
experience problems with poor time synchronization. In that case, you can increase the window
from its default size of 3 permitted codes (one previous code, the current
code, the next code) to 17 permitted codes (the eight previous codes, the current
code, and the eight next codes). This will permit a time skew of up to 4 minutes
between client and server.
Do you want to do so? (y/n) n
При ответе yes эта опция будет создавать до 17 валидных кодов в скользящем окне в течение 4 минут. Если вы ответите no, их количество будет ограничено до 3 валидных кодов в полторы минуты – это более безопасный выбор. Позже вы сможете изменить эту настройку в файле .google_authenticator, который хранится в корне вашего домашнего каталога.
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 three login attempts every 30s.
Do you want to enable rate-limiting (y/n) y
Этот параметр ограничит количество попыток угадать код: удаленному злоумышленнику дается всего несколько попыток ввести правильное значение, после чего ввод блокируется на некоторое время. Если ранее вы не настраивали ограничение скорости ввода непосредственно в SSH, сделайте это сейчас – это отличный способ укрепить защиту системы.
Примечание: После завершения настройки рекомендуем создать резервную копию секретного ключа. Для этого нужно скопировать файл ~/.google-authenticator в надежное место. Теперь вы сможете использовать его в других системах или хранить как резервную копию.
Следующим шагом будет настройка SSH для поддержки TOTP-ключа
2: Настройка OpenSSH
Поскольку все изменения вносятся через SSH, в процессе настройки очень важно случайно не закрыть исходное SSH-соединение – иначе вы можете заблокировать себя на своем же сервере, если в настройках SSH допущена ошибка. Соединение можно прервать только после того, как вы убедитесь, что ваша аутентификация работает.
Еще одна мера предосторожности – создать резервную копию системных файлов, которые вы будете редактировать: если что-то пойдет не так, вы сможете легко вернуться к исходному файлу и начать настройку заново.
Итак, создайте резервную копию конфигурационного файла sshd:
sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.bak
Откройте его в текстовом редакторе:
sudo nano /etc/pam.d/sshd
В конец файла вставьте:
. . .
# Standard Un*x password updating.
@include common-password
auth required pam_google_authenticator.so nullok
auth required pam_permit.so
Параметр nullok в конце предпоследней строки включает поддержку разных методов аутентификации. Это значит, что пользователи, у которых нет TOTP-ключа, смогут использовать SSH-ключи для входа. Если TOTP-ключи есть у всех ваших пользователей, nullok можно удалить, чтобы сделать MFA обязательной для всех.
Вторая строка, pam_permit.so, разрешит аутентификацию, если пользователь не применяет токен MFA для входа в систему. Любой метод входа требует ответ SUCCESS, чтобы разрешить аутентификацию. Если пользователь не поддерживает инструмента многофакторной аутентификации, опция nullok возвращает IGNORE для аутентификации по интерактивной клавиатуре. Затем pam_permit.so возвращает SUCCESS, что позволяет продолжить аутентификацию.
Сохраните и закройте файл.
Затем нам нужно настроить SSH для поддержки этого типа аутентификации.
Создайте резервную копию файла:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
Откройте конфигурацию 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 оставался открытым, иначе в какой-то момент вы заблокируете себе доступ и вам придется использовать веб-консоль, чтобы вернуть его..
Примечание: Если раньше для аутентификации вы использовали SSH-ключи, сейчас программа не предложит вам вводить пароль или код MFA, поскольку по умолчанию SSH-ключи заменяют все остальные методы. Вам будет предложено ввести пароль и код подтверждения при условии, что раньше вы не пользовались ключами.
3: Поддержка многофакторной аутентификации
Многофакторная аутентификация MFA не работает, если вы до сих пор используете SSH-ключ. Чтобы сервис SSH узнал о настройке MFA, нужно снова открыть конфигурационный файл sshd:
sudo nano /etc/ssh/sshd_config
Добавьте в конец файла строку:
. . .
AuthenticationMethods publickey,password publickey,keyboard-interactive
Она настраивает методы аутентификации SSH. Сохраните и закройте файл.
Затем откройте настройки sshd для PAM:
sudo nano /etc/pam.d/sshd
Найдите в файле строку @include common-auth и закомментируйте её (для этого обавьте символ диеза в начало строки). Теперь PAM тоже не будет запрашивать пароль.
. . .
# Standard Un*x authentication.
#@include common-auth
. . .
Сохраните и закройте файл, а затем перезапустите SSH.
sudo systemctl restart sshd.service
Попробуйте снова подключиться к серверу в новом терминале. На этот раз SSH запросит код подтверждения. Введите этот код и вы сможете войти на сервер. Теперь для аутентификации используются два фактора: 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 перечислены все факторы аутентификации:
- publickey (SSH-ключ);
- password publickey (пароль);
- keyboard-interactive (код подтверждения).
Это все доступные факторы, но согласно дальнейшей нашей настройке в работе используются только два фактора из трех: SSH-ключ и код подтверждения. Если вы хотите, вы можете быстро добавить третий фактор аутентификации.
Для этого сначала откройте конфигурационный файл:
sudo nano /etc/pam.d/sshd
Найдите закомментированную строку:
#@include common-auth
Раскомментируйте её, удалив символ диеза. Затем сохраните и закройте файл. Перезапустите SSH.
sudo systemctl restart sshd.service
Теперь, когда опция @include common-auth включена, PAM будет запрашивать вместе с ключом и кодом третий фактор – пароль. Таким образом, для авторизации необходимы два канала (компьютер и телефон) и три фактора: что-то, что вы знаете – это пароль; что-то что вы имеете – ключ и код.
5: Восстановление доступа к Google MFA (опционально)
Занимаясь настройкой защиты любой системы, вы берёте на себя ответственность за управление безопасностью этой системы. Под этим подразумевается, что вы должны сохранить в надежном свой SSH-ключ, секретный ключ TOTP или же доступ к TOTP-приложению. К сожалению, в некоторых ситуациях ключи или доступ к приложению всё же теряются, и тогда их необходимо восстановить.
Восстановление секретного ключа TOTP
Если вы потеряли свой ключ TOTP, рекомендуем вам такой процесс восстановления, его можно разделить на два этапа:
- Вход без кода подтверждения;
- Поиск старого или создание нового ключа для восстановления MFA.
Обычно доступ теряется, если у вас появился новый смартфон, на который вы не перенесли свои данные.
Чтобы попасть на сервер, когда секретный ключ утрачен, используйте консоль хостинг-провайдера (это работает, потому что, как правило, с помощью MFA провайдеры защищают только соединения SSH; соединения, не связанные с SSH, не используют модуль PAM Google Authenticator).
Если доступа к консоли нет, у вас есть два варианта восстановления доступа:
- Консольный (локальный, не SSH) доступ к системе (то есть физический доступ или через приложение типа iDrac)
- Пользователь с доступом к sudo, для которого не была активирована MFA.
Второй вариант является менее безопасным, поскольку цель MFA – усилить защиту всех SSH-соединений, но это один из самых надежных способов восстановить доступ к приложению.
Войдя в систему, вы можете получить секретный ключ:
- Восстановить утерянный ключ;
- Сгенерировать новый ключ.
В домашнем каталоге каждого пользователя есть файл ~/.google-authenticator, где хранятся секретный ключ и настройки Google Authenticator. Первая строка этого файла содержит необходимый нам ключ. Чтобы получить его, выполните следующую команду, она выведет первую строку файла google-authenticator. Полученный ключ можно ввести в TOTP-приложение.
head -n 1 /home/8host/.google_authenticator
Восстановив текущий ключ, вы можете либо вручную ввести его в приложение аутентификации, либо ввести соответствующие данные в приведенный ниже URL-адрес и попросить Google сгенерировать QR-код, который вы сможете просканировать. Вам нужно будет указать в адресе свое имя пользователя, имя хоста, секретный ключ из файла .google-Authenticator, а затем любое имя для ‘entry-name-in-auth-app’, чтобы легко отличить этот ключ от других токенов TOTP:
Если же по какой-либо причине вы не может воспользоваться текущим ключом (к примеру, если у вас нет возможности безопасно передать его), вы можете временно переместить файл ~/.google-authenticator в другое место. Это позволит вам получить доступ к серверу по одному фактору (если только вы не сделали многофакторную аутентификацию обязательной, удалив опцию nullok) и запустить google-authenticator, чтобы сгенерировать новый ключ.
Восстановление доступа к TOTP-приложению
Если вы утратили доступ к своему TOTP-приложению и не можете создать код подтверждения, используйте коды для восстановления, которые были выданы вам во время создания первого секретного ключа. Это последние пять строк файла .google-authenticator.
Важно! Эти коды восстановления одноразовые.
6: Изменение настроек аутентификации (опционально)
Если вы решили изменить какие-то настройки многофакторной аутентификации, отредактируйте свой файл ~/.google-authenticator. Он имеет такую структуру:
<secret key>
<options>
<recovery codes>
Каждая строка была добавлена в раздел Options во время начальной настройки (если вы ответили no на один из вопросов программы сразу после установки, в файле может не быть соответствующей строки).
В файл можно внести такие изменения:
- Чтобы использовать токены на основе математического алгоритма вместо синхронизированных по времени, замените ” TOTP_AUTH строкой ” HOTP_COUNTER 1.
- Коды подтверждения можно будет использовать повторно, если вы удалите строку ” DISALLOW_REUSE.
- Чтобы увеличить продолжительность работы окна подтверждения до 4 минут, добавьте в файл строку ” WINDOW_SIZE 17.
- Если вы хотите отключить ограничение скорости передачи данных, удалите строку ” RATE_LIMIT 3 30.
- Также можно изменить пороговое значение ограничения скорости. Для этого найдите строку ” RATE_LIMIT 3 30 (где 3 – это количество попыток ввести код, а 30 – интервал времени в секундах) и измените числа в ней.
- Чтобы отключить использование кодов восстановления, просто удалите восьмизначные коды в конце файла.
7: Избирательное отключение многофакторной аутентификации
Иногда отдельным пользователям или аккаунтам (к примеру, аккаунтам сервисов, которые используются только приложениями, а не людьми) необходим 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-ключей.
8: Автоматизация настройки многофакторной аутентификации (опционально)
Многие системные администраторы используют для оркестровки сервера различные системы управления конфигурациями (Puppet, Chef или Ansible). Такая система может автоматизировать настройку многофакторной аутентификации для новых пользователей.
Читайте также: Основы управления конфигурациями
google-authenticator поддерживает ключи командной строки, благодаря которым мы можем заранее определить все параметры начальной настройки в неинтерактивной команде. Чтобы узнать об этом больше, введите:
google-authenticator --help
К примеру, такая команда автоматически выполнит все действия, описанные в разделе 1:
google-authenticator -t -d -f -r 3 -R 30 -w 3
Она ответит на все вопросы программы:
- -t включит счетчик времени
- -d запретит повторное использование токена
- -f принудительно запишет настройки в файл, не спрашивая пользователя
- -r определит, сколько у пользователя есть попыток ввести правильный код
- -R указывает, как долго (в секундах) пользователь может пытаться ввести правильный код
- -w определяет, сколько существует действительных кодов одновременно (это относится к временному интервалу от 1:30 до 4 минут)
Также команда сохранит настройки в файл, выведет секретный ключ, QR-код и коды восстановления. Для подавления вывода можно использовать флаг –q.
При автоматизации MFA важно сделать так, чтобы конечные пользователи получили секретный ключ и ключи восстановления.
9: Настройка обязательной многофакторной аутентификации (опционально)
Вы также можете сделать многофакторную аутентификацию обязательной для всех пользователей и запретить им самостоятельно генерировать ключи. Для этого достаточно просто использовать один и тот же файл .google-authenticator для всех пользователей в системе (в этом файле нет индивидуальных данных).
Выполнив начальную настройку, скопируйте этот файл в корень домашнего каталога каждого пользователя и измените права на файл (для этой операции необходимы привилегии root). Можно также скопировать файл в /etc/skel/, откуда он будет автоматически скопирован в домашний каталог нового пользователя.
Важно! Такая настройка представляет угрозу безопасности, ведь все ваши пользователи используют один и тот же второй фактор. В случае утечки информации сразу все пользователи потеряют один из факторов аутентификации. Обязательно учитывайте этот риск, если решите применить этот подход.
Также можно сделать MFA обязательной с помощью сценария bash, который:
- Создаст TOTP-токен;
- Загрузит приложение Google Authenticator и просканирует QR-код;
- Запустит google-authenticator и проверит, существует ли файл .google-authenticator.
Чтобы сценарий запускался при входе пользователя, назовите его .bash_login и поместите его в корень домашнего каталога пользователей.
Заключение
Только что вы настроили двухфакторную аутентификацию (SSH-ключ + токен), которая обрабатывается по двум разным каналам (компьютер + телефон). Подобная настройка почти полностью исключает возможность взлома и brute force атак, а также существенно увеличивает защиту машины от злоумышленников.
Запомните: повышая уровень безопасности системы, вы отвечаете за ее управление. Будьте очень внимательны. Следите за сохранностью ключей SSH и секретных ключей TOTP.
Tags: Google Authenticator, MFA, PAM, SSH, Ubuntu 20.04