Это можно сделать, связав вместе модули 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
- другими словами, это должно быть установлено для самого верхнего модуля auth [success = n default = ignore] + 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.