[>a258.html>] [<a256.html<] [^a2.html^]


Capitolo 41.   Password shadow

Il meccanismo delle password shadow si basa su un principio molto semplice: nascondere le password cifrate ai processi che non hanno i privilegi dell'utente root. Infatti, nei sistemi in cui le password shadow non sono attivate, è il file /etc/passwd, leggibile a tutti i tipi di utenti, che contiene tali password cifrate.

Il problema nasce dal fatto che è possibile scoprire la password degli utenti attraverso programmi specializzati che scandiscono un vocabolario alla ricerca di una parola che possa corrispondere alla password cifrata.

L'utilizzo del sistema delle password shadow richiede che alcuni programmi siano predisposti per questo. In questo capitolo si fa riferimento a strumenti standard che però si intende siano stati integrati nella distribuzione GNU/Linux che si utilizza. L'attivazione di password shadow in una distribuzione che non sia stata predisposta, comporta una serie di difficoltà che rendono la cosa sconsigliabile.

Nome Descrizione
/etc/shadow File delle password cifrate.
/etc/login.defs Configurazione generale del sistema di autenticazione.
pwconv Conversione dal sistema tradizionale alle password shadow.
pwunconv Conversione dalle password shadow al sistema tradizionale.
useradd Inserimento di un nuovo utente.
/etc/default/useradd Configurazione di useradd.
userdel Eliminazione di un utente.
usermod Modifica di alcune impostazioni riferite a un utente.
/etc/gshadow File delle password cifrate dei gruppi.
grpconv Conversione dai gruppi tradizionali alle password shadow.
grpunconv Conversione dai gruppi con password shadow a quelli tradizionali.
gpasswd Modifica della password di un gruppo.
groupadd Inserimento di un nuovo gruppo.
groupdel Eliminazione di un gruppo.
pwck Verifica di coerenza delle informazioni sugli utenti.
grpck Verifica di coerenza delle informazioni sui gruppi.

Tabella 41.1. Riepilogo dei programmi e dei file per la gestione delle password shadow.

41.1   Funzioni delle password shadow

Con le password shadow attivate si aggiunge il file /etc/shadow a fianco del consueto /etc/passwd. In quest'ultimo vengono tolte le password cifrate e al loro posto viene inserita una x, mentre nel file /etc/shadow, oltre alle password cifrate, vengono inserite altre informazioni sulle utenze che permettono di aumentare la sicurezza.

Anche i gruppi possono avere delle password, ed è possibile affiancare al file /etc/group il file /etc/gshadow.

41.1.1   /etc/shadow

La presenza del file /etc/shadow indica l'attivazione delle password shadow. I record di questo file sono organizzati in campi, separati attraverso il simbolo due punti (:), secondo la sintassi seguente:

utente:password:modifica:valid_min:valid_max:preavviso:tempo_riserva:termine:riservato

I campi che rappresentano una data possono contenere un numero intero che indica il numero di giorni trascorsi dal 1/1/1970, mentre quelli che rappresentano una durata, possono contenere un numero intero che esprime una quantità di giorni.

  1. utente

    Il nominativo dell'utente.

  2. password

    La password cifrata, quella tolta dal file /etc/passwd.

  3. modifica

    Data in cui è stata modificata la password per l'ultima volta.

  4. validità_minima

    Numero di giorni di validità minima della password; entro questo tempo, l'utente non può cambiare la password.

  5. validità_massima

    Numero di giorni di validità massima della password; prima che trascorra questo tempo, l'utente deve cambiare la password.

  6. preavviso

    Numero di giorni, prima della scadenza della password, durante i quali l'utente viene avvisato della necessità di modificarla.

  7. tempo_di_riserva

    Durata massima di validità dell'utenza dopo che la password è scaduta.

  8. termine

    Data di scadenza dell'utenza.

  9. riservato

    Riservato per usi futuri.

A titolo di esempio, viene mostrato un caso sufficientemente completo nella figura 41.1.

tizio:wsLHjp.FutW0s:10459:0:30:7:10:10824:
 |     |             |    | |  | |   |
 |     password      |    | |  | |   termine dell'utenza il
 |     cifrata       |    | |  | |   giorno 21/08/1999
 |                   |    | |  | |
 utente              |    | |  | dieci giorni di riserva
                     |    | |  |
                     |    | |  sette giorni di preavviso
                     |    | |
    la password è stata   | trenta giorni di validità massima
    modificata il giorno  |
    21/08/1998            l'utente può cambiare password
                          in ogni momento

Figura 41.1. Esempio di un record del file /etc/shadow.

Perché il sistema delle password shadow possa dare la sicurezza che promette, è necessario che il file /etc/shadow appartenga all'utente root e abbia esclusivamente il permesso di lettura per il proprietario (04008).

41.1.2   /etc/passwd

Quando è attivo il sistema delle password shadow, il file /etc/passwd non dovrebbe contenere più le password cifrate. Al loro posto dovrebbe apparire una lettera x (minuscola), come nell'esempio seguente:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
...
tizio:x:1000:1000::/home/tizio:/bin/bash
...

Tuttavia, dovrebbe essere ammissibile la presenza di record contenenti la password cifrata dell'utente relativo, e la corrispondente assenza di un record nel file /etc/shadow. Per questi utenti, le funzionalità delle password shadow sono ovviamente disattivate, e non dovrebbero esserci altre conseguenze.

41.2   Amministrazione degli utenti

La presenza delle password shadow richiede strumenti adeguati alla loro amministrazione. Le informazioni aggiuntive che richiede un'utenza quando sono attive le password shadow, rende utile la presenza di un file di configurazione contenente le caratteristiche predefinite che questo dovrebbe avere. Questo file è /etc/login.defs.

41.2.1   /etc/login.defs

Il file /etc/login.defs permette di stabilire alcune caratteristiche predefinite delle utenze che utilizzano le password shadow. La sua presenza è importante soprattutto nel momento della creazione di un nuovo utente, ovvero della trasformazione di utenze normali in utenze munite di password shadow, per definire i valori relativi alla validità e alla scadenza delle password.

Il file si compone di righe, in cui, ciò che inizia con il simbolo # viene considerato un commento, le righe vuote vengono ignorate, e il resto compone le direttive di configurazione. La sintassi di queste è molto semplice: ogni direttiva occupa una sola riga e si compone di coppie nome valore, spaziate, senza simboli di assegnamento.

I valori che possono essere attribuiti sono di tre tipi: stringa, numerico e logico (booleano). Le stringhe vengono indicate senza delimitatori di alcun tipo; i valori numerici possono essere di tipo decimale, ottale (e in tal caso iniziano con uno zero), ed esadecimale (quando iniziano con la sigla 0x...); i valori booleani sono indicati attraverso le costanti yes (Vero) e no (Falso).

Segue l'esempio di una configurazione minima di questo file, che deriva da una distribuzione GNU/Linux Red Hat.

# *REQUIRED*
#   Directory where mailboxes reside, _or_ name of file, relative to the
#   home directory.  If you _do_ define both, MAIL_DIR takes precedence.
#   QMAIL_DIR is for Qmail
#
#QMAIL_DIR      Maildir
#MAIL_DIR       /var/spool/mail
MAIL_DIR        /var/mail
#MAIL_FILE      .mail

# Password aging controls:
#
#   PASS_MAX_DAYS   Maximum number of days a password may be used.
#   PASS_MIN_DAYS   Minimum number of days allowed between password changes.
#   PASS_MIN_LEN    Minimum acceptable password length.
#   PASS_WARN_AGE   Number of days warning given before a password expires.
#
PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7

#
# Min/max values for automatic uid selection in useradd
#
UID_MIN                   500
UID_MAX                 60000

#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN                   500
GID_MAX                 60000

#
# Require password before chfn/chsh can make any changes.
#
CHFN_AUTH               yes

#
# Don't allow users to change their "real name" using chfn.
#
CHFN_RESTRICT           yes

#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD    /usr/sbin/userdel_local

#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is ORed with the -m flag on
# useradd command line.
#
CREATE_HOME     yes

Per quanto riguarda il problema particolare delle password shadow, si possono osservare le direttive PASS_MAX_DAYS, PASS_MIN_DAYS, e PASS_WARN_AGE. La prima permette di stabilire la durata massima, predefinita, di validità di una password; la seconda serve a stabilire la durata minima; la terza il periodo di preavviso.

Il file /etc/login.defs permette di definire molte più cose, interferendo anche con il comportamento del programma login, se quest'ultimo è stato compilato in modo da prendere in considerazione quel file. L'esempio seguente proviene da una distribuzione Debian.

#
# /etc/login.defs - Configuration control definitions for the login package.
#
#       $Id: login.defs.linux,v 1.8 1997/12/07 23:26:48 marekm Exp $
#
# Three items must be defined:  MAIL_DIR, ENV_SUPATH, and ENV_PATH.
# If unspecified, some arbitrary (and possibly incorrect) value will
# be assumed.  All other items are optional - if not specified then
# the described action or option will be inhibited.
#
# Comment lines (lines beginning with "#") and blank lines are ignored.
#
# Modified for Linux.  --marekm

#
# Delay in seconds before being allowed another attempt after a login failure
#
FAIL_DELAY              3

#
# Enable additional passwords upon dialup lines specified in /etc/dialups.
#
DIALUPS_CHECK_ENAB      yes

#
# Enable logging and display of /var/log/faillog login failure info.
#
FAILLOG_ENAB            yes

#
# Enable display of unknown usernames when login failures are recorded.
#
LOG_UNKFAIL_ENAB        no

#
# Enable logging of successful logins
#
LOG_OK_LOGINS           no

#
# Enable logging and display of /var/log/lastlog login time info.
#
LASTLOG_ENAB            yes

#
# Enable checking and display of mailbox status upon login.
#
# Disable if the shell startup files already check for mail
# ("mailx -e" or equivalent).
#
MAIL_CHECK_ENAB         yes

#
# Enable additional checks upon password changes.
#
OBSCURE_CHECKS_ENAB     yes

#
# Enable checking of time restrictions specified in /etc/porttime.
#
PORTTIME_CHECKS_ENAB    yes

#
# Enable setting of ulimit, umask, and niceness from passwd gecos field.
#
QUOTAS_ENAB             yes

#
# Enable "syslog" logging of su activity - in addition to sulog file logging.
# SYSLOG_SG_ENAB does the same for newgrp and sg.
#
SYSLOG_SU_ENAB          yes
SYSLOG_SG_ENAB          yes

#
# If defined, either full pathname of a file containing device names or
# a ":" delimited list of device names.  Root logins will be allowed only
# upon these devices.
#
CONSOLE         /etc/securetty
#CONSOLE        console:tty01:tty02:tty03:tty04

#
# If defined, all su activity is logged to this file.
#
#SULOG_FILE     /var/log/sulog

#
# If defined, ":" delimited list of "message of the day" files to
# be displayed upon login.
#
MOTD_FILE       /etc/motd
#MOTD_FILE      /etc/motd:/usr/lib/news/news-motd

#
# If defined, this file will be output before each login prompt.
#
#ISSUE_FILE     /etc/issue

#
# If defined, file which maps tty line to TERM environment parameter.
# Each line of the file is in a format something like "vt100  tty01".
#
#TTYTYPE_FILE   /etc/ttytype

#
# If defined, login failures will be logged here in a utmp format.
# last, when invoked as lastb, will read /var/log/btmp, so...
#
FTMP_FILE       /var/log/btmp

#
# If defined, name of file whose presence which will inhibit non-root
# logins.  The contents of this file should be a message indicating
# why logins are inhibited.
#
NOLOGINS_FILE   /etc/nologin

#
# If defined, the command name to display when running "su -".  For
# example, if this is defined as "su" then a "ps" will display the
# command is "-su".  If not defined, then "ps" would display the
# name of the shell actually being run, e.g. something like "-sh".
#
SU_NAME         su

#
# *REQUIRED*
#   Directory where mailboxes reside, _or_ name of file, relative to the
#   home directory.  If you _do_ define both, MAIL_DIR takes precedence.
#   QMAIL_DIR is for Qmail
#
#QMAIL_DIR      Maildir
MAIL_DIR        /var/spool/mail
#MAIL_FILE      .mail

#
# If defined, file which inhibits all the usual chatter during the login
# sequence.  If a full pathname, then hushed mode will be enabled if the
# user's name or shell are found in the file.  If not a full pathname, then
# hushed mode will be enabled if the file exists in the user's home directory.
#
HUSHLOGIN_FILE  .hushlogin
#HUSHLOGIN_FILE /etc/hushlogins

#
# If defined, the presence of this value in an /etc/passwd "shell" field will
# disable logins for that user, although "su" will still be allowed.
#
# XXX this does not seem to be implemented yet...  --marekm
# no, it was implemented but I ripped it out ;-) -- jfh
NOLOGIN_STR     NOLOGIN

#
# If defined, either a TZ environment parameter spec or the
# fully-rooted pathname of a file containing such a spec.
#
#ENV_TZ         TZ=CST6CDT
#ENV_TZ         /etc/tzname

#
# If defined, an HZ environment parameter spec.
#
# for Linux/x86
ENV_HZ          HZ=100
# For Linux/Alpha...
#ENV_HZ         HZ=1024

#
# *REQUIRED*  The default PATH settings, for superuser and normal users.
#
# (they are minimal, add the rest in the shell startup files)
ENV_SUPATH      PATH=/sbin:/bin:/usr/sbin:/usr/bin
ENV_PATH        PATH=/bin:/usr/bin

#
# Terminal permissions
#
#       TTYGROUP        Login tty will be assigned this group ownership.
#       TTYPERM         Login tty will be set to this permission.
#
# If you have a "write" program which is "setgid" to a special group
# which owns the terminals, define TTYGROUP to the group number and
# TTYPERM to 0620.  Otherwise leave TTYGROUP commented out and assign
# TTYPERM to either 622 or 600.
#
TTYGROUP        tty
TTYPERM         0600

#
# Login configuration initializations:
#
#       ERASECHAR       Terminal ERASE character ('\010' = backspace).
#       KILLCHAR        Terminal KILL character ('\025' = CTRL/U).
#       UMASK           Default "umask" value.
#       ULIMIT          Default "ulimit" value.
#
# The ERASECHAR and KILLCHAR are used only on System V machines.
# The ULIMIT is used only if the system supports it.
# (now it works with setrlimit too; ulimit is in 512-byte units)
#
# Prefix these values with "0" to get octal, "0x" to get hexadecimal.
#
ERASECHAR       0177
KILLCHAR        025
UMASK           022
#ULIMIT         2097152

#
# Password aging controls:
#
#       PASS_MAX_DAYS   Maximum number of days a password may be used.
#       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
#       PASS_MIN_LEN    Minimum acceptable password length.
#       PASS_WARN_AGE   Number of days warning given before a password expires.
#
PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7

#
# If "yes", the user must be listed as a member of the first gid 0 group
# in /etc/group (called "root" on most Linux systems) to be able to "su"
# to uid 0 accounts.  If the group doesn't exist or is empty, no one
# will be able to "su" to uid 0.
#
SU_WHEEL_ONLY   no

#
# If compiled with cracklib support, where are the dictionaries
#
#CRACKLIB_DICTPATH      /usr/lib/passwd/pw_dict

#
# Min/max values for automatic uid selection in useradd
#
UID_MIN                  1000
UID_MAX                 60000

#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN                   100
GID_MAX                 60000

#
# Max number of login retries if password is bad
#
LOGIN_RETRIES           5

#
# Max time in seconds for login
#
LOGIN_TIMEOUT           60

#
# Maximum number of attempts to change password if rejected (too easy)
#
PASS_CHANGE_TRIES       5

#
# Warn about weak passwords (but still allow them) if you are root.
#
PASS_ALWAYS_WARN        yes

#
# Number of significant characters in the password for crypt().
# Default is 8, don't change unless your crypt() is better.
# Ignored if MD5_CRYPT_ENAB set to "yes".
#
#PASS_MAX_LEN           8

#
# Require password before chfn/chsh can make any changes.
#
CHFN_AUTH               yes

#
# Which fields may be changed by regular users using chfn - use
# any combination of letters "frwh" (full name, room number, work
# phone, home phone).  If not defined, no changes are allowed.
# For backward compatibility, "yes" = "rwh" and "no" = "frwh".
# 
CHFN_RESTRICT           rwh

#
# Password prompt (%s will be replaced by user name).
#
# XXX - it doesn't work correctly yet, for now leave it commented out
# to use the default which is just "Password: ".
#LOGIN_STRING           "%s's Password: "

#
# Only works if compiled with MD5_CRYPT defined:
# If set to "yes", new passwords will be encrypted using the MD5-based
# algorithm compatible with the one used by recent releases of FreeBSD.
# It supports passwords of unlimited length and longer salt strings.
# Set to "no" if you need to copy encrypted passwords to other systems
# which don't understand the new algorithm.  Default is "no".
#
#MD5_CRYPT_ENAB no

#
# List of groups to add to the user's supplementary group set
# when logging in on the console (as determined by the CONSOLE
# setting).  Default is none.
#
# Use with caution - it is possible for users to gain permanent
# access to these groups, even when not logged in on the console.
# How to do it is left as an exercise for the reader...
#
#CONSOLE_GROUPS         floppy:audio:cdrom

#
# Should login be allowed if we can't cd to the home directory?
# Default in no.
#
DEFAULT_HOME    yes

#
# If this file exists and is readable, login environment will be
# read from it.  Every line should be in the form name=value.
#
ENVIRON_FILE    /etc/environment

#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD    /usr/sbin/userdel_local

Il confronto è utile, soprattutto se si pensa che il programma login della distribuzione Debian legge questo file prima di consentire l'accesso. Un'altra cosa da considerare è che tra una distribuzione e l'altra di GNU/Linux, questo file può contenere o meno determinate direttive. Per esempio, la direttiva CREATE_HOME che appare alla fine del primo esempio, sembra appartenere esclusivamente alla distribuzione Red Hat.

La descrizione dettagliata di alcune delle direttive mostrate può essere utile, anche se queste non hanno effetto in tutte le distribuzioni GNU/Linux.

Alcune direttive
CHFN_AUTH {yes|no}

Se si assegna il valore yes, si intende fare in modo che i programmi chfn e chsh chiedano di reintrodurre la password prima di eseguire, rispettivamente, la sostituzione delle informazioni personali e della shell.

CHFN_RESTRICT [f][r][w][h]

Per consentire all'utente di modificare i propri dati personali, è necessario utilizzare questa direttiva. Attraverso la stringa che può contenere le lettere f, r, w e h, si possono indicare quali elementi ha diritto di modificare l'utente:

  • f, full name -- nome e cognome;

  • r, room -- numero della stanza;

  • w, work -- telefono dell'ufficio (di lavoro);

  • h, home -- numero telefonico di casa.

CONSOLE {file|elenco_dispositivi_console}

Permette di definire quali siano i terminali da cui può accedere l'utente root, attraverso l'indicazione di un file, che solitamente è /etc/securetty, oppure attraverso un elenco di nomi di file di dispositivo (senza l'indicazione della directory /dev/), separati da due punti verticali: console:tty01:tty02:tty03:tty04:tty05:tty06.

DEFAULT_HOME {yes|no}

Se si assegna il valore yes, si intende permettere l'accesso anche se non risulta possible entrare nella directory personale dell'utente (perché non esiste, perché i permessi non sono corretti, ecc.). Se non viene indicata questa direttiva, il valore predefinito è (o dovrebbe essere) no.

FAIL_DELAY n_secondi

Permette di specificare un ritardo, espresso in secondi, da applicare nel caso di un tentativo fallito di accesso. L'utente dovrà attendere quella quantità di tempo prima di poter ritentare.

GID_MIN n_gid_minimo
GID_MAX n_gid_massimo

Queste due direttive permettono rispettivamente di definire il valore minimo e quello massimo per i numeri GID, cioè quelli che vengono utilizzati per distinguere i gruppi di utenti.

UID_MIN n_uid_minimo
UID_MAX n_uid_massimo

Queste due direttive permettono rispettivamente di definire il valore minimo e quello massimo per i numeri UID, cioè quelli che vengono utilizzati per distinguere gli utenti.

ISSUE_FILE percorso

Permette di definire il percorso assoluto di un file il cui contenuto deve essere visualizzato prima della presentazione dell'invito della procedura di accesso. Tradizionalmente si tratta del file /etc/issue.

LASTLOG_ENAB {yes|no}

Se si assegna il valore yes si intende fare in modo che, nel momento in cui viene concesso l'accesso, venga visualizzata la data, l'ora e il terminale dell'ultimo accesso precedente.

LOGIN_RETRIES n_tentativi

Permette di definire un numero massimo di tentativi che possono essere compiuti dall'utente che cerca di accedere, a seguito di errori nella combinazione tra nominativo e password. Esauriti i tentativi a disposizione, il programma login dovrebbe terminare il suo funzionamento, anche se poi, di solito, viene riavviata una nuova copia del programma Getty.

LOGIN_TIMEOUT n_secondi

Stabilisce un tempo massimo per completare la procedura di accesso, dopo il quale il programma login conclude il suo funzionamento.

MAIL_CHECK_ENAB {yes|no}

Se si assegna il valore yes, si vuole che il programma login verifichi la presenza di messaggi di posta elettronica per l'utente, in modo da avvisarlo prima di lasciare il controllo alla shell. La verifica viene fatta in base alle informazioni indicate con la direttiva MAIL_DIR, oppure in MAIL_FILE.

MAIL_DIR directory_caselle_postali

Se si vuole fare in modo che login verifichi la presenza di messaggi di posta elettronica per l'utente che accede, è necessario utilizzare questa direttiva (oppure MAIL_FILE, a seconda della configurazione del sistema di posta elettronica) per fornire l'indicazione della directory che contiene le caselle dei vari utenti. Se queste caselle sono contenute nelle rispettive directory personali, si utilizza la direttiva MAIL_FILE.

MAIL_FILE file_casella_postale

Questa direttiva si contrappone, e si sostituisce a MAIL_DIR. Serve a definire il percorso, relativo alla directory personale dell'utente, del file contenente i messaggi di posta elettronica.

MD5_CRYPT_ENAB {yes|no}

Se si assegna il valore yes, si vuole che il programma passwd utilizzi l'algoritmo MD5 per le password cifrate da annotare nel file /etc/passwd, o /etc/shadow. Ciò può essere fatto solo se la funzione crypt() del sistema lo consente.

MOTD_FILE elenco_percorsi

Permette di definire uno o più percorsi assoluti di file il cui contenuto deve essere visualizzato subito dopo il completamento della procedura di accesso, come messaggio del giorno. L'elenco è separato attraverso due punti verticali (:). Tradizionalmente si tratta del file /etc/motd.

NOLOGINS_FILE percorso

Permette di definire il percorso assoluto di un file, la cui presenza inibisce l'accesso da parte degli utenti comuni. Se il file contiene qualcosa, questo viene visualizzato, e solitamente si tratta della spiegazione del rifiuto a concedere l'accesso. Tradizionalmente si tratta del file /etc/nologin.

PASS_MIN_DAYS n_giorni
PASS_MAX_DAYS n_giorni

Queste due direttive permettono di definire l'intervallo di validità delle password. Questi valori vengono utilizzati all'atto della registrazione di un nuovo utente, per il quale verranno presi come predefiniti. Per la precisione, PASS_MIN_DAYS stabilisce la durata minima di una password che quindi non può essere modificata con maggiore frequenza; PASS_MAX_DAYS stabilisce invece la durata massima di una password dopo la quale l'utenza viene bloccata.

PASS_WARN_AGE n_giorni

Stabilisce il numero di giorni di preavviso per la scadenza delle password.

PASS_MIN_LEN n_caratteri
PASS_MAX_LEN n_caratteri

Queste due direttive servono a porre dei limiti alla dimensione che può essere assegnata a una nuova password. Finché si utilizza la funzione crypt() tradizionale, non ha senso consentire l'uso di password più lunghe di otto caratteri.

TTYGROUP {gruppo|gid}

Permette di definire il gruppo a cui attribuire il dispositivo corrispondente al terminale utilizzato dall'utente che accede. Di solito si tratta di tty. Ciò è utile in abbinamento alla direttiva TTYPERM, in modo da consentire al programma write (abbinato allo stesso gruppo e impostato con il bit SGID) di scrivere su quel terminale.

TTYPERM permessi_numerici

Permette di definire i permessi da attribuire al dispositivo corrispondente al terminale utilizzato per accedere. Di solito, se si utilizza l'abbinamento al gruppo tty, si utilizzano i permessi 06208. Il valore predefinito per questi è 06228, cosa che consentirebbe la scrittura a chiunque, mentre per motivi di sicurezza si potrebbe preferire 06008, in modo da escludere a priori l'uso di write e di qualunque altra interferenza simile.

41.2.2   # pwconv

pwconv

pwconv permette di convertire un file /etc/passwd normale in una coppia /etc/passwd e /etc/shadow, togliendo dal primo le password cifrate. Il programma funziona anche se il file /etc/shadow esiste già, e in tal caso serve per fare in modo che tutte le utenze siano registrate correttamente nel file /etc/shadow e le password siano tolte dal file /etc/passwd.

Come si vede dalla sintassi indicata, questo programma non richiede argomenti: si avvale semplicemente della configurazione contenuta in /etc/login.defs per stabilire i periodi di validità delle password. In pratica, utilizza precisamente le informazioni delle direttive PASS_MAX_DAYS, PASS_MIN_DAYS, e PASS_WARN_AGE.

41.2.3   # pwunconv

pwunconv

A fianco di pwconv, il programma pwunconv svolge il compito inverso: quello di trasferire le password cifrate nel file /etc/passwd, perdendo le informazioni aggiuntive contenute nel file /etc/shadow.

Anche questo programma è in grado di funzionare correttamente se parte delle utenze si trovano già solo nel file /etc/passwd. In ogni caso, al termine viene eliminato il file /etc/shadow.

41.2.4   # useradd

useradd [opzioni] utente
useradd -D [opzioni]

Il programma useradd permette di aggiungere un utente in un sistema in cui siano attive, o meno, le password shadow.

Il funzionamento di useradd può essere configurato attraverso il file /etc/default/useradd, e l'uso dell'opzione -D manifesta l'intenzione di visualizzare tale configurazione o di modificarla.

Dopo la creazione dell'utente, è necessario attribuirgli una password iniziale, attraverso il programma passwd.

Opzioni di configurazione

Il funzionamento di useradd può essere controllato attraverso il file di configurazione /etc/default/useradd, oppure attraverso opzioni della riga di comando. Queste opzioni possono essere utili quando si utilizza useradd attraverso uno script, mentre di solito si farà affidamento sulla configurazione memorizzata nel file.

Per questa ragione, qui vengono mostrate solo le opzioni valide in presenza dell'opzione -D. Quando questa opzione viene usata da sola, useradd visualizza semplicemente la configurazione attuale.

-D [...] -b directory_base

Definisce la nuova directory predefinita di partenza per la creazione di directory personali. A questa verrà aggiunta una directory con lo stesso nome dell'utente che si crea. Il valore normale è /home/.

L'argomento di questa opzione viene annotato nella direttiva HOME del file /etc/default/useradd.

-D [...] -e mese/giorno/anno

Definisce la nuova data di scadenza predefinita delle utenze. La data va inserita nella forma MM/GG/[CC]AA, dove l'anno può essere composto da due o quattro cifre (centenario e anno). Il valore normale di questa data è indefinito.

L'argomento di questa opzione viene annotato nella direttiva EXPIRE del file /etc/default/useradd.

-D [...] -f giorni

Definisce il numero di giorni predefinito in cui l'utenza resterà utilizzabile dopo la scadenza della validità della password. Il valore normale è -1, pari al numero più grande che possa essere gestito.

L'argomento di questa opzione viene annotato nella direttiva INACTIVE del file /etc/default/useradd.

-D [...] -g gruppo|UID

Definisce il gruppo predefinito a cui possono essere aggregati i nuovi utenti. Il valore normale è 100, pari al gruppo di utenti generico.

L'argomento di questa opzione viene annotato nella direttiva GROUP del file /etc/default/useradd.

Nella distribuzione GNU/Linux Red Hat, il programma useradd è modificato in modo che alla creazione di un nuovo utente, gli venga abbinato un gruppo privato. In questo senso, questa opzione di configurazione risulta non utilizzata in pratica.

-D [...] -s shell

Definisce la shell predefinita da assegnare ai nuovi utenti. Di solito di tratta di /bin/bash.

L'argomento di questa opzione viene annotato nella direttiva SHELL del file /etc/default/useradd.

Esempi

useradd caio

Crea l'utente caio secondo la configurazione stabilita nel file /etc/default/useradd.

useradd -D

Visualizza la configurazione attuale per la creazione di nuove utenze.

Nella distribuzione GNU/Linux Debian, è bene utilizzare sempre solo l'eseguibile adduser, che in pratica è un programma Perl in grado di gestire correttamente sia useradd che groupadd, in particolare per ciò che riguarda il problema dei gruppi privati. Per questo motivo, con la distribuzione GNU/Linux Debian non si deve toccare il file /etc/default/useradd, ammesso che ci sia, e se non c'è, non deve essere creato.

41.2.5   /etc/default/useradd

Il file /etc/default/useradd contiene la configurazione del programma useradd. Si tratta di una serie di direttive nella forma nome=valore, e quasi tutto ciò che appare in questo file può essere modificato attraverso lo stesso useradd, con l'opzione -D. Segue un esempio di questo file.

# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel

Il significato delle varie direttive è intuitivo; in ogni caso appare descritto nella sezione dedicata a useradd.

41.2.6   # userdel

userdel [-r] utente

userdel permette di eliminare facilmente un'utenza dai file /etc/passwd e /etc/shadow. Eventualmente, se si utilizza l'opzione -r, viene eliminata anche la directory personale dell'utente cancellato, mente altri file che dovessero trovarsi al di fuori di quella gerarchia, possono essere tolti solo in modo manuale.

Se si utilizza la tecnica dei gruppi privati, potrebbe essere necessaria, o desiderabile, l'eliminazione del gruppo corrispondente. In tal caso, occorre intervenire manualmente nel file /etc/group.

41.2.7   # usermod

usermod [opzioni] utente

usermod permette di modificare facilmente alcune caratteristiche di un'utenza. A seconda delle preferenze dell'amministratore del sistema, può darsi che si consideri più facile la modifica diretta dei file /etc/passwd e /etc/shadow, tuttavia, se si intende indicare una data di scadenza per un'utenza, la conversione in giorni trascorsi dal 1/1/1970, necessaria per modificare direttamente il file /etc/shadow, potrebbe essere un po' seccante.

Alcune opzioni
-e mese/giorno/anno

Definisce la data di scadenza dell'utenza. La data va inserita nella forma MM/GG/[CC]AA, dove l'anno può essere composto da due o quattro cifre (centenario e anno).

-f giorni

Definisce il numero di giorni in cui l'utenza resterà utilizzabile dopo la scadenza della validità della password.

[-m] -d directory_home

Modifica la posizione della directory personale dell'utente. Se viene usata anche l'opzione -m si ottiene lo spostamento della vecchia directory nella nuova collocazione, oppure, se manca, questa viene creata.

41.3   Amministrazione dei gruppi

Anche i gruppi possono avere una password, e questa dovrebbe servire a permettere ad altri utenti, che nulla hanno a che fare con questi, di potervisi inserire attraverso il comando newgrp.

Generalmente, per fare in modo che un utente possa partecipare a un gruppo del quale non fa già parte, basta aggiungere il suo nome nell'ultimo campo del record del gruppo in cui questo vuole essere inserito. Da quel momento, quell'utente potrà utilizzare il comando newgrp gruppo per agire con i privilegi concessi a quel gruppo.

L'idea di poter aggiungere una password ai gruppi, in modo che gli utenti estranei che la conoscono possano usare ugualmente newgrp per questo, è piuttosto discutibile. Infatti, una password è «sicura» solo se conosciuta da una sola persona; nel momento in cui la stessa password è conosciuta da un gruppo di persone diventa incontrollabile la sua diffusione (a causa della natura umana).

Tuttavia, il problema esiste e vale la pena di analizzarne gli effetti in presenza di password shadow.

41.3.1   /etc/gshadow

La presenza del file /etc/gshadow indica l'attivazione delle password shadow per i gruppi. I record di questo file sono organizzati in campi, separati attraverso due punti verticali (:), secondo la sintassi seguente:

gruppo:password:amministratori:utenti_membri
  1. gruppo

    Il nome del gruppo.

  2. password

    La password cifrata (che normalmente è assente).

  3. amministratori

    Un elenco, separato da virgole, di utenti amministratori del gruppo.

  4. utenti_membri

    Un elenco, separato da virgole, di utenti che fanno parte del gruppo.

Gli amministratori del gruppo hanno la possibilità di aggiungere e togliere utenti membri; inoltre, possono cambiare la password.

41.3.2   # grpconv

grpconv

grpconv permette di convertire un file /etc/group normale in una coppia /etc/group e /etc/gshadow, togliendo dal primo le eventuali password cifrate. Il programma funziona anche se il file /etc/gshadow esiste già: in tal caso serve per fare in modo che tutti i gruppi siano registrati correttamente nel file /etc/gshadow e le password siano tolte dal file /etc/group.

41.3.3   # grpunconv

grpunconv

A fianco di grpconv, il programma grpunconv svolge il compito inverso: quello di trasferire le password cifrate nel file /etc/group perdendo le informazioni aggiuntive contenute nel file /etc/gshadow.

Anche questo programma è in grado di funzionare correttamente se parte delle utenze si trovano solo nel file /etc/group. In ogni caso, al termine viene eliminato il file /etc/gshadow.

41.3.4   $ gpasswd

gpasswd [opzioni] gruppo

gpasswd, come suggerisce il nome, serve a cambiare la password di un gruppo. Oltre a questo, però, permette anche di intervenire sugli altri campi del file /etc/gshadow, inserendo o eliminando gli amministratori e i membri di un gruppo.

La presenza di una password in un gruppo, serve a permettere a utenti che non siano già membri di poterne fare parte utilizzando il comando newgrp. Tuttavia, il meccanismo potrebbe non funzionare, e questo è sintomo dello scarso interesse verso questa possibilità. Infatti, la vera innovazione nell'introduzione del file /etc/gshadow sta nella possibilità di definire degli amministratori per i gruppi, competenti per l'aggregazione dei membri rispettivi.

Alcune opzioni
-A amministratore[,...]

Permette all'utente root di definire uno o più amministratori per il gruppo. L'argomento dell'opzione è un elenco di uno o più utenti a cui viene attribuito il ruolo di amministratori del gruppo. L'elenco di amministratori va a sostituirsi a quanto impostato in precedenza.

-M membro[,...]

Permette all'utente root di definire uno o più membri del gruppo. L'argomento dell'opzione è un elenco di uno o più utenti membri del gruppo. L'elenco di membri va a sostituirsi a quanto impostato in precedenza.

-a membro

Permette a un amministratore del gruppo di aggiungere un utente membro.

-d membro

Permette a un amministratore del gruppo di eliminare un utente membro.

-r

Permette a un amministratore del gruppo di eliminare la password.

-R

Permette a un amministratore del gruppo di rendere impossibile l'accesso attraverso la password.

41.3.5   # groupadd

groupadd [opzioni] gruppo

Il programma groupadd permette di aggiungere un gruppo in un sistema in cui siano attive, o meno, le password shadow.

41.3.6   # groupdel

groupdel gruppo

Il programma groupdel permette di eliminare un gruppo in un sistema in cui siano attive, o meno, le password shadow.

41.4   Caso particolare di adduser e addgroup nella distribuzione GNU/Linux Debian

La distribuzione GNU/Linux Debian, al posto del programma adduser tradizionale (quello che si usa di solito quando non si gestiscono le password shadow), dispone di un programma Perl creato appositamente per gestire simultaneamente la creazione degli utenti e dei gruppi privati relativi. Se si dispone di password shadow, provvede a richiamare i programmi useradd e groupadd, nel modo più opportuno.

Con la distribuzione GNU/Linux Debian, i programmi useradd e groupadd non vanno usati direttamente; al loro posto si utilizzano adduser e addgroup (il secondo è solo alias, in qualità di collegamento del primo), che si configurano attraverso il file /etc/adduser.conf. Senza approfondire la sintassi degli argomenti di adduser e di addgroup, nella versione Debian, si può utilizzare il primo di questi due eseguibili indicando semplicemente il nome dell'utente che si vuole creare, affidandosi alla sua configurazione predefinita. Di seguito appare l'esempio standard del file /etc/adduser.conf:

# /etc/adduser.conf: `adduser' configuration.
# See adduser(8) and adduser.conf(5) for full documentation.

# The DSHELL variable specifies the default login shell on your
# system.
DSHELL=/bin/bash

# The DHOME variable specifies the directory containing users' home
# directories.
DHOME=/home

# If GROUPHOMES is "yes", then the home directories will be created as
# /home/groupname/user.
GROUPHOMES=no

# If LETTERHOMES is "yes", then the created home directories will have
# an extra directory - the first letter of the user name. For example:
# /home/u/user.
LETTERHOMES=no

# The SKEL variable specifies the directory containing "skeletal" user
# files; in other words, files such as a sample .profile that will be
# copied to the new user's home directory when it is created.
SKEL=/etc/skel

# FIRST_SYSTEM_UID to LAST_SYSTEM_UID inclusive is the range for UIDs
# for dynamically allocated administrative and system accounts.
FIRST_SYSTEM_UID=100
LAST_SYSTEM_UID=999

# FIRST_UID to LAST_UID inclusive is the range of UIDs of dynamically
# allocated user accounts.
FIRST_UID=1000
LAST_UID=29999

# The USERGROUPS variable can be either "yes" or "no".  If "yes" each
# created user will be given their own group to use as a default, and
# their home directories will be g+s.  If "no", each created user will
# be placed in the group whose gid is USERS_GID (see below).
USERGROUPS=yes

# If USERGROUPS is "no", then USERS_GID should be the GID of the group
# `users' (or the equivalent group) on your system.
USERS_GID=100

# If QUOTAUSER is set, a default quota will be set from that user with
# `edquota -p QUOTAUSER newuser'
QUOTAUSER=""

Come si può osservare, le direttive sono degli assegnamenti a variabili, dove le righe vuote e quelle bianche vengono ignorate, e così è ignorato il testo che segue il simbolo #, fino alla fine della riga in cui appare.

Alcune direttive
DSHELL=percorso_shell_standard

Definisce la shell da attribuire agli utenti che vengono creati. In mancanza di questa indicazione, si utilizza /bin/bash.

DHOME=radice_directory_personali

Definisce la radice delle directory personali che vengono create. Il valore predefinito è /home/.

SKEL=scheletro_directory_personali

Definisce la directory da utilizzare come scheletro per la creazione delle directory personali. In modo predefinito si tratta di /etc/skel/.

FIRST_UID=n_uid_iniziale
LAST_UID=n_uid_finale

Definiscono l'intervallo dei numeri UID che possono essere utilizzati per gli utenti. In modo predefinito, si tratta di 1 000 e 29 999 rispettivamente.

USERGROUPS={yes|no}

Serve a definire se gli utenti devono avere un gruppo privato. Se si attiva questa modalità, assegnando la parola chiave yes, che è anche il valore predefinito, si ottiene anche l'attribuzione del bit SGID alla directory personale.

USERS_GID=n_gid

Questa direttiva serve solo nel caso sia stata utilizzata USERGROUPS=no, e permette così di stabilire il numero GID del gruppo da abbinare agli utenti nuovi.

41.5   Verifiche di coerenza

La gestione delle utenze non è fatta solo di inserimenti, modifiche ed eliminazioni. Dal momento che le modifiche possono anche essere fatte direttamente sui file, è comodo se si dispone di qualche strumento di controllo di coerenza.

41.5.1   # pwck

pwck [-r] [file_passwd [file_shadow]] 

pwck verifica la coerenza del file /etc/passwd e, se esiste, del file /etc/shadow (utilizzando anche il file /etc/group per la verifica dell'appartenenza ai gruppi). Il programma, previo consenso dell'utilizzatore (l'utente root), può risolvere da solo alcuni tipi di problemi modificando i file. Tuttavia, se si utilizza l'opzione -r, pwck si limita a segnalare i problemi.

Se necessario, si possono indicare espressamente i file che svolgono le funzioni di passwd e shadow.

41.5.2   # grpck

grpck [-r] [file_group [file_gshadow]] 

grpck verifica la coerenza del file /etc/group e, se esiste, del file /etc/gshadow (utilizzando anche il file /etc/passwd per la verifica dell'aggregazione degli utenti). Il programma, previo consenso dell'utilizzatore (l'utente root), può risolvere da solo alcuni tipi di problemi modificando i file. Tuttavia, se si utilizza l'opzione -r, grpck si limita a segnalare i problemi.

Se necessario, si possono indicare espressamente i file che svolgono le funzioni di group e gshadow.

41.6   Copie di sicurezza

Quando si aggiunge, elimina, o si modifica un'utenza attraverso gli strumenti previsti, vengono generate delle copie di sicurezza dei file amministrativi coinvolti. Tipicamente può trattarsi di /etc/passwd, /etc/shadow, /etc/group e /etc/gshadow.

Queste copie di sicurezza si distinguono perché hanno gli stessi nomi dei file corrispondenti con l'aggiunta di un trattino finale. In pratica: /etc/passwd-, /etc/shadow-, /etc/group- e /etc/gshadow-. È importante fare un minimo di attenzione anche a questi file, se si vuole evitare che informazioni importanti vengano conosciute da utenti che non ne hanno il diritto. Infatti, un file /etc/shadow- che per qualche motivo dovesse diventare leggibile a tutti gli utenti, costituirebbe un grosso buco nel sistema di sicurezza.

41.7   Riferimenti

Appunti di informatica libera 2000.07.31 --- Copyright © 2000 Daniele Giacomini --  daniele @ swlibero.org

[>a258.html>] [<a256.html<] [^a2.html^]