Sudo

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Sudo and the translation is 88% complete.

Other languages:
English • ‎español • ‎français • ‎italiano • ‎日本語 • ‎한국어 • ‎русский • ‎中文(中国大陆)‎

Warning: Display title "sudo/it" overrides earlier display title "Sudo".

Resources

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.

Quando si vuole che altri utenti possano eseguire certe azioni amministrative sul proprio sistema senza concedere il totale accesso root access , l'uso di sudo è la migliore opzione. Con sudoè possibile controllare 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

Flags USE

USE flags for app-admin/sudo Allows users or groups to run commands as other users

gcrypt Use SHA2 from dev-libs/libgcrypt instead of sudo's internal SHA2. local
ldap Add LDAP support (Lightweight Directory Access Protocol) global
nls Add Native Language Support (using gettext - GNU locale utilities) global
offensive Let sudo print insults when the user types the wrong password. local
openssl Use SHA2 from dev-libs/openssl instead of sudo's internal SHA2. local
pam Add support for PAM (Pluggable Authentication Modules) - DANGEROUS to arbitrarily flip global
sasl Add support for the Simple Authentication and Security Layer global
selinux !!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur global
sendmail Allow sudo to send emails with sendmail. local
skey Enable S/Key (Single use password) authentication support global

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 se 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 (, 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 utilizzereste 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.

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
Note
L'hostname deve corrispondere al nome che il comando hostname restituisce.
Note
In the simplest case, commands must be fully qualified paths to executables: hence /usr/bin/emerge not just emerge. Paths can also contain wildcards and may refer to entire directories. See the manpage for details.
Warning
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 non vi è fiducia negli utenti sudo è 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

To enable more than one command for a given user on a given machine, multiple commands can be listed on the same line. For instance, to allow larry to not only run emerge but also ebuild and emerge-webrsync as root:

CODE Comandi multipli
larry  localhost = /usr/bin/emerge, /usr/bin/ebuild, /usr/sbin/emerge-webrsync

You can also specify a precise command line (including parameters and arguments) not just the name of the executable. This is useful to restrict the use of a certain tool to a specified set of command options. The sudo tool allows shell-style wildcards (AKA meta or glob characters) to be used in path names as well as command-line arguments in the sudoers file. Note that these are not regular expressions.

Here is an example of sudo from the perspective of a first-time user of the tool who has been granted access to the full power of 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 rendere sicuro che altri utenti non possano abusare con intenti maliziosi di alcun terminale lasciato accidentalmente aperto.

Important
sudo does not alter the ${PATH} variable: any command placed after sudo is executed within the user's own environment. Thus if a user wants to run a tool in /sbin, for instance, the user must provide sudo with the full path of the command, like so:
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 usa LDAP, sudo leggerà la configurazione dea un Server LDAP. E' necessario quindi modificare due files.

FILE /etc/ldap.conf.sudoPlease chmod 400 when done
# 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

E' necessario aggiungere la seguente voce a LDAP per Sudo.

Note
E' stato progettato che i branch Sudoers non siano in cima al tree per ragioni di sicurezza. Quindi è possibile avere differenti diritti di accesso da LDAP per leggere/scrivere su questo branch
CODE Ldap Entry for 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 Ldap Entry for wheel Group
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]

  1. [1]Pagina di manuale di Sudoers LDAP

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 possono essere definiti gli alias' 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>/code> (per fare maggior distinzione fra alias e non-alisa è raccomandato usare le lettere maiuscole per i primi). Come è possibile immaginare, l'alias <code>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 Using aliases for users and commands
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 per eseguire 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 Non-root execution example
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

E' possibile configurare un alias 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: è possibile impostare 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 da poter eseguire strumenti grafici.

CODE Mantenere la variabile DISPLAY viva
Defaults:john env_keep=DISPLAY

E' possibile cambiare dozzine di valori di default usando la direttiva Defaults:. Si faccia riferimento alle pagine di manuale di sudoers per la direttiva Defaults.

Comunque, se si vuole 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 .zprofileAdding zshell completion
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'.

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

Se si ha un qualsiasi comando in /etc/sudoers che non richiede una password, questa non richiederò la password per elencare le voci di completamento. Altrimenti, verrà richiesta 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.