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

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

2 ответа

Если вы ищете аутентификацию лица на основе 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

К вашему сведению: Рохан Анил разработал pam-face-аутентификацию во время GSOC08 под открытое использование, которое размещено на code.google.com/p/pam-face-authentication/

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

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

Подводя итог, можно сказать, что модуль является общим объектом, загружаемым 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's 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 см. В этом документе и в целом в документации модуля записи).

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

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

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

Другие вопросы по тегам