Как создать модуль pam?

Кто-нибудь может рассказать мне об этом... Я хочу создать модуль pam, аналогичный модулю входа в/etc/pam.d

Ответ 1

Если вы ищете аутентификацию лица на основе pam во время входа в систему, вам нужно написать модуль, который сделает это для вас, и подключить его в файле конфигурации входа в /etc/pam.d/login.

Прежде чем вдаваться в это, я предлагаю вам написать простой модуль для понимания потока, работы с PAM и конфигурационного файла, например, начать играть с конфигурационным файлом sshd pam и попытаться подключить некоторый образец модуля pam. Я нашел эту статью весьма полезной:

http://aplawrence.com/Basics/understandingpam.html

https://www.packtpub.com/article/development-with-pluggable-authentication-modules-pam

FYI: Rohan Anil разработал аутентификацию с помощью pam-face во время GSOC08 под openuse, который размещен на code.google.com/p/pam-face-authentication/

Ответ 2

Одним из лучших ресурсов для создания модулей pam является документация сам:

http://www.linux-pam.org/Linux-PAM-html/Linux-PAM_MWG.html

Однако я согласен с @GG в том, что вы понимаете, как работает PAM.

Ответ 3

Поскольку ответ на этот вопрос очень длинный, я могу связать вас с моими учебными пособиями по PAM: написание модуля Linux PAM и учебного пособия по настройке Linux PAM

Прежде чем приступить к написанию модуля, я советую вам сначала прочитать руководство по настройке, в котором вы можете узнать, что делает модуль.

Подводя итог, модуль представляет собой общий объект, загружаемый PAM, когда приложение хочет аутентифицироваться. Каждый раз, когда приложение вызывает "этап" (авторизация, учетная запись, сеанс, пароль), соответствующая функция вызывается в модуле. Поэтому ваш модуль должен обеспечивать следующие функции:

PAM_EXTERN int pam_sm_authenticate(pam_handle_t *handle, int flags, int argc, const char **argv){
    /* In this function we will ask the username and the password with pam_get_user()
     * and pam_get_authtok(). We will then decide if the user is authenticated */
}

PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const char **argv) {
    /* In this function we check that the user is allowed in the system. We already know
     * that he authenticated, but we could apply restrictions based on time of the day,
     * resources in the system etc. */
}

PAM_EXTERN int pam_sm_setcred(pam_handle_t *pamh, int flags, int argc, const char **argv) {
    /* We could have many more information of the user other then password and username.
     * These are the credentials. For example, a kerberos ticket. Here we establish those
     * and make them visible to the application */
}

PAM_EXTERN int pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char **argv) {
    /* When the application wants to open a session, this function is called. Here we should
     * build the user environment (setting environment variables, mounting directories etc) */
}

PAM_EXTERN int pam_sm_close_session(pam_handle_t *pamh, int flags, int argc, const char **argv) {
    /* Here we destroy the environment we have created above */
}

PAM_EXTERN int pam_sm_chauthtok(pam_handle_t *pamh, int flags, int argc, const char **argv){
    /* This function is called to change the authentication token. Here we should,
     * for example, change the user password with the new password */
}

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