Это можно сделать, связав вместе модули 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