Пропустить модуль PAM считывателя отпечатков пальцев для аутентификации с помощью PAM из приложения C

Я хотел бы аутентифицировать пользователей моего сетевого приложения C с помощью PAM, и я нашел хороший пример PAM здесь, в стеке, который я прикрепляю внизу. Проблема в том, что на моей машине для разработки у меня есть считыватель отпечатков пальцев, для использования которого настроен PAM, как в /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                                                                                                                                                                        
# (e.g., /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 — это плагин для считывания отпечатков пальцев. Когда вы обычно входите в систему, сканирование может завершиться ошибкой, и вам будет предложено ввести пароль. Однако демон sshd вообще не инициирует отпечаток пальца, и я хотел бы понять, как он его пропускает, потому что, например, /etc/pam.d/sshd ссылается на модуль common-auth, поэтому он должен его вытащить.

#%PAM-1.0
auth     requisite  pam_nologin.so
auth     include        common-auth
account  requisite      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

Я попытался сослаться на схему «sshd» из программы C, но она все еще инициирует считыватель отпечатков пальцев. Я хочу как-то пропустить считыватель отпечатков пальцев в C и сохранить конфигурацию по умолчанию для считывателя отпечатков пальцев.

    #include <stdlib.h>
    #include <iostream>
    #include <fstream>
    #include <security/pam_appl.h>
    #include <unistd.h>

// 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 <username>\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;
}

person RushPL    schedule 06.06.2012    source источник


Ответы (1)


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

Чтобы ответить на ваш фактический вопрос, я не верю, что есть способ сказать PAM запустить определенную группу PAM, кроме одного модуля. Ожидаемый способ сделать то, что вы хотите, — это создать новый файл конфигурации в /etc/pam.d, который соответствует имени приложения, которое вы передаете pam_start, которое не включает common-auth, а вместо этого содержит только модули, которые вы хотите бегать.

person rra    schedule 17.03.2013
comment
Извините за позднее одобрение. PAM_RHOST был ключом, и я действительно обнаружил его независимо от вашего ответа. ;) - person RushPL; 05.05.2015