Puncte:4

Cum poate root începe un proces pe care numai root îl poate ucide?

drapel vn

Este ușor să începeți un proces în fundal sau să îl faceți ca systemd serviciu.

Cu toate acestea, dacă vreau să încep un proces care monitorizează activitățile pe mașina Linux, acesta cade în ținta atacurilor.Dacă orice utilizator dorește să facă ceva rău, mai întâi va ucide acest proces, chiar dacă doar este sudoers sau roată utilizatorii, prin simpla execuție ucide sau systemctl stop.

Există vreo modalitate de a aplica un proces numai rădăcină poate ucide?


Băieți, doar să mă gândesc la asta rsyslog serviciul poate fi ucis, ar trebui să recunoașteți cât de vulnerabil este cu adevărat Linux. Este ca și cum un pilot ar putea opri cutia neagră. O companie aeriană permite să se întâmple asta? Sau îi oferă pilotului o listă de permise pentru a-i împiedica să facă orice pentru a salva avionul? Desigur, pilotul poate prăbuși avionul, dar cutia neagră îl va înregistra.

Propunerea mea privind o listă de interdicție este legitimă din perspectiva securității, chiar dacă te poate speria. Deci nu încerca să dai vina pe tipul care a ridicat întrebarea, bine?

drapel cn
Comentariile nu sunt pentru discuții extinse; această conversație a fost [mutată în chat](https://chat.stackexchange.com/rooms/129511/discussion-on-question-by-george-y-how-can-root-start-a-process-that- numai-rădăcină-c).
Puncte:30
drapel za

Având privilegii nerestricționate sudo/wheel, oricine va putea anula orice ați făcut. Chiar dacă reușiți să realizați acest lucru prin eliminarea posibilității de a ucide direct procesul, de ex. cu sudo ucide, fie acest lucru ar putea fi încă ocolit utilizând alte comenzi sudoed, fie vă blocați și în afara administrării.

Întrebați-vă, de ce utilizatorii neîncrezători au, în primul rând, privilegii sudo nerestricționate? Nu ar trebui. Oferă astfel de privilegii doar celor în care ai încredere totală. Dacă există unele comenzi privilegiate care trebuie încă executate, activați sudo numai pentru acele comenzi:

+netmgr /usr/sbin/ifup, /usr/sbin/ifdown

(utilizare visudo -f /etc/sudoers.d/netmgr pentru a pune acest lucru în fișierul sudoers add-on).

În acest fel, puteți permite unui utilizator să ruleze doar sudo /usr/sbin/ifup și sudo /usr/sbin/ifdown, dar nu alte comenzi sudo. Există o mulțime de alte exemple, instrucțiuni și considerente de securitate man sudoers. Citește!

Auditul se face de obicei în alt mod. În special, ați configurat o alta mașină, configurați-și jurnalul de sistem pentru a accepta jurnalele de la stațiile la distanță. Pe mașina în cauză, configurați înregistrarea, astfel încât să trimită toate jurnalele în mașina de înregistrare, pe lângă stocarea locală. Chiar dacă cineva dezactivează această trimitere a jurnalului, acțiunea de dezactivare în sine va fi înregistrată, așa că cel puțin veți ști cine este vinovat.

George Y avatar
drapel vn
Din păcate, trebuie să le permit să folosească `kill` sau `systemctl stop` deoarece există unele aplicații care au nevoie de aceste privilegii pentru a-și face treaba. Am nevoie doar de un anumit program de monitorizare care să le refuze semnalul de oprire.
George Y avatar
drapel vn
Un alt exemplu este că adaug un declanșator în setarea `/etc/bashrc` - vreau să fie protejat, dar nu pot interzice rularea editorului ca `vim` sau `nano`.
Michael Hampton avatar
drapel cz
@GeorgeY Dacă cineva poate obține acces root, atunci vă poate ucide procesul. Dacă cineva _de fapt_ face asta și nu se va opri, atunci soluția nu este tehnică: trebuie să implicați managementul.
Nikita Kipriyanov avatar
drapel za
@GeorgeY, nu poți face ca un proces să nu fie ucis de root. Root este Dumnezeu, nu o poți dezactiva făcând ceva. Și sudo te face să rootezi eficient. Singurele soluții viabile, după cum văd, este să nu acordăm privilegii de root. Ceea ce am sugerat este să folosiți capacitățile încorporate ale sudo; dacă nu este suficient, trebuie să-ți inventezi propriul sudo. Scrieți o aplicație proxy pentru kill sau systemctl stop, care va filtra lucrurile care sunt interzise să ucidă, sau mai bine, care permit doar uciderea anumitor lucruri și așa mai departe. Trebuie să includeți *toate* lucrurile pe care doriți să le apeleze de către utilizatorii non-root.
Matthew Ife avatar
drapel jo
Dacă aveți root, puteți face un pas mai rău și puteți înlocui procesul menționat cu unul care raportează că totul este în regulă, dar vă permite să vă continuați activitățile nefaste.
George Y avatar
drapel vn
@Nikita Kipriyanov Bineînțeles că nu le voi acorda acces „rădăcină”, de fapt, le dau privilegii „roată”, dar totuși pot ucide orice proces indiferent. Ceea ce vreau este că nu pot ucide un anumit tip de procese, să zicem, inițiate de utilizatorul root sau un fișier în `/root`.
Nikita Kipriyanov avatar
drapel za
„rădăcină” și „roată” sunt exact același privilegiu divin. Suportă. Dacă nu vrei să le dai rădăcină, nu da roată. Perioadă.
drapel sa
@GeorgeY, deci ce îi împiedică să ruleze `sudo bash` și apoi să fie root?
raj avatar
drapel ye
raj
@GeorgeY Dacă doriți ca utilizatorul **care este efectiv root** să poată ucide orice proces, cu excepția unuia anume, sau să editeze orice fișier, cu excepția unuia anume, trebuie să vă proiectați propriul nucleu care are astfel de capacități :). Linux pur și simplu nu funcționează în acest fel, punct.
George Y avatar
drapel vn
@raj Deci, așa a deschis Linux calea către infracțiuni interne precum scurgerile de date? :)
drapel mt
@GeorgeY este trolling: aceeași problemă de privilegii există în Windows, cu detalii ușor diferite între ADMINISTRATOR/LOCALSYSTEM și administratorul domeniului, iar scurgerile de date se fac adesea fără escaladarea privilegiilor prin compromiterea aplicației web care are acces la date.
drapel mt
(A avea administrator de domeniu este și mai distractiv pentru că poți rula orice program pe orice computer din organizație!)
drapel mt
.. posibil ca solutia pe care o doriti este in cealalta directie? Dacă doriți să permiteți unui utilizator să ucidă numai anumite procese, identificați acele procese și faceți ca *le* să ruleze ca non-root? Sau rulați-le într-un container sau VM?
Nikita Kipriyanov avatar
drapel za
@pjc50 lucru amuzant aici este că autorul întrebării refuză cu încăpățânare să facă acest lucru, în ciuda faptului că asta îl sfătuiește toată lumea. În loc să urmeze modul Linux de a face lucrurile în Linux, el crede că aceasta este vina Linux-ului că nu funcționează așa cum a presupus el că trebuie să funcționeze.
Puncte:18
drapel in
bta

Nu poți da cuiva o putere și apoi să-l împiedici să o folosească. Trebuie să concentrezi îndeaproape puterea pe care le-o dai pentru a include doar ceea ce vrei ca ei să aibă.

Intr-un comentariu ai spus:

Trebuie să le permit să folosească ucide sau systemctl stop deoarece există unele aplicații care au nevoie de aceste privilegii isi fac treaba

Asta nu înseamnă acelea utilizatorii au nevoie de acces la acele comenzi, doar la acelea aplicatii. Utilizatorul are permisiuni limitate de rulare sudo ./someprogram și odată ce programul rulează ca root, poate folosi ucide, etc după cum este necesar. Cu toate acestea, utilizatorul nu are acces direct la acele comenzi interne.

În principiu, utilizatorii nu au nevoie de acces la comenzi, au nevoie de acces la funcţionalitate. Dacă ucide este prea riscant, blocați accesul la acesta și oferiți o altă modalitate mai sigură de a obține același rezultat. Poate creați un mic utilitar safekill care actioneaza ca ucide dar refuză cererile de a ucide anumite procese. Oferiți utilizatorilor dvs. acces sudo la safekill dar nu realul ucide. Dacă utilizatorii folosesc întotdeauna aceste comenzi pentru a face același lucru, încapsulați întregul proces într-un program mic și puneți-le să-l folosească în loc să o facă manual (de exemplu, ar rula sudo restart_webservers în loc să omorâți și să reporniți toate diferitele procese de server în mod individual). Utilizatorii dvs. au încă acces la funcționalitățile de care au nevoie, dar nu pot mânui armele periculoase direct.

Există un alt mecanism de aplicare mai extrem, care ar putea fi disponibil în funcție de configurația dvs. specială. Unele procesoare au cronometre de supraveghere disponibil. Modificați programul de monitorizare a activității pentru a porni watchdog-ul și a-l reseta la fiecare două secunde. Dacă cineva reușește să-ți omoare monitorul, timer-ul watchdog ar expira și sistemul se va reporni singur, relansând programul de monitor la pornire. Acest lucru nu ar împiedica strict dezactivarea monitorului, dar ar interzice oricui să facă ceva semnificativ după dezactivarea acestuia. Acest lucru va crea, de asemenea, semnale roșii frumoase în jurnalele de sistem. Majoritatea sistemelor cu watchdog vor raporta când a fost declanșată o anumită repornire de către watchdog. O repornire declanșată de watchdog care are loc în timp ce un utilizator a fost conectat la shell ar trebui să fie văzută ca foarte suspicios.

George Y avatar
drapel vn
Cred că sugestia dvs. este să definiți o „Lista albă” pe ceea ce pot face utilizatorii, alții decât `root`, mai degrabă decât nevoia mea inițială de ceea ce NU POT face. Aceasta este într-adevăr o plimbare, dar le-ar ușura prea mult datoria.
drapel in
„Nu poți da cuiva o putere și apoi să-l împiedici să o folosească” – sună ca familia regală britanică. Regina are puterea de a ordona execuții pentru oricine nu-i place, dar dacă ea folosește cu adevărat această putere, ea ar fi probabil destituită înainte ca orice execuție reală să aibă loc.
drapel in
bta
@GeorgeY Majoritatea administratorilor folosesc lista albă, da. De asemenea, puteți în mod eficient lista neagră anumite comenzi. Ceva de genul `baduser localhost = (baduser) /bin/kill` ar permite utilizatorului 'baduser' să ruleze kill doar ca propriul cont (nu ca root). Există mult mai multe informații și opțiuni avansate în `man sudoers`.
ilkkachu avatar
drapel us
@hanshenrik, ea? Aveti o sursa despre asta?
drapel cn
@ilkkachu: Ei bine, când Marea Britanie avea încă pedeapsa capitală, din punct de vedere tehnic, orice execuție ar fi făcută în numele ei (deoarece ea este întotdeauna reclamanta într-un dosar penal în Marea Britanie). Dar asta probabil că nu contează.
ilkkachu avatar
drapel us
@Kevin, da, desigur că referințele la Rege/Regină sau Coroană există ca formalisme acolo. Dar am avut impresia că Regatul Unit și alte țări din Commonwealth aveau până acum o legislație care interzice pedepsele extrajudiciare. (Și în cazul Angliei, conceptul vine de obicei cu referințe până la Magna Carta, acum aproximativ 800 de ani...) Și, deși au ceva asemănător cu puterea teoretică a Reginei de a reține semnarea proiectelor de lege în lege, aceasta este totuși puțin diferit de Regina care tocmai trecea peste legile deja aprobate de Rege/Regina. (Suveranitatea parlamentară și toate astea.)
George Y avatar
drapel vn
@hanshenrik Deci vrei să spui că soldații care se ocupă de rachete nucleare pot trage după propria voință? Întrebarea mea este echivalentă cu - un pilot poate face orice în avion, cu excepția opririi sau spargerii cutiei negre.
drapel mt
„definiți o „Lista albă” pe ceea ce pot face utilizatorii, alții decât root, mai degrabă decât nevoia mea inițială de ceea ce NU POT face” - acest lucru este, din păcate, obligatoriu în securitate, pentru că altfel oamenii continuă să găsească modalități de a folosi funcționalitatea pe care o au pentru a face lucrurile. nu vrei. În ceea ce privește armele nucleare din Marea Britanie, da sunt (se presupune) capabile de lansare independentă - și într-adevăr pentru asta sunt destinate, să fie lansate în cazul în care toată ierarhia de mai sus este deja moartă.
raj avatar
drapel ye
raj
@GeorgeY, dar majoritatea sistemelor de operare (nu numai Linux) sunt proiectate astfel încât să nu aibă niciun fel de „cutie neagră”. M-aș opune ferm ideii de a avea o „cutie neagră” pe care nu o pot controla într-un computer pe care îl dețin.
timuzhti avatar
drapel eg
@raj, poate că majoritatea sistemelor de operare nu pot avea o cutie neagră, dar majoritatea hardware-ului are în zilele noastre. Intel și AMD au un mic procesor în plus, iar controlul pe care îl aveți asupra acestuia este variat în funcție de ce caracteristici de gestionare sunt activate.
Lodinn avatar
drapel in
@GeorgeY Un pilot POATE opri un avion atât de mult cât permite fizica. Aceasta (și problema dvs. inițială) este mai degrabă una socială decât una tehnică. Întrebați-vă: de ce, deși având capacitatea tehnică de a face ceva rău, să spunem că un pilot nu ar veni practic niciodată să facă acest lucru; de ce utilizatorii tăi sunt diferiți? Dacă nu sunt, nu este o problemă, dacă sunt, ai o problemă care are puțin de-a face cu computerele și foarte mult cu oamenii. Nu acordați acces la lucruri în care nu aveți încredere utilizatorilor, mai ales dacă bănuiți răutate.
raj avatar
drapel ye
raj
@timuzhti Și asta deranjează pe mulți oameni, puteți vedea articole care își exprimă îngrijorarea față de acest lucru pe tot internetul, pentru că oamenii cu siguranță nu își doresc asta.
Puncte:10
drapel tn

Linux noob aici. Ați putea să vă gândiți să scrieți programe sau scripturi care fac doar ceea ce acești oameni sunt menționați să facă, apoi să le faceți proprietar de root și să le adăugați bit setuid? Desigur, o mare problemă este că s-ar putea să nu doriți ca alți oameni să execute aceste comenzi. Nu sunt sigur dacă puteți obține informațiile originale despre utilizator. Și, desigur, o grijă suplimentară este întotdeauna necesară cu setuid/setgid.

drapel sa
Programul *poate* obține informațiile originale despre utilizator. getuid() încă returnează utilizatorul original, aparent. Utilizatorul setuid este geteuid() ("UID efectiv")
Nikita Kipriyanov avatar
drapel za
De fapt, *aceasta* este calea obișnuită. *Acesta* este modul în care funcționează `sudo` în sine.
drapel do
JoL
„sau scripturi” -- Setuid nu funcționează pe scripturi. Ele trebuie să fie executabile binare.
Puncte:2
drapel cn

Dacă dați drept rădăcină unui utilizator liber, atunci utilizatorul ar putea ucide aproape orice. Pentru unele discuții aprofundate și posibile soluții, consultați: unix stack sigkill discuție.

Interesantă este și soluția watchdog menționată de @bta. Există de fapt un pachet software watchdog disponibil, care poate fi configurat pentru a monitoriza schimbarea fișierelor sau pentru a executa un script de utilizator. Cu toate acestea, pe majoritatea nucleelor ​​standard, acest watchdog poate fi oprit de utilizatorul root sau îi puteți modifica configurația. Dar alți utilizatori ar trebui să fie conștienți de acest lucru pentru a o evita. Vedea: https://linux.die.net/man/8/watchdog

Dar dacă nu trebuie să permiteți accesul root complet, dar le puteți gestiona accesul cu mecanismul sudo, atunci puteți seta unele comenzi cu argumente explicite pentru ca acestea să fie executate și să nu permiteți altceva decât drepturile lor implicite de utilizator.

De exemplu, puteți pune /bin/kill în /etc/sudoers fișier, dar permiteți doar argumente specifice.

bob ALL=(rădăcină) /bin/kill -sigTERM [1-9][0-9][0-9][0-9]

Acest lucru ar permite utilizatorului bob a executa /bin/kill, dar omorâți numai procesele cu un PID între 1000 și 9999. Dacă executați monitorul suficient de devreme, acesta va avea un PID scăzut și nu va putea fi ucis în acest fel. Utilizator bob s-ar putea încurca în continuare cu tine ucigându-ți propriile procese de utilizator, desigur... și, cu împachetarea PID, acest lucru poate să nu fie prea util oricum.

Este posibil să scadă anumite opțiuni dintr-un set complet. De exemplu, ucideți toate PID-urile nenegative, dar nu permiteți semnalizarea unui PID care conține 1337 și nu permiteți -1 uciderea.

bob ALL=(rădăcină) /bin/kill -sigTERM *,!/bin/kill *1337*,!bin/kill *-1*

Dar asta ar fi puțin ciudat și ai fi fost foarte sigur că programul nu-și înglobează intrările. Procps kill nu face parte din câte văd, dar acest exemplu ar permite totuși uciderea unui proces cu pid 1337 dacă a făcut parte dintr-un grup de procese al cărui lider nu era. Deci, acest lucru arată cât de dificil este să lucrezi cu negative sau liste negre.

Opțiune mai bună, permiteți doar să ucideți anumite procese după nume

bob ALL=(rădăcină) /usr/bin/pkill -sigTERM -f namedprocess

Sau doar reporniți un anumit serviciu

bob ALL=(rădăcină) /bin/systemctl reporniți a-service

Utilizatorul poate vizualiza comenzile sudo disponibile cu sudo -l

Este important dacă permiteți anumitor programe să le specifice calea completă. Și, de asemenea, utilizatorul nu trebuie să aibă drepturi de deconectare sau de editare pe acel program sau ar putea fi înlocuit cu altceva.

Nikita Kipriyanov avatar
drapel za
Restricția pid este inutilă. Sistemul care rulează suficient de mult va avea pid-uri împachetate, deci va avea atât procese utilizator, cât și procese de sistem cu orice pid-uri, fără distribuție aparentă. Cu siguranță nu va exista nicio modalitate de a exprima un set de pid-uri care trebuie să fie imposibil de ucis.
George Y avatar
drapel vn
Exact, buclele pid în intervalul 0 ~ 2^16-1=65535.
Nikita Kipriyanov avatar
drapel za
PID_MAX este 32767 în mod implicit, dar poate fi ajustat până la 2²²-1, consultați http://web.archive.org/web/20111209081734/http://research.cs.wisc.edu/condor/condorg/linux_scalability. html . Valoarea implicită este atât de mică pentru a nu sparge software-ul vechi.
Puncte:0
drapel vn

Am venit cu A Start!

rădăcină poate seta un SHELL DEFAULT pentru un utilizator ca acesta:

useradd [un utilizator] -s [un anumit executabil]

Atunci, dacă un anumit executabil = Un script de cenzură care:

  1. Cenzurează automat anumite comenzi pentru a fi executate. Ca Stop & rsyslog combinate.

  2. comenzile bans pentru a scăpa de acest shell și pentru a utiliza un altul chiar și originalul bash

  3. interzice comenzile pentru a împiedica utilizatorul să obțină rolul rădăcină ca ceea ce @user253751 a menționat mai sus.

  4. Transmiteți restul comenzilor către /bin/bash

Apoi doar setează-l r+x pentru orice utilizator.

Orice sugestie este apreciată sub acest răspuns. Mai ales pentru 2 & 3 par diverse mijloace.


Bash va încărca setările în /etc/profile și /etc/bashrc primul. Am observat că ultimele se referă la PROMPT_COMMAND variabil. Este posibil să deturnați acest lucru la ultima linie a acestuia pentru a adăuga în scriptul de cenzură, dar este necesar un nume de utilizator de exceptare pentru unele sisteme, deoarece în mod implicit nimeni nu are privilegiul de root pentru a-l schimba înapoi.

O cenzură completă care satisface 4+1 de mai sus va fi marcată ca răspuns legitim.

Nu voi marca niciodată un răspuns „vei să renunți” ca fiind legitim.

întrebările conexe sunt:

Cum pot înregistra comenzile bash ale utilizatorilor?

Cum pot face bash to log comenzi shell la syslog?

Conectați-vă fără a rula bash_profile sau bashrc

drapel mt
Scenariul de cenzură este o idee bună; puteți face acest lucru și prin sudo, astfel încât utilizatorii au bash normal atunci când nu sunt privilegiați, dar rulați „sudo censorscript” pentru al rula. Problema este să te asiguri că ai prins absolut toate modurile în care oamenii se pot strecura prin ea. De exemplu, nu le puteți lăsa să ruleze emacs sau vi, deoarece acestea pot porni shell-uri. Prin urmare, este mai ușor să treceți pe lista albă.
Gerrit avatar
drapel cn
Singurul executabil de cenzor viabil care rulează ca root ar fi un meniu precum o listă albă de acțiuni. Apăsați 1 pentru a opri serviciul A, apăsați 2 pentru a opri serviciul B. Orice altă abordare ar oferi întotdeauna modalități de a se strecura. Și chiar și atunci ar trebui să fie compilat static și să ia tot felul de măsuri de precauție pentru a izola în raport cu mediul în care a pornit. Mai bine să nu reinventezi roata și să folosești utilități precum sudo care au multă experiență în această linie. de acțiune.
Nikita Kipriyanov avatar
drapel za
Trebuie să fii atent la multe lucruri, cum ar fi evadările de obuz și așa mai departe. Și „scriptul de cenzură” nu ar putea fi de fapt un scenariu. Linux permite setarea setuid/setgid numai pentru binare, nu pentru scripturi, astfel încât scriptul dumneavoastră nu a putut fi pornit privilegiat de un utilizator neprivilegiat.Și, aș reformula @Gerrit, mai bine construiește o listă de comenzi complete permise (fără substituenți) și asta va fi protecția ta, pentru că va fi imposibil de ocolit.
Nikita Kipriyanov avatar
drapel za
De asemenea, observați, ceea ce ajungeți este versiunea ad-hoc a `sudo`. Așa că mai bine citiți manualul sudo și ajustați-i configurația decât să vă inventați propriul sudo.
George Y avatar
drapel vn
@pjc50 Vă mulțumim că ați subliniat mijloacele de atac lateral prin „vi” și „vim”. Dar mă îndoiesc că pot sparge închisoarea shell-ului, deoarece `vi` și `vim` pot trimite doar o linie de comenzi către shell-ul curent, la fel cu `htop` și alte aplicații.
drapel ca
Trebuie doar să știți că această metodă se destramă de îndată ce permiteți orice fel de scriere în fișiere arbitrare ca root (chiar și doar redirecționarea de intrare este suficientă). Utilizatorul poate rescrie un fișier executabil arbitrar și poate rula orice dorește. (orice altceva decât o listă albă de comenzi va avea probleme similare)

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.