PDA

View Full Version : Script e privilegi di root


Damage92
22-06-2010, 14:39
Salve!

Ho scoperto anyremote, un programma per controllare il pc attraverso un client sul cellulare, usando il bluetooth. Si associa ogni tasto del telefono ad un comando. Ci sono diverse configurazioni, una per ogni programma. Per esempio c'è quella per comandare vlc, totem, per controllare il mouse :D, etc...

Uso questo programma come telecomando per vedere i film la sera sul pc.
Però, prima di avviare anyremote, devo cambiare l'output audio e disattivare lo screensaver. Allora avevo pensato di fare uno script, che magari quando ho finito di usare il pc, ripristina l'audio e lo screensaver e spegne il pc.

Qui mi sono bloccato, perché per eseguire shutdown devo essere root. Ma gli altri comandi vanno eseguiti col mio utente. Inoltre lo shutdown va eseguito alla fine, e non posso certo alzarmi per mettere la password, altrimenti non avrebbe senso.

Lo script avrebbe una struttura del tipo:

-----
cambia output
disattiva screensaver

avvia anyremote
[credo che da anyremote posso lanciare dal telefono "killall anyremote" per farlo chiudere da solo, anche se non mi sembra una bella soluzione]

cambia output
riabilita screensaver

shutdown
----

Qualcuno può aiutarmi?
grazie :)

asghan
22-06-2010, 20:07
per lo shutdown

puoi provare con

http://www.lecco.linux.it/Un_pinguino_per_ogni_bambino/Guida_per_gli_sviluppatori#Configurazione_di_Sudo

Kampa67
22-06-2010, 21:12
Qui mi sono bloccato, perché per eseguire shutdown devo essere root. Ma gli altri comandi vanno eseguiti col mio utente. Inoltre lo shutdown va eseguito alla fine, e non posso certo alzarmi per mettere la password, altrimenti non avrebbe senso.


Ciao,
nello script davanti al comando da eseguire come root (nel tuo caso "shutdown") metti sudo.

Poi dai i permessi allo script in questo modo:
chmod u+s+x /percorso/script.sh

e la password non te la chiede più ;)

Damage92
23-06-2010, 11:08
Ciao,
nello script davanti al comando da eseguire come root (nel tuo caso "shutdown") metti sudo.

Poi dai i permessi allo script in questo modo:
chmod u+s+x /percorso/script.sh

e la password non te la chiede più ;)

Questa non la conoscevo! A cosa servono quei permessi esattamente?

demi@n
23-06-2010, 17:26
u+x = permette all'user di eseguire lo script
+s = set user ID, o set group ID = vedi qui (http://it.wikipedia.org/wiki/Permessi_(Unix)#Altri_permessi). ;)

Damage92
23-06-2010, 20:19
Innanzitutto grazie a tutti quanti per le risposte :)

Ancora non capisco come funziona il meccanismo. Da quello che ho letto, utilizzando quei permessi, se lancio lo script con il mio utente, dato che lo script appartiene a root, allora dovrei avere i privilegi di root. Ma facendo una prova non funziona...
Inoltre, se avessi i permessi di root, a cosa servirebbe utilizzare sudo davanti al comando?

Forse il fatto è che avere i privilegi di root ed essere loggati come utente root sono due concetti diversi?

Grazie ancora!

demi@n
23-06-2010, 23:12
Ancora non capisco come funziona il meccanismo. Da quello che ho letto, utilizzando quei permessi, se lancio lo script con il mio utente, dato che lo script appartiene a root, allora dovrei avere i privilegi di root.

Il meccanismo più o meno l'ho compreso, ma mi riesce molto difficile spiegarlo.
Il setuid è un po' diverso dal dare i privilegi di superutente o root.
In realtà, con il setuid, i privilegi del processo vengono impostati in base a quelli del proprietario del file.
Guarda, nel link che ti ho postato è spiegato abbastanza bene. Disorienta giusto l'ultima proposizione ("con quelli dell'utente che lo avvia"):
"il setuid o suid, applicato ad un file che ha il permesso di esecuzione, indica che esso va eseguito con i privilegi dell'utente proprietario del file anziché con quelli dell'utente che lo avvia".

In altre parole (correggetemi se sbaglio) è come assegnare all'user la proprietà dello script, che viene eseguito senza una richiesta di password anche se questo contiene comandi che implicano privilegi di root.



Ma facendo una prova non funziona...
Inoltre, se avessi i permessi di root, a cosa servirebbe utilizzare sudo davanti al comando?

Forse il fatto è che avere i privilegi di root ed essere loggati come utente root sono due concetti diversi?


Perchè non funzioni onestamente non lo so, potrebbe essere anche un errore di impostazione del programma.
Una cosa è certa, il setuid è cosa diversa dall'eseguire lo script come root o con i privilegi di root.
Inoltre, credo che sì, root e superutente siano due cose diverse. Quando s'installa ubuntu viene chiesto d'inserire una sola password. Se installi debian, invece, te ne chiede due, come è giusto che sia: una è per l'utente con eventuali privilegi, l'altra è quella di root.
Se con ubuntu vuoi loggarti da root, devi prima impostare (attraverso dei comandi) la password di root che durante l'installazione non viene, appunto, richiesta.
Già questo fa capire un po' la differenza.

Spero di non aver scritto marronate. :D

Kampa67
24-06-2010, 23:12
Avete ragione a dire che non funziona, ho detto una minkiata spaventosa :sofico: sorry... :asd:

Se così fosse chiunque senza password di root potrebbe fare qualsiasi cosa... :doh: il che non sarebbe il massimo.

La soluzione comunque c'è (e funziona) solo che dovresti mettere la password di root all'interno dello script.
Se non temi che qualcuno possa vederti la password curiosando nello script, procedi così:

Nella riga dove andrebbe il shutdown
echo 'TuaPassword' | sudo -S shutdown -h now
Ovviamente funziona anche con gli altri comandi volendo...

Mi scuso ancora se vi ho fatto perdere tempo.

Damage92
25-06-2010, 11:48
@demi@n


Forse il fatto è che avere i privilegi di root ed essere loggati come utente root sono due concetti diversi?



Inoltre, credo che sì, root e superutente siano due cose diverse.


Per superutente indendi "avere i privilegi di root ma essere loggati con un altro utente"?

Quando s'installa ubuntu viene chiesto d'inserire una sola password. Se installi debian, invece, te ne chiede due, come è giusto che sia: una è per l'utente con eventuali privilegi, l'altra è quella di root.

Quindi stai dicendo che, dato che su Ubuntu non si usa root ma sudo, è possibile dare i poteri di root ad un utente qualsiasi (che sia sudoers) ma che rimane sempre quell'utente, non diventa root.
Il ragionamento fila, quindi possiamo dire che avere i privilegi di root ed essere root sono due cose diverse.

Ora rimane da capire perché il setuid non funziona (almeno con la prova che ho fatto io...). Ho scritto in un file:
touch /prova
solo root può creare un file nella cartella radice. Lo script appartiene a root:root, ed è settato il setuid (s minuscola, quindi c'è anche il flag di esecuzione). Quando con il mio utente vado ad eseguire, touch mi risponde: "permission denied". Ovviamente lanciato da root funziona...

@Kampa67
Effettivamente con echo pare funzionare! Non è proprio la soluzione migliore, ma almeno per il momento lo posso usare.


Grazie a tutti, se riesco a capirci qualcosa in più lo scrivo nella discussione!

demi@n
25-06-2010, 14:08
Se così fosse chiunque senza password di root potrebbe fare qualsiasi cosa... :doh: il che non sarebbe il massimo.


Non se mette lo script nella propria home & se ne è il proprietario & non permette a nessun altro utente (eccetto root) di vederlo.


Per superutente indendi "avere i privilegi di root ma essere loggati con un altro utente"?

Esatto. Infatti è possibile, sia su debian che su ubuntu, loggarsi nell'ambiente grafico come root (root è un utente a tutti gli effetti). L'unica differenza tra debian e ubuntu è che nella prima la password di root viene impostata durante l'installazione; mentre nella seconda la devi impostare a installazione finita.
In entrambi i casi, devi dare, attraverso la conf di gdm, il permesso a root di loggarsi. Impostazione che di default non è abilitata, perchè ritenuta pericolosa.


Quindi stai dicendo che, dato che su Ubuntu non si usa root ma sudo, è possibile dare i poteri di root ad un utente qualsiasi (che sia sudoers) ma che rimane sempre quell'utente, non diventa root.

Sì, puoi dare i privilegi di superutente a chi vuoi tu, attraverso sudoers, appunto.


Il ragionamento fila, quindi possiamo dire che avere i privilegi di root ed essere root sono due cose diverse.

Superutente e root sono due utenti distinti. Infatti root ha una propria home, diversa da quella tua. Te ne puoi rendere benissimo conto, ad esempio, quando dai "gksu nautilus". ;)


Ora rimane da capire perché il setuid non funziona (almeno con la prova che ho fatto io...).

Dove sta questo script? Nella tua home? Che permessi ha?
Può anche darsi che non sia corretta la sintassi del chmod. Non lo so, dovrei verificare.

PS: qui c'è un piccolo how-to per ubuntu (non so se vale per Lucid) su come permettere a root di loggarsi nell'ambiente grafico: http://www.brainessence.it/index.php?id=142
Solo che il tizio del blog ha scritto un'inesattezza, questa: "L’ utente root, detto anche “super utente”, è infatti l’equivalente dell’amministratore di sistema tipico di Windows".
Non è così. Il superutente sei tu, root è l'utente di sistema e c'è di default.

Damage92
25-06-2010, 14:29
Non se mette lo script nella propria home & se ne è il proprietario & non permette a nessun altro utente (eccetto root) di vederlo.



Esatto. Infatti è possibile, sia su debian che su ubuntu, loggarsi nell'ambiente grafico come root (root è un utente a tutti gli effetti). L'unica differenza tra debian e ubuntu è che nella prima la password di root viene impostata durante l'installazione; mentre nella seconda la devi impostare a installazione finita.
In entrambi i casi, devi dare, attraverso la conf di gdm, il permesso a root di loggarsi. Impostazione che di default non è abilitata, perchè ritenuta pericolosa.



Sì, puoi dare i privilegi di superutente a chi vuoi tu, attraverso sudoers, appunto.



Superutente e root sono due utenti distinti. Infatti root ha una propria home, diversa da quella tua. Te ne puoi rendere benissimo conto, ad esempio, quando dai "gksu nautilus". ;)



Dove sta questo script? Nella tua home? Che permessi ha?
Può anche darsi che non sia corretta la sintassi del chmod. Non lo so, dovrei verificare.

PS: qui c'è un piccolo how-to per ubuntu (non so se vale per Lucid) su come permettere a root di loggarsi nell'ambiente grafico: http://www.brainessence.it/index.php?id=142
Solo che il tizio del blog ha scritto un'inesattezza, questa: "L’ utente root, detto anche “super utente”, è infatti l’equivalente dell’amministratore di sistema tipico di Windows".
Non è così. Il superutente sei tu, root è l'utente di sistema e c'è di default.

No, aspetta, penso che stai facendo confusione...
Gli utenti sono root (che c'è sempre, al massimo è disabilitato il suo login) e gli altri utenti.
Ogni utente ha i suoi privilegi (cosa può e non può fare).
Root ha i provilegi di superutente, può fare tutto.

Prima stavamo dicendo che sudo è in grado di dare agli utenti normali i privilegi di superutente (quelli che normalmente ha root), rimanendo comunque gli stessi utenti.

In effetti quello che servirebbe a me è proprio avere i privilegi di root (per fare lo shutdown), ma rimanere con il mio utente (quando do il comando per togliere lo screensaver, deve toglierlo alla configurazione del mio utente, non a quella di root!).

Purtroppo, dando il comando (da utente normale):
sudo whoami
risponde:
root

...quindi significa che sudo ti fa diventare proprio root, non ti da semplicemente i suoi poteri :(

demi@n
25-06-2010, 15:16
No, aspetta, penso che stai facendo confusione...
Gli utenti sono root (che c'è sempre, al massimo è disabilitato il suo login) e gli altri utenti.
Ogni utente ha i suoi privilegi (cosa può e non può fare).
Root ha i provilegi di superutente, può fare tutto.

Prima stavamo dicendo che sudo è in grado di dare agli utenti normali i privilegi di superutente (quelli che normalmente ha root), rimanendo comunque gli stessi utenti.

Nessuna confusione, i normali utenti possono avere i privilegi di superutenti, pur rimanendo se stessi.
Quello che volevo mettere in risalto, è che root è un utente vero e proprio.
Prova a navirare in nautilus come root e dimmi se la home è uguale alla tua.


In effetti quello che servirebbe a me è proprio avere i privilegi di root (per fare lo shutdown), ma rimanere con il mio utente (quando do il comando per togliere lo screensaver, deve toglierlo alla configurazione del mio utente, non a quella di root!).

Prova a dare un'occhiata a questo link: http://www.linuxforums.org/forum/linux-programming-scripting/12551-simple-shutdown-script.html
Mi sembra che alla fine il tizio abbia risolto (se ho tradotto bene).


Purtroppo, dando il comando (da utente normale):
sudo whoami
risponde:
root

...quindi significa che sudo ti fa diventare proprio root, non ti da semplicemente i suoi poteri :(

Che c'entra, anche se digiti da terminale "sudo su" o "su -" diventi root, virtualmente root.
Rimane il fatto che tu e root cmq non siete gli stessi utenti. ;)

ps: sudo significa "super user do", non "root do".

Damage92
25-06-2010, 15:45
Nessuna confusione, i normali utenti possono avere i privilegi di superutenti, pur rimanendo se stessi.
Quello che volevo mettere in risalto, è che root è un utente vero e proprio.
Prova a navirare in nautilus come root e dimmi se la home è uguale alla tua.

A, ok, non ti avevo capito :D


Che c'entra, anche se digiti da terminale "sudo su" o "su -" diventi root, virtualmente root.
Rimane il fatto che tu e root cmq non siete gli stessi utenti. ;)

ps: sudo significa "super user do", non "root do".

Questo era quello che pensavo anche io... però ho provato a lanciare un comando per cambiare una impostazione a gconf (che ovviamente cambia da utente ad utente), e ho usato sudo per vedere cosa succedeva... risultato, l'impostazione è rimasta uguale... quindi mi viene il dubbio, considerando anche che whoami risponde root, che usando sudo non si hanno solo i privilegi di root, ma lo si diventa... :(

Non so proprio che dirti, anche secondo me si dovrebbe rimanere gli stessi utenti, ma di fatto non funziona (o comunque non mi torna utile per il mio script :( ).

pabloski
25-06-2010, 16:25
mmm male molto male :D

sarò catastrofista ma già vedo virus per android e iphone che manipolano i nostri pc e gli home server :ciapet:

demi@n
25-06-2010, 16:32
Ascolta, sto leggendo in web varie soluzioni per lo shutdown, perchè interessa anche a me.

Se scrivi "linux shutdown script" o meglio ancora "ubuntu shutdown script" su google, vengono fuori parecchie cosine.

Il setuid è sconsigliato in casi come questo (giustamente).

Io ho trovato inressante questo post: http://linux.derkeiler.com/Mailing-Lists/Debian/2004-08/3538.html

Il tizio deve gestire un server e fare uno shutdown quando lo ritiene opportuno.
Chi gli risponde, addirittura ha autorizzato tutti gli user del suo laptop ad eseguire lo shutdown senza avere privilegi di root e senza andare a sovrascrivere file di sistema.
Quindi ha creato uno script e l'ha messo in /usr/local/sbin/, chiamandolo shutdwon.sh

Se nel tuo programma, fai in modo di puntare a quello script, può darsi che hai risolto il problema.

Cmq, ti lascio anche il link di un paio di post molto significativi riguardo la questione root-superuser. In quel thread molti consigliano di mettere lo script in /etc/init.d e lswb (l'autore dei post), spiega perchè non è corretto un approccio del genere.

http://ubuntuforums.org/showpost.php?p=5693903&postcount=16
http://ubuntuforums.org/showpost.php?p=5694584&postcount=18

Dacci un'occhiata. ;)

demi@n
25-06-2010, 16:34
mmm male molto male :D

sarò catastrofista ma già vedo virus per android e iphone che manipolano i nostri pc e gli home server :ciapet:

:D

E hai ragione!

Damage92
25-06-2010, 16:55
@ demi@n
Il primo link mi è utile, in pratica si può configurare sudo per non chiedere la password quando si lancia un certo comando! :D Ora posso togliere la mia password dal file :D

Ora grazie a sudo posso fare quello che volevo... però non è che sia il massimo usare sudo... il sistema così è più insicuro (come dice anche pabloski :D).
Se un processo riesce a prendere i privilegi del mio utente (e non dovrebbe essere difficile, basta che mi sbaglio io e lo avvio), allora potrebbe spegnere la macchina da solo, e non è una bella cosa :(

Interessante il discorso di init.d, in pratica non è furbo mettere li degli script che non servono per il boot/shutdown.

demi@n
25-06-2010, 17:09
Ora grazie a sudo posso fare quello che volevo... però non è che sia il massimo usare sudo... il sistema così è più insicuro (come dice anche pabloski :D).

Perchè? Nome di fantasia + sudo = più sicuro di root (che è l'amministratore di default nei sistemi gnu/linux).

Ma forse ti riferivi a sudoers?
Guarda che configurato in quel modo, viene specificato chi può fare lo shutdown senza password e chi no. Inoltre punta ad una directory locale (se dai un'occhiata a /usr/local/sbin/ non ci trovi nessun file).


Se un processo riesce a prendere i privilegi del mio utente (e non dovrebbe essere difficile, basta che mi sbaglio io e lo avvio), allora potrebbe spegnere la macchina da solo, e non è una bella cosa :(

Beh, se temi questo, il discorso cambia. In effetti ci sarebbe da ragionarci meglio.
Approfondiamo la discussione, che oltretutto mi sta piacendo.


Interessante il discorso di init.d, in pratica non è furbo mettere li degli script che non servono per il boot/shutdown.

No, potrebbero anche servire o essere efficaci, ma è un approccio sbagliato.
Lì ci sono file di sistema che, a mio avviso, non vanno sovrascritti o scavalcati.
Diverso è mettere lo script in /usr/local/sbin/.

Damage92
25-06-2010, 17:24
Beh, se temi questo, il discorso cambia. In effetti ci sarebbe da ragionarci meglio.
Approfondiamo la discussione, che oltretutto mi sta piacendo.


La logica è semplice: solo root dovrebbe poter fare lo shutdown.
Nel mio caso mi frega, perché non posso stare davanti la tastiera per scrivere la password!
Dovrei scriverla quando "avvio la modalità media-center" (cioè prima di ficcarmi sotto le coperte :D), e poi usare quei privilegi successivamente per eseguire shutdown quando mi sono stufato...
Non vedo altre soluzioni "semplici" :(

Però adesso mi è venuto un altro dubbio: come fa il mio utente a spegnere la macchina dal menu di Gnome!?
Su gnome sono loggato con il mio utente, e il mio utente non può fare lo shutdown!!
Come hanno fatto? :O

demi@n
27-06-2010, 13:13
Media Center immagino che si avvii senza privilegi, lo shutdown invece li richiede.
Quindi le due operazioni sono su un piano diverso.

Avviare il sistema o lanciare MC da root non sta nè in cielo nè in terra.

Quindi l'unica soluzione è quella di autormatizzare il tutto attraverso uno script che contempli lo spegnimento del pc senza richiesta di password o con password già scritta (da qualche parte).

Lo shutdown non è necessario farlo dal menu di gnome, si può fare attraverso i comandi:

- poweroff
- halt
- shutdown

Al momento, l'unica cosa che mi pare possibile è quella di editare sudoers come indicato in uno dei precedenti post e non vedo come qualche processo possa prendere il controllo del tuo pc. Oppure attraverso il setuid che però, a mio avviso, è più pericoloso del primo.

Ti lascio un altro po' di link:
http://ubuntuforums.org/showthread.php?t=392346 (sudoders)
http://ubuntuforums.org/showthread.php?t=161230 (sudoers)
http://forum.html.it/forum/showthread/t-702454.html (setuid, v. post di MaximoD e per chmod guarda qui: http://en.wikipedia.org/wiki/Chmod#Command_line_examples )

Mi raccomando, se dovessi metter mano a sudoers, fallo con visudo (sudo visudo) che verifica la correttezza del file stesso e in caso di errori non salva le modifiche.

demi@n
27-06-2010, 13:37
Dimenticavo: si può creare il gruppo degli "shutdowners" con

sudo groupadd shutdowners

e aggiungere questo a sudoers.

Al gruppo, poi, aggiungi i nomi degli utenti che ne fanno parte con:

sudo gpasswd -a nomeutente shutdowners

Damage92
27-06-2010, 14:56
Ora ho configurato sudo per far spegnere il pc dal mio utente.

Però, teoricamente, non è una bella soluzione... perché ora uno script o programma "malevolo" potrebbe spegnere il computer a mia insaputa. Se invece solo root potesse eseguire shutdown non potrebbe farlo (a meno che non scrivo la pass di root, ma allora sarei idiota io).
Poi non ho questo problema, probabilmente non esiste nessun programma malevolo che fa ciò, ma nella teoria non penso sia la soluzione migliore.

Riguardo Gnome, intendevo dire: come è possibile che il mio utente può fare lo shutdown passando dal menu di gnome, ma non può farlo attraverso il comando? Come hanno fatto quelli di Gnome ad implementare lo shutdown!?

demi@n
29-06-2010, 15:28
Riguardo Gnome, intendevo dire: come è possibile che il mio utente può fare lo shutdown passando dal menu di gnome, ma non può farlo attraverso il comando? Come hanno fatto quelli di Gnome ad implementare lo shutdown!?

Uhm, in effetti hai ragione, l'utente semplice può spegnere il computer attraverso la gui e senza richiesta di password.
Giusta osservazione la tua... faccio qualche ricerca.

Edit: mentre indago sulla questione, ti suggerisco di provare ubuntu-twik (http://wiki.ubuntu-it.org/AmministrazioneSistema/UbuntuTweak), attraverso il quale sembra che si possa manipolare lo spegnimento (http://www.jobbyn77.it/?p=2202).

Riedit: forse ho trovato il modo per spegnere senza privilegi di root (http://ubuntrucchi.wordpress.com/2010/03/28/spegnere-e-riavviare-senza-permessi-amministrativi/), ma ancora non ho capito che comando viene eseguito quando si spegne il pc da interfaccia grafica. Sto tizio (http://old.nabble.com/Risolto%3A-Pulsante-Arresto-"spegnimento"-td12042751.html#a12042751) ha posto la tua stessa domanda, ma pare che nessuno gli abbia risposto... Chissà che non siano questi (http://ubuntrucchi.wordpress.com/2009/07/25/creare-un-lanciatore-per-spegnere-e-riavviare/)?

Damage92
30-06-2010, 11:06
Grande, hai trovato una soluzione, è nel penultimo ultimo link che hai postato! :D
In pratica quel comando invia il messaggio di shutdown ad hal attraverso d-bus.

Hal (Hardware abstraction layer) è un "software" che fa da interfaccia tra l'hardware e il software per permettere ai programmi di accedere facilmente alle risorse hardware. Per esempio da un pò lo usa Xorg, al posto del file xorg.conf viene chiesta la configurazione hardware ad Hal.

D-bus invece è un demone che permette a due processi di comunicare tra loro, scambiandosi messaggi (e comandi).

Il primo comando serve per chiedere ad hal di fare lo shutdown attraverso d-bus (si vede dall'ultima parola del comando). Hal gira con i privilegi di root, quindi può fare quello che vuole.

Dunque non ha molto senso impedire agli utenti di usare shutdown quando attraverso Hal possono chiedere lo shutdown :doh:
Penso che Gnome faccia proprio così...

p.s.: comunque uso Debian, quindi credo che Ubuntu-twik non vada molto bene :p