Capitolo successivo Capitolo precedente Indice

21. Account

Le informazioni sugli utenti registrati nel sistema sono raccolte principalmente all'interno di /etc/passwd. Anche se il nome suggerisce che debba contenere le password, in realtà il suo scopo è più ampio e la sua accessibilità in lettura è essenziale per tutti i programmi che hanno qualcosa a che fare con gli utenti.

Per questo motivo, in molti sistemi si preferisce trasferire le password in un altro file con meno possibilità di accesso: /etc/shadow.

Il file /etc/group permette di raccogliere le notizie sui gruppi e in particolare di stabilire la possibile appartenenza da parte di un utente a più gruppi.

Questi file sono già stati descritti nelle sezioni passwd, group e shadow.

21.1 Utenti e gruppi

I nuovi utenti possono essere aggiunti solo da parte dell'utente root, ma poi possono essere loro stessi a cambiare alcuni elementi del loro account. Il più importante è naturalmente la password.

# adduser

adduser

Permette a root di aggiungere un nuovo utente all'interno del file /etc/passwd, assegnandogli un UID, un GID, una password, una shell e creando la sua directory home.

<!>   Il nome dell'utente non deve superare gli otto caratteri.

$ passwd

passwd [<utente>]

Permette di cambiare la password registrata all'interno di /etc/passwd. Solo root può cambiare la password di un altro utente. Gli utenti normali (tutti escluso root) devono utilizzare una password di almeno sei caratteri composti sia da maiuscole che minuscole o simboli diversi. Alcune password simili al nome utilizzato per identificare l'utente, non sono valide.

Se non si dispone di un mezzo per l'inserimento di un nuovo utente, come quello fornito da adduser, è possibile aggiungere manualmente un record all'interno del file /etc/passwd senza l'indicazione della password che poi potrà essere specificata attraverso passwd.

$ chsh

chsh [<opzioni>] [<utente>]

Permette di cambiare la shell predefinita all'interno del file /etc/passwd. È possibile indicare solo una shell tra quelle elencate all'interno di /etc/shells. Se la nuova shell non viene indicata tra gli argomenti, questa viene richiesta subito dopo l'avvio di chsh. Per conferma, viene richiesta anche la ripetizione della password.

Alcune opzioni

-s shell | --shell shell

Permette di specificare la shell.

-l | --list-shells

Emette un elenco delle shell disponibili in base al contenuto di /etc/shells.

/etc/shells

Il file /etc/shells contiene semplicemente un elenco di shell valide, cioè di quelle che sono esistenti e possono essere utilizzate. Segue un esempio di questo file.

/bin/sh
/bin/bash
/bin/tcsh
/bin/csh
/bin/ash
/bin/zsh

$ chfn

chfn [<opzioni>] [<utente>]

Consente di modificare le informazioni finger registrate all'intero del file /etc/passwd. Si tratta in pratica del nominativo dell'utente, del numero dell'ufficio, del telefono dell'ufficio e del telefono di casa. Se non vengono specificate opzioni, i dati vengono inseriti in maniera interattiva, se non viene specificato l'utente, si intende l'utente che ha eseguito il comando. Solo l'utente root può cambiare le informazioni di un altro utente.

$ groups

groups [<utente>... ]

Visualizza i gruppi ai quali l'utente o gli utenti appartengono. Il risultato è equivalente al comando seguente.

id -Gn [<nome-utente>].

$ id

id [<opzioni>] [<utente>]

Visualizza lo UID (User ID) e il GID (Group ID) reale e/o efficace dell'utente selezionato o di quello corrente.

Opzioni

-u | --user

Emette solo il numero dell'utente (UID).

-g | --group

Emette solo il numero del gruppo (GID).

-G | --groups

Emette solo i numeri dei gruppi supplementari.

-n | --name

Emette il nome dell'utente, del gruppo o dei gruppi, a seconda che sia usato insieme a -u, -g o -G.

-r | --real

Emette i numeri UID o GID reali invece di quelli efficaci (ammesso che ci sia differenza). Si usa insieme a -u, -g o -G.

21.2 Account importanti

Osservando il file /etc/passwd si possono notare diversi utenti fittizi standard che hanno degli scopi particolari.

root:dxdFf9MvQ3s:0:0:root:/root:/bin/bash
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
adm:*:3:4:adm:/var/adm:
lp:*:4:7:lp:/var/spool/lpd:
sync:*:5:0:sync:/sbin:/bin/sync
shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown
halt:*:7:0:halt:/sbin:/sbin/halt
mail:*:8:12:mail:/var/spool/mail:
news:*:9:13:news:/var/spool/news:
uucp:*:10:14:uucp:/var/spool/uucp:
operator:*:11:0:operator:/root:
games:*:12:100:games:/usr/games:
gopher:*:13:30:gopher:/usr/lib/gopher-data:
ftp:*:14:50:FTP User:/home/ftp:
nobody:*:99:99:Nobody:/:

Di conseguenza, anche /etc/group contiene l'indicazione di gruppi particolari.

root::0:root
bin::1:root,bin,daemon
daemon::2:root,bin,daemon
sys::3:root,bin,adm
adm::4:root,adm,daemon
tty::5:
disk::6:root
lp::7:daemon,lp
mem::8:
kmem::9:
wheel::10:root
mail::12:mail
news::13:news
uucp::14:uucp
man::15:
games::20:
gopher::30:
dip::40:
ftp::50:
nobody::99:
users::100:

I campi delle password di questi utenti speciali (tutti tranne root) hanno un asterisco che di fatto impedisce qualunque accesso.

<!>   In questo caso, l'utente fittizio nobody ha il numero UID 99, come organizzato nella distribuzione RedHat. In generale, questo utente potrebbe avere il numero UID 65535 (-1), oppure 65534 (-2).

Segue la descrizione di alcuni di questi utenti e gruppi.

root

L'utente root è l'amministratore del sistema: ogni sistema Unix ha un utente root. L'utente root ha sempre il numero UID pari a zero.

bin

L'utente bin non esiste nella realtà. Si tratta di un nome fittizio definito per assegnare ai file eseguibili (binary) un proprietario diverso da root. Di solito, con Linux, questi eseguibili appartengono al gruppo bin, mentre l'utente proprietario resta root.

uucp

L'utente fittizio uucp viene spesso utilizzato come proprietario di file (soprattutto file di dispositivo) destinati alla comunicazione. Di solito, con Linux, si assegna il gruppo uucp ai dispositivi di comunicazione /dev/cua*, in modo da poter controllare gli utenti che accedono a queste risorse (tipicamente il modem), cambiando il gruppo di questi utenti in uucp, oppure permettendogli di cambiare gruppo attraverso newgrp ( newgrp).

tty

Di solito, al gruppo tty appartengono i file di dispositivo utilizzabili come canali per la connessione di un terminale.

disk

Di solito, al gruppo disk appartengono i file di dispositivo che si riferiscono a unità a dischi, compresi i CD-ROM.

floppy

Di solito, al gruppo floppy appartengono i file di dispositivo che si riferiscono a unità a dischetti.

nobody

L'utente nobody corrisponde in linea di massima a un utente generico, non identificato, senza privilegi particolari. Viene usato in particolare per evitare che un utente root possa accedere a un filesystem di rete (NFS) mantenendo i suoi privilegi: quando ciò accade, il computer che offre il servizio NFS lo tratta come utente nobody.

Di solito, per tradizione, questo utente dovrebbe avere il numero UID -1 (65535), oppure -2 (65534), ma alcune distribuzioni Linux attribuiscono a questo un altro numero (nell'esempio visto sopra era 99).

21.3 Eliminazione di un utente

L'eliminazione di un utente dal sistema, non è gestibile attraverso un programma di utilità standard di uso generale: la particolare distribuzione Linux può fornire degli strumenti adatti, oppure si deve agire manualmente. In questa sezione si descrive come si può intervenire manualmente.

Fondamentalmente si tratta di agire su due punti:

Collocazione dei dati dell'utente

I file di un utente possono trovarsi ovunque gli sia stato consentito di scriverli. In particolare:

Per cercare tutti i file appartenenti a un certo utente, è possibile usare il programma find in uno dei modi seguenti.

find / -uid <numero-utente>

find / -user <utente>

Eliminazione dei dati dell'utente

Volendo si potrebbe costruire uno script per l'eliminazione automatica di tutti i file appartenenti a un determinato utente. L'esempio seguente, prima di eliminare i file, crea una copia compressa.

#!/bin/bash
#======================================================================
# eliminautente
#======================================================================

#======================================================================
# Variabili.
#======================================================================

    #------------------------------------------------------------------
    # Il nome dell'utente viene fornito come primo e unico argomento
    # di questo script.
    #------------------------------------------------------------------
    NOME_UTENTE="$1"
    #------------------------------------------------------------------
    # Nome per un file temporaneo contenente l'elenco dei file
    # appartenenti all'utente che si vuole eliminare.
    #------------------------------------------------------------------
    ELENCO_FILE_UTENTE="/tmp/elenco_file_utente"

#======================================================================
# Funzioni.
#======================================================================

    #------------------------------------------------------------------
    # Visualizza la sintassi corretta per l'utilizzo di questo script.
    #------------------------------------------------------------------
    function sintassi () {
        echo ""
        echo "eliminautente <nome-utente>"
        echo ""
        echo "Il nome può avere al massimo 8 caratteri."
    }

#======================================================================
# Inizio.
#======================================================================

    #------------------------------------------------------------------
    # Verifica la quantità di argomenti.
    #------------------------------------------------------------------
    if [ $# != 1 ]
    then
        sintassi
        exit 1
    fi
    #------------------------------------------------------------------
    # Verifica che l'utente sia root.
    #------------------------------------------------------------------
    if [ $UID != 0 ]
    then
        echo \
"Questo script può essere utilizzato solo dall'utente root."
        exit 1
    fi
    #------------------------------------------------------------------
    # Crea un elenco di tutti i file appartenenti all'utente
    # specificato.
    #------------------------------------------------------------------
    find / -user $NOME_UTENTE > $ELENCO_FILE_UTENTE
    #------------------------------------------------------------------
    # Comprime i file generando un file compresso con lo stesso nome
    # dell'utente da eliminare e con estensione ``.tgz''.
    # Si utilizza ``tar'' e in particolare:
    # ``-z'' permette di comprimere automaticamente l'archivio
    #        attraverso ``gzip'';
    #------------------------------------------------------------------
    if tar -c -f ~/$NOME_UTENTE.tgz -v -z `cat $ELENCO_FILE_UTENTE`
    then
        #--------------------------------------------------------------
        # Se è andato tutto bene, elimina i file
        # (togliere il commento).
        #--------------------------------------------------------------
        #rm `cat $ELENCO_FILE_UTENTE`
    fi

#======================================================================
# Fine.
#======================================================================

21.4 Trucchi

Alcuni accorgimenti nella gestione degli utenti e dei gruppi possono essere utili in situazioni particolari. Nelle sezioni seguenti se ne descrivono alcuni.

Utente con funzione specifica

Un trucco che potrebbe rivelarsi comodo in certe situazioni è quello di creare un utente fittizio, con o senza password, al quale si associa un programma o uno script, al posto di una shell. La directory corrente nel momento in cui il programma o lo script viene eseguito è quella indicata come directory home.

L'esempio seguente mostra un record del file /etc/passwd preparato in modo da permettere a chiunque di eseguire il programma (o lo script) /usr/local/bin/ciao partendo dalla posizione della directory /tmp/.

ciao::505:100:Ciao a tutti:/tmp:/usr/local/bin/ciao

Naturalmente, il numero UID 505 e GID 100 sono solo un esempio.

Gruppo di utenti con lo stesso UID

All'interno di un ambiente in cui esiste una certa fiducia nel comportamento reciproco, potrebbe essere conveniente creare un gruppo di utenti con lo stesso numero UID.

Ogni utente avrebbe un proprio nome e una password per accedere al sistema, ma poi, tutti i file apparterrebbero a un utente immaginario che rappresenta tutto il gruppo. Segue un esempio del file /etc/passwd.

tutti:*:1000:1000:Gruppo dei mille:/home/tutti:/bin/sh
alfa:34gdf6r:1000:1000:Gruppo dei mille:/home/tutti:/bin/sh
bravo:e445gsdfr:1000:1000:Gruppo dei mille:/home/tutti:/bin/sh
charlie:t654df7u7:1000:1000:Gruppo dei mille:/home/tutti:/bin/sh

Se esiste la necessità o l'utilità si possono assegnare anche directory home e/o shell differenti.

Un gruppo per ogni utente

Si tratta di una strategia di gestione degli utenti e dei gruppi con cui, ogni volta che si crea un nuovo utente, si crea anche un gruppo con lo stesso nome e lo stesso numero (ID).

Questa tecnica si combina con una maschera umask 002. In pratica, i file vengono creati in modo predefinito con i permessi di lettura e scrittura, sia per l'utente proprietario che per il gruppo, mentre si esclude la scrittura per gli altri utenti.

Il motivo di tutto questo sta nella facilità con cui si può concedere a un altro utente di poter partecipare al proprio lavoro: basta aggiungere il suo nome nell'elenco degli utenti associati al proprio gruppo.

Volendo agire in maniera più elegante, si possono creare degli altri gruppi aggiuntivi, in base alle attività comuni e aggiungere a questi gruppi i nomi degli utenti che di volta in volta partecipano a quelle attività. Naturalmente, i file da condividere all'interno di questi gruppi, devono appartenere a questi stessi gruppi.

Questo metodo di comportamento è quello predefinito della distribuzione RedHat.

 

1997.10.26 - Scritto da Daniele Giacomini   daniele@calion.com   (vedi copyright: Appunti Linux).


Capitolo successivo Capitolo precedente Indice