Guida a Sudo: differenze tra le versioni

prima impaginazione
m (Corretto tempalte stub)
(prima impaginazione)
Riga 1: Riga 1:
{{Stub}}
{{Stub}}
== Caveat ==
== Prima di iniziare ==
La stragrande maggioranza degli utenti che utilizza sudo lo fa in maniera sbagliata e, tipicamente, è composta da utenti provenienti da una famosa distribuzione derivata che si affacciano per la prima volta a Debian.
=== Caveat ===
La stragrande maggioranza degli utenti che utilizza sudo lo fa in maniera sbagliata e, tipicamente, è composta da utenti provenienti da una famosa distribuzione derivata che si affacciano per la prima volta a Debian.<br/>
È necessario, quindi, spender poche parole in proposito.
È necessario, quindi, spender poche parole in proposito.


Debian, durante l'installazione, chiede di inserire due password: una per l'utente root e l'altra per l'utente che normalmente utilizza la macchina (e che non ha abitualmente la necessità di eseguire comandi con i permessi di root).
Debian, durante l'installazione, chiede di creare due password: una per l'utente [[root]] e l'altra per l'utente che normalmente utilizza la macchina (e che non ha abitualmente la necessità di eseguire comandi con i permessi di root).<br/>
Questa distinzione non è un capriccio degli sviluppatori e neanche una forma di sadismo per obbligarci nell'ardua impresa di memorizzare due password, è, invece, un forma minima di sicurezza per mantenere separati i compiti di amministrazione (modifica dei file di sistema che richiedono i permessi di root) dalle normali attività legate all'uso della macchina (lavoro, studio, ascolto di file musicali, navigazione in Internet).
Questa distinzione non è un capriccio degli sviluppatori e neanche una forma di sadismo per obbligarci nell'"ardua impresa" di memorizzare due password; è, invece, un forma minima di sicurezza per mantenere separati i compiti di amministrazione (modifica dei file di sistema che richiedono i permessi di root) dalle normali attività legate all'uso della macchina (lavoro, studio, ascolto di file musicali, navigazione in Internet).


Questa separazione è di fondamentale importanza  
Questa separazione è di fondamentale importanza<br/>
- per evitare accidentali modifiche a file di sistema
- per evitare accidentali modifiche a file di sistema<br/>
- per accrescere la consapevolezza in ciascuna persona sulle operazioni che sta svolgendo
- per accrescere la consapevolezza in ciascuna persona sulle operazioni che sta svolgendo


Purtroppo oggi la stessa famosa distribuzione derivata installa sudo di default con il meritevole intento di 'semplificare' l'interazione uomo-macchina; il risultato, però, ha portato a conseguenza indesiderate:
Purtroppo oggi la stessa famosa distribuzione derivata installa sudo di default con il meritevole intento di 'semplificare' l'interazione uomo-macchina; il risultato, però, ha portato a conseguenza indesiderate:
1 non si ha la percezione di cosa si sta facendo
* non si ha la percezione di cosa si sta facendo
2 non si ha la percezione della distinzione amministratore - utente
* non si ha la percezione della distinzione amministratore - utente
3 non si ha la percezione di sé nei confronti della macchina
* non si ha la percezione di sé nei confronti della macchina
Tutto questo, per un utente Debian, è inaccettabile.
Tutto questo, per un utente Debian, è inaccettabile.


== MI SERVE SUDO? ==
=== Mi serve sudo? ===
Dopo questa premessa, torniamo a sudo per rispondere alla domanda: "Mi serve sudo?"
Dopo questa premessa, torniamo a sudo per rispondere alla domanda: "Mi serve sudo?"<br/>
La risposta è, come sempre, "dipende".
La risposta è, come sempre, "dipende".


Se non sai qual è la sua funzione o come si configura, probabilmente non ti serve.
Se non sai qual è la sua funzione o come si configura, probabilmente non ti serve.<br/>
Su una macchina desktop monoutente (il computer di casa, il portatile, il PC dell'ufficio), sudo è inutile. Esiste il comando su (e le sue interfacce grafiche gksu e kdesu) che permette di eseguire comandi con i permessi di root (o, se presente, di qualsiasi altro utente) in tutta sicurezza e, soprattutto, senza dover modificare alcun file di configurazione. questo previene errori dovuti a configurazioni sbagliate.
Su una macchina desktop monoutente (il computer di casa, il portatile, il PC dell'ufficio), sudo è inutile. Esiste il comando ''su''' (e le sue interfacce grafiche ''gksu'' e ''kdesu'') che permette di eseguire comandi con i permessi di root (o, se presente, di qualsiasi altro utente) in tutta sicurezza e, soprattutto, senza dover modificare alcun file di configurazione. Questo previene errori dovuti a configurazioni sbagliate.


Su una macchina server, invece, il comando sudo è a volte necessario se non indispensabile.
Su una macchina server, invece, il comando sudo è a volte necessario se non indispensabile.<br/>
Sudo permette all'amministratore del server di concedere privilegi di esecuzione per comandi ben precisi e solo ad utentu (o host) ben definiti.
Sudo permette all'amministratore del server di concedere privilegi di esecuzione per comandi ben precisi e solo ad utentu (o [[host]]) ben definiti.<br/>
Il tutto si traduce in una maggiore flessibilità nelle operazioni di gestione della macchina.
Il tutto si traduce in una maggiore flessibilità nelle operazioni di gestione della macchina.


Vi è anche una terza di tipologia di sistemi a cui si rivolge sudo: le macchine desktop gestite da utenti consapevoli che utilizzano sudo per operazioni ben definite e che modificano correttamente il file sudoers.
Vi è anche una terza di tipologia di sistemi a cui si rivolge sudo: le macchine desktop gestite da utenti consapevoli che utilizzano sudo per operazioni ben definite e che modificano correttamente il file <code>sudoers</code>.


== ERRORI COMUNI ==
=== Errori comuni ===
Un breve elenco di operazioni da evitare nell'uso e configurazione di sudo.
Un breve elenco di operazioni da evitare nell'uso e configurazione di sudo.


- ALL : ALL
;'''ALL : ALL'''
Il primo errore consiste nell'inserire la riga:
:Il primo errore consiste nell'inserire la riga:<pre>utente ALL:ALL</pre>oppure la riga:<pre>utente ALL = (ALL) ALL</pre>In questo modo si dà il permesso a ''utente'' di fare qualunque cosa previo inserimento della propria password.<br/>Ma perché ricorrere a tale soluzione quando si può essere ugualmente distruttivi con...
utente ALL:ALL
oppure la riga:
utente ALL = (ALL) ALL
In questo modo si dà il permesso a utente di fare qualunque cosa previo inserimento della propria password.
Ma perché ricorrere a tale soluzione quando si può essere ugualmente distruttivi con...


- Aggiungere il proprio utente al gruppo sudo
;Aggiungere il proprio utente al gruppo sudo
Altro errore è aggiungere il proprio utente al gruppo sudo:
:Altro errore è aggiungere il proprio utente al gruppo sudo:<pre># adduser nome_utente sudo</pre>ed effettuare un logout/login.<br/><br/>Poiché in <code>/etc/sudoers</code> esiste la riga:<pre>%sudo ALL = (ALL):ALL</pre>l'effetto è permettere agli utenti del gruppo sudo di eseguire qualsiasi comando (ultimo ALL) da qualsiasi host (primo ALL) e con qualsiasi credenziale (ALL tra parentesi).<br/>Si otterrà effettivamente il funzionamento di sudo, ma a che prezzo?<br/>L'utente può eseguire qualunque comando semplicemente inserendo la propria password. Quindi:* cade la distinzione tra utente normale e amministratore * si permette a chiunque conosca la password, di eseguire tutti i comandi di sistema<br/>La conclusione è ovvia: state utilizzando Debian come se fosse Win95. Se qualcuno viene in possesso della vostra password utente, potrà fare qualunque cosa senza nemmeno doversi affannare a cercare la password di root.<br/>In pratica siete come dei direttori di banca che, nel portachiavi, portano in giro una chiave che apre sia la porta di ingresso alla banca che la cassaforte.
# adduser nome_utente sudo
ed effettuare un logout/login.


Poiché in /etc/sudoers esiste la riga:
;Modifiche frequenti ai file
%sudo ALL = (ALL):ALL
:Se modificate frequentemente i file di sistema, potrebbe sorgere l'illusoria esigenza di dover installare sudo.<br/>Qui l'errore è concettuale: se modificate spesso i file di sistema, c'è qualcosa che non va. A meno che non siate amministratori di un server.<br/>La soluzione non è installare sudo, ma capire il perché di tante modifiche su una macchina Debian che non necessita di interventi continui come root. Spesso, infatti, l'intervento come root si riduce ad una prima configurazione iniziale (che resta poi praticamente invariata) e a successive operazioni di installazione, rimozione e aggiornamento di pacchetti (per cui esistono programmi a interfaccia grafica o il comando su).
L'effetto è permettere agli utenti del gruppo sudo di eseguire qualsiasi comando (ultimo ALL) da qualsiasi host (primo ALL) e con qualsiasi credenziale (ALL tra parentesi).
Si otterrà effettivamente il funzionamento di sudo, ma a che prezzo?
L'utente può eseguire qualunque comando semplicemente inserendo la propria password. Quindi:
1 cade la distinzione tra utente normale e amministratore
2 si permette a chiunque conosca la password, di eseguire tutti i comandi di sistema
La conclusione è ovvia: state utilizzando Debian come se fosse Win95. Se qualcuno viene in possesso della vostra password utente, potrà fare qualunque cosa senza nemmeno doversi affannare a cercare la password di root.
In pratica siete come dei direttori di banca che, nel portachiavi, portano in giro una chiave che apre sia la porta di ingresso alla banca che la cassaforte.


-Modifiche frequenti ai file.
;Sudo semplifica l'amministrazione
Se modificate frequentemente i file di sistema, potrebbe sorgere l'illusoria esigenza di dover installare sudo.
:Sudo semplifica l'amministrazione del sistema solo se si sa esattamente quali sono le proprie esigenze e come si modifica correttamente il file <code>/etc/sudoers</code> .<br/>Se pensate che 'semplificare' coincida con il dimenticarsi della password di root (o, peggio ancora, con il non averla), siete fuori strada e, probabilmente, Debian on è la distribuzione che fa per voi.
Qui l'errore è concettuale: se modificate spesso i file di sistema, c'è qualcosa che non va. A meno che non siate amministratori di un server.
La soluzione non è installare sudo, ma capire il perché di tante modifiche su una macchina Debian che non necessita di interventi continui come root.
Spesso, infatti, l'intervento come root si riduce ad una prima configurazione iniziale (che resta poi praticamente invariata) e a successive operazioni di installazione, rimozione e aggiornamento di pacchetti (per cui esistono programmi a interfaccia grafica o il comando su).


- Sudo semplifica l'amministrazione
;Sudo e l'escape della shell
Sudo semplifica l'amministrazione del sistema solo se si sa esattamente quali sono le proprie esigenze e come si modifica correttamente il file etc/sudoers.  
:Un errore molto meno marchiano è utilizzare sudo con programmi che permettono l'escape della shell, ossia che consentono, una volta eseguiti, di poter avviare una shell.<br/>Consideriamo la seguente riga in <code>/etc/sudoers</code>:<pre>pippo ALL = /usr/bin/vim /etc/apt/sources.list</pre>in buona fede si potrebbe pensare di concedere all'utente pippo la sola modifica del file <code>/etc/apt/sources.list</code> attraverso Vim. Malauguratamente Vim, e altri programmi, permettono di eseguire un shell (vedere qui). Per cui l'utente pippo, un volta eseguito il comando:<pre>$ sudo vim /etc/apt/sources.list</pre>potrà, dopo aver inserito la propria password, aprire una shell con i permessi di root e, subito dopo, eseguire qualunque comando con i permessi di superutente; esattamente ciò che non vogliamo.<br/>La soluzione è modificare il file sudoers così:<pre>pippo localhost = NOEXEC : /usr/bin/vim /etc/apt/sources.list</pre>o utilizzare altro editor (nano) che non permetta l'escape della shell.
Se pensate che 'semplificare' coincida con il dimenticarsi della password di root (o, peggio ancora, con il non averla), siete fuori strada e, probabilmente, Debian on è la distribuzione che fa per voi.


-Sudo e l'escape della shell
;Modifica dei file
Un errore molto meno marchiano è utilizzare sudo con programmi che permettono l'escape della shell, ossia che consentono, una volta eseguiti, di poter avviare una shell.
:La precedente riga:<pre>pippo localhost = NOEXEC : /usr/bin/vim /etc/apt/sources.list</pre>effettivamente impedisce che Vim possa eseguire una shell. Il problema è che non impedisce che Vim possa aprire un altro file e modificarlo. Oppure creare un file in un punto qualunque del filesystem.<br/>La soluzione è utilizzare ''sudoedit'':<pre>pippo localhost = NOEXEC : /usr/bin/sudoedit /etc/apt/sources.list</pre>
Consideriamo la seguente riga in /etc/sudoers:
pippo ALL = /usr/bin/vim /etc/apt/sources.list
in buona fede si potrebbe pensare di concedere all'utente pippo la sola modifica del file /etc/apt/sources.list attraverso Vim. Malauguratamente Vim, e altri programmi, permettono di eseguire un shell (vedere qui)
Per cui l'utente pippo, un volta eseguito il comando:
$ sudo vim /etc/apt/sources.list
potrà, dopo aver inserito la propria password, aprire una shell con i permessi di root e, subito dopo, eseguire qualunque comando con i permessi di superutente; esattamente ciò che non vogliamo.
La soluzione è modificare il file sudoers così:
pippo localhost = NOEXEC : /usr/bin/vim /etc/apt/sources.list
o utilizzare altro editor (nano) che non permetta l'escape della shell.


- Modifica dei file
=== Consigli utili ===
La precedente riga:
* Non installare sudo su macchine desktop.<br/>Avvalersi, piuttosto, degli strumenti alternativi (grafici e testuali) che Debian mette a disposizione.
pippo localhost = NOEXEC : /usr/bin/vim /etc/apt/sources.list
effettivamente impedisce che Vim possa eseguire una shell. Il problema è che non impedisce che Vim possa aprire un altro file e modificarlo. Oppure creare un file in un punto qualunque del filesystem.
La soluzione è utilizzare sudoedit
pippo localhost = NOEXEC : /usr/bin/sudoedit /etc/apt/sources.list


== CONSIGLI UTILI ==
* Se si decide di utilizzare sudo, documentarsi sul suo funzionamento e la sua configurazione.<br/>Documentarsi anche sul funzionamento di ogni programma che si è deciso di avviare attraverso sudo.
- Non installare sudo su macchine desktop.
Avvalersi, piuttosto, degli strumenti alternativi (grafici e testuali) che Debian mette a disposizione.


- Se si decide di utilizzare sudo, documentarsi sul suo funzionamento e la sua configurazione.
* Utilizzare ''sudoedit'' anziché direttamente programmi che permettono l'escape della shell
Documentarsi anche sul funzionamento di ogni programma che si è deciso di avviare attraverso sudo.


- Utilizzare sudoedit anziché direttamente programmi che permettono l'escape della shell
* Tenere sempre presente che la priorità è la sicurezza della Debian box.<br/>In un mondo interconnesso, la compromissione della sicurezza della vostra macchina non è solo un problema per voi stessi ma anche un serio problema per ogni computer del globo.


- tenere sempre presente che la priorità è la sicurezza della Debian box.
* Valutare attentamente i vantaggi e gli svantaggi a cui si va incontro utilizzando sudo.
In un mondo interconnesso, la compromissione della sicurezza della vostra macchina non è solo un problema per voi stessi ma anche un serio problema per ogni computer del globo.


- Valutare attentamente i vantaggi e gli svantaggi a cui si va incontro utilizzando sudo.
== Installazione ==
 
== INSTALLAZIONE ==
Sudo, contrariamente a quanto si possa pensare, non è uno strumento essenziale per la configurazione del sistema e non viene installato di default in Debian. Per installarlo, è necessario impartire esplicitamente un:
Sudo, contrariamente a quanto si possa pensare, non è uno strumento essenziale per la configurazione del sistema e non viene installato di default in Debian. Per installarlo, è necessario impartire esplicitamente un:
<pre># apt-get install sudo</pre>
<pre># apt-get install sudo</pre>
Riga 108: Riga 72:
<pre>$ sudo passwd root</pre>
<pre>$ sudo passwd root</pre>
e poi rimuovere il proprio utente dal gruppo sudo:
e poi rimuovere il proprio utente dal gruppo sudo:
# deluser nome_utente sudo
<pre># deluser nome_utente sudo</pre>
Questo disabilita sudo per nome_utente e permette di configurarlo successivamente, se si vuole, con sicurezza e precisione maggiori. Oltre che con la piena consapevolezza delle operazioni che ci si accinge a svolgere.
Questo disabilita sudo per "nome_utente" e permette di configurarlo successivamente, se si vuole, con sicurezza e precisione maggiori. Oltre che con la piena consapevolezza delle operazioni che ci si accinge a svolgere.


Se ci si dovesse chiedere del perché Debian non installi sudo di default come altre famose distribuzioni derivate, la risposta è semplice: Debian ha una configurazione di base fortemente orientata alla sicurezza e possiede già di default tutti gli strumenti necessari e coerenti per amministrare la propria macchina.
Se ci si dovesse chiedere del perché Debian non installi sudo di default come altre famose distribuzioni derivate, la risposta è semplice: Debian ha una configurazione di base fortemente orientata alla sicurezza e possiede già di default tutti gli strumenti necessari e coerenti per amministrare la propria macchina.


== CONFIGURAZIONE ==
== Configurazione ==
La configurazione di sudo si ottiene con la modifica del file /etc/sudoers oppure con la creazione di file di configurazione nella directory /etc/sudoers.d/ .
La configurazione di sudo si ottiene con la modifica del file <code>/etc/sudoers</code> oppure con la creazione di file di configurazione nella directory <code>/etc/sudoers.d/</code> .
/ETC/SUDOERS
 
=== Il file <code>/etc/sudoers</code> ===
Per modificare il file sudoers c'è un'unica strada, utilizzare da root il comando:
Per modificare il file sudoers c'è un'unica strada, utilizzare da root il comando:
# visudo
<pre># visudo</pre>
In questo modo viene eseguito l'editor di default, rigorosamente testuale.
In questo modo viene eseguito l'editor di default, rigorosamente testuale.


Il file all'inizio si presenta così:
Il file all'inizio si presenta così:
  #
  #
  # This file MUST be edited with the 'visudo' command as root.
  # This file MUST be edited with the 'visudo' command as root.
Riga 138: Riga 104:
   
   
  # Cmnd alias specification
  # Cmnd alias specification
 
  # User privilege specification
  # User privilege specification
  '''root    ALL=(ALL:ALL) ALL'''
  '''root    ALL=(ALL:ALL) ALL'''
 
  # Allow members of group sudo to execute any command
  # Allow members of group sudo to execute any command
  '''%sudo  ALL=(ALL:ALL) ALL'''
  '''%sudo  ALL=(ALL:ALL) ALL'''
 
  # See sudoers(5) for more information on "#include" directives:
  # See sudoers(5) for more information on "#include" directives:
   
   
  '''#includedir /etc/sudoers.d'''
  '''#includedir /etc/sudoers.d'''
 
Le righe in grassetto sono quelle significative. I commenti (righe che iniziano con #) o le righe vuote non contribuiscono alla configurazione di sudo ma sono comunque importanti per la leggibilità del file.
Le righe in grassetto sono quelle significative. I commenti (righe che iniziano con #) o le righe vuote non contribuiscono alla configurazione di sudo ma sono comunque importanti per la leggibilità del file.<br/>
L'ultima linea, in cui è contenuta la direttiva "#includedir", rappresenta un'eccezione alla regola precedente e non viene vista come un commento.
L'ultima linea, in cui è contenuta la direttiva "#includedir", rappresenta un'eccezione alla regola precedente e non viene vista come un commento.


Prestare attenzione al fatto che aggiornamenti del pacchetto sudo potrebbero chiedere di sovrascrivere questo file.
Prestare attenzione al fatto che aggiornamenti del pacchetto sudo potrebbero chiedere di sovrascrivere questo file.<br/>
Benché in fase di aggiornamento gli avvertimenti siano piuttosto chiari (verrà chiesto esplicitamente se mantenere il file, se sovrascriverlo, guardare i cambiamenti introdotti etc.), è consigliato creare una copia di backup e custodirla al sicuro.
Benché in fase di aggiornamento gli avvertimenti siano piuttosto chiari (verrà chiesto esplicitamente se mantenere il file, se sovrascriverlo, guardare i cambiamenti introdotti etc.), è consigliato creare una copia di backup e custodirla al sicuro.


/SUDOERS.D
=== La directory <code>/etc/sudoers.d/</code> ===
In caso si debba scrivere un elevato numero di righe, si può far uso della directory /etc/sudoers.d/ in cui è possibile creare tutti i file che si ritengono necessari per configurare sudo. Questi verranno visti in sequenza come un unico file di configurazione.
In caso si debba scrivere un elevato numero di righe, si può far uso della directory /etc/sudoers.d/ in cui è possibile creare tutti i file che si ritengono necessari per configurare sudo. Questi verranno visti in sequenza come un unico file di configurazione.
1 Il file sudoers viene comunque e sempre letto per primo
* Il file sudoers viene comunque e sempre letto per primo
2 Affinché questi file possano essere considerati come file di configurazione, è necessario che sia presente in /etc/sudoers la riga:<pre>#includedir /etc/sudoers.d</pre>
* Affinché questi file possano essere considerati come file di configurazione, è necessario che sia presente in /etc/sudoers la riga:<pre>#includedir /etc/sudoers.d</pre>
3 I file non possono contenere punti nel loro nome
* I file non possono contenere punti nel loro nome
4 I file che terminano con ~ non vengono considerati
* I file che terminano con ~ non vengono considerati
5 È opportuno dare i permessi 0440 a questi file:<pre># chmod 0440 /etc/sudoers.d/*</pre>in modo che siano leggibili e scrivibili solo da root
* È opportuno dare i permessi 0440 a questi file:<pre># chmod 0440 /etc/sudoers.d/*</pre>in modo che siano leggibili e scrivibili solo da root
6 I file sono letti in ordine alfabetico. Si consiglia di anteporre un numero al loro nome in modo da avere la certezza che i file vengano letti nell'ordine desiderato. Ad esempio: 00topolino, 01pippo, 02 pluto, .... , 99gambadilegno
* I file sono letti in ordine alfabetico. Si consiglia di anteporre un numero al loro nome in modo da avere la certezza che i file vengano letti nell'ordine desiderato. Ad esempio: 00topolino, 01pippo, 02 pluto, .... , 99gambadilegno
7 Scegliere nomi significativi (07alias_comandi_per_l_utente_pippo è preferibile a 07config).
* Scegliere nomi significativi (07alias_comandi_per_l_utente_pippo è preferibile a 07config).
8 Le configurazioni presenti in un file possono sovrascrivere identiche configurazioni contenute in un file che lo precede. Se possibile, fare in modo che le configurazioni comuni siano contenute nel primo file o nel file sudoers.
* Le configurazioni presenti in un file possono sovrascrivere identiche configurazioni contenute in un file che lo precede. Se possibile, fare in modo che le configurazioni comuni siano contenute nel primo file o nel file sudoers.
9 Suddividere i file in maniera logica (per utente, per host, per gruppi, per comandi, etc.) e commentare ogni aggiunta o modifica. Questo consentirà, sia a voi sia a chi si troverà a leggerli, di interpretarli con maggior semplicità e chiarezza
* Suddividere i file in maniera logica (per utente, per host, per gruppi, per comandi, etc.) e commentare ogni aggiunta o modifica. Questo consentirà, sia a voi sia a chi si troverà a leggerli, di interpretarli con maggior semplicità e chiarezza
10 A differenza del file sudoers, è possibile creare e modificare questi file con un editor grafico attraverso gksu o kdesu<pre>$ gksu gedit /etc/sudoers.d/01pippo</pre>
* A differenza del file sudoers, è possibile creare e modificare questi file con un editor grafico attraverso gksu o kdesu<pre>$ gksu gedit /etc/sudoers.d/01pippo</pre>
11 Tutti i file presenti in questa directory non saranno sovrascritti o cancellati da futuri aggiornamenti del pacchetto sudo
* Tutti i file presenti in questa directory non saranno sovrascritti o cancellati da futuri aggiornamenti del pacchetto sudo


Leggere anche:
Leggere anche il file <code>/etc/sudoers.d/README</code>
<pre># cat /etc/sudoers.d/README</pre>


STRUTTURA
=== Struttura ===
Riprendiamo il file /etc/sudoers per analizzarne la struttura. Possiamo vedere che esistono quattro sezioni:
Riprendiamo il file /etc/sudoers per analizzarne la struttura. Possiamo vedere che esistono quattro sezioni.
- Opzioni di default
 
Defaults        env_reset
'''Opzioni di default'''<br/>
Defaults        mail_badpass
<pre>
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults        env_reset
- Alias
Defaults        mail_badpass
# Host alias specification
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
</pre>
 
'''Alias'''<br/>
<pre>
# Host alias specification
   
   
# User alias specification
# User alias specification
   
   
# Cmnd alias specification
# Cmnd alias specification
inizialmente vuoto
</pre>
- Specifiche
inizialmente vuoto.
root    ALL=(ALL:ALL) ALL
%sudo  ALL=(ALL:ALL) ALL


- Direttiva #includedir (TODO #include)
'''Specifiche'''<br/>
  #includedir /etc/sudoers.d
<pre>
root    ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL
</pre>


Quest'ultima sezione indica la directory in cui leggere eventuali e ulteriori file di configurazione di sudo. Andrebbe lasciata in fondo al file ed, eventualmente, modificata specificando altra directory se si hanno esigenze particolari.
'''Direttiva #includedir (TODO #include)'''<br/>
<pre>#includedir /etc/sudoers.d</pre>
Quest'ultima sezione indica la directory in cui leggere eventuali e ulteriori file di configurazione di sudo. Andrebbe lasciata in fondo al file ed, eventualmente, modificata specificando altra directory se si hanno esigenze particolari.
   
   
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.
   
   
ALIAS
== Alias ==
Iniziamo ad analizzare gli alias, inizialmente non specificati. Questo indica che, in sostanza, non sono strettamente necessari per configurare sudo, 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 sudo, 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.
Come lascia intuire il nome, gli alias permettono di raggruppare logicamente il nome di un certo numero di utenti, di host, di gruppi o di comandi, in modo da farvi riferimento in modo semplice e veloce attraverso una sola stringa identificativa (il nome dell'alias).
 
Facciamo un esempio chiarificatore anche se non realistico.
Come lascia intuire il nome, gli alias permettono di raggruppare logicamente il nome di un certo numero di utenti, di host, di gruppi o di comandi, in modo da farvi riferimento in modo semplice e veloce attraverso una sola stringa identificativa (il nome dell'alias).<br/>
Facciamo un esempio non realistico.<br/>
Supponiamo di avere una configurazione che contiene:
Supponiamo di avere una configurazione che contiene:
<pre>
<pre>
Riga 206: Riga 180:
pippo ALL = /usr/bin/rm /media/share/temp/*
pippo ALL = /usr/bin/rm /media/share/temp/*
</pre>
</pre>
con cui l'utente pippo ha il permesso di cancellare determinati file. Che accade se l'amministratore di sistema decide di concedere gli stessi permessi all'utente pluto? O se decide di togliere i permessi a pippo e di darli a pluto? O se vuole modificare il comando "rm" passandogli un'opzione? Con questa configurazione dovrà modificare una per una tutte le linee (nell'esempio sono tre, ma potrebbero essere molte di più).
con cui l'utente pippo ha il permesso di cancellare determinati file. Che accade se l'amministratore di sistema decide di concedere gli stessi permessi all'utente pluto? O se decide di togliere i permessi a pippo e di darli a pluto? O se vuole modificare il comando "rm" passandogli un'opzione? Con questa configurazione dovrà modificare una per una tutte le linee (nell'esempio sono tre, ma potrebbero essere molte di più).<br/>
La soluzione è ricorrere agli alias:
La soluzione è ricorrere agli alias:
<pre>
User_Alias UTENTI_RM = pippo
User_Alias UTENTI_RM = pippo
Cmnd_Alias COMANDO_RM = "/usr/bin/rm"
Cmnd_Alias COMANDO_RM = "/usr/bin/rm"
Riga 214: Riga 189:
UTENTI_RM ALL = COMANDO_RM /log/app/*
UTENTI_RM ALL = COMANDO_RM /log/app/*
UTENTI_RM ALL = COMANDO_RM /media/share/temp/*
UTENTI_RM ALL = COMANDO_RM /media/share/temp/*
</pre>


A questo punto, se si vogliono concedere gli stessi permessi a pluto:
A questo punto, se si vogliono concedere gli stessi permessi a pluto:
<pre>
User_Alias UTENTI_RM = pippo, pluto
User_Alias UTENTI_RM = pippo, pluto
Cmnd_Alias COMANDO_RM = "/usr/bin/rm"
Cmnd_Alias COMANDO_RM = "/usr/bin/rm"
Riga 222: Riga 199:
UTENTI_RM ALL = COMANDO_RM /log/app/*
UTENTI_RM ALL = COMANDO_RM /log/app/*
UTENTI_RM ALL = COMANDO_RM /media/share/temp/*
UTENTI_RM ALL = COMANDO_RM /media/share/temp/*
 
</pre>
Se si vuol cambiare anche il comando:
Se si vuol cambiare anche il comando:
<pre>
User_Alias UTENTI_RM = pippo, pluto
User_Alias UTENTI_RM = pippo, pluto
Cmnd_Alias COMANDO_RM = "/usr/bin/rm -rf"
Cmnd_Alias COMANDO_RM = "/usr/bin/rm -rf"
Riga 230: Riga 208:
UTENTI_RM ALL = COMANDO_RM /log/app/*
UTENTI_RM ALL = COMANDO_RM /log/app/*
UTENTI_RM ALL = COMANDO_RM /media/share/temp/*
UTENTI_RM ALL = COMANDO_RM /media/share/temp/*
 
</pre>
si può notare che la modifica avviene in un solo punto del file con le ultime tre righe che restano invariate.
si può notare che la modifica avviene in un solo punto del file con le ultime tre righe che restano invariate.


SINTASSI
=== Sintassi degli alias ===
La sintassi è:
La sintassi è:
<pre>Tipo_di_alias NOME_ALIAS = Lista</pre>
<pre>Tipo_di_alias NOME_ALIAS = Lista</pre>
   
   
-Tipo_di_alias
;Tipo_di_alias:Ciacuna riga che identifica un alias deve iniziare necessariamente con una parola che stabilisce il tipo di alias che stiamo creando. Questa parole sono quattro:- User_Alias<br/>- Runas_Alias<br/>- Host_Alias<br/>- Cmnd_Alias<br/>e vanno scritte esattamente in questa forma.
Ciacuna riga che identifica un alias deve iniziare necessariamente con una parola che stabilisce il tipo di alias che stiamo creando. Questa parole sono quattro:
- User_Alias
- Runas_Alias
- Host_Alias
- Cmnd_Alias
e vanno scritte esattamente in questa forma.
   
   
-Nome alias
;Nome alias:Questa è la stringa a cui potrà farà riferimento in altri alias o nelle specifiche.<br/>- Deve essere composto da lettere maiuscole, lettere minuscole o caratteri di underscore "_" . Altri caratteri non sono ammessi.<br/>- Deve necessariamente iniziare con una lettera maiuscola<br/>- Per maggiore chiarezza è una buona idea scriverlo in sole lettere maiuscole
Questa è la stringa a cui potrà farà riferimento in altri alias o nelle specifiche.
1 - Deve essere composto da lettere maiuscole, lettere minuscole o caratteri di underscore "_" . Altri caratteri non sono ammessi.
2 - Deve necessariamente iniziare con una lettera maiuscola
3 - Per maggiore chiarezza è una buona idea scriverlo in sole lettere maiuscole


- Lista
;Lista:A differenza del tipo e del nome dell'alias, la scrittura di una lista è leggermente più articolata e dipende dal tipo di alias specificato. Gli elementi che compongono una lista devono essere separati da una virgola e vanno quotati tra doppie virgolette se contengono caratteri speciali; la lista può contenere anche altri alias purché questi siano già stati definiti. Ad esempio:<pre>User_Alias UTENTI1 = pippo, pluto
A differenza del tipo e del nome dell'alias, la scrittura di una lista è leggermente più articolata e dipende dal tipo di alias specificato. Gli elementi che compongono una lista devono essere separati da una virgola e vanno quotati tra doppie virgolette se contengono caratteri speciali; la lista può contenere anche altri alias purché questi siano già stati definiti. Ad esempio:
User_Alias UTENTI1 = pippo, pluto
User_Alias UTENTI2 = paperino, gastone, UTENTI1
User_Alias UTENTI2 = paperino, gastone, UTENTI1


UTENTI2 ALL = /usr/bin/tail /var/log/syslog
UTENTI2 ALL = /usr/bin/tail /var/log/syslog</pre>
 
e gli utenti pippo e pluto possono visualizzare le ultime righe del file /var/log/syslog
e gli utenti pippo e pluto possono visualizzare le ultime righe del file /var/log/syslog


-- Alias di tipo User_Alias
==== Alias di tipo User_Alias ====
Una lista di questo tipo è composta da uno o più nomi utente, UID, gruppi, gruppi di rete, gruppi di tipo "nonunix" o altri alias di tipo User_Alias.
Una lista di questo tipo è composta da uno o più nomi utente, UID, gruppi, gruppi di rete, gruppi di tipo "nonunix" o altri alias di tipo User_Alias.<br/>
I nomi utente (username) vanno scritti "as is", seguendo la distinzione maiuscole/minuscole (Pippo e pippo sono utenti diversi)
I nomi utente (username) vanno scritti "as is", seguendo la distinzione maiuscole/minuscole (Pippo e pippo sono utenti diversi).<br/>
Gli UID identificano un utente e vanno preceduti da un carattere cancelletto "#" (ad es. #1000, #1001, #1002)
Gli UID identificano un utente e vanno preceduti da un carattere cancelletto "#" (ad es. #1000, #1001, #1002).<br/>
I gruppi sono preceduti dal carattere di percentuale (%) e sono quelli letti nel file /etc/group (ad es. %adm, %src, %plugdev)
I gruppi sono preceduti dal carattere di percentuale (%) e sono quelli letti nel file /etc/group (ad es. %adm, %src, %plugdev).<br/>
Gli alias di tipo User_Alias vanno scritti con il loro nome e devono essere stati definiti in precedenza.
Gli alias di tipo User_Alias vanno scritti con il loro nome e devono essere stati definiti in precedenza.


Esempio 1
'''Esempio 1'''
<pre>
User_Alias PAPEROPOLI = paperoga, paperina, gastone
User_Alias PAPEROPOLI = paperoga, paperina, gastone
PAPEROPOLI ALL = /usr/bin/ifconfig -a > ifconfig.txt
PAPEROPOLI ALL = /usr/bin/ifconfig -a > ifconfig.txt
</pre>
gli utenti paperoga, paperina e gastone possono creare un file nella directory corrente con l'output del comando "ifconfig -a' .
gli utenti paperoga, paperina e gastone possono creare un file nella directory corrente con l'output del comando "ifconfig -a' .


Esempio 2
'''Esempio 2'''
<pre>
User_Alias FANTASY = %robot, !goldrake, godzilla
User_Alias FANTASY = %robot, !goldrake, godzilla
FANTASY ALL = /bin/rm /tmp/tempdir/*
FANTASY ALL = /bin/rm /tmp/tempdir/*
</pre>
tutti i file della directory "/tmp/tempdir" possono essere cancellati solo dagli utenti che fanno parte del gruppo "robot", dall'utente godzilla (anche se non fa parte del gruppo "robot") ma non dall'utente goldrake (anche se fa parte del gruppo "robot")
tutti i file della directory "/tmp/tempdir" possono essere cancellati solo dagli utenti che fanno parte del gruppo "robot", dall'utente godzilla (anche se non fa parte del gruppo "robot") ma non dall'utente goldrake (anche se fa parte del gruppo "robot")


Esempio 3
'''Esempio 3'''
<pre>
User_Alias TOPOLINIA = topolino, #1005, %bandabassotti, minnie, !371-173
User_Alias TOPOLINIA = topolino, #1005, %bandabassotti, minnie, !371-173
TOPOLINIA ALL = /myscripts/backup.sh
TOPOLINIA ALL = /myscripts/backup.sh
gli utenti topolino e minnie, gli utenti che fanno parte del gruppo "bandabassotti" e l'utente con UID uguale a 1005 possono eseguire uno script di backup.
</pre>
gli utenti topolino e minnie, gli utenti che fanno parte del gruppo "bandabassotti" e l'utente con UID uguale a 1005 possono eseguire uno script di backup.<br/>
Non può eseguire lo script l'utente 371-173 anche se fa parte del gruppo "bandabassotti".
Non può eseguire lo script l'utente 371-173 anche se fa parte del gruppo "bandabassotti".


Esempio 4  
'''Esempio 4'''
<pre>
User_Alias PAPEROPOLI = paperoga, paperina
User_Alias PAPEROPOLI = paperoga, paperina
User_Alias NIPOTI_DI_PAPERINO = qui, quo, qua
User_Alias NIPOTI_DI_PAPERINO = qui, quo, qua
User_Alias DISNEY = %biancaneve, #1001, PAPEROPOLI, NIPOTI_DI_PAPERINO, !paperoga, !quo
User_Alias DISNEY = %biancaneve, #1001, PAPEROPOLI, NIPOTI_DI_PAPERINO, !paperoga, !quo


DISNEY ALL = NOEXEC:/usr/bin/vim /etc/apt/sources.list  
DISNEY ALL = NOEXEC:/usr/bin/vim /etc/apt/sources.list
il file /etc/apt/sources.list può essere modificato solo dall'utente con UID uguale a 1001, dagli utenti del gruppo biancaneve, da qui e da qua. Non può essere modificato da paperoga e quo.
</pre>
il file <code>/etc/apt/sources.list</code> può essere modificato solo dall'utente con UID uguale a 1001, dagli utenti del gruppo biancaneve, da qui e da qua. Non può essere modificato da paperoga e quo.


-- Alias di tipo Host_Alias
==== Alias di tipo Host_Alias ====
In questa lista possono essere compresi nomi di host, indirizzi IP, indirizzi di rete con relativa submask (sia in formato standard che con la notazione CIDR), gruppi di rete (preceduti dal carattere "+") o altri alias di tipi Host_Alias.
In questa lista possono essere compresi nomi di host, indirizzi IP, indirizzi di rete con relativa submask (sia in formato standard che con la notazione CIDR), gruppi di rete (preceduti dal carattere "+") o altri alias di tipi Host_Alias.<br/>
Il carattere "!" nega un elemento della lista come nel caso precedente.
Il carattere "!" nega un elemento della lista come nel caso precedente.
Esempio
 
Ad esempio:
<pre>Host_Alias TRUSTED = server1, 192.168.1.23, 10.0.0.0/24, +grupporete</pre>
<pre>Host_Alias TRUSTED = server1, 192.168.1.23, 10.0.0.0/24, +grupporete</pre>


-- Alias di tipo Cmd_Alias
==== Alias di tipo Cmd_Alias ====
Lista che contiene uno o più comandi o directory.
Lista che contiene uno o più comandi o directory.
1) I comandi devono essere scritti esattamente insieme al loro path assoluto (whereis nomecomando per trovarlo)
* I comandi devono essere scritti esattamente insieme al loro path assoluto (whereis nomecomando per trovarlo)
2) I comandi funzionano anche se vengono eseguiti insieme a dei parametri, per cui se:
* I comandi funzionano anche se vengono eseguiti insieme a dei parametri, per cui se:
<pre>
Cmd_Alias LS = /bin/ls
Cmd_Alias LS = /bin/ls
pippo ALL = LS
pippo ALL = LS
 
</pre>
il seguente comando non produrrà un errore:
il seguente comando non produrrà un errore:
<pre>$ sudo ls -l</pre>
<pre>$ sudo ls -l</pre>
Per evitare questo comportamento e consentire che il comando venga eseguito solo senza parametri, bisogna far seguire "" al comando:
Per evitare questo comportamento e consentire che il comando venga eseguito solo senza parametri, bisogna far seguire "" al comando:
<pre> Cmd_Alias LS = /bin/ls ""</pre>
<pre> Cmd_Alias LS = /bin/ls ""</pre>
Riga 316: Riga 290:
<pre>Cmd_Alias LS = /bin/ls -[la]
<pre>Cmd_Alias LS = /bin/ls -[la]
pippo ALL = LS</pre>
pippo ALL = LS</pre>
3) È possibile inserire anche il percorso assoluto di una directory, questo indicherà che potranno essere eseguiti con sudo tutti i programmi contenuti in quella directory ma non nelle sottodirectory. Ad esempio con:
* È possibile inserire anche il percorso assoluto di una directory, questo indicherà che potranno essere eseguiti con sudo tutti i programmi contenuti in quella directory ma non nelle sottodirectory. Ad esempio con:
<pre>Cmnd_Alias BIN = /bin/
<pre>Cmnd_Alias BIN = /bin/
pippo ALL = BIN</pre>
pippo ALL = BIN</pre>
Riga 322: Riga 296:
<pre>$ sudo cat /var/log/kern.log</pre>
<pre>$ sudo cat /var/log/kern.log</pre>


-- Alias di tipo Runas_Alias
==== Alias di tipo Runas_Alias ====
Questa lista può essere  composta da nomi utente, gruppi (preceduti dal carattere "%"), UID (preceduti dal carattere "#"), gruppi di rete (preceduti dal carattere "+") o altri alias di tipo Runas_Alias e specifica con i permessi di quale utente deve essere eseguito un comando attraverso sudo.
Questa lista può essere  composta da nomi utente, gruppi (preceduti dal carattere "%"), [[UID]] (preceduti dal carattere "#"), gruppi di rete (preceduti dal carattere "+") o altri alias di tipo Runas_Alias e specifica con i permessi di quale utente deve essere eseguito un comando attraverso sudo.
Ad esempio:
Ad esempio:
<Runas_Alias AMICI = pippo, pluto, %adm
<pre>
paperino ALL = (AMICI) /usr/local/bin/script.sh</pre>
Runas_Alias AMICI = pippo, pluto, %adm
paperino ALL = (AMICI) /usr/local/bin/script.sh
</pre>
E paperino potrà eseguire:
E paperino potrà eseguire:
<pre>
<pre>
Riga 337: Riga 313:
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
== Specifiche ==
Eccoci giunti al cuore del file sudoers: le righe che indicano in che modo e con quali comandi è possibile invocare sudo.
Eccoci giunti al cuore del file sudoers: le righe che indicano in che modo e con quali comandi è possibile invocare sudo.<br/>
Una riga è costituita da diverse parti strutturate in questo modo:
Una riga è costituita da diverse parti strutturate in questo modo:
<pre>Chi_può_eseguire_sudo Da_quale_host = (Con_i_permessi_di_quale_utente : Con_i_permessi_di_quale_gruppo) EVENTUALI_TAG:Path_assoluto_del_comando_da eseguire</pre>
<pre>
Chi_può_eseguire_sudo Da_quale_host = (Con_i_permessi_di_quale_utente : Con_i_permessi_di_quale_gruppo) EVENTUALI_TAG:Path_assoluto_del_comando_da eseguire
</pre>
Quindi:
Quindi:
<pre>pippo topolinia = (topolino:topolino) NOPASSWD:/path/assoluto/del/comando
<pre>pippo topolinia = (topolino:topolino) NOPASSWD:/path/assoluto/del/comando</pre>
significa che l'utente pippo potrà eseguire il comando solo dall'host "topolinia" e con le credenziali dell'utente topolino e del gruppo topolino. Non verrà chiesta la password.
significa che l'utente pippo potrà eseguire il comando solo dall'host "topolinia" e con le credenziali dell'utente topolino e del gruppo topolino. Non verrà chiesta la password.
Le uniche parti obbligatorie sono:
Le uniche parti obbligatorie sono:<br/>
- L'utente a cui è consentito eseguire sudo
- L'utente a cui è consentito eseguire sudo<br/>
- L'host da cui si esegue sudo
- L'host da cui si esegue sudo<br/>
- Il carattere "="
- Il carattere "="<br/>
- Il path assoluto del comando da eseguire
- Il path assoluto del comando da eseguire<br/>
Le voci facoltative sono:
Le voci facoltative sono:<br/>
- Credenziali utente e gruppo. Vanno inserite necessariamente tra parentesi.
- Credenziali utente e gruppo. Vanno inserite necessariamente tra parentesi.<br/>
- Eventuali tag. Vanno inseriti prima del comando a cui si applicano e separati da questo da un carattere ":"
- Eventuali tag. Vanno inseriti prima del comando a cui si applicano e separati da questo da un carattere ":"<br/>


CHI
=== Chi ===
La prima parola indica chi può eseguire sudo. Questa può essere uno username, un gruppo (preceduto da %), un netgroup (preceduto da "+") o un alias di tipo User_Alias.
La prima parola indica chi può eseguire sudo. Questa può essere uno username, un gruppo (preceduto da %), un netgroup (preceduto da "+") o un alias di tipo User_Alias.<br/>
Quindi se:
Quindi se:
<pre>
<pre>
Riga 366: Riga 344:
L'utente pippo può eseguire il comando:
L'utente pippo può eseguire il comando:
<pre>$ sudo comando</pre>
<pre>$ sudo comando</pre>
L'utente topolino può eseguire comando2 ma solo se fa parte del gruppo "topolinia":
L'utente topolino può eseguire:
<pre>sudo comando2</pre>
<pre>sudo comando2</pre>
L'utente paperino può eseguire sudo con comando3 ma solo se fa parte del gruppo di rete "paperopoli":
ma solo se fa parte del gruppo "topolinia".<br/>
L'utente paperino può eseguire:
<pre>$ sudo comando3</pre>
<pre>$ sudo comando3</pre>
Biancaneve e cenerentola possono eseguire comando4
ma solo se fa parte del gruppo di rete "paperopoli".<br/>
Biancaneve e cenerentola possono eseguire:
<pre>$ sudo comando4</pre>
<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 sudo:
 
Di default a tutti viene chiesta la propria password. Nel caso l'utente non sia abilitato ad eseguire un comando con sudo:
<pre>Sorry, user nomeutente is not allowed to execute comando as root on nomehost.</pre>
<pre>Sorry, user nomeutente is not allowed to execute comando as root on nomehost.</pre>
Come si vede chiaramente, di default sudo cerca di eseguire il comando con i permessi di root (che è poi il compito per cui viene utilizzato).
Come si vede chiaramente, di default sudo cerca di eseguire il comando con i permessi di root (che è poi il compito per cui viene utilizzato).
Un esempio funzionante è il seguente:
Un esempio funzionante è il seguente:
<pre>pippo ALL = /usr/bin/ifconfig -a</pre>
<pre>pippo ALL = /usr/bin/ifconfig -a</pre>
Riga 381: Riga 363:
questo visualizzerà le interfacce di rete previo inserimento da parte di pippo della propria password.
questo visualizzerà le interfacce di rete previo inserimento da parte di pippo della propria password.


DA DOVE
=== Da dove ===
La seconda parola specifica il nome dell'host da cui è permesso eseguire sudo. Possono essere specificati anche indirizzi IP o indirizzi di rete con submask. Vedi ...
La seconda parola specifica il nome dell'host da cui è permesso eseguire sudo. Possono essere specificati anche indirizzi IP o indirizzi di rete con submask. Vedi ...<br/>
La parola "ALL" indica che gli utenti potranno eseguire sudo da qualsiasi host.
La parola "ALL" indica che gli utenti potranno eseguire sudo da qualsiasi host.<br/>
Lo scopo di questa voce è chiaro, magari si vuol consentire a pippo di eseguire sudo solo da una macchina della rete locale:
Lo scopo di questa voce è chiaro, magari si vuol consentire a pippo di eseguire sudo solo da una macchina della rete locale:
<pre>pippo 192.168.1.80 = comando</pre>
<pre>pippo 192.168.1.80 = comando</pre>
Riga 394: Riga 376:
<pre>pippo pippohost = comando</pre>
<pre>pippo pippohost = comando</pre>


(TODO: permessi utente/gruppo tag comando)


OPZIONI
== Opzioni ==
 
'''lecture'''<br/>
lecture
Visualizza un avvertimento prima che un utente esegua un comando attraverso sudo. I possibili valori sono:<br/>
Visualizza un avvertimento prima che un utente esegua un comando attraverso sudo. I possibili valori sono:
always = l'avvertimento viene sempre visualizzato<br/>
always = l'avvertimento viene sempre visualizzato
never = l'avvertimento non viene mai visualizzato<br/>
never = l'avvertimento non viene mai visualizzato
once = l'avvertimento viene visualizzato solo la prima volta che un utente esegue sudo
once = l'avvertimento viene visualizzato solo la prima vota che un utente esegue sudo


Di default l'avvertimento è:
Di default l'avvertimento è:
Riga 414: Riga 396:
Ad esempio:
Ad esempio:
<pre>Defaults lecture=always</pre>
<pre>Defaults lecture=always</pre>
stampa sempre un avvertimento.
stampa sempre un avvertimento.<br/>
Queste due righe sono equivalenti:
Queste due righe sono equivalenti:
<pre>
<pre>
Riga 421: Riga 403:
</pre>
</pre>


lecture_file
'''lecture_file'''<br/>
L'avvertimento di default può essere cambiato con questa opzione. Ad esempio, se l'avvertimento è contenuto nel file /etc/sudo_lecturefile :
L'avvertimento di default può essere cambiato con questa opzione. Ad esempio, se l'avvertimento è contenuto nel file <code>/etc/sudo_lecturefile</code> :
<pre>Defaults lecture=always
<pre>Defaults lecture=always
Defaults lecture_file="/etc/sudo_lecturefile"
Defaults lecture_file="/etc/sudo_lecturefile"
</pre>
</pre>


-passprompt (TODO: andata a capo)
'''passprompt (TODO: andata a capo)'''<br/>
Permette di definire il prompt che verrà visualizzato alla richiesta password. Di default questo valore è impostato a:
Permette di definire il prompt che verrà visualizzato alla richiesta password. Di default questo valore è impostato a:
<pre>[sudo] password for %p: </pre>
<pre>[sudo] password for %p: </pre>
È possibile ricorrere a qualche carattere speciale
È possibile ricorrere a qualche carattere speciale<br/>
-%H : il nome dell'host (FQDN)
-%H : il nome dell'host (FQDN)<br/>
-%h : host non FQDN
-%h : host non FQDN<br/>
-%p : l'utente la cui password viene richiesta (%p può essere diverso dall'utente che esegue sudo)
-%p : l'utente la cui password viene richiesta (%p può essere diverso dall'utente che esegue sudo)<br/>
-%U : l'utente con i cui permessi verrà eseguito il comando (di default è root)
-%U : l'utente con i cui permessi verrà eseguito il comando (di default è root)<br/>
-%u : l'utente che esegue il comando attraverso sudo
-%u : l'utente che esegue il comando attraverso sudo<br/>
Ad esempio:
Ad esempio:
<pre>Defaults passprompt="%u sta utilizzando sudo su %H. Il comando verrà eseguito con i permessi di %U. Inserisci la password di %p"
<pre>Defaults passprompt="%u sta utilizzando sudo su %H. Il comando verrà eseguito con i permessi di %U. Inserisci la password di %p"</pre>


LOG
LOG<br/>
-logfile
'''logfile'''<br/>
Il file di log per sudo, di default viene utilizzato /var/log/syslog . È sempre conveniente avere un log separato e specifico in cui leggere eventuali messaggi di errore (o minacce alla sicurezza del sistema attraverso sudo) senza rischiare di perderli nella lettura di un file di log più generale. Utilizzare logrotate per evitare che il file di log cresca troppo.
Per il file di log per sudo, di default, viene utilizzato <code>/var/log/syslog</code>. È sempre conveniente avere un log separato e specifico in cui leggere eventuali messaggi di errore (o minacce alla sicurezza del sistema attraverso sudo) senza rischiare di perderli nella lettura di un file di log più generale. Utilizzare [[logrotate]] per evitare che il file di log cresca troppo.<br/>
Creare il file di log:
Creare il file di log:
<pre># touch /var/log/sudo.log</pre>
<pre># touch /var/log/sudo.log</pre>
Riga 447: Riga 429:
<pre>Defaults logfile="/var/log/sudo.log"
<pre>Defaults logfile="/var/log/sudo.log"


-log_host
'''log_host'''<br/>
Nel file di log (diverso da syslog) viene specificato l'host. Di default questa opzione è disabilitata, per abilitarla:
Nel file di log (diverso da syslog) viene specificato l'host. Di default questa opzione è disabilitata, per abilitarla:
<pre>Defaults log_host</pre>
<pre>Defaults log_host</pre>


-log_year
'''log_year'''<br/>
Nel file di log (diverso da syslog) viene specificato l'anno. Di default questa opzione è disabilitata, per abilitarla:
Nel file di log (diverso da <code>syslog</code>) viene specificato l'anno. Di default questa opzione è disabilitata, per abilitarla:
<pre>Defaults log_year</pre>
<pre>Defaults log_year</pre>


-loglinelen
'''loglinelen'''<br/>
Lunghezza delle linee del file di log. La lunghezza di default è 80 caratteri, superata la quale la linea viene tagliata sulla riga successiva. Per disabilitare questo comportamento:
Lunghezza delle linee del file di log. La lunghezza di default è 80 caratteri, superata la quale la linea viene tagliata sulla riga successiva. Per disabilitare questo comportamento:
<pre>
<pre>
Riga 465: Riga 447:
<pre>Defaults loglinelen=120</pre>
<pre>Defaults loglinelen=120</pre>


-log_input
'''log_input'''<br/>
Tutti gli input dell'utente attraverso una sessione sudo verranno loggati nella directory /var/log/sudo-io/. Ciascun file di questa directory ha un nome univoco in base al TSID (Terminal Session ID).
Tutti gli input dell'utente attraverso una sessione sudo verranno loggati nella directory <code>/var/log/sudo-io/</code>. Ciascun file di questa directory ha un nome univoco in base al TSID (Terminal Session ID).<br/>
Questa opzione è disabilita di default. Per abilitarla:
Questa opzione è disabilita di default. Per abilitarla:
<pre>Defaults log_input</pre>
<pre>Defaults log_input</pre>
TUTTI gli input degli utenti saranno loggati in chiaro, anche le password eventualmente digitate durante una sessione sudo. I log si trovano in /var/log/sudo-io/nn/nn/nn/ttyin in formato compresso (nn sono stringhe di numeri-cifre), ad esempio per leggere l'input della sessione con TSID=000001:
TUTTI gli input degli utenti saranno loggati in chiaro, anche le password eventualmente digitate durante una sessione sudo. I log si trovano in <code>/var/log/sudo-io/nn/nn/nn/ttyin</code> in formato compresso (nn sono stringhe di numeri-cifre), ad esempio per leggere l'input della sessione con TSID=000001:
<pre># zless /var/log/sudo-io/00/00/01/ttyin</pre>
<pre># zless /var/log/sudo-io/00/00/01/ttyin</pre>


-log_output (TODO:CAMBIARE LA DATA)
'''log_output (TODO:CAMBIARE LA DATA)'''<br/>
Tutti i messaggi visualizzati a schermo in una sessione sudo saranno loggati nella directory /var/log/sudo-io/, anche questi in base al TSID.
Tutti i messaggi visualizzati a schermo in una sessione sudo saranno loggati nella directory <code>/var/log/sudo-io/</code>, anche questi in base al TSID.<br/>
Questa opzione è disabilita di default. Per abilitarla:
Questa opzione è disabilita di default. Per abilitarla:
<pre>Defaults log_output</pre>
<pre>Defaults log_output</pre>
Riga 490: Riga 472:
per ottenere maggiori informazioni sul funzionamento di sudoreplay.
per ottenere maggiori informazioni sul funzionamento di sudoreplay.


 
PASSWORD<br/>
PASSWORD
'''authenticate'''<br/>
-authenticate
L'utente deve inserire una password per poter utilizzare sudo (di default: la propria password). Questo comportamento può essere bypassato attraverso i tag PASSWD e NOPASSWD.<br/>
L'utente deve inserire una password per poter utilizzare sudo (di default: la propria password). Questo comportamento può essere bypassato attraverso i tag PASSWD e NOPASSWD.
Di default questa opzione è attiva. Per disabilitarla:
Di default questa opzione è attiva. Per disabilitarla:
<pre>Defaults !authenticate</pre>
<pre>Defaults !authenticate</pre>
Riga 512: Riga 493:
</pre>
</pre>


-passwd_tries
'''passwd_tries'''<br/>
Di default è 3. Ciò vuol dire che si hanno tre tentativi per inserire correttamente la password prima che sudo termini con questo messaggio d'errore:
Di default è 3. Ciò vuol dire che si hanno tre tentativi per inserire correttamente la password prima che sudo termini con questo messaggio d'errore:
<pre>sudo: 3 incorrect password attempts</pre>
<pre>sudo: 3 incorrect password attempts</pre>
Riga 518: Riga 499:
<pre>Defaults passwd_tries=5</pre>
<pre>Defaults passwd_tries=5</pre>


-passwd_timeout
'''passwd_timeout'''<br/>
È il numero di minuti trascorsi i quali il prompt di immissione della password viene chiuso. Di default questo valore è 0, cioè sudo rimane indefinitivamente in attesa della password.
È il numero di minuti trascorsi i quali il prompt di immissione della password viene chiuso. Di default questo valore è 0, cioè sudo rimane indefinitivamente in attesa della password.
Per chiudere il prompt dopo tre minuti:
Per chiudere il prompt dopo tre minuti:
Riga 525: Riga 506:
<pre>Defaults passwd_timeout=3.1</pre>
<pre>Defaults passwd_timeout=3.1</pre>


-timestamp_timeout
'''timestamp_timeout'''<br/>
È il numero di minuti trascorsi i quali verrà nuovamente richiesta una password.
È il numero di minuti trascorsi i quali verrà nuovamente richiesta una password.<br/>
Di default questo valore è 15. Ciò vuol dire che, dal momento in cui si inserisce correttamente una password, passeranno quindici minuti senza che sudo la richieda ancora.
Di default questo valore è 15. Ciò vuol dire che, dal momento in cui si inserisce correttamente una password, passeranno quindici minuti senza che sudo la richieda ancora.


-badpass_message
'''badpass_message'''<br/>
Il messaggio che viene visualizzato quando si inserisce una password sbagliata. Di default è:
Il messaggio che viene visualizzato quando si inserisce una password sbagliata. Di default è:
<pre>Sorry, try again.</pre>
<pre>Sorry, try again.</pre>
Riga 535: Riga 516:
<pre>Defaults badpass_message="Password errata. Controlla che non sia stato premuto il tasto delle maiuscole."</pre>
<pre>Defaults badpass_message="Password errata. Controlla che non sia stato premuto il tasto delle maiuscole."</pre>


-insults
'''insults'''<br/>
Se viene inserita una password sbagliata, verrà visualizzato un messaggio di "insulto" anziché il messaggio di errore di default o ciò che è definito in badpass_message.
Se viene inserita una password sbagliata, verrà visualizzato un messaggio di "insulto" anziché il messaggio di errore di default o ciò che è definito in badpass_message.<br/>
I messaggi sono in inglese e non particolarmente offensivi; se volete messaggi in italiano o volete andarci giù pesante con le offese, ricompilatevi sudo con le modifiche apportate.
I messaggi sono in inglese e non particolarmente offensivi; se volete messaggi in italiano o volete andarci giù pesante con le offese, ricompilatevi sudo con le modifiche apportate.
Di default questa opzione è disabilitata. Per abilitarla:
Di default questa opzione è disabilitata. Per abilitarla:
<pre>Defaults insults</pre>
<pre>Defaults insults</pre>


-pwfeedback
'''pwfeedback'''<br/>
Attiva il feedback per ogni tasto premuto durante l'inserimento della password. Tipicamente un asterisco. (TODO: come è impostato?)
Attiva il feedback per ogni tasto premuto durante l'inserimento della password. Tipicamente un asterisco. (TODO: come è impostato?)
<pre>[sudo] password for pippo: *******</pre>
<pre>[sudo] password for pippo: *******</pre>
Per impostare questa opzione:
Per impostare questa opzione:
<pre>Defaults pwfeedback</pre>
<pre>Defaults pwfeedback</pre>
Questa opzione è disabilitata di default ed un amministratore di rete è invitato a non attivarla; un malintenzionato alle spalle dell'utente potrebbe ottenere informazioni sulla lunghezza della password.
Questa opzione è disabilitata di default ed un amministratore di rete è invitato a non attivarla; un malintenzionato alle spalle dell'utente potrebbe ottenere informazioni sulla lunghezza della password.<br/>
Su macchine desktop o portatilli, questo potrebbe essere invece un buon metodo da utilizzare per prevenire errori di immissione, soprattutto se la password è molto lunga e sempre che abbiate persone fidate o proprio nessuno alle spalle.
Su macchine desktop o portatili, questo potrebbe essere invece un buon metodo da utilizzare per prevenire errori di immissione, soprattutto se la password è molto lunga e sempre che abbiate persone fidate alle spalle.


-rootpw
'''rootpw'''<br/>
Con questa opzione viene chiesta la password di root anziché la password dell'utente che esegue sudo.  
Con questa opzione viene chiesta la password di root anziché la password dell'utente che esegue sudo.<br/>
Di default è disabilitata ed è fortemente sconsigliato abilitarla; sudo viene utilizzato proprio per evitare di digitare la password di root.
Di default è disabilitata ed è fortemente sconsigliato abilitarla; sudo viene utilizzato proprio per evitare di digitare la password di root.


-listpw
'''listpw'''<br/>
Controlla la richiesta della password quando un utente esegue il comando:
Controlla la richiesta della password quando un utente esegue il comando:
<pre>$ sudo -l</pre>
<pre>$ sudo -l</pre>
- all: la password non viene chiesta solo se tutte le entries che riguardano l'utente contengono il tag NOPASSWD
- all: la password non viene chiesta solo se tutte le entries che riguardano l'utente contengono il tag NOPASSWD<br/>
. any: la password non viene chiesta solo se almeno una entries che riguarda l'utente contiene il tag NOPASSWD
. any: la password non viene chiesta solo se almeno una entries che riguarda l'utente contiene il tag NOPASSWD<br/>
- always: la password viene sempre chiesta
- always: la password viene sempre chiesta<br/>
- never: la password non viene mai chiesta. "listpw=never" è equivalente a "!listpw"
- never: la password non viene mai chiesta. "listpw=never" è equivalente a "!listpw"<br/>


Esempio1
Esempio1
Riga 572: Riga 553:
     (root) /usr/bin/tail /var/log/kern.log
     (root) /usr/bin/tail /var/log/kern.log
</pre>
</pre>


Esempio2
Esempio2
Riga 585: Riga 565:
Il valore di default per questa opzione è "any". Il valore "never" può essere utilizzato dagli amministratori per impedire che, senza l'inserimento di una password, qualcuno possa risalire ai comandi eseguibili da un utente attraverso sudo.
Il valore di default per questa opzione è "any". Il valore "never" può essere utilizzato dagli amministratori per impedire che, senza l'inserimento di una password, qualcuno possa risalire ai comandi eseguibili da un utente attraverso sudo.


-verifypw
'''verifypw'''<br/>
Identica alla precedente. L'unica differenza è che controlla la password richiesta per il comando:
Identica alla precedente. L'unica differenza è che controlla la password richiesta per il comando:
<pre>$ sudo -v</pre>
<pre>$ sudo -v</pre>
Riga 591: Riga 571:


EMAIL /DA CONTROLLARE CON ESEMPI CONCRETI
EMAIL /DA CONTROLLARE CON ESEMPI CONCRETI
-mailsub
'''mailsub'''<br/>
È il soggetto dell'email che verrà inviata in base ai criteri impostati. Di default è:
È il soggetto dell'email che verrà inviata in base ai criteri impostati. Di default è:
<pre>* * * SECURITY information for %h * * *</pre>
<pre>* * * SECURITY information for %h * * *</pre>
(TODO: gli escpae %)
(TODO: gli escpape %)


-mailto
'''mailto'''<br/>
L'indirizzo di posta a cui verrà inviata l'email. Racchiudere tra doppie virgolette se contiene il carattere @ . Di default l'emailviene inviata a root.
L'indirizzo di posta a cui verrà inviata l'email. Racchiudere tra doppie virgolette se contiene il carattere @ . Di default l'email viene inviata a root.
(TODO: posta locale)
(TODO: posta locale)


-mailfrom
'''mailfrom'''<br/>
L'indirizzo da cui verrà inviata l'email. Di default è l'indirizzo dell'utente che esegue sudo.
L'indirizzo da cui verrà inviata l'email. Di default è l'indirizzo dell'utente che esegue sudo.
(TODO)
(TODO)


-mailerpath
'''mailerpath'''<br/>
Il path del programma utilizzato per inviare le email. Di default è "/usr/sbin/sendmail" che, in una installazione di default di Debian, è un link che punta a Exim.
Il path del programma utilizzato per inviare le email. Di default è "/usr/sbin/sendmail" che, in una installazione di default di Debian, è un link che punta a Exim.


-mailerflags
'''mailerflags'''<br/>
I flag da applicare al programma specificato in mailerpath.
I flag da applicare al programma specificato in mailerpath.<br/>
Di default questa variabile è impostata a "-t", cioè fa in modo che il programma di posta possa lavorare con indirizzi locali.
Di default questa variabile è impostata a "-t", cioè fa in modo che il programma di posta possa lavorare con indirizzi locali.


-mail_always
'''mail_always'''<br/>
Viene inviata una email ogni volta che un utente esegue sudo. Di default questa opzione è disabilitata.
Viene inviata una email ogni volta che un utente esegue sudo. Di default questa opzione è disabilitata. Per abilitarla:
Per abilitarla:
<pre>Defaults mail_always</pre>
<pre>Defaults mail_always</pre>


-mail_badpass
'''mail_badpass'''<br/>
Viene inviata una email se l'utente inserisce una password sbagliata. Di default è disabilitata.
Viene inviata una email se l'utente inserisce una password sbagliata. Di default è disabilitata. Per attivarla:
Per attivarla:
<pre>Defaults mail_badpass</pre>
<pre>Defaults mail_badpass</pre>


-mail_no_host
'''mail_no_host'''<br/>
Viene inviata una email se l'utente è abilitato ad eseguire sudo ma non sull'host specificato. Questa opzione è disabilitata di default.
Viene inviata una email se l'utente è abilitato ad eseguire sudo ma non sull'host specificato. Questa opzione è disabilitata di default. Per abilitarla:
Per abilitarla:
<pre>Defaults mail_no_host</pre>
<pre>Defaults mail_no_host</pre>
Esempio:
Esempio:
Riga 630: Riga 607:
</pre>
</pre>
L'email verrà inviata se l'utente pippo si collegherà dall'host sds.dsds.sds e proverà ad eseguire:
L'email verrà inviata se l'utente pippo si collegherà dall'host sds.dsds.sds e proverà ad eseguire:
<pre>$ sudo /usr/bin/tail 7var/log/kern.log</pre>
<pre>$ sudo /usr/bin/tail /var/log/kern.log</pre>


-mail:no_perms
'''mail:no_perms'''<br/>
Viene inviata una email se l'utente ha i permessi di eseguire comandi attraverso sudo ma cerca di eseguire altri comandi non consentiti. Di default questa opzione è disabilitata.
Viene inviata una email se l'utente ha i permessi di eseguire comandi attraverso sudo ma cerca di eseguire altri comandi non consentiti. Di default questa opzione è disabilitata.
Per abilitarla:
Per abilitarla:
Riga 648: Riga 625:
poiché non si trova nelle entries del file. La prossima opzione abilita questo comportamento.
poiché non si trova nelle entries del file. La prossima opzione abilita questo comportamento.


-mail_no_user
'''mail_no_user'''<br/>
Viene inviata una email se l'utente che esegue sudo non è presente nel file sudoers. Questa opzione è abilitata di default.
Viene inviata una email se l'utente che esegue sudo non è presente nel file sudoers. Questa opzione è abilitata di default. Per disabilitarla (sconsigliato):
Per disabilitarla (sconsigliato):
<pre>Defaults !mail_no_user</pre>
<pre>Defaults !mail_no_user</pre>
L'esempio è il contrario dell'esempio preacedente:
L'esempio è il contrario dell'esempio precedente:
<pre>
<pre>
pippo ALL : /usr/bin/tail /var/log/kern.log
pippo ALL : /usr/bin/tail /var/log/kern.log
6 999

contributi