Filbehörigheter i Linux

Hej allesammans. Vi integrerar oss aktivt i arbetet och förbereder redan mÄnga kraftfulla lanseringar i januari. Bland annat har vi utlyst ett nytt program av den populÀra kursen. «Linuxadministratör». I samband med lanseringen delar vi traditionellt med oss av en översÀttning av anvÀndbart material.

Filbehörigheter i Linux

Filbehörigheter erbjuder ett sÀkert alternativ till SUID-exekverbara filer, men kan vid första anblicken verka nÄgot förvirrande.


Vi vet alla att binÀra filer SUID Àr en dÄlig lösning ur ett sÀkerhetsperspektiv. Lyckligtvis, om din applikation krÀver vissa begrÀnsade privilegier, finns det ett mer effektivt sÀtt, kallat filbehörigheter.

Jag sparar tid för dig om du vill undvika att noggrant lÀsa artikeln ovan: i grunden tillÄter filbehörigheter processer som körs av root-anvÀndaren och dÀrmed har rÀtt att göra nÄgot, att behÄlla vissa möjligheter, begrÀnsade till denna lista, nÀr de avsÀger sig privilegier och körs som en icke-privilegierad anvÀndare. Detta innebÀr att om en angripare lyckas kompromettera en process genom en buffertöverföring eller annan sÄrbarhet, sÄ kan de inte utnyttja nÄgot annat Àn de specifika minimala privilegier som verkligen behövs för processen.

Behörigheter Àr utmÀrkta för tjÀnster som vanligtvis alltid körs som root-anvÀndare, men hur Àr det med kommandoradsverktyg? Lyckligtvis stöds det ocksÄ sÄ lÀnge du har de rÀtta verktygen installerade. Om du anvÀnder Ubuntu, behöver du till exempel paketet libcap2-bin. Du mÄste ocksÄ köra en icke-Älderdomlig kÀrna (frÄn och med version 2.6.24).

Dessa funktioner möjliggör koppling av behörigheter till exekverbara filer pÄ samma sÀtt som att stÀlla in SUID-bit, men endast för en specifik uppsÀttning behörigheter. Verktyget setcap anvÀnds för att lÀgga till och ta bort behörigheter frÄn en fil.

Det första steget Àr att vÀlja de behörigheter du behöver. För denna artikel antar jag att det finns ett nÀtverksdiagnosverktyg som kallas tracewalk, som bör kunna anvÀnda rÄa sockets. Vanligtvis krÀvs det att applikationen körs som root-anvÀndare, men nÀr man granskar listan det visar sig att endast behörighet krÀvs CAP_NET_RAW.

Förutsatt att du befinner dig i katalogen dÀr den körbara filen ligger tracewalk, kan du lÀgga till denna behörighet pÄ följande sÀtt:

sudo setcap cap_net_raw=eip tracewalk

Ignorera för tillfÀllet suffixet =eip för behörigheten, jag kommer att förklara detta om en sekund. Observera att namnet pÄ behörigheten Àr i smÄ bokstÀver. Nu kan du kontrollera om du har konfigurerat behörigheterna korrekt med:

setcap -v cap_new_raw=eip tracewalk

Eller sÄ kan du lista alla behörigheter som har stÀllts in för den angivna körbara filen:

getcap tracewalk

För information kan du ocksÄ ta bort alla behörigheter frÄn den körbara filen med:

setcap -r tracewalk

Vid det hÀr laget bör du kunna köra den körbara filen som en icke-privilegierad anvÀndare, och den bör kunna arbeta med rÄa sockets, men utan nÄgra andra privilegier som root-anvÀndaren har.

SĂ„ vad betyder detta konstiga suffix =eip? Đ—ĐŽĐ”ŃŃŒ ĐżĐŸŃ‚Ń€Đ”Đ±ŃƒĐ”Ń‚ŃŃ Ń‚ĐŸĐ»ĐžĐșа ĐżĐŸĐœĐžĐŒĐ°ĐœĐžŃ ĐżŃ€ĐžŃ€ĐŸĐŽŃ‹ Ń€Đ°Đ·Ń€Đ”ŃˆĐ”ĐœĐžĐč. КажЎыĐč ĐżŃ€ĐŸŃ†Đ”ŃŃ ĐžĐŒĐ”Đ”Ń‚ тро ĐœĐ°Đ±ĐŸŃ€Đ° Ń€Đ°Đ·Ń€Đ”ŃˆĐ”ĐœĐžĐč — effektiva, Ă€rvda och tillĂ„tna (effective, inheritable och permitted):

  • Effektiva (Effective) behörigheter Ă€r de som definierar vad processen faktiskt kan göra. Till exempel kan den inte interagera med rĂ„a sockets om CAP_NET_RAW det inte finns i den effektiva uppsĂ€ttningen.
  • TillĂ„tna (Permitted) behörigheter Ă€r de som en process har tillstĂ„nd att ha, om den begĂ€r dem med hjĂ€lp av det relevanta anropet. De tillĂ„ter inte att processen faktiskt gör nĂ„got, om den inte har skrivits specifikt för att begĂ€ra den angivna behörigheten. Detta möjliggör för processer att lĂ€gga till sĂ€rskilt viktiga behörigheter till den effektiva uppsĂ€ttningen endast under den tidsperiod de faktiskt behövs.
  • Ärvda (Inheritable) behörigheter Ă€r de som kan Ă€rvas i den tillĂ„tna uppsĂ€ttningen av den avkommande processen. Under operationen fork() eller clone() fĂ„r den avkommande processen alltid en kopia av behörigheterna frĂ„n den överordnade processen, eftersom den vid denna tidpunkt fortfarande kör samma körbara fil. Den Ă€rvda uppsĂ€ttningen anvĂ€nds nĂ€r exec() (eller motsvarande) anropas för att byta ut den körbara filen mot en annan. Vid detta tillfĂ€lle maskeras den tillĂ„tna uppsĂ€ttningen för processen av den Ă€rvda uppsĂ€ttningen för att fĂ„ den tillĂ„tna uppsĂ€ttning som ska anvĂ€ndas för den nya processen.

SÄledes Àr verktyget setcap möjliggör för oss att lÀgga till behörigheterna för dessa tre uppsÀttningar oberoende för den angivna körfilen. Observera att gruppens vÀrde tolkas nÄgot annorlunda för filbehörigheter:

  • TillgĂ€ngliga filbehörigheter Ă€r de som alltid Ă€r tillgĂ€ngliga för körfilen, Ă€ven om den överordnade processen som anropade den inte hade dem. De kallades tidigare "tvingande" behörigheter.
  • Ärvda filbehörigheterna definierar en extra mask som ocksĂ„ kan anvĂ€ndas för att ta bort behörigheter frĂ„n den anropande processens uppsĂ€ttning. De tillĂ€mpas ovanpĂ„ den överordnade uppsĂ€ttningen frĂ„n den anropande processen, sĂ„ behörigheten Ă€rver bara om den finns i bĂ„da uppsĂ€ttningarna.
  • Effektiva filbehörigheter Ă€r faktiskt bara en bit, inte en uppsĂ€ttning, och om den Ă€r instĂ€lld betyder det att hela den tillgĂ€ngliga uppsĂ€ttningen ocksĂ„ kopieras till den effektiva uppsĂ€ttningen för den nya processen. Detta kan anvĂ€ndas för att lĂ€gga till behörigheter till processer som inte specifikt Ă€r skrivna för att begĂ€ra dem. Eftersom detta Ă€r en bit, om du stĂ€ller in den för nĂ„gon behörighet, mĂ„ste den stĂ€llas in för alla behörigheter. Du kan tĂ€nka pĂ„ den som en legacy-bit eftersom den anvĂ€nds för att tillĂ„ta anvĂ€ndning av behörigheter för applikationer som inte stöder dem.

NÀr behörigheter anges via setcap tre bokstÀver e, i och p syftar pÄ effektiv, Àrvd och tillgÀnglig uppsÀttningar respektive. SÄ den tidigare specifikationen:

sudo setcap cap_net_raw=eip tracewalk

... anger att behörigheten CAP_NET_RAW mÄste lÀggas till de tillgÀngliga och Àrvda uppsÀttningarna och att Àven den effektiva biten bör stÀllas in. Detta kommer att ersÀtta eventuella tidigare instÀllda behörigheter i filen. För att stÀlla in flera behörigheter samtidigt, anvÀnd en lista genom kommatecken:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Guide till behörigheter diskuterar allt detta mer ingÄende, men förhoppningsvis har detta inlÀgg avmystifierat vad som pÄgÄr nÄgot. Det ÄterstÄr bara att nÀmna nÄgra varningar och fÀllor.

För det första fungerar inte filbehörigheterna med symlĂ€nkar – du mĂ„ste tillĂ€mpa dem pĂ„ den sjĂ€lva binĂ€ra filen (dvs. mĂ„let för symlĂ€nken).

För det andra fungerar de inte med tolkade skript. Om du till exempel har ett Python-skript som du vill ge behörighet, mÄste du ge det till Python-tolken sjÀlv. Det Àr uppenbart att detta Àr ett potentiellt sÀkerhetsproblem, eftersom dÄ alla skript som körs med denna tolk kommer att ha den angivna behörigheten, Àven om det fortfarande Àr betydligt bÀttre Àn att anvÀnda SUID. Den vanligaste arbetsvÀgen verkar vara att skriva en separat körbar fil i C eller en liknande, som kan utföra de nödvÀndiga operationerna och anropas frÄn skriptet. Detta liknar den metod som anvÀnds av Wireshark, som anvÀnder en binÀr fil. /usr/bin/dumpcap för att utföra privilegierade operationer:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

För det tredje inaktiveras filbehörigheter om du anvÀnder en miljövariabel LD_LIBRARY_PATH av uppenbara sÀkerhetsskÀl(1). Detsamma gÀller för LD_PRELOAD, sÄvitt jag vet.

1. Eftersom en angripare uppenbarligen kan byta ut ett av de standardbibliotek som anvÀnds och anvÀnda LD_LIBRARY_PATH, för att fÄ sitt bibliotek att anropas i stÀllet för systemet, och dÀrmed fÄ sin egen godtyckliga kod att köras med samma privilegier som det anropande programmet.

Det Àr allt. Mer information om kursprogrammet kan fÄs pÄ webbinariet som Àger rum den 24 januari.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster