Ignorer le module PAM du lecteur d’empreintes digitales pour s’authentifier avec PAM depuis l’application C

Je voudrais authentifier les utilisateurs de mon application réseau C avec PAM et j’ai trouvé un bel exemple PAM ici sur Stack, que je joins en bas. Le problème est que dans ma machine de développement, j’ai un lecteur d’empreintes digitales que PAM est configuré pour utiliser, comme dans /etc/pam.d/common-auth :

 #%PAM-1.0 # # This file is autogenerated by pam-config. All changes # will be overwritten. # # Authentication-related modules common to all services # # This file is included from other service-specific PAM config files, # and should contain a list of the authentication modules that define # the central authentication scheme for use on the system # (eg, /etc/shadow, LDAP, Kerberos, etc.). The default is to use the # traditional Unix authentication mechanisms. # auth required pam_env.so auth sufficient pam_fprint.so auth optional pam_gnome_keyring.so auth required pam_unix2.so 

pam_fprint.so est le plugin lecteur d’empreintes digitales. Lorsque vous vous connectez normalement, l’parsing peut échouer et vous êtes invité à entrer un mot de passe. Cependant, le démon sshd n’initialise pas du tout l’empreinte digitale et j’aimerais comprendre comment il le saute, car par exemple, /etc/pam.d/sshd référence au module d’authentification commune, il doit donc le tirer.

 #%PAM-1.0 auth requirejsite pam_nologin.so auth include common-auth account requirejsite pam_nologin.so account include common-account password include common-password session required pam_loginuid.so session include common-session session optional pam_lastlog.so silent noupdate showfailed 

J’ai essayé de référencer le schéma ‘sshd’ du programme C mais il lance toujours le lecteur d’empreintes digitales. Je veux sauter le lecteur d’empreintes digitales en quelque sorte en C et conserver ma configuration par défaut du lecteur d’empreintes digitales.

  #include  #include  #include  #include  #include  // To build this: // g++ test.cpp -lpam -o test struct pam_response *reply; //function used to get user input int function_conversation(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr) { *resp = reply; return PAM_SUCCESS; } int main(int argc, char** argv) { if(argc != 2) { fprintf(stderr, "Usage: check_user \n"); exit(1); } const char *username; username = argv[1]; const struct pam_conv local_conversation = { function_conversation, NULL }; pam_handle_t *local_auth_handle = NULL; // this gets set by pam_start int retval; // local_auth_handle gets set based on the service retval = pam_start("common-auth", username, &local_conversation, &local_auth_handle); if (retval != PAM_SUCCESS) { std::cout << "pam_start returned " << retval << std::endl; exit(retval); } reply = (struct pam_response *)malloc(sizeof(struct pam_response)); // *** Get the password by any method, or maybe it was passed into this function. reply[0].resp = getpass("Password: "); reply[0].resp_retcode = 0; retval = pam_authenticate(local_auth_handle, 0); if (retval != PAM_SUCCESS) { if (retval == PAM_AUTH_ERR) { std::cout << "Authentication failure." << std::endl; } else { std::cout << "pam_authenticate returned " << retval << std::endl; } exit(retval); } std::cout << "Authenticated." << std::endl; retval = pam_end(local_auth_handle, retval); if (retval != PAM_SUCCESS) { std::cout << "pam_end returned " << retval << std::endl; exit(retval); } return retval; } 

Je doute que sshd saute ce module. Plutôt, je soupçonne que le module d’authentification du lecteur d’empreintes digitales (de manière sensée) vérifie si l’utilisateur authentifiant semble être sur le système local ou arrive sur le réseau (qu’il peut trouver dans les données PAM comme rhost ) et ne fait rien en silence c’est une authentification réseau. Vous pouvez essayer de regarder le code source pour voir s’il a un tel test, ou essayez de configurer PAM_RHOST via pam_set_item et voir si cela change le comportement.

Pour répondre à votre question, je ne pense pas qu’il soit possible de dire à PAM d’exécuter un groupe PAM particulier, à l’exception d’un module. La manière attendue de faire ce que vous voulez faire est de créer un nouveau fichier de configuration dans /etc/pam.d qui correspond au nom de l’application que vous transmettez à pam_start qui n’inclut pas common-auth mais contient uniquement les modules que vous souhaitez courir.