Sudo
Il comando sudo fornisce una via semplice e sicura per permettere agli utenti normali di eseguire alcuni (o tutti) comandi come root o altro utente, eventualmente senza fornire alcuna password.
Per permettere ad alcuni utenti di eseguire certe azioni amministrative su un sistema senza concedere il totale accesso root access , l'uso di sudo è la migliore opzione. L'uso di sudo permette il controllo su chi può fare cosa. Questa guida offre una piccola introduzione a questo potente strumento.
Questo articolo intende essere una veloce introduzione a sudo. Il pacchetto app-admin/sudo è molto più potente di quanto si descritto in questo documento. Infatti, ha funzionalità speciali per modificare file come differente utente (sudoedit), eseguire dall'interno di uno script (lanciato in background, leggere la password dallo standard-in in alternativa alla tastiera, ...), ecc.
Per favore leggi le pagine del manuale di sudo e di sudoers per avere maggiori informazioni.
Installazione
sudo is not part of the system set, so it must be installed manually, if it is needed.
The su command should always be available, in case sudo is not installed.
Flags USE
USE flags for app-admin/sudo Allows users or groups to run commands as other users
+secure-path
|
Replace PATH variable with compile time secure paths |
+sendmail
|
Allow sudo to send emails with sendmail |
gcrypt
|
Use message digest functions from dev-libs/libgcrypt instead of sudo's |
ldap
|
Add LDAP support (Lightweight Directory Access Protocol) |
nls
|
Add Native Language Support (using gettext - GNU locale utilities) |
offensive
|
Let sudo print insults when the user types the wrong password |
pam
|
Add support for PAM (Pluggable Authentication Modules) - DANGEROUS to arbitrarily flip |
sasl
|
Add support for the Simple Authentication and Security Layer |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
skey
|
Enable S/Key (Single use password) authentication support |
ssl
|
Add support for SSL/TLS connections (Secure Socket Layer / Transport Layer Security) |
sssd
|
Add System Security Services Daemon support |
verify-sig
|
Verify upstream signatures on distfiles |
Emerge
root #
emerge --ask app-admin/sudo
Configurazione
Attività di log
Un vantaggio addizionale di sudo è che può scrivere sul log ogni tentativo (con successo o senza successo) di eseguire una applicazione. Questo è molto utile quando si vuole tenere traccia di chi fa un errore fatale che potrebbe richiedere 10 ore per la risoluzione :)
Ottenimento dei permessi
Il pacchetto app-admin/sudo permette all'amministratore del sistema di ottenere i permessi di altri utenti per eseguire una o più applicazioni di cui solitamente non si hanno i diritti. Diversamente dall'uso del bit setuid
su queste applicazioni, sudo dà un grana di controllo molto fine su chi può eseguire certi comandi e quando questo può essere fatto.
Con sudo è possibile fare una chiara lista di chi può eseguire una certa applicazione. Mentre se si usasse il bit setuid, ogni utente potrebbe essere autorizzato ad eseguire questa applicazione (oppure ogni utente di un certo gruppo, in base ai permessi usati). Con sudo è possibile (e, probabilmente, meglio) richiedere all'utente di immettere una password per poter eseguire l'applicazione
La configurazione di sudo è gestita dal file /etc/sudoers. Questo file non dovrebbe essere mai modificato tramite nano /etc/sudoers o vim /etc/sudoers o ogni altro editor che si utilizza normalmente. Quando si vuole alterare questo file, andrebbe usato sempre il comando visudo. Questo tool assicura che il file non venga editato da due amministratori allo stesso tempo, preserva i permessi ed esegue un controllo della sintassi per assicurare che non ci siano errori critici all'interno.
The /etc/sudoers should never be edited through nano /etc/sudoers or vim /etc/sudoers, or any other editor that is normally used. When altering the /etc/sudoers file, always use visudo. This tool makes sure that no two system administrators are editing this file at the same time, preserves the permissions on the file, and performs some syntax checking to make sure no fatal mistakes in the file.
Sintassi di base
La parte più difficile di sudo è la sintassi del file /etc/sudoers. La sintassi di base è la seguente:
user host = command
Questa linea dice a sudo che l'utente, identificato da user
e loggato nel sistema host
, può eseguire il comando command
(che può anche essere un elenco separato da virgole di comandi consentiti).
Un esempio realistico potrebbe rendere più chiara l'idea: Per permettere all'utente larry di eseguire emerge quando è loggato in localhost:
larry localhost = /usr/bin/emerge
L'hostname deve corrispondere al nome che il comando hostname restituisce.
Nel caso più semplice, i comandi devono essere path completi agli eseguibili: quindi
/usr/bin/emerge
e non solamente emerge
. I path possono anche contenere delle wildcards e possono riferirsi ad intere directory. Vedere la pagina man per i dettagli.Non permettere ad un utente normale di eseguire applicazioni che possano elevarne i privilegi. In concreto, permettendo agli utenti di eseguire emerge come root può permettere di ottenere i pieni diritti di accesso root al sistema perché emerge può essere manipolato per apportare modifiche ad un filesystem live per dare vantaggio all'utente stesso. Se gli utenti sudo non sono fidati, è opportuno non dare loro alcun diritto aggiuntivo.
Il nome utente può essere anche sostituito con il nome del gruppo, in tal caso il nome del gruppo andrebbe prefissato con il segno %
. Per esempio, per permettere ad ogni utente nel gruppo wheel di eseguire emerge:
%wheel localhost = /usr/bin/emerge
Per abilitare più di un comando per un determinato utente in una determinata macchina, più comandi possono essere listati nella stessa riga. Per esempio, per permettere all'utente larry di non eseguire solo emerge ma anche ebuild e emerge-webrsync come root:
larry localhost = /usr/bin/emerge, /usr/bin/ebuild, /usr/sbin/emerge-webrsync
La riga di comando precisa può essere inoltre definita (includendo parametri ed argomenti) non solo il nome dell'eseguibile. Questo è utile per restringere l'uso di un certo tool ad uno specifico set di opzioni della riga di comando. Il programma sudo permette di usare wildcards stile shell (AKA meta o caratteri jolly) nei path name come negli argomenti dell righe di comando specificate all'interno del file sudoers. E' da notare come queste non siano espressioni regolari.
Sottostante si ha un'esempio di sudo dalla prospettiva di un'utente a cui per la prima volta è stato concesso il pieno potere ad emerge
user $
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: ## (Enter the user password, not root!)
La password che sudo richiede è la password dell'utente stesso. Questo è per assicurarsi che nessun terminale rimasto aperto accidentalmente permetta ad altri utenti di abusare per scopi dannosi.
sudo non altera la variabile
${PATH}
: qualsiasi comando posizionato dopo sudo è eseguito nell' ambiente dell'utente. Quindi se l'utente vuole lanciare un comando in /sbin, ad esempio, l'utente deve fornire sudo con il percorso completo del comando, così:
user $
sudo /usr/sbin/emerge-webrsync
Sintassi di base con LDAP
Le USE flag ldap
e pam
sono entrambe necessarie per il supporto a LDAP.
Quando si utilizza sudo con LDAP, sudo leggerà anche la configurazione dal server LDAP.. Quindi due file devono essere modificati.
# See ldap.conf(5) and README.LDAP for details
# This file should only be readable by root
# supported directives: host, port, ssl, ldap_version
# uri, binddn, bindpw, sudoers_base, sudoers_debug
# tls_{checkpeer,cacertfile,cacertdir,randfile,ciphers,cert,key}
host ldap.example.com
port 389
base dc=example,dc=com
uri ldap://ldap.example.com/
#uri ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock
ldap_version 3
#ssl start_tls
sudoers_base ou=SUDOers,dc=example,dc=com
#sudoers_debug 2
bind_policy soft
sudoers: ldap files
La seguente voce a LDAP dovrà essere aggiunta per sudo.
È stato progettato in modo che il ramo sudoers fosse in cima all'albero per motivi di sicurezza. Ciò consente un diverso diritto di accesso da LDAP per leggere/scrivere su questo ramo
version: 1
DN: ou=SUDOers,dc=example,dc=com
objectClass: organizationalUnit
objectClass: top
objectClass: domainRelatedObject
associatedDomain: example.com
ou: SUDOers
DN: cn=defaults,ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: defaults
description: Default sudoOption's go here
sudoOption: env_reset
DN: cn=root,ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: root
sudoCommand: ALL
sudoHost: ALL
sudoUser: root
DN: cn=%wheel,ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: %wheel
sudoCommand: ALL
sudoHost: ALL
sudoOption: !authenticate
sudoUser: %wheel
version: 1
DN: cn=wheel,ou=Group,dc=example,dc=com
objectClass: top
objectClass: posixGroup
cn: wheel
description: Wheel Group
gidNumber: 10
memberUid: useradmin1
memberUid: root
Le configurazioni su un sudoers su LDAP sono simili a file con qualche differenza. Si legga in aggiunta sudo con LDAP nel link seguente.[1]
Uso degli alias
In grandi ambienti l'inserimento di tutti gli utenti (o sistemi o comandi) più volte può essere una attività costosa. Per facilitare l'amministrazione degli alias possono essere definiti. Il formato per dichiarare gli alias è semplice:
Host_Alias hostalias = hostname1, hostname2, ...
User_Alias useralias = user1, user2, ...
Cmnd_Alias cmndalias = command1, command2, ...
Un alias che funziona sempre, in ogni posizione, è l'alias ALL
(per fare maggior distinzione fra alias e non-alisa è raccomandato usare le lettere maiuscole per i primi). L'alias ALL
è un alias di tutte le possibili configurazioni.
Un esempio di uso dell'alias ALL
per permettere ad ogni (any) utente di eseguire il comando shutdown se è loggato localmente è:
ALL localhost = /sbin/shutdown
Un altro esempio è permettere all'utente larry di eseguire il comando emerge come root, senza considerare da dove si è loggato:
larry ALL = /usr/bin/emerge
Più interessante è definire un insieme di utenti che possono eseguire software amministrativo (come emerge e ebuild) su un sistema e un gruppo di amministratori che possono cambiare la password di ogni utente ad eccezione di root:
User_Alias SOFTWAREMAINTAINERS = larry, john, danny
User_Alias PASSWORDMAINTAINERS = larry, 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
Esecuzione non-root
E' anche possibile avere un utente che esegue una applicazione com e un differente utente non-root. Questo può essere molto interessante quando si eseguono applicazioni come differente utente (per esempio apache per il server web) e permettere a certi utenti di eseguire operazioni di amministrazione come tali utenti (tipo uccidere processi Zombie).
All'interno di /etc/sudoers sono elencati gli utenti tra (
e )
prima dell'elenco dei comandi:
users hosts = (run-as) commands
Per esempio, per permettere all'utente larry di eseguire il tool kill come utente apache o gorg:
Cmnd_Alias KILL = /bin/kill, /usr/bin/pkill
larry ALL = (apache, gorg) KILL
Con questo insieme, l'utente può eseguire sudo -u per selezionare l'utente con cui vuole eseguire l'applicazione:
user $
sudo -u apache pkill apache
Un alias può essere configurato per permettere all'utente di eseguire una applicazione tramite la direttiva Runas_Alias
. Il suo uso è identico alle altre direttive _Alias
viste precedentemente.
Password e configurazioni di default
Di default, sudo chiede all'utente di identificarsi tramite la propria password. Una volta inserita la password, sudo la ricorda per 5 minuti, permettendo all'utente di concentrarsi sulle sue attività e di non inserire ripetitivamente la sua password.
Ovviamente, questo comportamento può essere cambiato: imposta la direttiva Defaults:
nel file /etc/sudoers per cambiare il comportamento di default per un utente.
Per esempio, per cambiare il valore di default da 5 minuti a 0 (non ricordare mai):
Defaults:larry timestamp_timeout=0
Un valore di -
permetterà di ricordare la password per tempo indefinito (sino al riavvio del sistema).
Un configurazione differente potrebbe richiedere la password dell'utente con cui il comando dovrebbe essere richiesto in alternativa alla password personale dell'utente. E' possibile ottenere questo usando runaspw
. Nell'esempio seguente è stato configurato il numero dei tentativi (quante volte l'utente può reinserire la password prima che sudo fallisca) a 2
invece del default 3
:
Defaults:john runaspw, passwd_tries=2
Un'altra interessante funzionalità quella di mantenere la variabile DISPLAY
impostata in modo che gli strumenti grafici possano essere eseguiti.
Defaults:john env_keep=DISPLAY
Dozzine di valori di default possono essere cambiate usando la direttiva Defaults:
. Si faccia riferimento alle pagine di manuale di sudoers per la direttiva Defaults
.
Per permettere ad un utente di eseguire un certo insieme di comandi senza fornire alcuna password, è necessario iniziare i comandi con NOPASSWD:
, ad esempio:
larry localhost = NOPASSWD: /usr/bin/emerge
Completamento Bash
Gli utenti che vogliono avere il completamento bash con sudo devono eseguire il seguente comando almeno una volta.
user $
sudo echo "complete -cf sudo" >> $HOME/.bashrc
Completamento ZShell
Gli utenti che vogliono il completamento zsh per sudo possono configurare i file .zprofile e .zshrc, rispettivamente, con gli script seguenti:
if [[ $EUID != 0 ]]; then
typeset -xT SUDO_PATH sudo_path
typeset -U sudo_path
sudo_path=({,/usr/local,/usr}/sbin(N-/))
alias sudo="sudo env PATH=\"SUDO_PATH:$PATH\""
fi
zstyle ':completion:*:sudo:*' environ PATH="$SUDO_PATH:$PATH"
Con le modifiche di spora, tutti i comandi nelle locazioni /sbin, /usr/sbin e /usr/local/sbin saranno disponibile alla shell per il completamento quando il comando è prefissato con 'sudo'.
This alias will disrupt sudo configurations specifying commands like
larry localhost = NOPASSWD: /usr/bin/emerge
Utilizzo
Elencare i privilegi
Per ottenere la lista dei privilegi dell'utente corrente, si esegua il comando sudo -l:
user $
sudo -l
User larry 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
Qualsiasi comando in /etc/sudoers che non richiede una password, non richiederà la password nemmeno per elencare le voci di completamento. Altrimenti, sudo richiederà la password se questa non è stata precedentemente inserita.
Prolungare il timeout della password
Di default, se un utente ha inserito una password per autenticarsi su sudo, questa è ricordata per 5 minuti. Se l'utente vuole prolungare questo periodo, può eseguire sudo -v per resettare il time stamp guadagnando ulteriori 5 minuti prima che sudo richieda nuovamente la password.
user $
sudo -v
L'inverso è uccidere la stampa temporale usando sudo -k.