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

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

По умолчанию для аутентификации SSH использует пароли, но большинство инструкций по безопасности 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. Таким образом, чтобы войти на сервер, нужно будет предоставить два фактора для двух каналов.

Требования

  • Предварительно настроенный сервер Ubuntu 14.04.
  • Не-root пользователь с доступом к sudo.
  • Смартфон или планшет (iOS, Android) с приложением OATH-TOTP (например, Google Authenticator).

1: Установка libpam-google-authenticator

Сначала нужно установить PAM.

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

Для начала обновите кэш репозиториев Ubuntu:

sudo apt-get update

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

sudo apt-get install libpam-google-authenticator

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

google-authenticator

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

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

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

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

После этого на экране появится большой вывод, содержащий QR-код. Сохраните секретный ключ, проверочный код и аварийные скретч-коды в надежном месте (например, в менеджере паролей).

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

Остальные вопросы настраивают работу 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

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

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

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

Для начала откройте конфигурационный файл 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, чтоб обновить настройки:

sudo service ssh restart

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

Проверьте, работают ли SSH-ключи.

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

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

sudo nano /etc/ssh/sshd_config

Найдите строку PasswordAuthentication, раскомментируйте её и установите значение no. Теперь SSH не будет запрашивать пароль.

. . .
\# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no
. . .

Затем добавьте следующую строку в конец файла. Она определяет методы аутентификации:

. . .
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive

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

Затем откройте конфигурацию PAM sshd:

sudo nano /etc/pam.d/sshd

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

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

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

Перезапустите SSH.

sudo service ssh restart

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

ssh 8host@your_server_ip
Authenticated with partial success.
Verification code:

Предоставьте все данные, после чего вы сможете войти на сервер.

Заключение

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

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

  • Если у вас нет доступа к приложению TOTP, используйте коды восстановления вместо кодов подтверждения (например, если вы забыли экспортировать ключи из старого телефона на новый, или если ваш телефон разряжается).
  • Если вы потеряли секретный ключ и резервную копию, используйте для подключения консоль. Затем переименуйте или удалите файл ~/.google_authenticator. PAM утратит свои настройки и не будет запрашивать код. В таком случае параметр nullok должен находиться в/etc/pam.d/sshd .не забудьте перезапустить SSH.
  • Если вы потеряли SSH-ключ, войдите при помощи консоли и удалите открытый ключ из ~/.ssh/authorized_hosts. Потом можно заменить его новым.

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

Tags: , , , , ,

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