Sudo

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Sudo and the translation is 84% complete.
Outdated translations are marked like this.


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

Nota
sudo is not part of the system set, so it must be installed manually, if it is needed.
Suggerimento
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.

Importante
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:

CODE Sintassi di base di /etc/sudoers
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:

CODE Esempio di /etc/sudoers
larry  localhost = /usr/bin/emerge
Nota
L'hostname deve corrispondere al nome che il comando hostname restituisce.
Nota
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.
Attenzione
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:

CODE Permettere a tutti i membri del 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:

CODE Comandi multipli
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.

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

FILE /etc/ldap.conf.sudoLanciare chmod 400 quando fatto
# 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
FILE /etc/nsswitch.confAggiungere la linea sudoers
sudoers:     ldap files

La seguente voce a LDAP dovrà essere aggiunta per sudo.

Nota
È 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
CODE Voci LDAP per sudo
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
CODE Voci Ldap per il gruppo 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:

CODE Dichiarazioni di 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, è 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 è:

CODE Permettere ad ogni utente di eseguire il comando shutdown
ALL  localhost = /sbin/shutdown

Un altro esempio è permettere all'utente larry di eseguire il comando emerge come root, senza considerare da dove si è loggato:

CODE Permettere all'utente di eseguire una applicazione senza considerare la sua locazione
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:

CODE Uso di alias per utenti e comandi
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:

CODE Sintassi per l'esecuzione non-root
users  hosts = (run-as) commands

Per esempio, per permettere all'utente larry di eseguire il tool kill come utente apache o gorg:

CODE Esempio di esecuzione come utente non-root
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):

CODE Cambio del valore di timeout
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:

CODE Richiesta della password di root invece di quella utente
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.

CODE Mantenere la variabile DISPLAY viva
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:

CODE Permettere l'esecuzione di emerge come root senza richiedere la password
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:

FILE .zprofileAggiunta del completamento zshell
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
FILE .zshrcAggiunta del completamento zshell
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'.

Attenzione
This alias will disrupt sudo configurations specifying commands like
CODE Allowing emerge to be run as root without asking for a password
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.

  • doas — provides a way to perform commands as another user.
  • su — used to adopt the privileges of other users from the system

References