PDA

View Full Version : [C] Linux e root


aik
04-12-2005, 11:30
Salve a tutti, sto scrivendo un programma per linux che deve necessariamente girare con i permessi di root, su 3000 righe di codice però quelle dove sono necessari i permessi di super-utente sono solo una decina. (per settare la scheda di rete in modalità promiscua)
E' possibile acquisire i permessi di root durante l'esecuzione del programma chiedendo la password all'utente e poi rilasciarli quando non sono necessari?
Ho provato ad usare le libpam ma non mi permettono di cambiare utente...non so che pesci prendere !

ciao!

aik
04-12-2005, 19:23
up :muro:

DarkMic
04-12-2005, 22:21
puoi utilizzare il sudo. devi configurare il file /etc/sudoers

Per caso stai sviluppando un IDS (firewall)

aik
04-12-2005, 23:00
Come lo uso sudo?
Non voglio lanciare il programma da root...voglio lanciarlo da utente normale e chiedere la password di root solo per fare una parte del codice..

sottovento
05-12-2005, 07:54
Ciao,
non ti conviene creare un processo a parte per quel codice e settare lo sticky bit? Te la caveresti con un chmod solo sul processo in questione, senza dover usare l'utente di root, un po' come quando stampi....

ilsensine
05-12-2005, 09:08
Il modo più rapido è rendere il programma root suid (chmod +s). Un programma root suid parte con effective uid=0 (root), ma può cambiare id durante la sua esecuzione. Così puoi farlo girare come utente quando non ti servono i privilegi di root.

Innanzitutto all'inizio prendi nota dell'id dell'utente che lo avviato, e cambi id in quello dell'utente:

uid_t user_id = getuid();
if (geteuid())!=0) {
fprintf(stderr, "This program must be root suid\n");
exit(-1);
}
seteuid(user_id);
setegid(getgid());


Quindi riacquisisci i privilegi di root quando/se necessario:

seteuid(0);
execute_privileged_code();
seteuid(user_id);

Ci sono forse tecniche piu' sicure (pam, processo root suid esterno, demone di sistema, capability ecc). Un programma root suid è sempre un potenziale problema di sicurezza.