GNU/Linux >> Tutoriales Linux >  >> Linux

Autenticación PAM para una aplicación heredada

La forma en que se pasa la información estándar (como una contraseña) para PAM es mediante el uso de variables establecidas en el identificador de pam con pam_set_item (consulte la página del manual para pam_set_item).

Puede configurar cualquier cosa que su aplicación necesite usar más adelante en pam_stack. Si desea colocar la contraseña en pam_stack, debería poder hacerlo inmediatamente después de llamar a pam_start() configurando la variable PAM_AUTHTOK en la pila de forma similar al pseudocódigo a continuación:

pam_handle_t* handle = NULL;
pam_start("common-auth", username, NULL, &handle);
pam_set_item( handle, PAM_AUTHTOK, password);

Esto hará que la contraseña esté disponible en la pila para cualquier módulo que quiera usarla, pero generalmente debe decirle al módulo que la use configurando las opciones estándar use_first_pass o try_first_pass en pam_configuration para el servicio (en este caso /etc /pam.d/common-auth).

El módulo pam_unix estándar admite try_first_pass, por lo que no estaría de más agregarlo a la configuración de pam en su sistema (al final de la línea para pam_unix).

Después de hacer esto, cualquier llamada a pam_authenticate() que se invocan desde el servicio de autenticación común solo deben elegir la contraseña e ir con ella.

Una pequeña nota sobre la diferencia entre use_first_pass y try_first_pass:ambos le dicen al módulo (en este caso pam_unix) que pruebe la contraseña en pam_stack, pero difieren en el comportamiento cuando no hay contraseña/AUTHTOK disponible. En caso de que falte, use_first_pass falla y try_first_pass permite que el módulo solicite una contraseña.


Esto es lo que terminé haciendo. Ver el comentario marcado con tres asteriscos.

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

// To build this:
// g++ test.cpp -lpam -o test

// if pam header files missing try:
// sudo apt install libpam0g-dev

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;
}

Linux
  1. 3 enfoques para la gestión de secretos para aplicaciones Flatpak

  2. ¿Vsftpd falla en la autenticación de Pam?

  3. tomboy-ng:aplicación simple para tomar notas para computadoras de escritorio

  4. Limitación del acceso al sistema para una aplicación de Linux

  5. chsh:la autenticación PAM falló

Deshabilitar la autenticación de contraseña SSH para un usuario o grupo específico

Cómo configurar la autenticación multifactor para SSH en Linux

Anatomía de un archivo de configuración de módulos de autenticación conectables (PAM) de Linux

Una introducción a los módulos de autenticación conectables (PAM) en Linux

Autenticación PAM

NGINX como proxy inverso para aplicación de nodo o angular