Categories: LinuxProgrammazione

Creare Applicazioni con Autenticazione Linux-PAM

In uno scorso articolo abbiamo introdotto il funzionamento dei moduli in Linux-PAM, questa volta implementaremo una semplicissima applicazione in linguaggio C che consente di autenticarsi attraverso il meccanismo dei moduli della libreria. Dal punto di vista del programmatore di un’applicazione, Linux-PAM permette di ignorare lo schema di autenticazione, in quanto sarà l’amministratore a configurarlo, lo sviluppatore si limita soltanto a caricare dinamicamente i moduli di autenticazione della libreria.
Ogni applicazione che intenda far uso della libreria, deve richiamare la funzione pam_authenticate che serve da interfaccia al meccanismo di autenticazione del modulo caricato. L’argomento principale della funzione è la struttura pam_handle_t che non deve mai essere modificata direttamente dal programma, ma accedervi attraverso le altre funzioni disponibili, per gli altri argomenti vi rimando alle pagine man, info o doc della libreria. Se l’autenticazione ha avuto successo la funzione restituisce PAM_SUCCESS, altrimenti un altro valore di fallimento. La gestione dell’accesso è gestita attraverso la funzione pam_acct_mgmt e viene richiamata dopo che l’utente è stato autenticato e permette l’accesso dell’utente al sistema. Dopo queste premesse vediamo in pratica l’uso della libreria Linux-PAM in un’applicazione di esempio con il file veruser.c:

#include <security/pam_appl.h>
#include <security/pam_misc.h>
#include <stdio.h>

static struct pam_conv conv = { misc_conv, NULL };

int main(int argc, char** argv)
{
   pam_handle_t* pamh = NULL;
   int retVal;
   const char* user = "nobody";

   if (argc == 2)
      user = argv[1];

   if (argc > 2)
   {
      fprintf(stderr, "Uso: veruser [nomeutente]\n");
      exit(1);
   }

   retVal = pam_start("veruser", user, &conv, &pamh);
   if (retVal == PAM_SUCCESS)
      retVal = pam_authenticate(pamh, 0);
   else
      fprintf(stderr, "Fallimento di pam_start\n");
   if (retVal == PAM_SUCCESS)
      retVal = pam_acct_mgmt(pamh, 0);
   else
      fprintf(stderr, "Fallimento di pam_authenticate\n");
   if (retVal == PAM_SUCCESS)
      printf("Autenticato!\n");
   else
      printf("Non Autenticato!\n");

   if (pam_end(pamh, retVal) != PAM_SUCCESS)
   {
      pamh = NULL;
      fprintf(stderr, "veruser: fallimento nella terminazione!\n");
      exit(1);
   }

   return (retVal == PAM_SUCCESS) ? 0 : 1;
}

Per compilare il programma occorre dare questo comando:

gcc -o veruser -lpam -lpam_misc -ldl veruser.c

Dopo il controllo dei parametri passati da linea di comando,  il codice provvede ad inizializzare l’interfaccia PAM con la funzione pam_start alla quale sono passati nell’ordine: il nome del servizio che deve essere uguale al modulo di configurazione nella cartella /etc/pam.d, il nome utente da autenticare. In caso di successo viene chiamata pam_authenticate che verifica l’identità dell’utente chiedendogli di immettere la password, quindi in caso di successo viene chiamata la funzione pam_acct_mgmt che si occupa di verificare le condizioni che consentono l’accesso all’utente.

Share
Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.

Recent Posts

MerciGest: il gestionale di magazzino semplice e gratuito

MerciGest è il software gestionale gratuito per Windows che semplifica la gestione del magazzino: giacenze,…

3 giorni ago

Software gestionali con SQL Server: un archivio unico, accessibile ovunque

Tutti i nostri software gestionali possono essere collegati a un database SQL Server, consentendo l’accesso…

4 giorni ago

Come iniziare ad usare MerciGest in 5 minuti

MerciGest è semplice e immediato: basta scaricare e installare il programma per iniziare subito. Al…

7 giorni ago

Cos’è MerciGest e a chi serve

MerciGest è un gestionale di magazzino per Windows pensato per negozi, piccole imprese e artigiani…

1 settimana ago

Introduzione alla Standard Template Library (STL)

La Standard Template Library (STL) è una delle componenti più potenti del C++. Fornisce una…

7 mesi ago

Un Abbonamento per Tutti i Software

Sono arrivato alla convinzione che un abbonamento per tutti i miei software gestionali sia il…

2 anni ago