[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]


40. 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 40.1: Riepilogo dei programmi e dei file per la gestione delle password shadow.

40.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'.

40.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 40.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 40.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 (0400).

40.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.

40.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'.

40.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 0620. Il valore predefinito per questi è 0622, cosa che consentirebbe la scrittura a chiunque, mentre per motivi di sicurezza si potrebbe preferire 0600, in modo da escludere a priori l'uso di `write' e di qualunque altra interferenza simile.

40.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'.

40.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'.

40.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.

40.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'.

40.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'.

40.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.

40.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.

40.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.

40.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'.

40.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'.

40.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.

40.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.

40.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.

40.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 1000 e 29999 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.

40.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.

40.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'.

40.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'.

40.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.

40.7 Riferimenti

---------------------------

Appunti Linux 2000.04.12 --- Copyright © 1997-2000 Daniele Giacomini --  daniele @ pluto.linux.it


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]