Guida a Sudo: differenze tra le versioni

nessun oggetto della modifica
Nessun oggetto della modifica
 
Riga 178: Riga 178:
   
   
Le prime tre sezioni verranno analizzate separatamente ed è raccomandato mantenerle separate e nell'ordine indicato. Benché sia possibile mescolare gli alias con le specifiche e con le opzioni di default, il risultato sarebbe solo quello di rendere illeggibile il file di configurazione e, spesso, sperimentare comportamenti indesiderati.
Le prime tre sezioni verranno analizzate separatamente ed è raccomandato mantenerle separate e nell'ordine indicato. Benché sia possibile mescolare gli alias con le specifiche e con le opzioni di default, il risultato sarebbe solo quello di rendere illeggibile il file di configurazione e, spesso, sperimentare comportamenti indesiderati.
== Specifiche ==
Eccoci giunti al cuore del file <code>sudoers</code>: le righe che indicano in che modo e con quali comandi è possibile invocare <code>sudo</code>.<br/>
Una riga è costituita da diversi parametri strutturati in questo modo:
<pre>CHI HOST=(ALTRO_UTENTE:ALTRO_GRUPPO) EVENTUALI_TAG:COMANDO</pre>
I parametri obbligatori sono:
* '''CHI''', cioè il nome dell'utente linux cui è consentito eseguire <code>sudo</code>
* '''HOST''', cioè il ''luogo'' da cui è permesso eseguire <code>sudo</code>
* Il carattere <code>=</code>
* '''COMANDO''', cioè il comando che ''CHI'' può eseguire, avendo cura di specificarlo dandone il percorso (''path'') assoluto (''/path/to/command'').
I parametri facoltativi sono:
* '''ALTRO_UTENTE''' e '''ALTRO_GRUPPO''' permettono di specificare con che nome utente e gruppo il comando dovrà essere eseguito. Omettere questi due parametri significa dire implicitamente al sistema che il comando deve essere eseguito con i privilegi di '''root''' (il comportamento desiderato nella maggior parte dei casi). Se però si decide di specificarli è necessario specificare entrambi i parametri come sopra indicato, ovvero racchiudendoli tra parentesi e separandoli col carattere <code>:</code>..
* '''EVENTUALI_TAG'''. Devono essere inseriti prima del comando a cui si applicano e separati da questo da un carattere <code>:</code>
Di seguito un semplice esempio del tutto teorico:
<pre>pippo topolinia = (topolino:topolino) NOPASSWD:/path/assoluto/del/comando</pre>
Questa riga indica che l'utente pippo (CHI) potrà eseguire il comando solo dall'host "topolinia" e con le credenziali dell'utente topolino (ALTRO_UTENTE) e del gruppo topolino (ALTRO_GRUPPO) senza richiedere la password di pippo prima di eseguire il comando (NOPASSWD è proprio uno degli EVENTUALI_TAG che è possibile dichiarare).
=== Chi ===
La prima parola indica chi può eseguire <code>sudo</code>. Questa può essere uno username, un gruppo (preceduto da %), un netgroup (preceduto da "+") o un alias di tipo User_Alias.<br/>
Quindi se:
<pre>
User_Alias DISNEY = cenerentola, biancaneve
pippo ALL = comando
%topolia ALL = comando2
+paperopoli ALL = comando3
DISNEY ALL = comando4
</pre>
L'utente pippo può eseguire il comando:
<pre>$ sudo comando</pre>
L'utente topolino può eseguire:
<pre>sudo comando2</pre>
ma solo se fa parte del gruppo "topolinia".<br/>
L'utente paperino può eseguire:
<pre>$ sudo comando3</pre>
ma solo se fa parte del gruppo di rete "paperopoli".<br/>
Biancaneve e cenerentola possono eseguire:
<pre>$ sudo comando4</pre>
Di default a tutti viene chiesta la propria password. Nel caso l'utente non sia abilitato ad eseguire un comando con <code>sudo</code>:
<pre>Sorry, user nomeutente is not allowed to execute comando as root on nomehost.</pre>
Come si vede chiaramente, di default <code>sudo</code> cerca di eseguire il comando con i permessi di root (che è poi il compito per cui viene utilizzato).
Un esempio funzionante è il seguente:
<pre>pippo ALL = /usr/bin/ifconfig -a</pre>
con cui pippo può eseguire un comando che richiede i permessi di root:
<pre>$ sudo ifconfig -a</pre>
questo visualizzerà le interfacce di rete previo inserimento da parte di pippo della propria password.
=== Da dove ===
La seconda parola specifica il nome dell'host da cui è permesso eseguire <code>sudo</code>. Possono essere specificati anche indirizzi IP o indirizzi di rete con submask.<br/>
La parola "ALL" indica che gli utenti potranno eseguire <code>sudo</code> da qualsiasi host.<br/>
Lo scopo di questa voce è chiaro, magari si vuol consentire a pippo di eseguire <code>sudo</code> solo da una macchina della rete locale:
<pre>pippo 192.168.1.80 = comando</pre>
A questo proposito è sempre opportuno specificare l'IP o l'host e non utilizzare la parola "ALL". Il nome dell'host si può ricavare con il comando:
<pre>$ hostname</pre>
Ad esempio:
<pre>$ hostname
pippohost</pre>
e la configurazione sarà:
<pre>pippo pippohost = comando</pre>
=== Tag ===
I [[tag]] utilizzati da <code>sudo</code> precedono immediatamente il [[path]] assoluto del comando e sono separati da questo da un carattere di ":". Ad esempio:
utente host = '''TAG''':comando
Sono permessi più tag, in questo caso è necessario separarli con un carattere ":", ad esempio:
utente host = '''TAG1:TAG2''':comando
I tag consentiti sono dieci:
*PASSWD e NOPASSWD
*EXEC e NOEXEC
*SETENV e NOSETENV
*LOG_INPUT e NOLOG_INPUT
*LOG_OUTPUT e NOLOG_OUTPUT
Questi tag, come si può notare, compongono delle coppie duali in cui un tag della coppia può sovrascrivere una precedente impostazione creata dall'altro componente della coppia.
Dovrebbe essere facilmente intuibile l'assoluta inutilità, benché sia consentito farlo, di specificare tag duali sulla stessa riga. Ad esempio:
utente host = PASSWD:NOPASSWD:comando
Questa notazione è assolutamente identica a:
utente host = NOPASSWD:comando
in quanto il tag che crea l'impostazione sovrascrive l'impostazione creata dal tag duale. In questo caso, quindi, avrà effetto solo l'impostazione creata dal tag della coppia che viene scritto per ultimo.
   
   
<!--(TODO: permessi utente/gruppo comando)-->
== Alias ==
== Alias ==
Iniziamo ad analizzare gli alias, inizialmente non specificati. Questo indica che, in sostanza, non sono strettamente necessari per configurare <code>sudo</code>, anche se il loro ruolo diventa fondamentale quando il numero di linee inizia a crescere ed è facile ritrovarsi nella sgradevole situazione di perdere tempo nell'analizzare i file di configurazione.
Iniziamo ad analizzare gli alias, inizialmente non specificati. Questo indica che, in sostanza, non sono strettamente necessari per configurare <code>sudo</code>, anche se il loro ruolo diventa fondamentale quando il numero di linee inizia a crescere ed è facile ritrovarsi nella sgradevole situazione di perdere tempo nell'analizzare i file di configurazione.
Riga 319: Riga 401:
se l'utente topolino fa parte del gruppo <code>adm</code>.<br/>
se l'utente topolino fa parte del gruppo <code>adm</code>.<br/>
Ovviamente tutti gli utenti coinvolti devono avere il permesso di eseguire lo script.
Ovviamente tutti gli utenti coinvolti devono avere il permesso di eseguire lo script.
== Specifiche ==
Eccoci giunti al cuore del file <code>sudoers</code>: le righe che indicano in che modo e con quali comandi è possibile invocare <code>sudo</code>.<br/>
Una riga è costituita da diversi parametri strutturati in questo modo:
<pre>CHI HOST=(ALTRO_UTENTE:ALTRO_GRUPPO) EVENTUALI_TAG:COMANDO</pre>
I parametri obbligatori sono:
* '''CHI''', cioè il nome dell'utente linux cui è consentito eseguire <code>sudo</code>
* '''HOST''', cioè il ''luogo'' da cui è permesso eseguire <code>sudo</code>
* Il carattere <code>=</code>
* '''COMANDO''', cioè il comando che ''CHI'' può eseguire, avendo cura di specificarlo dandone il percorso (''path'') assoluto (''/path/to/command'').
I parametri facoltativi sono:
* '''ALTRO_UTENTE''' e '''ALTRO_GRUPPO''' permettono di specificare con che nome utente e gruppo il comando dovrà essere eseguito. Omettere questi due parametri significa dire implicitamente al sistema che il comando deve essere eseguito con i privilegi di '''root''' (il comportamento desiderato nella maggior parte dei casi). Se però si decide di specificarli è necessario specificare entrambi i parametri come sopra indicato, ovvero racchiudendoli tra parentesi e separandoli col carattere <code>:</code>..
* '''EVENTUALI_TAG'''. Devono essere inseriti prima del comando a cui si applicano e separati da questo da un carattere <code>:</code>
Di seguito un semplice esempio del tutto teorico:
<pre>pippo topolinia = (topolino:topolino) NOPASSWD:/path/assoluto/del/comando</pre>
Questa riga indica che l'utente pippo (CHI) potrà eseguire il comando solo dall'host "topolinia" e con le credenziali dell'utente topolino (ALTRO_UTENTE) e del gruppo topolino (ALTRO_GRUPPO) senza richiedere la password di pippo prima di eseguire il comando (NOPASSWD è proprio uno degli EVENTUALI_TAG che è possibile dichiarare).
=== Chi ===
La prima parola indica chi può eseguire <code>sudo</code>. Questa può essere uno username, un gruppo (preceduto da %), un netgroup (preceduto da "+") o un alias di tipo User_Alias.<br/>
Quindi se:
<pre>
User_Alias DISNEY = cenerentola, biancaneve
pippo ALL = comando
%topolia ALL = comando2
+paperopoli ALL = comando3
DISNEY ALL = comando4
</pre>
L'utente pippo può eseguire il comando:
<pre>$ sudo comando</pre>
L'utente topolino può eseguire:
<pre>sudo comando2</pre>
ma solo se fa parte del gruppo "topolinia".<br/>
L'utente paperino può eseguire:
<pre>$ sudo comando3</pre>
ma solo se fa parte del gruppo di rete "paperopoli".<br/>
Biancaneve e cenerentola possono eseguire:
<pre>$ sudo comando4</pre>
Di default a tutti viene chiesta la propria password. Nel caso l'utente non sia abilitato ad eseguire un comando con <code>sudo</code>:
<pre>Sorry, user nomeutente is not allowed to execute comando as root on nomehost.</pre>
Come si vede chiaramente, di default <code>sudo</code> cerca di eseguire il comando con i permessi di root (che è poi il compito per cui viene utilizzato).
Un esempio funzionante è il seguente:
<pre>pippo ALL = /usr/bin/ifconfig -a</pre>
con cui pippo può eseguire un comando che richiede i permessi di root:
<pre>$ sudo ifconfig -a</pre>
questo visualizzerà le interfacce di rete previo inserimento da parte di pippo della propria password.
=== Da dove ===
La seconda parola specifica il nome dell'host da cui è permesso eseguire <code>sudo</code>. Possono essere specificati anche indirizzi IP o indirizzi di rete con submask.<br/>
La parola "ALL" indica che gli utenti potranno eseguire <code>sudo</code> da qualsiasi host.<br/>
Lo scopo di questa voce è chiaro, magari si vuol consentire a pippo di eseguire <code>sudo</code> solo da una macchina della rete locale:
<pre>pippo 192.168.1.80 = comando</pre>
A questo proposito è sempre opportuno specificare l'IP o l'host e non utilizzare la parola "ALL". Il nome dell'host si può ricavare con il comando:
<pre>$ hostname</pre>
Ad esempio:
<pre>$ hostname
pippohost</pre>
e la configurazione sarà:
<pre>pippo pippohost = comando</pre>
=== Tag ===
I [[tag]] utilizzati da <code>sudo</code> precedono immediatamente il [[path]] assoluto del comando e sono separati da questo da un carattere di ":". Ad esempio:
utente host = '''TAG''':comando
Sono permessi più tag, in questo caso è necessario separarli con un carattere ":", ad esempio:
utente host = '''TAG1:TAG2''':comando
I tag consentiti sono dieci:
*PASSWD e NOPASSWD
*EXEC e NOEXEC
*SETENV e NOSETENV
*LOG_INPUT e NOLOG_INPUT
*LOG_OUTPUT e NOLOG_OUTPUT
Questi tag, come si può notare, compongono delle coppie duali in cui un tag della coppia può sovrascrivere una precedente impostazione creata dall'altro componente della coppia.
Dovrebbe essere facilmente intuibile l'assoluta inutilità, benché sia consentito farlo, di specificare tag duali sulla stessa riga. Ad esempio:
utente host = PASSWD:NOPASSWD:comando
Questa notazione è assolutamente identica a:
utente host = NOPASSWD:comando
in quanto il tag che crea l'impostazione sovrascrive l'impostazione creata dal tag duale. In questo caso, quindi, avrà effetto solo l'impostazione creata dal tag della coppia che viene scritto per ultimo.
<!--(TODO: permessi utente/gruppo comando)-->


== Opzioni ==
== Opzioni ==
Riga 684: Riga 684:
Facciamo un esempio.
Facciamo un esempio.
Supponiamo che l'utente gambadilegno abbia una variabile d'ambiente così definita nel proprio .bashrc : -->
Supponiamo che l'utente gambadilegno abbia una variabile d'ambiente così definita nel proprio .bashrc : -->


== Esempi ==
== Esempi ==
3 155

contributi