Puncte:2

Există ceva ca evenimente în Ubuntu?

drapel in

Aș dori să știu dacă Ubuntu are ceva de genul evenimentelor. Trebuie să conduc un job Jenkins, dar Jenkins nu are privilegii sudo și nu vreau să i-o dau. Dar munca trebuie să ruleze unele acțiuni care necesită privilegii sudo. Soluția ar putea fi declanșarea unui eveniment care va asculta ca utilizator root și acest eveniment ar rula codul cu privilegii sudo. Poate că sunt încă confuz de privilegii, dar acest lucru ar putea fi foarte util, cred. Sau ceva de genul interfață publică de utilizator root, care va fi disponibilă pentru alți utilizatori, dar va rula ca utilizator root. Ca

root->doSomethingAsRoot()

Sper că înțelegi ce vreau să obțin. Multumesc pentru ajutor.

PS Această întrebare este legată de această problemă

muru avatar
drapel us
Sigur, multe lucruri folosesc D-Bus pentru aceasta, de exemplu, interfața grafică a managerului de rețea și instrumentele de linie de comandă comunică prin D-Bus cu demonul manager de rețea, care rulează ca root.
drapel in
Multumesc o sa ma uit.
drapel in
Hmm, caut informații despre D-bus, dar nu sunt sigur dacă poate rula script sub utilizatorul root, care va fi declanșat cu un alt utilizator.
raj avatar
drapel cn
raj
Nu poți să îi oferi lui Jenkins privilegii sudo **pentru acel script special pe care vrei să-l rulezi**? Sudo nu este o soluție „totul sau nimic” - exact opus, puteți specifica foarte detaliat, ce utilizator poate rula ce.
drapel in
Fluxul arată ca și cum Jenkins rulează git clone. Git repo conține scriptul bash pe care Jenkins îl rulează. Și scriptul rulează `rm -rf` la sfârșit. Și aceasta este problema pentru care trebuie să șterg fișierele cu permisiuni 644 de utilizator diferit (www-data). Soluția ar putea fi dacă reușesc să forțez www-data (Laravel) să creeze fișiere cu 664 de privilegii.
drapel in
Cum pot adăuga privilegii sudo la scriptul pentru Jenkins? Jenkins putea rescrie scenariul și apoi face orice. Știu că sudo poate fi delegat la comandă, nu la script. Dar în acest caz comanda este rm, ceea ce este puțin periculos.
raj avatar
drapel cn
raj
@Äamo De asemenea, puteți restricționa dreptul sudo la o comandă **cu anumiți parametri**. Deci, dacă scriptul ar trebui, de exemplu, să ruleze `sudo rm -rf /some/path`, puteți acorda lui Jenkins permisiunile numai pentru a rula `rm -rf /some/path`. Desigur, acest lucru nu este complet predispus la încercări de a rezolva problema și de a elimina un alt director, dar acest lucru nu este doar simplu. Cu toate acestea, în acest caz, cred că cea mai sigură abordare este să rulați un binar setuid care rulează o comandă codificată `rm -rf /some/path`.
drapel in
Poate fi folosit scriptul python sau php ca „binar setuid”? (desigur că nu) Mă înnebunește...
drapel in
O am. Am făcut un script bash fără sfârșit care rulează ca rădăcină pe fundal, care șterge directoarele la fiecare 10 secunde. https://stackoverflow.com/questions/68003861/how-to-set-laravel-to-generate-files-with-required-permissions
raj avatar
drapel cn
raj
Ți-ai rezolvat deja problema într-un alt mod (și poate una mai bună, dacă ar fi nevoie doar de schimbarea permisiunilor), dar încă nu înțeleg care este problema ta cu binary wrapper în jurul unui script pentru a-l rula ca root. Pur și simplu rulați wrapper-ul în loc de script. Puteți încă modifica scriptul după cum doriți și să faceți tot ce doriți cu el. Și dacă doriți să rulați o singură comandă (`rm`) ca rădăcină, creați wrapper-ul numai în jurul acelei comenzi și rulați acel wrapper în loc de `rm` direct. E foarte simplu. Care este problema ta cu el?
Puncte:1
drapel cn
raj

Dacă acțiunile care trebuie executate ca root pot fi separate în procese/script-uri separate, atunci puteți rula aceste procese ca root setuid. Este un instrument foarte la îndemână care, după părerea mea, este folosit mult prea rar.

Ce sunt procesele setuid? Uită-te, de exemplu, la passwd comanda. Poate fi rulat de orice utilizator, dar trebuie să fie rulat ca root, deoarece trebuie să modifice parola stocată într-un fișier pe care numai root îl poate accesa (/etc/shadow).

Cum se face? Uită-te la permisiunile /usr/bin/passwd binar:

-rwsr-xr-x 1 root root 68208 maj 28 2020 /usr/bin/passwd

„s” în loc de „x” din câmpul proprietar indică faptul că acest binar va fi rulat cu drepturile proprietarului său - adică root.

În acest fel fiecare binar poate fi făcut să ruleze ca root (sau orice alt utilizator), independent de cine îl apelează.

Cu toate acestea, pe scenarii bitul setuid este ignorat din motive de securitate. Deci pentru a rula a scenariu ca root trebuie să folosiți a înveliș binar care va apela scenariul din interior. Puteți utiliza următorul program simplu C pentru a crea un astfel de wrapper:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
   int rc;
   setuid(0);
   rc=WEXITSTATUS(sistem("/calea/la/scriptul/dvs." ));
   ieșire(rc);
}

Compilați programul și faceți rădăcina setuid executabil (presupunând că executabilul este numit învelitoare, face sudo chown root:root wrapper urmat de sudo chmod o+s wrapper).

BTW. Scriptul care este rulat din interiorul wrapper-ului nu trebuie să fie setuid; doar ambalajul trebuie.

Editați | ×: din explicația dvs. din comentarii se pare că doriți să rulați un anumit rm -rf /unele/cale comandă ca root și sunt preocupați să nu eliminați accidental nimic altceva. În acest caz, sugerez doar înlocuirea /calea/la/scriptul/dvs parte în programul wrapper de mai sus prin această comandă rm -rf /unele/cale, și doar rulați învelitoare binar din scriptul dvs. în locul în care ați rula rm -rf /unele/cale comanda. Aceasta pare a fi cea mai sigură abordare.

drapel in
Nu inteleg. Ar trebui să existe ceva mai puțin complicat. De ce fișierele S nu sunt executabile direct, dar din wrapper sunt? Nu are sens.
raj avatar
drapel cn
raj
@Äamo Numai pe **binare** bitul **s** este eficient. Pentru **scripturi** nu este eficient, deoarece în spate există implicații grave de securitate. Prin urmare, scripturile trebuie să fie rulate dintr-un **binar** setuid. Binarul are deja drepturi root (pentru că este setuid), așa că atunci când execută un script, scriptul moștenește aceste drepturi. BTW. Scriptul rulat din interiorul wrapper-ului nu trebuie să aibă bitul **s** setat. Doar ambalajul trebuie.
drapel in
Acesta este motivul pentru care oamenii nu îl folosesc. Există ceva de genul evenimentelor în Linux? Ceva care va asculta ca root și va face ceva acțiune ca root?
raj avatar
drapel cn
raj
@Äam folosind socketuri, puteți oricând să scrieți o aplicație client-server care va asculta datele primite pe un socket și va efectua orice acțiune asupra datelor respective. Ambele părți ale unui socket pot rula sub utilizatori diferiți și acesta este un mecanism standard utilizat de multe aplicații pentru separarea privilegiilor. Dacă utilizați, de exemplu, client MySQL (neprivilegiat) pentru a cere serverului MySQL (privilegiat) să acceseze o bază de date, utilizați exact acest lucru. Cu toate acestea, este cu siguranță mai greu să programați socket-uri decât să apelați un binar setuid :) Probabil că puteți utiliza și conductele numite într-un mod similar.
drapel in
Cum se numesc conductele? Se pare că este imposibil pentru mine.
raj avatar
drapel cn
raj
@Äamo dacă rulați o comandă precum `mknod /tmp/mypipe p` și acordați permisiunile corespunzătoare ambilor utilizatori pentru `/tmp/mypipe`, procesele care rulează pe diferiți utilizatori pot comunica de ex. unul scriind în `/tmp/mypipe`, iar celălalt citind din `/tmp/mypipe`. Este ca o conductă obișnuită `|`, dar permite ca ambele procese să fie rulate independent. Dar nu cred că acest lucru va fi deosebit de util în cazul tău.
marko avatar
drapel tw
Dacă vă aflați într-un mediu grafic, cum ar fi X11, puteți invoca `pkexec` din script, având următoarele ca primă linie în script: `#!/usr/bin/pkexec /bin/bash` apoi restul din acesta rulează ca root/admin.Utilizatorului i se va solicita parola root atunci când se rulează scriptul.
drapel in
O am. Am făcut un script fără sfârșit care rulează ca root pe fundal și șterge directorul la fiecare 10 secunde. Poate să nu fie atât de cool, dar funcționează ca un farmec. https://stackoverflow.com/questions/68003861/how-to-set-laravel-to-generate-files-with-required-permissions
drapel in
Soluția finală este să folosiți setfacl pentru directorul părinte.
Puncte:0
drapel in

Soluția mea directă este să rulez un script de fundal nesfârșit ca root, care găsește și șterge directoarele necesare la fiecare 10 secunde. Funcționează ca nohup, așa că funcționează în continuare, deși închid terminalul.

în timp ce adevărat
do
  găsiți /var/www -maxdepth 1 -type d -name 'deploy-old-*' -exec rm -rf {} \;
  dormi 10
Terminat
Puncte:0
drapel in

Soluția finală pentru această problemă în care Laravel generează fișierele cu chmod 644 este configurarea privilegiilor ACL pentru directorul părinte prin setfacl.

setfacl -R -dm "g:www-data:rw" $www_new_app_dir/storage 

unde toate fișierele generate vor moșteni setările acl din directorul părinte. În acest caz, rw pentru www-data group.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.