Трехступенчатая аутентификация?

9

Я использую Ubuntu.

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

Я заставил обоих работать независимо, но никогда не мог заставить их работать вместе. Я уверен, что как-то это возможно.

Спасибо.

Джесси W
источник
Обычно вы не получаете много за счет повторяющихся факторов. Сертификат и генератор кода соответствуют фактору «что-то, что у вас есть». Пароль соответствует «что-то, что вы знаете». Другим распространенным фактором является то, что вы есть (биометрия).
Зоредаче

Ответы:

8

Это можно сделать, связав вместе модули PAM. Но прежде чем углубляться в детали:

Неправильная настройка PAM может и не позволит вам войти в вашу систему

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

Во всяком случае, идея в том , что можно использовать для штабелирования модулей PAM , чтобы убедиться , что pam-google-authenticator, pam_unix(это проверяет ваш пароль) и модуль сертификата все должны преуспеть , чтобы позволить вам доступ. По умолчанию PAM настроен так, что любой модуль аутентификации может аутентифицировать вас, пропуская остальные.

В /etc/pam.d/common-auth рядом с верхней частью вы увидите строку, которая выглядит примерно так:

auth    [success=2 default=ignore]  pam_unix.so nullok_secure try_first_pass

Это говорит PAM о том, что он должен быть pam_unix.soуспешным, пропустит следующие два правила (которые обычно являются другим модулем аутентификации, а затем pam_deny.so) и перейдет к дополнительным модулям. Однако, если модуль выйдет из строя, он будет проигнорирован, и управление перейдет к следующему модулю в цепочке. Это продолжается в каждом модуле аутентификации до тех пор, пока либо элемент управления не перейдет к необязательному блоку, либо PAM не ударит pam_deny.so и не завершится с ошибкой.

Это можно использовать для обеспечения того pam-google-authenticator, чтобы pam_unix.soвсе модули PAM сертификата все успешно выполнялись, чтобы предоставить вам доступ. Я не знаю названия модуля аутентификатора Google или модуля сертификатов, который вы используете, но вы сможете найти их в своем файле общей аутентификации. Итак, поместив что-то вроде этого вверху:

auth    requisite   pam_unix.so nullok_secure
auth    requisite   pam_google_authenticator.so
auth    requisite   pam_certificate_auth.so
auth    [success=<n>]   pam_permit.so

Замена <n>на количество модулей между модулем pam_permit.so здесь и следующим pam_permit.soмодулем - другими словами, это должно быть установлено на код [success = n default = ignore] самого верхнего модуля auth + 1. Этот синтаксис немного фанк , но по существу пропускает модули авторизации после того, как вышеупомянутые модули преуспели.

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

auth    [success=ignore default=4]  pam_succeed_if.so user = <username>

Где <username>заменяется ваше имя пользователя. Эта строка просто говорит, что если pam_succeed_if.so будет успешным (иначе ваше имя пользователя совпадает с именем пользователя в этой строке), тогда PAM должен продолжить работу со следующими модулями, которые являются трехэтапными модулями аутентификации. В противном случае PAM должен перейти к реальным модулям, которые находятся на расстоянии 4 модулей от этого.

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

auth    [success=1 default=ignore]  pam_succeed_if.so user = <username>
auth    [success=ignore default=4]  pam_succeed_if.so user ingroup <group>

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

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

Полная документация для pam_succeed_if.soмодуля может быть найдена в http://linux.die.net/man/8/pam_succeed_if

Xenopathic
источник
Отличный ответ! Если бы я мог поднять это более одного раза, я бы.
Аарон Миллер
Спасибо! Хотя - для входа в сертификат я добавляю свой открытый ключ в .ssh / authorized_keys (используя настройки RSAAuthentication и PubkeyAuthentication в sshd_config), а для кода OTP я использую pam_google_authenticator - google-authenticator.googlecode.com/hg . Так как это будет работать?
Джесси W
@JesseW Чтобы это работало, вам нужно настроить SSHD для использования PAM, а также открытый ключ. Хотя я не уверен в деталях, вам, безусловно, нужно будет установить ChallengeResponseAuthenticationи UsePAMустановить «да», а затем установить строки, подробно описанные в моем ответе выше, либо в /etc/pam.d/sshd, либо в /etc/pam.d/common. -auth, в зависимости от того, хотите ли вы выполнить это для всех входов в систему или только для SSH. Не забудьте удалить строку-заполнитель pam_certificate_auth.so и в результате изменить строку [success = <n>.
Ксенопатический
2

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

По сути, я настроил Google Authenticator и пароль в PAM, а затем настроил аутентификацию с открытым ключом в OpenSSH (это обходит два других), и, наконец, OpenSSH потребовал также аутентификации через PAM (последняя строка)

Из / etc / ssh / sshd_conf

PubkeyAuthentication yes
ChallengeResponseAuthentication yes
PasswordAuthentication no
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
Эйнар
источник
1

Только Pubkey + GoogleAuth нужно добавить в начало вашего /etc/pam.d/sshd

#auth    requisite    pam_unix.so nullok_secure #if you want password, too :)
auth    requisite    pam_google_authenticator.so
auth    [success=2]  pam_permit.so

Я полагаю, у вас есть OpenSSH> = 6.2 и sshd_config отредактированы

Для большей безопасности добавьте несколько дополнительных настроек: D

x4k3p
источник