Gentoo Logo

Guida a Sudo(ers)

Indice:

1.  Sudo

Assegnare permessi

Il pacchetto app-admin/sudo permette all'amministratore di sistema di concedere ad altri utenti i privilegi per eseguire una o più applicazioni a cui normalmente non avrebbero diritto. Invece di impostare il bit setuid di queste applicazioni sudo permette una gestione migliore di chi può eseguire certi comandi e quando.

Usando sudo puoi creare una lista precisa di chi può eseguire determinati comandi. Se tu impostassi il bit setuid chiunque potrebbe eseguire quell'applicazione (o, a seconda dei permessi utilizzati, ogni membro di un certo gruppo). Con sudo, invece, puoi (e dovresti) richiedere all'utente l'inserimento di una password quando tenta di eseguire tale applicazione.

Loggare le attività

Un ulteriore vantaggio di sudo è che può fornire i log di ogni tentativo di esecuzione (sia andato a buon fine che non) di un'applicazione. Questo è veramente comodo se si vuole tenere traccia di chi ha fatto l'errore che ti è costato 10 ore di tempo per sistemarlo :)

Configurare Sudo

La configurazione di sudo è gestita dal file /etc/sudoers. Questo file non andrebbe mai editato usando nano /etc/sudoers o vim /etc/sudoers o qualsiasi altro editor da voi utilizzato. Quando si vuole modificare questo file si dovrebbe usare visudo.

Questo programma infatti permette di controllare che non ci siano due amministratori che stanno modificando il file contemporaneamente, di mantenere i permessi corretti sul file stesso e di verificarne la sintassi in modo da evitare errori.

Questa guida

Questa guida può essere vista come una breve introduzione a questo programma. Il pacchetto sudo è molto più potente di come viene descritto qui. Possiede infatti molte funzionalità come il poter editare file come un utente differente (sudoedit), può essere eseguito in uno script (può girare in background, può leggere la password dallo standard in e non dalla tastiera, ...), etc.

Per favore leggi le pagine del manuale di sudo e di sudoers per informazioni maggiori.

2.  Sintassi di Sudoers

Sintassi di base

La cosa più difficile dell'utilizzo di sudo è la sintassi di /etc/sudoers. La sintassi base è qualcosa di simile a:

Codice 2.1: Sintassi di base di /etc/sudoers

user  host = comandi

Questa sintassi indica a sudo che l'utente, identificato da user e loggato nel sistema host può eseguire qualsiasi comando indicato in commands come se fosse l'utente root. Facciamo un esempio reale per semplificare le cose: si vuole permettere all'utente swift di eseguire emerge se è autenticato in localhost:

Codice 2.2: Reale esempio di /etc/sudoers

swift  localhost = /usr/bin/emerge

Nota: L'hostname deve corrispondere a ciò che restituisce il comando hostname.

Prestare attenzione a cosa si scrive: non permettere ad utenti di eseguire applicazioni che potrebbero concedergli privilegi troppo elevati. Per esempio, permettere ad utenti di eseguire emerge come utente root significa affidargli i pieni accessi al sistema in quanto emerge può essere utilizzato per cambiare file di sistema a vantaggio dell'utente stesso. Se non vi fidate dei vostri utenti sudo non dategli nessun diritto.

Il nome dell'utente può anche essere sostituito con il nome di un gruppo - in questo caso si deve far precedere al nome del gruppo il carattere %. Esempio per permettere a tutti gli utenti del gruppo wheel di eseguire emerge:

Codice 2.3: Permettere ai membri del gruppo wheel di eseguire emerge

%wheel  localhost = /usr/bin/emerge

Si possono inserire più comandi nella stessa linea in modo da non doverne creare una diversa per ogni istruzione. Per esempio, per permettere allo stesso utente non solo di eseguire emerge ma anche di eseguire ebuild e emerge-webrsync come utente root:

Codice 2.4: Comandi multipli

swift  localhost = /usr/bin/emerge, /usr/bin/ebuild, /usr/sbin/emerge-webrsync

Si può inoltre specificare un preciso comando e non solo il generico programma. Questo è comodo per poterne restringere l'uso ad uno specifico set di opzioni. Il programma sudo permette wildcard in stile shell (AKA caratteri meta o glob) per essere usate in pathname come argomenti nella riga di comando nei file sudoers. Notare che questi non sono espressioni regolari.

Esempio:

Codice 2.5: Permettere il solo aggiornamento del sistema usando sudo

$ sudo emerge -uDN world

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

Password: (Inserire la password dell'utente, not quella di root!)

La password richiesta da sudo è la password personale dell'utente. Questo è fatto per impedire che terminali lasciati accidentalmente aperti vengano usati per scopi dannosi da altre persone.

Dovresti sapere che sudo non modifica la variabile ${PATH}: ogni comando scritto dopo sudo viene trattato nel tuo ambiente. Se vuoi permettere all'utente di eseguire un programma posto in, per esempio, /sbin, l'utente stesso deve preoccuparsi di utilizzare sudo fornendo il path completo del comando da eseguire:

Codice 2.6: Usare il path completo di un programma

$ sudo /usr/sbin/emerge-webrsync

Usare gli Alias

In sistemi di grandi dimensioni inserire tutti gli utenti più e più volte (o gli host o i comandi) può essere un lavoro davvero faticoso. Per semplificare l'amministrazione di /etc/sudoers si possono definire degli alias. Il formato di tale definizione è relativamente semplice:

Codice 2.7: Dichiarare alias in /etc/sudoers

Host_Alias hostalias = hostname1, hostname2, ...
User_Alias useralias = user1, user2, ...
Cmnd_Alias cmndalias = command1, command2, ...

Un alias che funziona sempre, in ogni posizione, è ALL (per differenziare maggiormente gli alias dai non-alias è consigliato usare i caratteri maiuscoli per i primi). Come indubbiamente avrai notato l'alias ALL è utilizzabile per tutte le possibili configurazioni.

Esempio dell'uso di ALL per permettere a tutti gli utenti di eseguire il comando shutdown solo se loggati localmente:

Codice 2.8: Permettere a tutti gli utenti di eseguire shutdown

ALL  localhost = /sbin/shutdown

Altro esempio per permettere all'utente swift di eseguire il comando emerge come root, indipendentemente da dove si è loggato è:

Codice 2.9: Permettere ad un utente di eseguire un comando indipendentemente da dove si è loggato

swift   ALL = /usr/bin/emerge

Un esempio ancora più interessante è definire un set di utenti che possono eseguire applicazioni amministrative (come emerge o ebuild) e un gruppo di utenti che possono cambiare la password di chiunque, eccetto quella di root!

Codice 2.10: Usare alias per utenti e programmi

User_Alias  SOFTWAREMAINTAINERS = swift, john, danny
User_Alias  PASSWORDMAINTAINERS = swift, sysop
Cmnd_Alias  SOFTWARECOMMANDS    = /usr/bin/emerge, /usr/bin/ebuild
Cmnd_Alias  PASSWORDCOMMANDS    = /usr/bin/passwd [a-zA-Z0-9_-]*, !/usr/bin/passwd root

SOFTWAREMAINTAINERS  localhost = SOFTWARECOMMANDS
PASSWORDMAINTAINERS  localhost = PASSWORDCOMMANDS

Esecuzioni Non-Root

Usando sudo è inoltre possibile permettere ad un utente di eseguire un'applicazione come un utente differente, e non root. Questo può essere molto utile se nel sistema vengono eseguite delle applicazioni da utenti particolari (per esempio apache come web server) e si vuole permettere ad alcuni utenti di eseguire determinate operazioni amministrative come se fossero questi utenti particolari (come uccidere processi zombie).

Dentro /etc/sudoers bisogna elencare l'utente(utenti) con cui si vuole eseguire l'applicazione tra ( e ) prima dell'elenco dei comandi:

Codice 2.11: Sintassi per l'esecuzione di programmi come utente non-root

users  hosts = (run-as) commands

Esempio per permettere all'utente swift di eseguire il comando kill come se fosse l'utente apache o gorg:

Codice 2.12: Esempio di esecuzione come utente non-root

Cmnd_Alias KILL = /bin/kill, /usr/bin/pkill

swift   ALL = (apache, gorg) KILL

E' possibile usare il comando sudo -u per specificare l'utente con cui vuole eseguire l'applicazione interessata:

Codice 2.13: Eseguire il comando pkill come utente apache

$ sudo -u apache pkill apache

Si possono settare alias anche per gli utenti con cui si vogliono eseguire determinate operazioni usando la direttiva Runas_Alias, il cui uso è identico alle altre direttive _Alias viste precedentemente.

Passwords e configurazioni di default

Di default sudo chiede all'utente di identificarsi usando la propria password personale. Quando questa viene inserita sudo la ricorda per 5 minuti, permettendo così all'utente di eseguire più comandi senza doversi preoccupare di reinserire la password ogni volta.

Ovviamente questo comportamento può essere modificato: si può settare la direttiva Defaults: nel file /etc/sudoers per cambiare tale impostazione per un utente.

Per esempio, per cambiare i 5 minuti di default in 0 minuti (non ricordare mai la password) per l'utente swift:

Codice 2.14: Cambiare il valore del timeout

Defaults:swift  timestamp_timeout=0

Impostando il valore a -1 significherebbe ricordare la password indefinitamente (fino al riavvio del sistema).

Un utilizzo differente è il voler impostare la richiesta della password dell'utente con cui si vuole eseguire il comando e non quella privata dell'utente che utilizza sudo. Questo è possibile usando runaspw. Nell'esempio seguente modifichiamo inoltre il numero di tentativi possibili (quante volte l'utente può inserire la password prima che sudo ritorni un errore) passando dai 3 di default a 2:

Codice 2.15: Richiedere la password di root invece che la password privata dell'utente

Defaults:john   runaspw, passwd_tries=2

Un'altra funzione interessante è la variabile DISPLAY, che se impostata permette di eseguire tools grafici.

Codice 2.16: Mantenere abilitata la variabile DISPLAY

Defaults:john env_keep=DISPLAY

Esistono dozzine di configurazioni di default modificabili tramite la direttiva Defaults:. Leggi le pagine di manuale di sudo cercando l'argomento Defaults per avere maggiori informazioni.

Se invece si vuol permettere ad un utente di eseguire certi comandi senza fornire una password bisogna far precedere alla lista dei comandi NOPASSWD:. Ad esempio:

Codice 2.17: Permettere l'esecuzione di emerge come utente root senza richiedere una password

swift     localhost = NOPASSWD: /usr/bin/emerge

3.  Usare Sudo

Mostrare i privilegi

Un utente, per poter visualizzare l'elenco dei comandi che sudo gli mette a disposizione, può utilizzare sudo -l:

Codice 3.1: Elenco permessi

$ sudo -l
User swift may run the following commands on this host:
    (root)   /usr/libexec/xfsm-shutdown-helper
    (root)   /usr/bin/emerge
    (root)   /usr/bin/passwd [a-zA-Z0-9_-]*
    (root)   !/usr/bin/passwd root
    (apache) /usr/bin/pkill
    (apache) /bin/kill

Se l'utente è associato ad alcuni programmi in /etc/sudoers che non richiedono una password, questa non verrà richiesta neanche per mostrarli col comando precedente. Altrimenti una password, se non "ricordata" da sudo, verrà richiesta all'utente.

Aumentare la durata della password

Di default se un utente ha inserito la sua password in sudo questa verrà ricordata per 5 minuti. Se l'utente vuole prolungare questo periodo può eseguire il comando sudo -v per ricomiciare il timeout, avendo quindi a disposizione altri 5 minuti prima che sudo la richieda nuovamente.

Codice 3.2: Prolungare la durata della password

$ sudo -v

Per dire a sudo di "scordare" immediatamente la propria password si può utilizzare il comando sudo -k.



Stampa

Aggiornato il 13 agosto 2011

La versione originale di questo documento non è più mantenuta

Oggetto: Quando si vuol permettere a qualcuno di eseguire certe funzioni amministrative sul proprio sistema senza affidargli l'accesso di root, usare sudo risulta essere la soluzione migliore. Con sudo si può controllare chi può fare cosa. Questa guida offre una breve introduzione a questo ottimo programma.

Sven Vermeulen
Autore

Grentis
Traduzione

Cristiano Chiucchiolo
Revisione

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.