Linux Shadow Password HOWTO <author>Michael H. Jackson <tt>mhjack@tscnet.com</tt> <date>v1.3, 3 Aprile 1996 <abstract> Questo documento si propone di descrivere come ottenere, installare e configurare la Linux Password <em>Shadow Suite</em>. Esso spiega anche come ottenere e reinstallare altri software e demoni di rete che richiedono accesso alle password degli utenti. Questi ultimi software in realtà non fanno parte della <em>Shadow Suite</em>. Questo documento contiene inoltre un esempio di programmazione per aggiungere il supporto shadow ad un programma. Risposte ad alcune delle domande più frequenti sono incluse verso la fine di questo documento. Traduzione a cura di <htmlurl url="mailto:isacher@nettaxi.com" name="Isabella Ruocco <isacher@nettaxi.com>">, ultima revisione 25 Maggio 1999. </abstract> <!-- Indice --> <toc> <!-- Inizio del documento --> <sect><heading>Introduzione <p> Questo è il Linux Shadow Password HOWTO. Questo documento descrive perché e come aggiungere il supporto shadow password su un sistema Linux. Sono inclusi anche alcuni esempi su come usare alcune delle caratteristiche della <em>Shadow Suite</em>. <p> Quando si installa la <em>Shadow Suite</em> e quando si usano molti dei programmi di utilità, occorre essere collegati come <em>root</em>. Quando si installa la <em>Shadow Suite</em> verranno effettuati dei cambiamenti al software di sistema, ed è fortemente consigliato fare copie di backup dei programmi come indicato. Consiglio anche di leggere e comprendere tutte le istruzioni prima di iniziare. <sect1><heading>Cambiamenti dalla versione precedente <p> <verb>Aggiunte: Aggiunta una sotto-sezione sul perché potreste non voler installare le shadow Aggiunta una sotto-sezione sull'aggiornamento del programma xdm Aggiunta una sezione su come far funzionare le caratteristiche della Shadow Suite Aggiunta una sezione contenente le domande più frequenti (FAQ) Correzioni/Aggiornamenti: Correzione dei riferimenti html sul sunsite Correzione della sezione su wu-ftp in modo che tenga conto dell'aggiunta di -lshadow al Makefile Correzione di errori secondari di ortografia Cambiamento della sezione su wu-ftp in modo da supportare ELF Aggiornamenti sui problemi di sicurezza in diversi programmi di login Aggiornamenti sulla raccomandazione di Marek Michalkiewicz sulla Linux Shadow Suite </verb> <sect1><heading>Nuove versioni di questo documento <p> La più recente versione di questo documento si può anche ottenere via FTP anonimo da: <bf>sunsite.unc.edu</bf> <verb>/pub/Linux/docs/HOWTO/Shadow-Password-HOWTO</verb> oppure: <verb>/pub/Linux/docs/HOWTO/other-formats/Shadow-Password-HOWTO{-html.tar,ps,dvi}.gz</verb> o tramite il World Wide Web dal <url url="http://sunsite.unc.edu/mdw/linux.html" name="Linux Documentation Project Web Server">, alla pagina: <url url="http://sunsite.unc.edu/linux/HOWTO/Shadow-Password-HOWTO.html" name="Shadow-Password-HOWTO"> o direttamente da me, <tt><mhjack@tscnet.com></tt>. Sarà anche inviata al newsgroup: <tt>comp.os.linux.answers</tt> <p> Questo documento è ora impacchettato con i pacchetti Shadow-AAMMGG. <sect1><heading>Commenti e critiche <p> Per favore inviate qualunque commento, aggiornamento, o suggerimenti a me: <htmlurl url="mailto:mhjack@tscnet.com" name="Michael H. Jackson <mhjack@tscnet.com>">. Prima ricevo feedback, prima posso aggiornare e correggere questo documento. Se avete dei problemi, per favore mandate una e-mail direttamente a me, dato che molto raramente rimango aggiornato con i newsgroup. <sect><heading> Perché "oscurare" il vostro file passwd? <p> Come impostazione predefinita, la maggior parte delle attuali distribuzioni Linux non contengono la <em>Shadow Suite</em> installata. Questo riguarda la Slackware 2.3, Slackware 3.0 ed altre famose distribuzioni. Una delle ragioni di questo è che le informazioni sul copyright nella <em>Shadow Suite</em> originale non spiegavano chiaramente se si dovesse versare una somma per la ridistribuzione. Linux usa un Copyright GNU (a cui talvolta si fa riferimento come Copyleft) che permette alle persone di impacchettarlo in un supporto conveniente (come una distribuzione su CD-ROM) e di venderlo. <p> L'attuale manutentore della <em>Shadow Suite</em>, <htmlurl url="mailto:marekm@i17linuxb.ists.pwr.wroc.pl" name="Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl>"> ha ricevuto il codice sorgente dall'autore originale con un copyright tipo BSD che permette la ridistribuzione. Ora che i problemi di copyright sono risolti, ci si aspetta che le future distribuzioni conterranno le shadow password come opzione predefinita. Fino ad allora, dovrete installarvele voi. <p> Se avete installato la vostra distribuzione da un CD-ROM, potrebbe succedere che, anche se la distribuzione non aveva la <em>Shadow Suite</em> installata, alcuni dei file che vi occorrono per installare la <em>Shadow Suite</em> siano sul CD-ROM. <p> <em>Comunque, le versioni 3.3.1, 3.3.1-2 della Shadow Suite e la shadow-mk potrebbero avere problemi di sicurezza con il loro programma di login e molti altri programmi <em>SUID root</em> che si trovano insieme ad esse, e non dovrebbero essere più usate.</em> <p> Tutti i file necessari si possono ottenere via FTP anonimo o tramite il World Wide Web. <p> Su un sistema Linux senza la <em>Shadow Suite</em> installata, le informazioni sugli utenti, comprese la password, sono contenute nel file <tt>/etc/passwd</tt>. La password viene conservata in un formato <em>criptato</em>. Se chiedete ad un esperto crittografo, comunque, lui o lei vi diranno che la password è in realtà in un formato <em>codificato</em> piuttosto che <em>criptato</em>, perché quando viene usato crypt(3), viene preso un testo vuoto e la password è usata come chiave. Perciò, da qui in poi, in questo documento, userò il termine <em>codificato</em>. <p> Tecnicamente ci si riferisce all'algoritmo usato per codificare il campo password come ad una <em>funzione hash monodirezionale</em>. Questa è un algoritmo che è facile eseguire in una direzione, ma molto difficile eseguire nella direzione opposta. Altre informazioni sull'algoritmo usato si possono trovare nel paragrafo 2.4 o nella vostra pagina di manuale per crypt(3). <p> Quando un utente sceglie o gli viene assegnata una password, questa viene codificata con un valore generato casualmente detto <em>seme</em> ("salt"). Questo significa che una certa password può essere memorizzata in 4096 modi diversi. Il valore del <em>seme</em> viene memorizzato insieme alla password codificata. <p> Quando un utente si collega e fornisce una password, prima viene prelevato il <em>seme</em> dalla password codificata in memoria. Poi la password digitata viene <em>codificata</em> con tale valore del <em>seme</em> e quindi confrontata con la password <em>codificata</em>. Se c'è corrispondenza l'utente viene autenticato. <p> È computazionalmente difficile (ma non impossibile), ricostruire la password originale dalla password <em>codificata</em> casualmente. Comunque, su ogni sistema con più di qualche utente, almeno alcune delle password saranno parole comuni (o semplici variazioni di parole comuni). <p> Gli "scassinatori" di sistemi informatici sono a conoscenza di questo, e semplicemente critteranno un vocabolario di parole e password comuni usando tutti i 4096 possibili valori di <em>seme</em>. Quindi confronteranno le password codificate nel vostro file <tt>/etc/passwd</tt> con il loro database. Una volta trovata una corrispondenza, avranno la password per un altro account. Questo viene chiamato <em>attacco a vocabolario</em> ed è uno dei metodi più comuni per ottenere o diffondere accessi non autorizzati ad un sistema. <p> Se ci pensate, una password di 8 caratteri codifica fino a 4096*13 stringhe di caratteri. Perciò un vocabolario di, diciamo, 400.000 parole comuni, nomi, password e semplici variazioni starà facilmente su un disco fisso da 4GB. Lo scassinatore dovrà solo ordinarle e cercare le corrispondenze. Poiché un disco fisso da 4GB si può avere a meno di $1000.00, è ampiamente nelle possibilità di molti scassinatori di sistemi informatici. <p> Inoltre, se uno scassinatore ottiene prima il file <tt>/etc/passwd</tt>, avrà bisogno solo di codificare il vocabolario con i valori del <tt>seme</tt> effettivamente contenuti nel vostro file <tt>/etc/passwd</tt>. Questo metodo può essere usato dall'adolescente medio con un paio di Megabyte liberi e un computer 486. <p> Anche senza molto spazio su disco, utility come crack(1) possono di solito corrompere almeno un paio di password su un sistema con un discreto numero di utenti (assumendo che gli utenti del sistema possano scegliersi le loro password). <p> Il file <tt>/etc/passwd</tt> contiene anche informazioni tipo gli user ID e i group ID che sono usati da molti programmi di sistema. Perciò il file <tt>/etc/passwd</tt> <em>deve</em> rimanere accessibile a tutti. Se voi cambiaste il file <tt>/etc/passwd</tt> in modo che nessuno possa leggerlo, la prima cosa che notereste sarebbe che il comando <tt>ls -s</tt> ora mostrerebbe gli user ID invece dei nomi! <p> La <em>Shadow Suite</em> risolve il problema spostando le password in un altro file (di solito <tt>/etc/shadow</tt>). Il file <tt>/etc/shadow</tt> viene impostato in modo che quasi nessuno possa leggerlo. Solo <em>root</em> potrà leggere e scrivere il file <tt>/etc/shadow</tt>. Alcuni programmi (come xlock) non devono poter cambiare le password, occorre solo che le possano verificare. Questi programmi possono essere eseguiti <em>SUID root</em> oppure si può creare un gruppo <em>shadow</em> a cui è permesso l'accesso solo in lettura al file <tt>/etc/shadow</tt>. Quindi i programmi possono essere eseguiti <em>SGID shadow</em>. <p> Spostando le password nel file <tt>/etc/shadow</tt>, stiamo effettivamente impedendo allo scassinatore di avere accesso alle password codificate con cui eseguire l'<em>attacco a vocabolario</em>. <p> Inoltre, la <em>Shadow Suite</em> aggiunge molte altre caratteristiche interessanti: <itemize> <item>un file di configurazione per impostare le caratteristiche predefinite di login (<tt>/etc/login.defs</tt>) <item>utility per aggiungere, modificare e cancellare account di utenti e gruppi <item>invecchiamento e scadenza delle password <item>scadenza e blocco degli account <item>password di gruppo "oscurate" (opzionale) <item>password di doppia lunghezza (password da 16 caratteri) [SCONSIGLIATO] <item>migliore controllo sulla scelta delle password degli utenti <item>dial-up password <item>programmi di autenticazione secondaria [SCONSIGLIATO] </itemize> <p> Installare la <em>Shadow Suite</em> contribuisce alla sicurezza del sistema ma ci sono anche molte altre cose che si possono fare per migliorare la sicurezza di un sistema Linux, e ci saranno alcuni Linux Security HOWTO che discutono altre misure di sicurezza ed aspetti correlati. <p> Per informazioni aggiornate su altri aspetti della sicurezza in Linux, tra cui avvertimenti sulle debolezze note guardate la <url url="http://bach.cis.temple.edu/linux/linux-security/" name="Linux Security home page."> <sect1><heading>Perchè potreste NON voler "oscurare" il vostro file passwd <p> Ci sono alcune circostanze e configurazioni in cui installare la <em>Shadow Suite</em> <em>NON</em> sarebbe una buona idea: <itemize> <item>la macchina non contiene account di utenti <item>la vostra macchina funziona su una LAN e usa NIS (Network Information Services) per ottenere e fornire nomi e password degli utenti alle altre macchine sulla rete (in realtà si potrebbe fare, ma è oltre lo scopo di questo documento, e in realtà non aumenterebbe comunque molto la sicurezza) <item>la vostra macchina viene usata dai server dei terminali per verificare gli utenti con NFS (Network File System), NIS, o qualche altro metodo <item>la vostra macchina esegue altro codice per validare gli utenti, e non c'è nessuna versione shadow disponibile, e non avete il codice sorgente. </itemize> <sect1><heading>Formato del file /etc/passwd <p> Un file <tt>/etc/passwd</tt> non "oscurato" ha il seguente formato: <tscreen><verb>nomeutente:passwd:UID:GID:nome_completo:directory:shell</verb></tscreen> Dove: <descrip> <tag/<tt>nomeutente</tt></tag> Il nome (di login) dell'utente <tag/<tt>passwd</tt></tag> La password codificata <tag/<tt>UID</tt></tag> Identificativo numerico dell'utente <tag/<tt>GID</tt></tag> Identificativo numerico predefinito del gruppo <tag/<tt>nome_completo</tt></tag> Il nome completo dell'utente - in realtà questo campo viene chiamato campo GECOS (General Electric Comprehensive Operating System) e può contenere altre informazioni invece del solo nome completo. I comandi Shadow e le pagine di manuale si riferiscono a questo campo come al campo commento. <tag/<tt>directory</tt></tag> Home directory dell'utente (percorso completo) <tag/<tt>shell</tt></tag> Shell di login dell'utente (percorso completo) </descrip> Ad esempio: <tscreen><verb>nomeutente:Npge08pfz4wuk:503:100:Nome Completo:/home/nomeutente:/bin/sh</verb></tscreen> Dove <tt>Np</tt> è il seme e <tt>ge08pfz4wuk</tt> è la password <em>codificata</em>. La coppia seme/password codificata avrebbe anche potuto essere <tt>kbeMVnZM0oL7I</tt> e queste due sono esattamente la stessa password. Ci sono 4096 possibili codifiche per la stessa password (la password usata in questo esempio è 'password', una <em>pessima</em> password). <p> Una volta che la Shadow Suite è installata, il file <tt>/etc/passwd</tt> invece conterrà: <tscreen><verb>nomeutente:x:503:100:Nome Completo:/home/nomeutente:/bin/sh</verb></tscreen> La <tt>x</tt> nel secondo campo in questo caso è ora soltanto un segnaposto. Il formato del file <tt>/etc/passwd</tt> non è di fatto cambiato, solo che non contiene più le password <em>codificate</em>. Questo significa che qualunque programma che legge il file <tt>/etc/passwd</tt>, ma in realtà non ha bisogno di verificare le password, funzionerà ancora correttamente. <p> Le password sono ora situate nel file shadow (di solito il file <tt>/etc/shadow</tt>). <sect1><heading>Formato del file shadow <p> Il file <tt>/etc/shadow</tt> contiene le seguenti informazioni: <tscreen><verb>nomeutente:passwd:ult:può:deve:avv:scad:disab:riservato</verb></tscreen> Dove: <descrip> <tag/<tt>nomeutente</tt></tag> Il nome dell'utente <tag/<tt>passwd</tt></tag> La password codificata <tag/<tt>ult</tt></tag> Giorni dal 1 Gennaio 1970 fino all'ultima modifica della password <tag/<tt>può</tt></tag> Giorni prima che la password possa essere cambiata <tag/<tt>deve</tt></tag> Giorni dopo i quali la password deve essere cambiata <tag/<tt>avv</tt></tag> Giorni prima della scadenza della password in cui l'utente viene avvisato <tag/<tt>scad</tt></tag> Giorni dopo la scadenza della password in cui l'account viene disabilitato <tag/<tt>disab</tt></tag> Giorni a partire dal 1 Gennaio 1970 dopo cui l'account verrà disabilitato <tag/<tt>riservato</tt></tag> Campo riservato </descrip> Il precedente esempio potrebbe allora essere: <tscreen><verb>nomeutente:Npge08pfz4wuk:9479:0:10000::::</verb></tscreen> <sect1><heading>Uno sguardo a crypt(3) <p> Dalla pagina di manuale di crypt(3): <p> &dquot;<em>crypt</em> è la funzione di crittaggio delle password. Si basa sull'algoritmo <em>Data Encryption Standard</em> con variazioni aventi lo scopo (tra le altre cose) di scoraggiare l'uso di implementazioni hardware per la ricerca della chiave. <p> [La] chiave è la password digitata dall'utente. [La stringa codificata è tutta vuota.] <p> [Il] <em>seme</em> è una stringa di due caratteri scelta nell'insieme [a-z A-Z 0-9./]. Questa stringa viene usata per perturbare l'algoritmo in uno tra 4096 modi diversi. <p> Prendendo i 7 bit meno significativi di ogni carattere della chiave, si ottiene una chiave di 56 bit. Questa chiave di 56 bit viene usata per crittare ripetutamente una stringa costante (di solito una stringa costituita di zeri). Il valore restituito punta alla password crittata, un insieme di 13 caratteri ASCII stampabili (i primi due caratteri sono il seme stesso). Il valore di ritorno punta a dati statici il cui contenuto viene sovrascritto da ogni chiamata. <p> <bf>Attenzione:</bf> lo spazio chiave consiste di 2**56 cioè 7.2e16 possibili valori. <bf>È possibile</bf> effettuare ricerche esaustive di questo spazio chiave usando computer massivamente paralleli. È disponibile del software, come <tt>crack(1)</tt>, che cercherà la porzione di questo spazio chiave che viene generalmente usata dagli umani per le password. Perciò la scelta delle password dovrebbe, come minimo, evitare parole e nomi comuni. Si raccomanda l'uso di un programma <tt>passwd(1)</tt> che, durante il processo di selezione, controlla se le password sono vulnerabili a manomissioni. <p> Lo stesso algoritmo DES ha alcune arguzie che rendono l'uso dell'interfaccia <tt>crypt(3)</tt> una scelta inefficace per qualunque altra cosa che non sia l'autenticazione di password. Se state pensando di usare l'interfaccia <tt>crypt(3)</tt> per un progetto di crittografia non lo fate: prendete un buon libro sulla crittografia e una delle librerie DES ampiamente disponibili.&dquot; <p> Molte <em>Shadow Suite</em> contengono codice per raddoppiare la lunghezza della password a 16 caratteri. Esperti in <tt>DES</tt> sconsigliano questo, dato che la codifica viene semplicemente applicata prima alla metà di sinistra e poi alla metà di destra della password allungata. A causa del modo in cui funziona <tt>crypt</tt>, la password codificata di lunghezza doppia potrebbe risultare addirittura <em>meno</em> sicura. Inoltre, è meno facile che un utente riesca a ricordare una password da 16 caratteri. <p> È in via di sviluppo un lavoro che permetterebbe all'algoritmo di autenticazione di essere sostituito con qualcosa di più sicuro, che supporti password più lunghe (in particolare l'algoritmo MD5) e mantenga compatibilità con il metodo <tt>crypt</tt>.<p> Se state cercando un buon libro sulla crittografia, vi consiglio: <verb> "Applied Cryptography: Protocols, Algorithms, and Source Code in C" di Bruce Schneier <schneier@chinet.com> ISBN: 0-471-59756-2 </verb> <sect><heading>Ottenere la Shadow Suite <sect1><heading>Storia della Shadow Suite per Linux <p> <em>NON USATE I PACCHETTI DI QUESTO CAPITOLO, HANNO PROBLEMI DI SICUREZZA</em> <p> La <em>Shadow Suite</em> originale è stata scritta da <tt>John F. Haugh II</tt>. <p> Esistono diverse versioni che sono state usate su sistemi Linux: <itemize> <item><tt>shadow-3.3.1</tt> è l'originale; <item><tt>shadow-3.3.1-2</tt> è la patch specifica per Linux fatta da <htmlurl url="mailto:flla@stud.uni-sb.de" name="Florian La Roche <flla@stud.uni-sb.de>"> e contiene alcuni ulteriori miglioramenti; <item><tt>shadow-mk</tt> è stata specificamente impacchettata per Linux. </itemize> <p> Il pacchetto <tt>shadow-mk</tt> contiene il pacchetto <tt>shadow-3.3.1</tt> distribuito da <tt>John F. Haugh II</tt> con la <tt>patch shadow-3.3.1-2</tt> installata, alcune correzioni fatte da <htmlurl url="mailto:magnus@texas.net" name="Mohan Kokal <magnus@texas.net>"> che semplificano molto l'installazione, una patch di <tt>Joseph R.M. Zbiciak</tt> per <tt>login1.c</tt> (login.secure) che elimina i bachi di sicurezza -f, -h in /bin/login, e alcune altre patch di vario tipo. <p> Il pacchetto <tt>shadow.mk</tt> era il pacchetto <em>precedentemente</em> raccomandato, ma dovrebbe essere sostituito a causa di <em>problemi di sicurezza</em> con il programma di <tt>login</tt>. <p> Ci sono problemi di <em>sicurezza</em> con le versioni 3.3.1, 3.3.1-2 di Shadow, e con shadow-mk che coinvolgono il programma di <tt>login</tt>. Questo baco di <tt>login</tt> riguarda il mancato controllo di un nome di login. Questo provoca un overflow nel buffer, con conseguente crash o peggio. Si è diffusa la voce che questo overflow del buffer possa permettere a qualcuno con un account sul sistema di usare questo baco e le librerie condivise per ottenere l'accesso come <em>root</em>. Non discuterò esattamente come questo sia possibile, perché ci sono molti sistemi Linux che ne sono affetti, ma sistemi con queste <em>Shadow Suite</em> installate e la maggior parte delle distribuzioni pre-ELF <em>senza</em> la <em>Shadow Suite</em> sono vulnerabili! <p> Per avere maggiori informazioni su questo e altri aspetti della sicurezza su Linux, guardate la: <url url="http://bach.cis.temple.edu/linux/linux-security/Linux-Security-FAQ/Linux-telnetd.html" name="Linux Security home page (Shared Libraries and login Program Vulnerability)"> <sect1><heading>Dove prendere la Shadow Suite <p> L'unica <em>Shadow Suite</em> raccomandata è ancora in beta testing, comunque le ultime versioni sono sicure in un ambiente di produzione e non contengono un programma di <tt>login</tt> vulnerabile. <p> Il pacchetto usa la seguente convenzione di denominazione: <tscreen><verb>shadow-AAMMGG.tar.gz</verb></tscreen> dove <tt>AAMMGG</tt> è la data di rilascio della Suite. <p> Questa versione alla fine diventerà la <em>Versione 3.3.3</em> quando verrà rilasciata dal beta testing ed è mantenuta da <htmlurl url="mailto:marekm@i17linuxb.ists.pwr.wroc.pl" name="Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl>">. È disponibile come: <url url="ftp://i17linuxb.ists.pwr.wroc.pl/pub/linux/shadow/shadow-current.tar.gz" name="shadow-current.tar.gz">. <p> Sono stati anche organizzati i seguenti siti mirror: <itemize> <item><htmlurl url="ftp://ftp.icm.edu.pl/pub/Linux/shadow/shadow-current.tar.gz" name="ftp://ftp.icm.edu.pl/pub/Linux/shadow/shadow-current.tar.gz"> <item><htmlurl url="ftp://iguana.hut.fi/pub/linux/shadow/shadow-current.tar.gz" name="ftp://iguana.hut.fi/pub/linux/shadow/shadow-current.tar.gz"> <item><htmlurl url="ftp://ftp.cin.net/usr/ggallag/shadow/shadow-current.tar.gz" name="ftp://ftp.cin.net/usr/ggallag/shadow/shadow-current.tar.gz"> <item><htmlurl url="ftp://ftp.netural.com/pub/linux/shadow/shadow-current.tar.gz" name="ftp://ftp.netural.com/pub/linux/shadow/shadow-current.tar.gz"> </itemize> <p> Dovreste usare la versione attualmente disponibile. <p> NON dovreste usare una versione <em>precedente</em> alla <tt>shadow-960129</tt> perché anche quelle hanno il problema di sicurezza di <tt>login</tt> discusso sopra. <p> Quando questo documento fa riferimento alla <em>Shadow Suite</em> mi riferisco a questo pacchetto. Si assume che sia questo il pacchetto che state usando. <p> Per riferimento, io ho usato <tt>shadow-960129</tt> per fare queste istruzioni di installazione. <p> Se stavate usando <tt>shadow-mk</tt>, dovreste fare l'aggiornamento a questa versione e ricompilare tutto ciò che avevate originariamente compilato. <sect1><heading>Cosa è incluso nella Shadow Suite <p> La <em>Shadow Suite</em> contiene programmi sostitutivi per: <p> <tt>su, login, passwd, newgrp, chfn, chsh, e id</tt> <p> Il pacchetto contiene anche i nuovi programmi: <p> <tt>chage, newusers, dpasswd, gpasswd, useradd, userdel, usermod, groupadd, groupdel, groupmod, groups, pwck, grpck, lastlog, pwconv, e pwunconv</tt> <p> Inoltre è compresa la libreria: <tt>libshadow.a</tt> per scrivere e/o compilare programmi che necessitino di accedere alle password degli utenti. <p> Sono anche comprese pagine di manuale per i programmi. <p> C'è anche un file di configurazione per il programma di login che sarà installato come <tt>/etc/login.defs</tt>. <sect><heading>Compilare i programmi <sect1><heading>Spacchettare l'archivio <p> Il primo passo dopo aver ottenuto il pacchetto è spacchettarlo. Il pacchetto è nel formato tar (tape archive) e compresso usando gzip, perciò prima spostatelo in <tt>/usr/src</tt>, poi digitate: <tscreen><verb>tar -xzvf shadow-current.tar.gz</verb></tscreen> <p> Questo lo spacchetterà nella directory: <tt>/usr/src/shadow-AAMMGG</tt> <sect1><heading>Configurare con il file config.h <p> La prima cosa che avete bisogno di fare è sovrascrivere il <tt>Makefile</tt> e il file <tt>config.h</tt>: <tscreen><verb>cd /usr/src/shadow-AAMMGG cp Makefile.linux Makefile cp config.h.linux config.h</verb></tscreen> <p> Dovreste poi dare un'occhiata al file <tt>config.h</tt>. Questo file contiene definizioni per alcune delle opzioni di configurazione. Se state usando il pacchetto <em>consigliato</em>, vi consiglio, almeno per la prima volta, di disabilitare il supporto per il gruppo shadow. <p> Come opzione predefinita, sono abilitate le password di gruppo "oscurate". Per disabilitarle, editate il file <tt>config.h</tt>, e cambiate il <tt>#define SHADOWGRP</tt> in <tt>#undef SHADOWGRP</tt>. Consiglio di disabilitarle per iniziare, e poi se volete davvero le password di gruppo e gli amministratori di gruppo, li abiliterete in seguito e ricompilerete. Se le lasciate abilitate, <em>dovete</em> creare il file <tt>/etc/gshadow</tt>. <p> Abilitare l'opzione per le password lunghe NON è raccomandato, come discusso sopra. <p> <em>NON</em> cambiate l'impostazione: <tt>#undef AUTOSHADOW</tt> <p> L'opzione <tt>AUTOSHADOW</tt> era stata in origine progettata in modo che i programmi che ignoravano la presenza delle shadow password avrebbero continuato a funzionare. Questo in teoria suona bene, ma non funziona correttamente. Se abilitate questa opzione, e il programma viene eseguito da root, potrebbe chiamare <tt>getpwnam()</tt> da root, e in seguito riscrivere il campo modificato nel file <tt>/etc/passwd</tt> (con <em>la password non più "oscurata"</em>). Fanno parte di tali programmi chfn e chsh (non potete aggirare questo problema semplicemente scambiando l'identificativo utente reale con quello effettivo prima di chiamare <tt>getpwnam()</tt> perché anche root potrebbe usare chfn e chsh). <p> Lo stesso avvertimento vale anche se state compilando libc, che ha un'opzione <tt>SHADOW_COMPAT</tt> che fa la stessa cosa. <em>NON dovrebbe</em> essere usata. Se cominciate a rimettere le password codificate nel vostro file <tt>/etc/passwd</tt>, questo è il problema. <p> Se state usando una versione di <tt>libc</tt> precedente alla 4.6.27, avrete bisogno di fare un paio di modifiche al <tt>config.h</tt> e al <tt>Makefile</tt>. Per il <tt>config.h</tt> editate e cambiate: <tscreen><verb>#define HAVE_BASENAME</verb></tscreen> in: <tscreen><verb>#undef HAVE_BASENAME</verb></tscreen> Poi, nel <tt>Makefile</tt>, cambiate: <tscreen><verb>SOBJS = smain.o env.o entry.o susetup.o shell.o sub.o mail.o motd.o sulog.o age.o tz.o hushed.o SSRCS = smain.c env.c entry.c setup.c shell.c pwent.c sub.c mail.c motd.c sulog.c shadow.c age.c pwpack.c rad64.c tz.c hushed.c</verb></tscreen> in: <tscreen><verb>SOBJS = smain.o env.o entry.o susetup.o shell.o sub.o mail.o motd.o sulog.o age.o tz.o hushed.o basename.o SSRCS = smain.c env.c entry.c setup.c shell.c pwent.c sub.c mail.c motd.c sulog.c shadow.c age.c pwpack.c rad64.c tz.c hushed.c basename.c</verb></tscreen> Questi cambiamenti aggiungono il codice contenuto in <tt>basename.c</tt> che è contenuto in <tt>libc 4.6.27</tt> e successive. <sect1><heading>Fare copie di backup dei vostri programmi originali <p> Sarebbe anche una buona idea rintracciare e fare copie di backup dei programmi che la Shadow Suite sostituirà. Su un sistema Slackware 3.0 questi sono: <itemize> <item>/bin/su <item>/bin/login <item>/usr/bin/passwd <item>/usr/bin/newgrp <item>/usr/bin/chfn <item>/usr/bin/chsh <item>/usr/bin/id </itemize> <p> Il pacchetto BETA ha una destinazione di <em>salvataggio</em> nel Makefile, ma è commentata perché distribuzioni diverse mettono i programmi in posti diversi. <p> Dovreste anche fare una copia di backup del vostro file <tt>/etc/passwd</tt>, ma state attenti a rinominarlo se lo mettete nella stessa directory così non sovrascriverete il comando <tt>passwd</tt>. <sect1><heading>Eseguire il make <p> <em>È necessario che siate collegati come root per fare la maggior parte dell'installazione</em>. <p> Eseguite make per compilare gli eseguibili nel pacchetto: <tscreen><verb>make all</verb></tscreen> <p> Potreste vedere l'avvertimento: <tt>rcsid defined but not used</tt>. È tutto a posto, succede solo perché l'autore sta usando un pacchetto con il controllo di versione. <sect><heading>Installazione <sect1><heading>Tenete a portata di mano un disco di boot nel caso faceste qualche danno <p> Se qualcosa va terribilmente male, sarebbe utile avere un disco di boot. Se avete la combinazione boot/root dalla vostra installazione, questa funzionerà, altrimenti leggete il <url url="http://sunsite.unc.edu/mdw/HOWTO/Bootdisk-HOWTO.html" name="Bootdisk-HOWTO">, che descrive come fare un disco di boot. <sect1><heading>Rimuovere le pagine di manuale duplicate <p> Dovreste anche spostare le pagine di manuale che stanno per essere sostituite. Anche se siete abbastanza coraggiosi da installare la Shadow Suite senza fare backup, comunque vorrete togliere le vecchie pagine di manuale. Le nuove pagine di manuale normalmente non sovrascriveranno quelle vecchie perché quelle vecchie sono probabilmente compresse. <p> Potete usare la combinazione del <tt>comando man -aW</tt> e del <tt>comando locate</tt> per spostare le pagine man che devono essere (ri)mosse. È generalmente più facile trovare quali sono le vecchie pagine man prima di eseguire <tt>make install</tt>. <p> Se state usando la distribuzione Slackware 3.0, allora le pagine man che volete rimuovere sono: <itemize> <item>/usr/man/man1/chfn.1.gz <item>/usr/man/man1/chsh.1.gz <item>/usr/man/man1/id.1.gz <item>/usr/man/man1/login.1.gz <item>/usr/man/man1/passwd.1.gz <item>/usr/man/man1/su.1.gz <item>/usr/man/man5/passwd.5.gz </itemize> <p> Ci potrebbero anche essere delle pagine man con lo stesso nome nelle sottodirectory <tt>/var/man/cat[1-9]</tt> che dovrebbero anch'esse essere cancellate. <sect1><heading>Eseguire make install <p> Siete ora pronti a digitare (fatelo come root) <tscreen<verb>make install</verb></tscreen> <p> Questo installerà i programmi nuovi e quelli sostitutivi e sistemerà i permessi dei file. Installerà anche le pagine man. <p> Questo si occupa anche di installare i file include della Shadow Suite nelle posizioni corrette in <tt>/usr/include/shadow</tt>. <p> Usando il pacchetto BETA dovete copiare manualmente il file <tt>login.defs</tt> nella sottodirectory <tt>/etc</tt> ed essere sicuri che solo <em>root</em> possa cambiarlo. <tscreen><verb>cp login.defs /etc chmod 700 /etc/login.defs</verb></tscreen> <p> Questo file è il file di configurazione per il programma di <em>login</em>. Dovreste controllare e apportare i cambiamenti opportuni a questo file per il vostro particolare sistema. Qui è dove potete decidere da quale tty root può collegarsi e stabilire altre opzioni di strategia di sicurezza (come predefinire la scadenza delle password). <sect1><heading>Eseguire pwconv <p> Il passo successivo è eseguire <tt>pwconv</tt>. Anche questo deve essere fatto da <em>root</em>, ed è meglio che venga fatto dalla sottodirectory <tt>/etc</tt>: <tscreen><verb>cd /etc /usr/sbin/pwconv</verb></tscreen> <p> <tt>pwconv</tt> prende il vostro file <tt>/etc/passwd</tt> e ne estrae i campi allo scopo di creare due file: <tt>/etc/npasswd</tt> e <tt>/etc/nshadow</tt>. <p> Viene anche fornito un programma <tt>pwunconv</tt> qualora aveste bisogno di ricostruire il file originale <tt>/etc/passwd</tt> dalla combinazione <tt>/etc/passwd</tt> e <tt>/etc/shadow</tt>. <sect1><heading>Rinominare npasswd e nshadow <p> Ora che avete eseguito <tt>pwconv</tt> avete creato i file <tt>/etc/npasswd</tt> e <tt>/etc/nshadow</tt>. Questi file devono essere copiati in <tt>/etc/passwd</tt> e <tt>/etc/shadow</tt>. Vogliamo anche fare una copia di backup del file originale <tt>/etc/passwd</tt> ed essere sicuri che solo root possa leggerlo. Metteremo la copia di backup nella home directory di root: <tscreen><verb>cd /etc cp passwd ~passwd chmod 600 ~passwd mv npasswd passwd mv nshadow shadow</verb></tscreen> <p> Dovreste anche assicurarvi che la proprietà e i permessi dei file siano corretti. Se state per usare <em>X-Windows</em>, i programmi <tt>xlock</tt> e <tt>xdm</tt> devono poter leggere il file <tt>shadow</tt> (ma non scriverlo). <p> Ci sono due modi per fare questo. Potete impostare <tt>xlock</tt> come SUID root (<tt>xdm</tt> di solito viene comunque eseguito da root). Oppure potete fare in modo che il proprietario del file <tt>shadow</tt> sia <tt>root</tt> con un gruppo <tt>shadow</tt>, ma prima che lo facciate, siate sicuri di avere un gruppo shadow (guardate in <tt>/etc/group</tt>). Nessuno degli utenti del sistema dovrebbe in realtà stare nel gruppo shadow. <tscreen><verb>chown root.root passwd chown root.shadow shadow chmod 0644 passwd chmod 0640 shadow</verb></tscreen> <p> Il vostro sistema ha ora il file password "oscurato". <em>Dovreste</em> ora andare su un altro terminale virtuale e verificare che possiate collegarvi. <p> <em>Davvero, fatelo adesso!</em> <p> Se non potete, allora c'è qualcosa di sbagliato! Per ritornare a un stato non "oscurato", fate ciò che segue: <tscreen><verb>cd /etc cp ~passwd passwd chmod 644 passwd</verb></tscreen> <p> Dovreste poi ripristinare nelle loro corrette posizioni i file che avevate salvato prima. <sect><heading>Altri programmi a cui potreste dover fare un aggiornamento o applicare una patch <p> Anche se la shadow suite contiene programmi sostitutivi per la maggior parte dei programmi che hanno bisogno di accedere alle password, ci sono alcuni altri programmi su molti sistemi che richiedono accesso alle password. <p> Se state usando una <em>Distribuzione Debian </em> (o anche se non la usate), potete ottenere i sorgenti Debian per i programmi che devono essere ricompilati da: ftp://ftp.debian.org/debian/stable/source/ <p> Il resto di questa sezione si occupa di come aggiornare <tt>adduser</tt>, <tt>wu_ftpd</tt>, <tt>ftpd</tt>, <tt>pop3d</tt>, <tt>xlock</tt>, <tt>xdm</tt> e <tt>sudo</tt> in modo che supportino la shadow suite. <p> Guardate il capitolo <ref id="sez-agg" name="Aggiungere il supporto Shadow ad un programma C"> per una discussione su come aggiungere il supporto shadow a qualunque altro programma che ne abbia bisogno (anche se il programma deve allora essere eseguito SUID root o SGID shadow per poter veramente accedere al file shadow). <sect1><heading>Il programma adduser della Slackware <p> Le distribuzioni Slackware (e forse anche altre) contengono un programma interattivo per aggiungere utenti chiamato <tt>/sbin/adduser</tt>. Una versione shadow di questo programma si può ottenere da <htmlurl url="ftp://sunsite.unc.edu/pub/Linux/system/Admin/accounts/adduser.shadow-1.4.tgz" name="ftp://sunsite.unc.edu/pub/Linux/system/Admin/accounts/adduser.shadow-1.4.tar.gz">. <p> Vi incoraggio ad usare i programmi che vengono forniti con la <em>Shadow Suite</em> (<tt>useradd</tt>, <tt>usermod</tt>, e <tt>userdel</tt>) invece del programma Slackware <tt>adduser</tt>. Imparare ad usarli richiede poco tempo, ma vale la pena fare lo sforzo perché avete molto più controllo ed essi eseguono un appropriato lock dei file <tt>/etc/passwd</tt> e <tt>/etc/shadow</tt> (<tt>adduser</tt> non lo fa). <p> Guardate il capitolo su <ref id="sez-lavoro" name="Mettere al lavoro la Shadow Suite"> per maggiori informazioni. <p> Ma se dovete proprio usarlo (adduser N.d.T.), ecco cosa dovete fare: <tscreen><verb>tar -xzvf adduser.shadow-1.4.tar.gz cd adduser make clean make adduser chmod 700 adduser cp adduser /sbin</verb></tscreen> <sect1><heading>Il Server wu_ftpd <p> La maggior parte dei sistemi Linux contengono il server <tt>wu_ftpd</tt>. Se la vostra distribuzione non ha la shadow installata, allora il vostro <tt>wu_ftpd</tt> non sarà compilato per la shadow. <tt>wu_ftpd</tt> viene lanciato da <tt>inetd/tcpd</tt> come un processo di <em>root</em>. Se state eseguendo un vecchio demone <tt>wu_ftpd</tt>, vorrete aggiornarlo comunque perché quelli più vecchi hanno un baco che permetterebbe che l'account <em>root</em> venisse compromesso (per maggiori informazione guardate la <url url="http://bach.cis.temple.edu/linux/linux-security/Linux-Security-FAQ/Linux-wu.ftpd-2.4-Update.html" name="Linux security home page">). <p> Fortunatamente, avete solo bisogno di ottenere il codice sorgente e di ricompilarlo con le shadow abilitate. <p> Se non state usando un sistema ELF, il server <tt>wu_ftp</tt> può essere trovato su Sunsite come <url url="ftp://sunsite.unc.edu/pub/Linux/system/Network/file-transfer/wu-ftpd-2.4-fixed.tar.gz" name="wu-ftp-2.4-fixed.tar.gz"> <p> Una volta ottenuto il server, mettetelo in <tt>/usr/src</tt>, quindi digitate: <tscreen><verb>cd /usr/src tar -xzvf wu-ftpd-2.4-fixed.tar.gz cd wu-ftpd-2.4-fixed cp ./src/config/config.lnx.shadow ./src/config/config.lnx</verb></tscreen> <p> Quindi editate <tt>./src/makefiles/Makefile.lnx</tt>, e cambiate la riga: <tscreen><verb>LIBES = -lbsd -support</verb></tscreen> in: <tscreen><verb>LIBES = -lbsd -support -lshadow</verb></tscreen> <p> Ora siete pronti ad eseguire lo script "build" e all'installazione: <tscreen><verb>cd /usr/src/wu-ftpd-2.4-fixed /usr/src/wu-ftp-2.4.fixed/build lnx cp /usr/sbin/wu.ftpd /usr/sbin/wu.ftpd.old cp ./bin/ftpd /usr/sbin/wu.ftpd</verb></tscreen> <p> Questo usa il file di configurazione delle shadow di Linux, compila ed installa il server. <p> Sul mio sistema Slackware 2.3 devo fare anche le seguenti cose prima di eseguire il <tt>build</tt>: <tscreen><verb>cd /usr/include/netinet ln -s in_systm.h in_system.h cd -</verb></tscreen> <p> Sono stati riscontrati dei problemi nel compilare questo pacchetto sotto sistemi ELF, ma la versione Beta della prossima release funziona bene. Si può trovare come <url url="ftp://tscnet.com/pub/linux/network/ftp/wu-ftpd-2.4.2-beta-10.tar.gz" name="wu-ftp-2.4.2-beta-10.tar.gz"> <p> Una volta ottenuto il server, mettetelo in <tt>/usr/src</tt>, quindi digitate: <tscreen><verb>cd /usr/src tar -xzvf wu-ftpd-2.4.2-beta-9.tar.gz cd wu-ftpd-beta-9 cd ./src/config</verb></tscreen> <p> Poi editate <tt>config.lnx</tt>, e cambiate: <tscreen><verb>#undef SHADOW.PASSWORD</verb></tscreen> in: <tscreen><verb>#define SHADOW.PASSWORD</verb></tscreen> Poi, <tscreen><verb>cd ../Makefiles</verb></tscreen> ed editate il file <tt>Makefile.lnx</tt> e cambiate: <tscreen><verb>LIBES = -lsupport -lbsd # -lshadow</verb></tscreen> in: <tscreen><verb>LIBES = -lsupport -lbsd -lshadow</verb></tscreen> Poi eseguite build ed installate: <tscreen><verb>cd .. build lnx cp /usr/sbin/wu.ftpd /usr/sbin/wu.ftpd.old cp ./bin/ftpd /usr/sbin/wu.ftpd</verb></tscreen> <p> Notate che dovreste controllare il vostro file <tt>/etc/inetd.conf</tt> per essere sicuri che è qui che viene realmente realmente il vostro server wu.ftpd. È stato riscontrato che alcune distribuzioni mettono i server dei demoni in posti diversi, e quindi wu.ftpd in particolare potrebbe essere chiamato in qualche altro modo. <sect1><heading>Ftpd standard <p> Se state usando il server <tt>ftpd</tt> standard, vi consiglio di aggiornarlo al server <tt>wu_ftpd</tt>. A parte il baco conosciuto discusso sopra, generalmente è considerato più sicuro. <p> Se insistete ad usare quello standard, o avete bisogno di supporto <em>NIS</em>, Sunsite ha <url url="ftp://sunsite.unc.edu/pub/Linux/system/Network/file-transfer/ftpd-shadow-nis.tgz" name="ftpd-shadow-nis.tgz"> <sect1><heading>pop3d (Post Office Protocol 3) <p> Se avete bisogno di supportare il <em>Post Office Protocol 3 (POP3)</em>, avete bisogno di ricompilare un programma <tt>pop3d</tt>. <tt>pop3d</tt> è normalmente eseguito da <tt>inetd/tcpd</tt> come <tt>root</tt>. <p> Ci sono due versioni disponibili da: <url url="ftp://sunsite.unc.edu/pub/Linux/system/Mail/pop/pop3d-1.00.4.linux.shadow.tar.gz" name="pop3d-1.00.4.linux.shadow.tar.gz"> e <url url="ftp://sunsite.unc.edu/pub/Linux/system/Mail/pop/pop3d+shadow+elf.tar.gz" name="pop3d+shadow+elf.tar.gz"> <p> Entrambi questi sono abbastanza semplici da installare. <sect1><heading>xlock <p> Se installate la Shadow Suite e poi eseguite <em>X Windows System</em> e bloccate (lock) lo schermo senza aggiornare il vostro <tt>xlock</tt>, dovrete usare <tt>CNTL-ALT-Fx</tt> per passare ad un'altra <em>tty</em>, collegarvi, e uccidere il processo <tt>xlock</tt> (o usare <tt>CNTL-ALT-BS</tt> per uccidere il server X). Fortunatamente è abbastanza facile aggiornare il vostro programma <tt>xlock</tt>. <p> Se state usando le Versioni 3.x.x di XFree86, probabilmente state usando <tt>xlockmore</tt> (che è un grande screen-saver in aggiunta a lock). Questo pacchetto supporta le <em>shadow</em> con una ricompilazione. Se avete un <tt>xlock</tt> precedente, vi consiglio di aggiornarlo a questo. <p> <tt>xlockmore-3.5.tgz</tt> è disponibile su: <url url="ftp://sunsite.unc.edu/pub/Linux/X11/xutils/screensavers/xlockmore-3.7.tgz"> <p> Fondamentalmente, questo è quello che avete bisogno di fare: <p> Ottenere il file <tt>xlockmore-3.7.tgz</tt> e metterlo in <tt>/usr/src</tt>, spacchettarlo: <tscreen><verb>tar -xzvf xlockmore-3.7.tgz</verb></tscreen> <p> Editare il file: <tt>/usr/X11R6/lib/X11/config/linux.cf</tt>, e cambiare la riga: <tscreen><verb>#define HasShadowPasswd NO in #define HasShadowPasswd YES</verb></tscreen> <p> Quindi compilate gli eseguibili: <tscreen><verb>cd /usr/src/xlockmore xmkmf make depend make</verb></tscreen> <p> Quindi spostare tutto al suo posto e aggiornare i proprietari ed i permessi dei file: <tscreen><verb>cp xlock /usr/X11R6/bin/ cp XLock /var/X11R6/lib/app-defaults/ chown root.shadow /usr/X11R6/bin/xlock chmod 2755 /usr/X11R6/bin/xlock chown root.shadow /etc/shadow chmod 640 /etc/shadow</verb></tscreen> <p> Il vostro xlock ora funzionerà correttamente. <sect1><heading>xdm <p> <tt>xdm</tt> è un programma che presenta uno schermo di login per X-Windows. Alcuni sistemi avviano <tt>xdm</tt> quando viene detto al sistema di andare ad uno specifico livello di esecuzione (vedere <tt>/etc/inittab</tt>). <p> Con la <em>Shadow Suite</em> installata, <tt>xdm</tt> avrà bisogno di essere aggiornato. Fortunatamente è abbastanza facile aggiornare il vostro programma <tt>xdm</tt>. <p> <tt>xdm.tar.gz</tt> è disponibile su: <url url="ftp://sunsite.unc.edu/pub/Linux/X11/xutils/xdm.tar.gz"> <p> Prendete il file <tt>xdm.tar.gz</tt> e mettetelo in <tt>/usr/src</tt>, quindi per spacchettarlo: <tscreen><verb>tar -xzvf xdm.tar.gz</verb></tscreen> <p> Editate il file: <tt>/usr/X11R6/lib/X11/config/linux.cf</tt>, e cambiate la riga: <tscreen><verb>#define HasShadowPasswd NO in #define HasShadowPasswd YES</verb></tscreen> <p> Quindi compilate gli eseguibili: <tscreen><verb>cd /usr/src/xdm xmkmf make depend make</verb></tscreen> <p> Poi mettete tutto al suo posto: <tscreen><verb>cp xdm /usr/X11R6/bin/</verb></tscreen> <p> <tt>xdm</tt> è eseguito da <em>root</em> perciò non avete bisogno di cambiare i permessi del file. <sect1><heading>sudo <p> Il programma <tt>sudo</tt> permette ad un amministratore di sistema di lasciare che gli utenti eseguano programmi che normalmente richiederebbero accesso da root. Questo è comodo perché lascia limitato l'accesso di amministratore all'account root stesso, mentre permette agli utenti di fare cose tipo il mount dei dispositivi. <p> <tt>sudo</tt> necessita di leggere le password perché verifica la password dell'utente quando viene invocato. <tt>sudo</tt> già viene eseguito SUID root, perciò accedere al file <tt>/etc/shadow</tt> non è un problema. <p> <tt>sudo</tt> per la shadow suite, è disponibile su: <url url="ftp://sunsite.unc.edu/pub/Linux/system/Admin/sudo-1.2-shadow.tgz"> <p> <em>Attenzione</em>: Quando installate <tt>sudo</tt> il vostro file <tt>/etc/sudoers</tt> sarà sostituito con uno predefinito, perciò avrete bisogno di farne una copia di backup se avete aggiunto qualcosa a quello predefinito (potreste anche editare il Makefile e rimuovere la riga che copia il file predefinito in <tt>/etc</tt>). <p> Il pacchetto è già predisposto per le shadow, perciò tutto quello che è richiesto è ricompilare il pacchetto (mettetelo in <tt>/usr/src</tt>): <tscreen><verb>cd /usr/src tar -xzvf sudo-1.2-shadow.tgz cd sudo-1.2-shadow make all make install</verb></tscreen> <sect1><heading>imapd (pacchetto Pine E-Mail) <p> <tt>imapd</tt> è un server e-mail simile a <tt>pop3d</tt>. <tt>imapd</tt> è incluso nel pacchetto <em>Pine E-mail</em>. La documentazione inclusa nel pacchetto afferma che nei sistemi Linux è predefinita l'opzione di includere il supporto shadow. Comunque, ho trovato che questo non è vero. Inoltre, la combinazione script di build/Makefile su questo pacchetto rende molto difficile aggiungere la libreria <tt>libshadow.a</tt> in tempo di compilazione, perciò non sono riuscito ad aggiungere il supporto shadow per <tt>imapd</tt>. <p> Se qualcuno è riuscito a farlo, per favore mi mandi una e-mail, ed io includerò qui la soluzione. <sect1><heading>pppd (Point-to-Point Protocol Server) <p> Il server pppd può essere impostato in modo che usi diversi tipi di autenticazione: <em>Password Authentication Protocol</em> (PAP) e <em>Cryptographic Handshake Authentication Protocol</em> (CHAP). Il server pppd di solito legge le stringhe contenenti le password che usa da <tt>/etc/ppp/chap-secrets</tt> e/o <tt>/etc/ppp/pap-secrets</tt>. Se state usando questo comportamento predefinito di pppd, non è necessario reinstallare pppd. <p> pppd vi permette anche di usare il parametro <em>login</em> (o su linea di comando, o nella configurazione del file <tt>options</tt>). Se viene data l'opzione <em>login</em>, il pppd userà il file <tt>/etc/passwd</tt> per il nome utente e la password per il <em>PAP</em>. Questo, ovviamente, non funzionerà più ora che il nostro file shadow è "oscurato". Per quanto riguarda pppd-1.2.1d questo richiede aggiunta di codice per il supporto shadow. <p> L'esempio dato nel prossimo capitolo consiste nell'aggiunta di supporto shadow a <tt>pppd-1.2.1d</tt> (una vecchia versione di pppd). <p> <tt>pppd-2.2.0</tt> contiene già il supporto shadow. <sect><heading>Mettere al lavoro la Shadow Suite<label id="sez-lavoro"> <p> Questo capitolo tratta alcune cose che dovete sapere ora che avete la <em>Shadow Suite</em> installata sul vostro sistema. Ulteriori informazioni sono contenute nelle pagine di manuale per ogni comando. <sect1><heading>Aggiungere, Modificare e Cancellare utenti <p> La <em>Shadow Suite</em> ha aggiunto i seguenti comandi orientati a linea di comando per aggiungere, modificare, e cancellare utenti. Potreste anche aver installato il programma <tt>adduser</tt>. <sect2><heading>useradd <p> Il comando <tt>useradd</tt> può essere usato per aggiungere utenti al sistema. Potete anche invocare questo comando per cambiare le impostazioni predefinite. <p> La prima cosa che dovreste fare è esaminare le impostazioni predefinite e apportare cambiamenti specifici per il vostro sistema: <tscreen><verb>useradd -D</verb></tscreen><code> GROUP=1 HOME=/home INACTIVE=0 EXPIRE=0 SHELL= SKEL=/etc/skel</code> <p> Le impostazioni predefinite probabilmente non sono quelle che volete, perciò se cominciaste ad aggiungere utenti adesso dovreste specificare tutte le informazioni per ciascun utente. Comunque, possiamo e dovremmo cambiare i valori predefiniti. <p> Sul mio sistema: <itemize> <item>Voglio che il gruppo predefinito sia 100 <item>Voglio che le password scadano ogni 60 giorni <item>Non voglio bloccare un account se la password è scaduta <item>Voglio che la shell predefinita sia <tt>/bin/bash</tt> </itemize> Per fare questi cambiamenti userei: <tscreen><verb>useradd -D -g100 -e60 -f0 -s/bin/bash</verb></tscreen> <p> Ora eseguendo <tt>useradd -D</tt> darà: <code> GROUP=100 HOME=/home INACTIVE=0 EXPIRE=60 SHELL=/bin/bash SKEL=/etc/skel </code> <p> Solo nel caso voleste saperlo, questi valori predefiniti sono contenuti nel file <tt>/etc/default/useradd</tt>. <p> Ora potete usare <tt>useradd</tt> per aggiungere utenti al sistema. Per esempio, per aggiungere l'utente <tt>fred</tt>, usando i valori predefiniti, dovreste fare come segue: <tscreen><verb>useradd -m -c "Fred Flintstone" fred</verb></tscreen> Questo creerà la voce seguente nel file <tt>/etc/passwd</tt>: <tscreen><verb>fred:*:505:100:Fred Flintstone:/home/fred:/bin/bash</verb></tscreen> E la voce seguente nel file <tt>/etc/shadow</tt>: <tscreen><verb>fred:!:0:0:60:0:0:0:0</verb></tscreen> Verrà creata la home directory di <tt>fred</tt> e il contenuto di <tt>/etc/skel</tt> sarà copiato là grazie all'opzione <tt>-m</tt>. <p> Inoltre, dato che non abbiamo specificato un UID, è stato usato il primo disponibile. <p> L'account di <tt>fred</tt> è stato creato, ma <tt>fred</tt> non sarà ancora in grado di collegarsi fino a quando sbloccheremo l'account. Facciamo questo cambiando la password. <tscreen><verb>passwd fred</verb></tscreen> <code> Changing password for fred Enter the new password (minimum of 5 characters) Please use a combination of upper and lower case letters and numbers. New Password: ******* Re-enter new password: ******* </code> Che, in italiano, sarebbe qualcosa del genere: <code> Cambio la password di fred Inserire la nuova password (minimo 5 caratteri) Per favore, utilizzare una combinazione di maiuscole, minuscole e cifre. Nuova Password: ******* Reinserire la nuova password: ******* </code> Ora <tt>/etc/shadow</tt> conterrà: <tscreen><verb>fred:J0C.WDR1amIt6:9559:0:60:0:0:0:0</verb></tscreen> E <tt>fred</tt> potrà ora collegarsi ed usare il sistema. La cosa bella di <tt>useradd</tt> e degli altri programmi che vengono forniti con la <em>Shadow Suite</em> è che fanno cambiamenti ai file <tt>/etc/passwd</tt> e <tt>/etc/shadow</tt> in modo non interrompibile. Perciò , se state aggiungendo un utente, e contemporaneamente un altro utente sta cambiando la sua password, entrambe le operazioni verranno eseguite correttamente. <p> Dovreste usare i comandi forniti anziché editare direttamente <tt>/etc/passwd</tt> e <tt>/etc/shadow</tt>. Se voi editaste il file <tt>/etc/shadow</tt>, e un utente cambiasse la sua password mentre voi state editando, e poi voi salvaste il file che stavate editando, il cambiamento della password dell'utente andrebbe perso. <p> Qui c'è un piccolo script interattivo che aggiunge utenti usando <tt>useradd</tt> e <tt>passwd</tt>: <code> #!/bin/bash # # /sbin/newuser - Uno script per aggiungere utenti al sistema usando i # comandi useradd e passwd della Shadow Suite. # # Scritto da Mike Jackson <mhjack@tscnet.com> come esempio per il # Linux Shadow Password Howto. Viene esplicitamente concesso il # permesso di usarlo e modificarlo. # # Questo potrebbe essere modificato per mostrare i valori predefiniti # e permettere modifiche simili al programma Slackware # adduser. Potrebbe essere modificato per non permettere voci stupide # (i.e. miglior controllo degli errori). # ## # Valori predefiniti per il comando useradd ## GROUP=100 # Gruppo predefinito HOME=/home # Collocazione della home directory (/home/nomeutente) SKEL=/etc/skel # Struttura tipica di una nuova directory home. INACTIVE=0 # Giorni tra la scadenza della password e la # disabilitazione dell'account (0 = mai) EXPIRE=60 # Durata della password in giorni SHELL=/bin/bash # Shell predefinita (intero percorso) ## # Valori predefiniti per il comando passwd ## PASSMIN=0 # Giorni tra i cambiamenti della password PASSWARN=14 # Giorni prima che scada la password in cui viene # dato un avviso ## # Assicurarsi che sia root ad eseguire lo script. ## WHOAMI=`/usr/bin/whoami` if [ $WHOAMI != "root" ]; then echo "Devi essere root per aggiungere nuovi utenti!" exit 1 fi ## # Chiedere il nome utente e il nome completo. ## echo "" echo -n "Nome utente: " read USERNAME echo -n "Nome completo: " read FULLNAME # echo "Aggiunta dell'utente: $USERNAME." # # Notate che le "" intorno a $FULLNAME sono richieste perché # questo campo quasi sempre conterrà almeno uno spazio, e senza # le " il comando useradd, quando raggiunge il carattere SPAZIO, # penserebbe che vi stiate spostando sul prossimo parametro. # /usr/sbin/useradd -c"$FULLNAME" -d$HOME/$USERNAME -e$EXPIRE \ -f$INACTIVE -g$GROUP -m -k$SKEL -s$SHELL $USERNAME ## # Impostare i valori predefiniti per le password ## /bin/passwd -n $PASSMIN -w $PASSWARN $USERNAME >/dev/null 2>&1 ## # Lascia che il comando passwd chieda la password (due volte) ## /bin/passwd $USERNAME ## # Mostra ciò che è stato fatto. ## echo "" echo "Voce di /etc/passwd:" echo -n " " grep "$USERNAME:" /etc/passwd echo "Voce di /etc/shadow:" echo -n " " grep "$USERNAME:" /etc/shadow echo "Riassunto dei risultati del comando passwd:" echo -n " " passwd -S $USERNAME echo "" </code> <p> Usare uno script per aggiungere utenti è davvero molto più preferibile che editare direttamente i file <tt>/etc/passwd</tt> o <tt>/etc/shadow</tt> o usare un programma come il programma Slackware <tt>adduser</tt>. Sentitevi liberi di usare e modificare questo script per il vostro particolare sistema. <p> Per maggiori informazioni su <tt>useradd</tt> vedere la pagina di manuale in linea. <sect2><heading>usermod <p> Il programma <tt>usermod</tt> viene usato per modificare le informazioni su un utente. Le opzioni sono simili a quelle del programma <tt>useradd</tt>. <p> Diciamo che volete cambiare la shell di <tt>fred</tt>, fareste ciò che segue: <tscreen><verb>usermod -s /bin/tcsh fred</verb></tscreen> Ora la voce di <tt>fred</tt>nel file <tt>/etc/passwd</tt> sarebbe diventata questa: <tscreen><verb>fred:*:505:100:Fred Flintstone:/home/fred:/bin/tcsh</verb></tscreen> Facciamo in modo che l'account di <tt>fred</tt> scada il 09/15/97: <tscreen><verb>usermod -e 09/15/97 fred</verb></tscreen> Ora la voce di <tt>fred</tt> in <tt>/etc/shadow</tt> diventa: <tscreen><verb>fred:J0C.WDR1amIt6:9559:0:60:0:0:10119:0</verb></tscreen> <p> Per maggiori informazioni sul comando <tt>usermod</tt> vedere la pagina di manuale in linea. <sect2><heading>userdel <p> <tt>userdel</tt> fa proprio quello che vi aspettate, cancella l'account dell'utente. Semplicemente usate: <tscreen><verb>userdel -r nomeutente</verb></tscreen> Il <tt>-r</tt> fa sì che tutti i file nella home directory dell'utente vengano cancellati insieme alla home directory stessa. I file collocati in altri file system dovranno essere cercati e cancellati manualmente. <p> Se volete semplicemente bloccare l'account invece che cancellarlo, usate piuttosto il comando <tt>passwd</tt>. <sect1><heading>Il comando passwd e l'invecchiamento delle password <p> Il comando <tt>passwd</tt> ha l'ovvio uso di cambiare le password. Inoltre, viene usato dall'utente <em>root</em> per: <itemize> <item>Bloccare (lock) e sbloccare (unlock) gli account (<tt>-l</tt> e <tt>-u</tt>) <item>Impostare il massimo numero di giorni per cui una password rimane valida (<tt>-x</tt>) <item>Impostare il minimo numero di giorni tra cambiamenti della password (<tt>-n</tt>) <item>Impostare il numero di giorni di avviso che una password sta per scadere (<tt>-w</tt>) <item>Impostare il numero di giorni dopo la scadenza della password prima che l'account venga bloccato (<tt>-i</tt>) <item>Permettere la visualizzazione delle informazioni di account in un formato più chiaro <tt>-S</tt>) </itemize> <p> Per esempio, diamo ancora un'occhiata a <tt>fred</tt> <tscreen><verb>passwd -S fred fred P 03/04/96 0 60 0 0</verb></tscreen> Questo significa che la password di <tt>fred</tt> è valida, che è stata cambiata l'ultima volta il 03/04/96, che può essere cambiata in qualunque momento, scade dopo 60 giorni, fred non sarà avvertito e l'account non verrà disabilitato quando la password scadrà. <p> Questo semplicemente significa che se <tt>fred</tt> si collega dopo che la password scade, al collegamento gli verrà richiesta una nuova password. <p> Se decidiamo che vogliamo avvertire <tt>fred</tt> 14 giorni prima che la sua password scada e inattivare il suo account 14 giorni dopo che lui la lascia scadere, dovremo fare quanto segue: <tscreen><verb>passwd -w14 -i14 fred</verb></tscreen> Ora <tt>fred</tt> è diventato: <tscreen><verb>fred P 03/04/96 0 60 14 14</verb></tscreen> Per ulteriori informazioni sul comando <tt>passwd</tt> vedere le pagine di manuale in linea. <sect1><heading>Il file login.defs <p> Il file <tt>/etc/login</tt> è il file di configurazione per il programma <tt>login</tt> e anche per l'intera <em>Shadow Suite</em>. <p> <tt>/etc/login</tt> contiene impostazioni che riguardano dall'aspetto del prompt fino alla scadenza predefinita quando un utente cambia la sua password. <p> Il file <tt>/etc/login.defs</tt> è abbastanza ben documentato dai commenti contenuti al suo interno. Comunque, ci sono alcune cose da notare: <itemize> <item>Contiene alcuni flag che possono essere attivati o disattivati che determinano il numero di collegamenti che vengono effettuati. <item>Contiene puntatori ad altri file di configurazione. <item>Contiene valori predefiniti per cose tipo l'invecchiamento delle password. </itemize> <p> Dalla lista sopra potete vedere che questo è un file abbastanza importante, e dovreste essere sicuri che sia presente, e che le impostazioni siano quelle che desiderate per il vostro sistema. <sect1><heading>Password di gruppo <p> Il file <tt>/etc/groups</tt> può contenere password che permettono ad un utente di diventare membro di un particolare gruppo. Questa funzione è abilitata se definite la costante <tt>SHADOWGRP</tt> nel file <tt>/usr/src/shadow-AAMMGG/config.h</tt>. <p> Se definite questa costante e poi compilate, dovete creare un file <tt>/etc/gshadow</tt> che contenga le password del gruppo e le informazioni di amministrazione del gruppo. <p> Quando avete creato <tt>/etc/shadow</tt>, avete usato un programma chiamato <tt>pwconv</tt>, non c'è nessun programma equivalente per creare il file <tt>/etc/gshadow</tt>, ma in realtà non importa, se ne occupa lui stesso. <p> Per creare il file iniziale <tt>/etc/gshadow</tt> fate come segue: <tscreen><verb>touch /etc/gshadow chown root.root /etc/gshadow chmod 700 /etc/gshadow</verb></tscreen> <p> Una volta che create nuovi gruppi, questi verranno aggiunti ai file <tt>/etc/group</tt> e <tt>/etc/gshadow</tt>. Se voi modificate un gruppo aggiungendo o togliendo utenti o cambiando la password del gruppo, il file <tt>/etc/gshadow</tt> verrà modificato. <p> I programmi <tt>groups</tt>, <tt>groupadd</tt>, <tt>groupmod</tt>, e <tt>groupdel</tt> sono forniti come parte della <em>Shadow Suite</em> per modificare i gruppi. <p> Il formato del file <tt>/etc/group</tt> è quello che segue: <tscreen><verb>nomegruppo:!:GID:membro,membro,...</verb></tscreen> Dove: <descrip> <tag/<tt>nomegruppo</tt></tag> Il nome del gruppo <tag/<tt>!</tt></tag> Il campo che normalmente contiene la password, che ora è però situata nel file <tt>/etc/gshadow</tt> <tag/<tt>GID</tt></tag> L'identificativo numerico del gruppo <tag/<tt>membro</tt></tag> Elenco dei membri del gruppo </descrip> <p> Il formato del file <tt>/etc/gshadow</tt> è quello che segue: <tscreen><verb>nomegruppo:password:ammin,ammin,...:membro,membro,...</verb></tscreen> Dove: <descrip> <tag/<tt>nomegruppo</tt></tag> Il nome del gruppo <tag/<tt>password</tt></tag> La password del gruppo codificata <tag/<tt>ammin</tt></tag> Elenco degli amministratori del gruppo <tag/<tt>membro</tt></tag> Elenco dei membri del gruppo </descrip> <p> Il comando <tt>gpasswd</tt> è usato solo per aggiungere o togliere amministratori e membri a o da un gruppo. Solo <tt>root</tt> o qualcuno appartenente all'elenco degli amministratori può aggiungere o togliere membri del gruppo. <p> La password del gruppo può essere modificata con il comando <tt>passwd</tt> da <em>root</em> o chiunque appartenga alla lista degli amministratori del gruppo. <p> Nonostante il fatto che attualmente non ci sia una pagina di manuale per <tt>gpasswd</tt>, digitando <tt>gpasswd</tt> senza alcun parametro si ottiene un elenco di opzioni. È abbastanza semplice capire come funziona il tutto una volta che avete capito i formati dei file e i concetti. <sect1><heading>Programmi per il controllo della consistenza <p> <sect2><heading>pwck <p> Il programma <tt>pwck</tt> viene fornito per offrire un controllo di consistenza sui file <tt>/etc/passwd</tt> e <tt>/etc/shadow</tt>. Esso controllerà ogni nome utente e verificherà che abbia quanto segue: <itemize> <item>il corretto numero di campi <item>un nome utente univoco <item>un valido identificatore di utente e di gruppo <item>un valido gruppo primario <item>una valida home directory <item>una valida shell di login </itemize> <p> Darà anche un avvertimento per ogni account privo di password. <p> È una buona idea eseguire <tt>pwck</tt> dopo aver installato la <em>Shadow Suite</em>. È anche una buona idea eseguirlo periodicamente, magari una volta alla settimana o al mese. Se usate l'opzione <tt>-r</tt>, potete usare <tt>cron</tt> per eseguirlo con una cadenza regolare e riceverne per posta il rapporto. <sect2><heading>grpck <p> <tt>grpck</tt> è il programma per il controllo della consistenza per i file <tt>/etc/group</tt> and <tt>/etc/gshadow</tt>. Esso esegue i seguenti controlli: <itemize> <item>il corretto numero di campi <item>un nome del gruppo univoco <item>elenco valido di membri ed amministratori </itemize> <p> Dispone anche dell'opzione <tt>-r</tt> per rapporti automatizzati. <sect1><heading>Password di dial-up <p> Le password di dial-up sono un altro strumento opzionale di difesa per i sistemi che permettono l'accesso tramite una linea telefonica commutata. Se avete un sistema che permette a molte persone di connettersi localmente o tramite una rete, ma volete porre dei limiti su chi possa accedere per telefono e connettersi, allora le password di dial-up fanno al caso vostro. Per abilitare le password di dial-up, dovete editare il file <tt>/etc/login.defs</tt> ed assicurarvi che <tt>DIALUPS_CHECK_ENAB</tt> sia impostato a <tt>yes</tt>. <p> Due sono i file che contengono informazioni di dial-up: <tt>/etc/dialups</tt> che contiene le tty (una per riga, senza la parte iniziale /dev). Se una tty compare nella lista, allora vengono effettuati i controlli di dial-up. <p> Il secondo file è <tt>/etc/d_passwd</tt>. Questo file contiene il percorso completo di una shell, seguito da una password opzionale. <p> Se un utente si collega attraverso una tty elencata in <tt>/etc/dialups</tt>, e la sua shell è presente nel file <tt>/etc/d_passwd</tt> gli sarà permesso l'accesso solo se fornirà la corretta password. <p> Un altro utile scopo per usare password di dial-up potrebbe essere quello di impostare una linea che permetta solo un certo tipo di connessione (come una connessione PPP o UUCP). Se un utente cerca di ottenere un altro tipo di connessione (i.e. un elenco di shell), deve conoscere una password per usare la linea. <p> Prima che possiate usare la caratteristica del dial-up, dovete creare i file. <p> Viene fornito il comando <tt>dpasswd</tt> per assegnare password per le shell nel file <tt>/etc/d_passwd</tt>. Vedere la pagina di manuale per ulteriori informazioni. <sect><heading>Aggiungere il supporto shadow ad un programma C<label id="sez-agg"> <p> Aggiungere il supporto shadow ad un programma è in realtà abbastanza semplice. L'unico problema è che il programma deve essere eseguito da root (o SUID root) in modo che il programma possa accedere al file <tt>/etc/shadow</tt>. <p> Questo presenta un grande problema: occorre seguire una condotta di programmazione molto attenta quando si creano programmi SUID. Per esempio, se un programma ha un comando che invoca una shell, questa non deve essere eseguita con i diritti di root anche se il programma è SUID root. <p> Per aggiungere il supporto shadow ad un programma in modo che possa controllare le password, ma per il resto non necessita di essere eseguito da root, è molto più sicuro eseguire il programma SGID shadow. Il programma <tt>xlock</tt> ne è un esempio. <p> Nell'esempio fatto prima, <tt>pppd-1.2.1d</tt> già viene eseguito SUID root, perciò aggiungere il supporto shadow non dovrebbe rendere il programma più vulnerabile. <sect1><heading>File di intestazione (header) <p> I file di intestazione (header) dovrebbero stare in <tt>/usr/include/shadow</tt>. Ci dovrebbe anche essere un <tt>/usr/include/shadow.h</tt>, ma sarebbe un link simbolico a <tt>/usr/include/shadow/shadow.h</tt>. <p> Per aggiungere il supporto shadow ad un programma, dovete includere i file di intestazione: <verb> #include <shadow/shadow.h> #include <shadow/pwauth.h> </verb> <p> Potrebbe essere una buona idea usare le direttive del compilatore in modo da condizionare la compilazione del codice shadow (io lo faccio nell'esempio che segue). <sect1><heading>La libreria libshadow.a <p> Quando avete installato la <em>Shadow Suite</em> il file <tt>libshadow.a</tt> è stato creato ed installato in <tt>/usr/lib</tt>. <p> Quando si compila il supporto shadow in un programma, bisogna dire al linker di includere la libreria <tt>libshadow.a</tt>. <p> Questo viene fatto da: <tscreen><verb>gcc program.c -o program -lshadow</verb></tscreen> <p> Comunque, come vedremo nell'esempio che segue, la maggior parte dei programmi di grandi dimensioni usa un <tt>Makefile</tt>, che di solito ha una variabile chiamata <tt>LIBS=...</tt> che noi modificheremo. <sect1><heading>La struttura Shadow <p> La libreria <tt>libshadow.a</tt> usa una struttura chiamata <tt>spwd</tt> per le informazioni che preleva dal file <tt>/etc/shadow</tt>. Questa è la definizione della struttura <tt>spwd</tt> dal file di intestazione <tt>/usr/include/shadow/shadow.h</tt>: <code> struct spwd { char *sp_namp; /* nome di login */ char *sp_pwdp; /* password codificata */ sptime sp_lstchg; /* data dell'ultimo cambiamento */ sptime sp_min; /* minimo numero di giorni tra cambiamenti */ sptime sp_max; /* massimo numero di giorni tra cambiamenti */ sptime sp_warn; /* numero di giorni di avvertimento prima che scada la password */ sptime sp_inact; /* numero di giorni dopo la scadenza della password prima che l'account venga disabilitato */ sptime sp_expire; /* giorni dal 1/1/70 fino alla scadenza dell'account */ unsigned long sp_flag; /* riservato per uso futuro */ }; </code> <p> La <em>Shadow Suite</em> può mettere altre cose nel campo <tt>sp_pwdp</tt> proprio a fianco della password codificata. Il campo della password potrebbe contenere: <tscreen><verb>nomeutente:Npge08pfz4wuk;@/sbin/extra:9479:0:10000::::</verb></tscreen> <p> Questo significa che, oltre alla password, dovrebbe essere chiamato il programma <tt>/sbin/extra</tt> per ulteriori autenticazioni. Il programma chiamato riceverà il nome utente e un'opzione che indica perché viene chiamato. Vedere il file <tt>/usr/include/shadow/pwauth.h</tt> e il codice sorgente di <tt>pwauth.c</tt> per ulteriori informazioni. <p> Ciò che voglio dire è che dovremmo usare la funzione <tt>pwauth</tt> per eseguire la vera autenticazione, dato che si occuperà anche dell'autenticazione secondaria. L'esempio sotto fa proprio questo. <p> L'autore della <em>Shadow Suite</em> fa presente che poiché molti dei programmi esistenti non la usano potrebbe essere rimossa o cambiata dalle future versioni della <em>Shadow Suite</em>. <sect1><heading>Funzioni Shadow <p> Il file <tt>shadow.h</tt> contiene anche i prototipi delle funzioni contenute nella libreria <tt>libshadow.a</tt>: <code> extern void setspent __P ((void)); extern void endspent __P ((void)); extern struct spwd *sgetspent __P ((__const char *__string)); extern struct spwd *fgetspent __P ((FILE *__fp)); extern struct spwd *getspent __P ((void)); extern struct spwd *getspnam __P ((__const char *__name)); extern int putspent __P ((__const struct spwd *__sp, FILE *__fp)); </code> <p> La funzione che useremo nell'esempio è: <tt>getspnam</tt> che ritorna una struttura <tt>spwd</tt> per il nome passato per argomento. <sect1><heading>Esempio <p> Questo è un esempio di aggiunta del supporto shadow ad un programma che ne ha bisogno, ma non lo possiede. <p> Questo esempio usa il <em>Point-to-Point Protocol Server</em> (pppd-1.2.1d), che ha una modalità in cui esegue l'autenticazione <em>PAP</em> usando i nomi e le password degli utenti dal file <tt>/etc/passwd</tt> anziché dai file <em>PAP</em> o <em>CHAP</em>. Non dovreste aver bisogno di aggiungere questo codice a <tt>pppd-2.2.0</tt> perché c'è già. <p> Questa caratteristica del pppd probabilmente non è molto usata, ma se avete installato la <em>Shadow Suite</em>, non funzionerà comunque perché le password non si trovano più in <tt>/etc/passwd</tt>. <p> Il codice per l'autenticazione degli utenti sotto <tt>pppd-1.2.1d</tt> si trova nel file <tt>/usr/src/pppd-1.2.1d/pppd/auth.c</tt>. <p> Il seguente codice deve essere aggiunto all'inizio del file dove si trovano tutte le altre direttive <tt>#include</tt>. Abbiamo racchiuso gli <tt>#include</tt> tra direttive condizionali (i.e. vengono presi in considerazione solo se stiamo compilando per il supporto shadow). <p> <code> #ifdef HAS_SHADOW #include <shadow.h> #include <shadow/pwauth.h> #endif </code> <p> Il passo successivo consiste nel modificare il codice vero e proprio. Stiamo ancora apportando cambiamenti al file <tt>auth.c</tt>. <p> Funzione <tt>auth.c</tt> prima delle modifiche: <code> /* * login - Controlla il nome e la password dell'utente nel database delle * password di sistema, e permette il login se l'utente è OK. * * restituisce: * UPAP_AUTHNAK: Login fallito. * UPAP_AUTHACK: Login riuscito. * In entrambi i casi, msg punta al messaggio appropriato. */ static int login(user, passwd, msg, msglen) char *user; char *passwd; char **msg; int *msglen; { struct passwd *pw; char *epasswd; char *tty; if ((pw = getpwnam(user)) == NULL) { return (UPAP_AUTHNAK); } /* * XXX Se non c'è nessuna password, li lascia collegare senza. */ if (pw->pw_passwd == '\0') { return (UPAP_AUTHACK); } epasswd = crypt(passwd, pw->pw_passwd); if (strcmp(epasswd, pw->pw_passwd)) { return (UPAP_AUTHNAK); } syslog(LOG_INFO, "user %s logged in", user); /* * Scrive una voce wtmp per questo utente. */ tty = strrchr(devname, '/'); if (tty == NULL) tty = devname; else tty++; logwtmp(tty, user, ""); /* Aggiunge una voce di login al wtmp */ logged_in = TRUE; return (UPAP_AUTHACK); } </code> <p> La password dell'utente viene messa in <tt>pw->pw_passwd</tt>, così tutto quello che dobbiamo fare in realtà è aggiungere la funzione <tt>getspnam</tt>. Questa metterà la password in <tt>spwd->sp_pwdp</tt>. <p> Aggiungeremo la funzione <tt>pwauth</tt> per eseguire l'autenticazione vera e propria. Questa eseguirà automaticamente l'autenticazione secondaria se il file shadow è impostato per farlo. <p> Funzione <tt>auth.c</tt> dopo le modifiche per il supporto shadow: <code> /* * login - Controlla il nome e la password dell'utente nel database delle * password di sistema, e permette il login se l'utente è OK. * * Questa funzione è stata modificata in modo da supportare la * Linux Shadow Password Suite se USE_SHADOW è definito. * * restituisce: * UPAP_AUTHNAK: Login fallito. * UPAP_AUTHACK: Login riuscito. * In entrambi i casi, msg punta al messaggio appropriato. */ static int login(user, passwd, msg, msglen) char *user; char *passwd; char **msg; int *msglen; { struct passwd *pw; char *epasswd; char *tty; #ifdef USE_SHADOW struct spwd *spwd; struct spwd *getspnam(); #endif if ((pw = getpwnam(user)) == NULL) { return (UPAP_AUTHNAK); } #ifdef USE_SHADOW spwd = getspnam(user); if (spwd) pw->pw_passwd = spwd->sp-pwdp; #endif /* * XXX Se non c'è nessuna password, NON li lascia collegare senza. */ if (pw->pw_passwd == '\0') { return (UPAP_AUTHNAK); } #ifdef HAS_SHADOW if ((pw->pw_passwd && pw->pw_passwd[0] == '@' && pw_auth (pw->pw_passwd+1, pw->pw_name, PW_LOGIN, NULL)) || !valid (passwd, pw)) { return (UPAP_AUTHNAK); } #else epasswd = crypt(passwd, pw->pw_passwd); if (strcmp(epasswd, pw->pw_passwd)) { return (UPAP_AUTHNAK); } #endif syslog(LOG_INFO, "user %s logged in", user); /* * Scrive una voce wtmp per questo utente. */ tty = strrchr(devname, '/'); if (tty == NULL) tty = devname; else tty++; logwtmp(tty, user, ""); /* Aggiunge una voce di login al wtmp */ logged_in = TRUE; return (UPAP_AUTHACK); } </code> <p> Un attento esame rivelerà che abbiamo fatto un'altra modifica. La versione originale permetteva l'accesso (restituiva <tt>UPAP_AUTHACK</tt>) se non c'era NESSUNA password nel file <tt>/etc/passwd</tt>. Questo <em>non</em> è una buona cosa, perché un uso comune di questa caratteristica di login è quello di usare un account che permetta l'accesso al processo ppp e quindi confrontare il nome utente e la password forniti da PAP con il nome utente nel file <tt>/etc/passwd</tt> e la password nel file <tt>/etc/shadow</tt>. <p> Perciò se abbiamo impostato la versione originale in modo da eseguire, al posto della shell per un utente, ad esempio <tt>ppp</tt>, allora chiunque potrebbe ottenere una connessione ppp impostando la sua PAP con utente <tt>ppp</tt> e senza password. <p> Abbiamo risolto questo anche restituendo <tt>UPAP_AUTHNAK</tt> invece che <tt>UPAP_AUTHACK</tt> nel caso in cui il campo password fosse vuoto. <p> È abbastanza interessante il fatto che <tt>pppd-2.2.0</tt> abbia lo stesso problema. <p> Poi abbiamo bisogno di modificare il Makefile in modo che avvengano due cose: <tt>USE_SHADOW</tt> deve essere definita, e <tt>libshadow.a</tt> deve essere aggiunta al processo di link. <p> Editate il Makefile, e aggiungete: <tscreen><verb>LIBS = -lshadow </verb></tscreen> <p> Quindi troviamo la riga: <tscreen><verb>COMPILE_FLAGS = -I.. -D_linux_=1 -DGIDSET_TYPE=gid_t </verb></tscreen> <p> E la cambiamo in: <tscreen><verb>COMPILE_FLAGS = -I.. -D_linux_=1 -DGIDSET_TYPE=gid_t -DUSE_SHADOW </verb></tscreen> <p> Ora eseguite il make ed installate. <sect><heading>Domande poste frequentemente (FAQ) <p> <em>D:</em> Ero abituato a controllare con quale tty <em>root</em> potesse collegarsi usando il file <tt>/etc/securettys</tt>, ma sembra non funzionare più, cosa è successo? <p> <em>R:</em> Il file <tt>/etc/securettys</tt> non fa assolutamente nulla ore che la <em>Shadow Suite</em> è installata. Le tty che <em>root</em> può usare sono ora situate nel file di configurazione di login <tt>/etc/login.defs</tt>. La voce in questo file potrebbe puntare ad un altro file. <p> <em>D:</em> Ho installato la <em>Shadow Suite</em>, ma ora non posso collegarmi, cosa ho dimenticato? <p> <em>R:</em> Probabilmente hai installato i programmi Shadow, ma non hai eseguito <tt>pwconv</tt> o hai dimenticato di copiare <tt>/etc/npasswd</tt> in <tt>/etc/passwd</tt> e <tt>/etc/nshadow</tt> in <tt>/etc/shadow</tt>. Inoltre, potresti aver bisogno di copiare <tt>login.defs</tt> in <tt>/etc</tt>. <p> <em>D:</em> Nella sezione su xlock, si dice di cambiare il gruppo proprietario del file <tt>/etc/shadow</tt> e di farlo diventare <tt>shadow</tt>. Non ho un gruppo <tt>shadow</tt>, cosa faccio? <p> <em>R:</em> Puoi aggiungerne uno. Semplicemente edita il file <tt>/etc/group</tt>, e inserisci una riga per il gruppo shadow. Devi assicurarti che il numero del gruppo non sia usato da un altro gruppo, e devi inserirlo prima della voce <tt>nogroup</tt>. Oppure puoi semplicemente impostare SUID root <tt>xlock</tt>. <p> <em>D:</em> Esiste una mailing list per la Linux Shadow Password Suite? <p> <em>R:</em> Sì, ma è per lo sviluppo e il beta testing della prossima Shadow Suite per Linux. Puoi iscriverti alla lista mandando una e-mail a: <tt>shadow-list-request@neptune.cin.net</tt> avente per subject: <tt>subscribe</tt>. La lista si occupa in realtà delle release Linux <tt>shadow-AAMMGG</tt>. Dovresti iscriverti se vuoi essere coinvolto in ulteriori sviluppi o se installi la Suite sul tuo sistema e vuoi avere informazioni sulle più recenti release. <p> <em>D:</em> Ho installato la <em>Shadow Suite</em>, ma quando uso il comando <tt>userdel</tt>, ottengo: "userdel: cannot open shadow group file", (in italiano: "userdel: non posso aprire il file shadow group"); cosa ho sbagliato? <p> <em>R:</em> Hai compilato la <em>Shadow Suite</em> con l'opzione <tt>SHADOWGRP</tt> abilitata, ma non hai un file <tt>/etc/gshadow</tt>. Devi o editare il file <tt>config.h</tt> e ricompilare, oppure creare un file <tt>/etc/group</tt>. Vedere la sezione sui gruppi shadow. <p> <em>D:</em> Ho installato la <em>Shadow Suite</em> ma ho di nuovo le password codificate nel mio file <tt>/etc/passwd</tt>, cosa c'è che non va? <p> <em>R:</em> O hai abilitato l'opzione <tt>AUTOSHADOW</tt> nel file Shadow <tt>config.h</tt>, oppure il tuo <tt>libc</tt> è stato compilato con l'opzione <tt>SAHDOW_COMPAT</tt>. Devi capire qual è il problema, e ricompilare. <sect><heading>Messaggio di copyright <p> The Linux Shadow Password HOWTO is Copyright (c) 1996 Michael H. Jackson. <p> Permission is granted to make and distribute verbatim copies of this document provided the copyright notice and this permission notice are preserved on all copies. <p> Permission is granted to copy and distribute modified versions of this document under the conditions for verbatim copies above, provided a notice clearly stating that the document is a modified version is also included in the modified document. <p> Permission is granted to copy and distribute translations of this document into another language, under the conditions specified above for modified versions. <p> Permission is granted to convert this document into another media under the conditions specified above for modified versions provided the requirement to acknowledge the source document is fulfilled by inclusion of an obvious reference to the source document in the new media. Where there is any doubt as to what defines 'obvious' the copyright owner reserves the right to decide. <p> Ovvero (ni noti che l'unica licenza valida è quella in lingua originale): <p> Il Linux Shadow Password HOWTO è Copyright (c) 1996 di Michael H. Jackson. <p> È concesso il permesso di fare e distribuire copie testuali di questo documento, a patto che la nota sul copyright e questa nota di permesso siano mantenute su tutte le copie. <p> È concesso il permesso di copiare e distribuire versioni modificate di questo documento sotto le condizioni delle copie testuali dette sopra, a condizione che venga inclusa nel documento modificato una nota che dica chiaramente che il documento è una versione modificata. <p> È concesso il permesso si copiare e distribuire traduzioni di questo documento in un'altra lingua, sotto le condizioni specificate sopra per le versioni modificate. <p> È concesso il permesso di convertire questo documento in altri mezzi sotto le condizioni specificate sopra per le versioni modificate, a condizione che il nuovo mezzo contenga il riconoscimento del documento sorgente tramite un ovvio riferimento al documento sorgente stesso. Dove ci sia un qualunque dubbio sul significato di 'ovvio' il proprietario del copyright si riserva il diritto di decidere. <sect><heading>Varie e Riconoscimenti <p> Il codice di esempio per <tt>auth.c</tt> è tratto da pppd-1.2.1d e ppp-2.1.0e, Copyright (c) 1993 The Australian National University e Copyright (c) 1989 Carnegie Mellon University. <p> Grazie a Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl> per aver scritto e mantenuto la <em>Shadow Suite</em> per Linux, e per la sua revisione e i suoi commenti a questo documento. <p> Grazie a Ron Tidd <rtidd@tscnet.com> per la sua utile revisione e il suo collaudo. <p> Grazie a tutti coloro che mi hanno mandato feedback per contribuire a migliorare questo documento. <p> Per favore, se avete commenti o suggerimenti, mandatemeli per posta. saluti <p> <htmlurl url="mailto:mhjack@tscnet.com" name="Michael H. Jackson <mhjack@tscnet.com>"> </article>