La gestione dei cgroup richiede l'accesso alla radice?


12

Sto cercando di lavorare con gruppi di controllo su due diversi sistemi operativi (Ubuntu e CentOS). Ci sono alcune preoccupazioni che vorrei porre.

Sto cercando di creare un gruppo di controllo utilizzando il cgcreatecomando e sembra che richieda l'accesso come root sulla macchina. Tutti gli esempi che ho visto finora non dicono nulla sulla necessità di essere l'utente root per la creazione o la modifica di gruppi di controllo.

È davvero necessario essere l'utente root? L'obiettivo finale è scrivere un'applicazione C ++ che crei e gestisca gruppi di controllo per controllare le risorse usando l'API libcgroup. Ma l'applicazione C ++ non verrà eseguita da nessun utente root. Potrebbe essere un normale utente.


1
wiki.archlinux.org/index.php/Cgroups ha alcune informazioni, apparentemente avrai bisogno di un po 'di installazione da parte di root (non ho ancora analizzato in dettaglio i cgroups).
Mat

Quel sito Web non aiuta con i dettagli però. È solo una panoramica di alto livello.
Rambo,

1
Bene, ti dice che root può impostare gruppi gestibili da utenti non root.
Mat

Ho esaminato ampiamente i cgroups qualche tempo fa; tali informazioni potrebbero esserti utili. Comunque stavo facendo tutto come root, quindi non ho la risposta a questa particolare domanda.
Wildcard il

Potresti creare un gruppo "editcgroup", quindi consentire a tutti i membri di quel gruppo di fare "sudo cgcreate" e "sudo cgdelete"
John Militer,

Risposte:


4

Lo scenario è normale che si imposta cgcreate, cgset, cgdelete, cgget, ecc come radice . Alla fine, il programma / script destinato a essere trattenuto dall'assorbimento di molte risorse verrà eseguito come un normale utente. Quindi, installa come root, usa ed esegui come utente.

Questo viene fatto con i parametri -ae -tdel cgcreatecomando (eseguito come root). Quindi già quando si imposta un gruppo. Nel mio caso:

cgcreate -t ​​monero: monero -a monero: monero -g memory, cpu: monerogroup

dove monero è il nome utente del futuro utente che eseguirà ed eseguirà il programma con le restrizioni del cgroup. Per la fine differenza tra il -ae i -tsottoparametri fare riferimento alle pagine man di cgcreate.

man cgcreate

Nella maggior parte dei casi è lo stesso utente.

Quindi, imposta le restrizioni (sempre come root):

cgset -r memory.limit_in_bytes = $ ((4 * 1024 * 1024 * 1024)) monerogroup

cgset -r cpu.shares = 128 monerogroup

Controlla le voci se desideri:

cgget -g memory: / monerogroup | byte grep

E poi alla fine cambia utente, nel mio caso monero utente, e dalla cartella giusta:

cgexec -g memory, cpu: monerogroup ./monerod

L'utente non avrà alcuna difficoltà con le autorizzazioni o giù di lì mentre lo configuri appositamente per lui.


2

A parte le implicazioni di sicurezza di questo, puoi impostare il setuidbit

chmod +s /bin/cgcreate
chmod +s /bin/cgdelete

per dare agli utenti non root che eseguono quel potere di root del programma.

La raccomandazione sarebbe quella di rimuovere il normale accesso dell'utente

chmod 550 /bin/cgcreate
chmod 550 /bin/cgdelete

e crea un gruppo speciale che desideri consentire a cgcreate IE cgusers,

groupadd cgusers

e modifica l'appartenenza al gruppo su quei file in quel gruppo:

chgrp cgusers /bin/cgcreate
chgrp cgusers /bin/cgdelete

Tutto ciò verrebbe eseguito da root, dopo che tutti gli utenti del cgusersgruppo verranno eseguiti cgcreatee cgdeletecome root anziché come se stessi. Avresti solo bisogno di avere membri che vorresti avere questo potere nel giusto gruppo.


1

I cgroup vengono infine gestiti tramite i filesystem cgroup. La capacità di creare cgroups dovrebbe essere semplicemente la capacità di creare directory sotto quello / loro e scrivere su file. Se monti gli FS di cgroup con permessi più elaborati, o se cambi i loro permessi al volo, alcuni utenti dovrebbero essere in grado di fare cose. Ovviamente non sarai in grado di aggiungere gli ID di processo del processo di altri utenti al file delle attività. Sarai solo in grado di aggiungere il tuo utente.

Detto questo, non sono sicuro che quanto sopra sia globale. Cioè c'è la possibilità che alcuni cgroups non lo supportino.

Nel complesso, l'approccio migliore consiste nell'utilizzare un gestore cgroup che può essere incaricato di associare le attività a un cgroup. Credo che cgmanager faccia qualcosa del genere.


1

La risposta breve è no.

Per la creazione e l'assegnazione della proprietà di un cgroup, si dipende dai privilegi di root. Non esiste un modo affidabile per aggirarlo.

Tuttavia, è possibile creare un cgroup e assegnare la proprietà a un determinato utente o gruppo.

Utente

$ u=$(whoami)
$ sudo mkdir /sys/fs/cgroup/cpuset/${u}
$ sudo chown -R ${u}: /sys/fs/cgroup/cpuset/${u}

Gruppo

$ g=MYGROUP && grep ^${g}: /etc/group || echo "Your group doesn't exist. Run \"mkgroup $g\" and repeat this command before you continue." 
$ sudo mkdir /sys/fs/cgroup/cpuset/${g}
$ sudo chgrp -R ${g} /sys/fs/cgroup/cpuset/${g}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.