Bestandstoegang in Linux

Hallo iedereen. We zijn actief aan de slag en in januari bereiden we veel krachtige lanceringen voor. Onder andere, is de inschrijving geopend voor een nieuwe ronde van de geliefde cursus. ‘Linux Beheerder’In de aanloop naar de lancering delen we traditiegetrouw een vertaling van nuttig materiaal.

Bestandstoegang in Linux

Bestandspermissies bieden een veilig alternatief voor uitvoerbare SUID-bestanden, maar kunnen aanvankelijk wat verwarrend lijken.


Iedereen weet dat binaire bestanden SUID zijn een slechte keuze vanuit veiligheidsoptiek.Gelukkig, als uw applicatie bepaalde beperkte privileges nodig heeft, is er een effectievere manier, genaamd bestandspermissies..

Ik bespaar u wat tijd als u een gedetailleerde lezing van het bovenstaande artikel wilt vermijden: in wezen stellen bestandspermissies processen die worden uitgevoerd onder de root-gebruiker, en die dus recht hebben om iets te doen, in staat om bepaalde mogelijkheden te behouden, beperkt tot deze lijst,wanneer ze privileges afstaan en worden uitgevoerd als een niet-geprivilegieerde gebruiker. Dit betekent dat als een aanvaller erin slaagt om een proces te compromitteren via een bufferoverloop of een andere exploit, ze niets kunnen gebruiken behalve bepaalde minimale privileges die werkelijk nodig zijn voor het proces.

Permissies zijn geweldig voor diensten die meestal altijd als root-gebruiker worden uitgevoerd, maar hoe zit het met commandoregelhulpmiddelen? Gelukkig wordt dit ook ondersteund, op voorwaarde dat u de juiste hulpprogramma's hebt geïnstalleerd. Als u Ubuntu gebruikt, heeft u bijvoorbeeld het pakket libcap2-binnodig. U moet ook een niet-archeologisch kernel draaien (beginnende vanaf versie 2.6.24).

Deze functies stellen u in staat om permissies aan uitvoerbare bestanden te koppelen, vergelijkbaar met het instellen van de SUID-bit, maar alleen voor een bepaalde set permissies. Het hulpprogramma setcap wordt gebruikt om permissies aan een bestand toe te voegen of van een bestand te verwijderen.

De eerste stap is om de benodigde permissies te kiezen. Voor dit artikel neem ik aan dat er een netwerkdiagnosehulpmiddel is genaamd tracewalk,dat in staat moet zijn om onafgebroken socketste gebruiken. Gewoonlijk is hiervoor nodig dat de applicatie wordt uitgevoerd als root-gebruiker, maar bij het bekijken van de lijst blijkt dat alleen de permissie vereist is CAP_NET_RAW..

Aannemende dat je je in de目录 bevindt waar het binaire bestand zich bevindt tracewalk,, kun je de volgende manier aan deze machtiging toevoegen:

sudo setcap cap_net_raw=eip tracewalk

Negeer voorlopig de suffix =eip voor de machtiging, ik zal hier binnenkort meer over vertellen. Let op dat de naam van de machtiging in kleine letters is. Je kunt nu controleren of je de machtigingen correct hebt ingesteld met:

setcap -v cap_new_raw=eip tracewalk

Of je kunt een lijst van alle machtigingen die aan een bepaald uitvoerbaar bestand zijn toegekend weergeven:

getcap tracewalk

Ter referentie, je kunt ook alle machtigingen uit het uitvoerbare bestand verwijderen met:

setcap -r tracewalk

Op dit punt zou je het uitvoerbare bestand als een niet-geprivilegieerde gebruiker moeten kunnen uitvoeren, en het zou in staat moeten zijn om met onbewerkte sockets te werken, maar geen andere privileges van de root-gebruiker hebben.

Dus, wat betekent deze vreemde suffix =eip? Здесь потребуется толика понимания природы разрешений. Каждый процесс имеет три набора разрешений — effectieve, erfelijke en toegestane (effective, inheritable en permitted):

  • Effectieve (Effective) machtigingen zijn die welke bepalen wat het proces daadwerkelijk kan doen. Bijvoorbeeld, het kan niet omgaan met onbewerkte sockets als CAP_NET_RAW. het niet in de effectieve set zit.
  • Toegestane (Permitted) machtigingen zijn die waartoe het proces is toegestaan als het deze aanvraagt met de juiste aanroep. Ze staan het proces niet daadwerkelijk toe om iets te doen, tenzij het specifiek is geschreven om de opgegeven machtiging aan te vragen. Dit stelt processen in staat om bijzonder belangrijke machtigingen aan de effectieve set toe te voegen, alleen voor die periode waarin ze daadwerkelijk nodig zijn.
  • Erfelijke (Inheritable) machtigingen zijn die kunnen worden geërfd in de beschikbare set van het afgeleide kindproces. Tijdens de operatie fork() of clone() krijgt het kindproces altijd een kopie van de machtigingen van het ouderproces, omdat het op dat moment nog steeds hetzelfde uitvoerbare bestand uitvoert. De erfelijke set wordt gebruikt wanneer exec() (of een soortgelijk) wordt aangeroepen om het uitvoerbare bestand door een ander te vervangen. Op dit punt wordt de beschikbare set van het proces gemaskeerd door de erfelijke set om de beschikbare set te verkrijgen die voor het nieuwe proces zal worden gebruikt.

Zo wordt de tool setcap staats ons toe om de toestemmingen van deze drie sets onafhankelijk toe te voegen voor dit uitvoerbare bestand. Houd er rekening mee dat de waarde van de groepen iets anders wordt geïnterpreteerd voor bestandsrechten:

  • Beschikbare bestandsrechten zijn die welke altijd toegankelijk zijn voor het uitvoerbare bestand, zelfs als het bovenliggende proces dat het aanriep deze niet had. Voorheen werden ze 'afdwingbare' rechten genoemd.
  • Geërfd bestandsrechten bepalen een extra masker dat ook kan worden gebruikt om rechten uit de set van het aanroepende proces te verwijderen. Ze worden toegepast naast de geërfde set van het aanroepende proces, daarom worden rechten alleen geërfd als ze in beide sets bestaan.
  • Effectief bestandsrechten vertegenwoordigen eigenlijk slechts één bit, en als dit is ingesteld, betekent dit dat de hele beschikbare set ook wordt gekopieerd naar de effectieve set van het nieuwe proces. Dit kan worden gebruikt om rechten toe te voegen aan processen die niet specifiek zijn geschreven om deze aan te vragen. Aangezien dit één bit is, als u dit voor een bepaalde toestemming instelt, moet het voor alle rechten worden ingesteld. U kunt het beschouwen als een legacy bit, omdat het wordt gebruikt om het gebruik van rechten voor applicaties die deze niet ondersteunen toe te staan.

Bij het opgeven van rechten via setcap drie letters e, i en Het commando geeft een lijst van onze huidige partities weer. In mijn geval één partitie van 30 GB en nog 20 GB in vrije ruimte, als ik dat zo mag zeggen. verwijzen naar effectieve, geërfde en beschikbare verzamelingen respectievelijk. Dus, de eerdere specificatie:

sudo setcap cap_net_raw=eip tracewalk

… geeft aan dat de toestemming CAP_NET_RAW. moet worden toegevoegd aan de beschikbare en geërfde verzamelingen en dat ook de effectieve bit moet worden ingesteld. Dit vervangt alle eerder ingestelde toestemmingen in het bestand. Om meerdere toestemmingen tegelijk in te stellen, gebruik een lijst scheiding met een komma:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

De gids voor rechten bespreekt dit alles uitgebreider, maar hopelijk heeft deze post enige mysterie weggenomen van wat er aan de hand is. Er zijn nog maar een paar waarschuwingen en trucs te vermelden.

Ten eerste, bestandsmogelijkheden werken niet met symbolische links - u moet ze toepassen op het uitvoerbare bestand zelf (dus op de doelbestemming van de symbolische link).

Ten eerste werken ze niet met geïnterpreteerde scripts. Bijvoorbeeld, als je een Python-script hebt waarvoor je machtigingen wilt toewijzen, moet je dit zelf aan de Python-interpreter doen. Dit is duidelijk een potentieel beveiligingsprobleem, omdat dan alle scripts die met deze interpreter worden uitgevoerd, de toegewezen machtigingen hebben, hoewel dit nog steeds aanzienlijk beter is dan het gebruik van SUID. De meest voorkomende omweg lijkt te zijn om een aparte uitvoerbare bestand in C of een vergelijkbare taal te schrijven dat de vereiste operaties kan uitvoeren en dit vanuit het script aan te roepen. Dit lijkt op de aanpak die Wireshark gebruikt, dat een binaire uitvoerbare file gebruikt. /usr/bin/dumpcap voor het uitvoeren van geprivilegieerde operaties:

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

Ten derde worden bestandsmachtigingen uitgeschakeld als je een omgevingsvariabele gebruikt LD_LIBRARY_PATH om begrijpelijke veiligheidsredenen(1). Hetzelfde geldt voor LD_PRELOAD, voor zover ik weet.

1. Omdat een aanvaller duidelijk een van de standaardbibliotheken kan vervalsen en kan gebruiken LD_LIBRARY_PATH, om zijn eigen bibliotheek in de voorkeur te laten oproepen boven de systeemversie, en dus zijn eigen willekeurige code uit te laten voeren met dezelfde privileges als de oproepende applicatie.

Dat is alles. Details over het cursusprogramma kun je vinden op het webinar dat op 24 januari zal plaatsvinden.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster