A képességek lehetővé teszik néhány fontos rendszerjogosultság értékelését a jelenlegi folyamattól eltérő külön szálban. Így nem kell rootként futtatni a programot, hogy elérje a rendszer bizonyos részeit.

Igényekből fakadó megoldásként a POSIX.1e 25. fejezete szól erről a kérdésről. Az ebben a részben meghatározott jogosultságok fejlesztése a Linux kernel 2.6.26-os verziójának kiadásával befejeződött. Itt van minden, amit a Linux kernel képességeiről tudni kell.

A képességek API logikájának megértése

Unix alapú rendszerekben az engedélyezés két lépésből áll:

  • Ha a futó alkalmazás jelenlegi tulajdonosa (érvényes felhasználói azonosító, EUID) nulla, akkor a rendszer nem ellenőrzi a jogosultságot
  • Ha az EUID értéke eltér nullától, akkor a rendszer az adott alkalmazás tényleges felhasználójának és csoportjának jogosultságai szerint hajtja végre az ellenőrzési folyamatot.

Egyes alkalmazásoknak szélesebb jogosultságokkal kell rendelkezniük (SUID, SGIT bitek) futás közben. A legjellemzőbb példaként gondolhatod

instagram viewer
a passwd alkalmazás. Ezzel a rendszer felhasználói megváltoztathatják jelszavaikat. Azonban írni a /etc/shadow fájlban, ahol a titkosított jelszavakat tárolják, root felhasználói jogokkal kell dolgozni (azaz felhasználói azonosító = 0).

A probléma megoldására a passwd alkalmazás rendelkezik egy SUID bittel. Bármelyik felhasználó is futtatja ezt az alkalmazást, az aktív tulajdonos (EUID) mindig root lesz:

ls -l /usr/bin/passwd

# Kimenet
-rwsr-xr-x. 1 gyökérgyökér 32552 2021. július 23. /usr/bin/passwd

Úgy tűnik, hogy a hagyományos Unix hitelesítési modellben SUID alkalmazások futtatása megoldotta a problémát. A SUID bitekkel rendelkező alkalmazások kritikus hibái azonban lehetőséget adnak a nem kívánt kódok futtatására a rendszerben teljes jogosultsággal rendelkező felhasználók számára. Egy ideális alkalmazásnak képesnek kell lennie root felhasználói jogok nélkül is futni, ha lehetséges.

A probléma nem ér véget csupán a SUID bittel. Ezenkívül root felhasználói jogosultságokkal kell rendelkeznie, ha az a privilegizált TCP vagy UDP port kevesebb, mint 1024 Unix alapú rendszereken. Például egy webszerver TCP 80-as portjának hallgatásához root felhasználóként kell futtatnia az alkalmazást.

Az évek során kiderült, milyen pusztító hatású olyan szoftvereket futtatni, amelyek teljes jogosultsággal rendelkező felhasználói fiókkal szolgálják a hálózati környezetet. Átmeneti megoldásként elfogadták, hogy a programnak csak egy bizonyos és kisebb része hallgat a privilegizált porton rootként, majd megváltoztatja az aktív felhasználói azonosítót egy másik felhasználóra a további folyamatokhoz (például a korlátozott jogokkal rendelkező senki felhasználóra).

Ez az évek óta használt rendszer a maga egyszerűségével jól működött, és még mindig hatékonyan használják. Manapság azonban lehetőség van néhány további, az alkalmazásra jellemző képességre, a Linux képességek API-ján keresztül, root jogok nélkül, a fent említetteken kívül rendszer.

A Linux képességmodell, magyarázat!

A képességek API legátfogóbb megvalósítását a Linux kernelben találhatja meg. A modern Linux disztribúciók is igyekeznek ezt az új modellt a lehető legnagyobb mértékben rendszerszinten használni.

Például ahhoz, hogy a ping alkalmazás működjön, képesnek kell lennie a RAW socketek megnyitására, amelyek általában csak root felhasználók számára vannak fenntartva. A régi Linux disztribúciókban az a probléma, hogy megadják a SUID bitet az alkalmazásnak, hogy a normál felhasználók is tudják használni. Ezekben a verziókban, amikor eltávolítja a SUID bitet az alkalmazásból, és megpróbálja normál felhasználóként futtatni az alkalmazást, a következő hibaüzenet jelenik meg:

ping 8.8.8.8

# Kimenet
ping: icmp nyitott socket: A működés nem engedélyezett

Míg a modern Linux disztribúciókban a ping alkalmazás valószínűleg nem rendelkezik SUID bittel:

ls -l /bin/ping 

# Kimenet
-rwxr-xr-x. 1 gyökérgyökér 95232 2021. július 25. /bin/ping

Ennek ellenére sikeresen futtathatja az alkalmazást normál felhasználóként. A mechanizmus, amely ezt lehetővé teszi, az, hogy a ping alkalmazás rendelkezik egy speciális képességgel CAP_NET_RAW.

Az alkalmazás további lehetőségeit a getcap parancs a következőképpen:

sudo getcap /bin/ping

# Kimenet
/bin/ping cap_net_raw=ep

Ha a getcap parancs üres választ ad vissza, manuálisan beállíthatja ezt az értéket a következővel:

sudo setcap cap_net_raw+ep /bin/ping

A folyamatképességi modell

Linux implementációban az egyes folyamatok képességei három címszó alá vannak csoportosítva:

Képesség Nyilatkozat
megengedett Ebben a fürtben található az adott folyamathoz engedélyezett további képességek listája. Az engedély megadása nem jelenti azt, hogy az adott időpontban aktívan használható. Lehetőség van az itt található jogosultságok felvételére a tényleges képességkészletbe egy további művelettel.
hatékony Megjeleníti a kapcsolódó folyamat aktuálisan aktív képességlistáját. A készségrendszert szabályozó segédfunkciókkal lehetőség nyílik egy-egy képesség feladására vagy visszaszerzésére. Ezt azonban mindenesetre csak az engedélyezett csoportban már jogosultak között lehet megtenni.
örökölhető Amikor egy alkalmazás új folyamatot indít, az újonnan elindított folyamat megjeleníti azon képességek listáját, amelyeket az engedélyezett listáról örököl.

A folyamatok bármikori futtatásához engedélyezett, hatékony és örökölhető képességek listája bitmaszkként jelenik meg a sorokon CapPrm, CapEff, és CapInh a fájlban /proc//status. Ezen kívül a CapBnd sor tartalmazza a képességhatár-vezérlési műveletben használt bitmaszkot.

Például próbálja kiolvasni a futó shell-alkalmazás értékeit a /proc/self/status fájl:

macska /proc/maga/állapot | grep Cap

# Kimenet
Kapitány: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000

A fájlképesség-modell Linuxban

A fájlok képességrendszerének működése attól függ, hogy ezek a tulajdonságok a virtuális fájlrendszer (VFS) rétegben tárolhatók-e. A folyamatmodellhez hasonlóan a fájlok képességei három kategóriába sorolhatók:

1. Engedélyezett

A rendszer akkor határozza meg a folyamat megengedett képességeit, amikor a megfelelő végrehajtható fájl fut ebben a fürtben.

2. Hatékony

A folyamatképességi modelltől eltérően ez a fejléc csak egy bitet tárol: aktív vagy inaktív. Ha a bit aktív, akkor automatikusan a fájl engedélyezett listájában meghatározott képességek érvényesülnek átkerül a releváns folyamat hatékony képességlistájába, amikor ez a fájl fut, és egy folyamat fut létre. Ha a bit nem aktív, akkor a fájlban engedélyezett képességek automatikus átvitele nem történik meg a futó folyamatba.

Ha azonban az adott alkalmazás kódja integrálva van a képességrendszerrel, akkor rendszerhívásokkal aktiválhatja a fájl engedélyezett halmazában lévő jogosultságokat. Ennek a viselkedésnek a fő célja annak biztosítása, hogy a régi alkalmazások, amelyek nem tartalmaznak rendszerspecifikus képességeket kód, a szoftverkód szintű fejlesztés a képességrendszerrel működhet anélkül, hogy forráskódra lenne szükség változtatások.

Azt gondolhatja, hogy a jobban megírt alkalmazások csak szükség esetén használják a képességeket. Ha a bit aktív, az engedélyezett listában szereplő összes képesség aktívvá válik az alkalmazás indításakor.

3. Örökölhető

A folyamatmodellhez hasonlóan a vonatkozó fájl lefut, és egy folyamat megtörténik. Ha ezután egy másik alkalmazás fut a folyamaton belülről, akkor az bekerül az új folyamat engedélyezett listájába. Összefoglalva: az örökölhető képességek listáját jelzi.

A képességek szerepe egy Linux rendszerben

Ha normál felhasználóként futtat egy bizonyos folyamatot, nincs jogosultsága. Ennek eredményeként csak azokhoz a partíciókhoz férhet hozzá, amelyeket a rendszer a normál felhasználók számára engedélyez. Ennek fő oka a rendszerbiztonság szigorítása és az ilyen intézkedések bevezetése.

Ha minden felhasználó számára lehetővé teszi az összes erőforráshoz való hozzáférést, az komoly biztonsági rést okozhat. A rendszert rosszindulatú célokra használó emberek nagyon könnyen kihasználhatják a rendszer sebezhetőségét. A Linux képességei jól jönnek ilyen esetekben. Könnyedén megerősítheti alkalmazásai biztonságát a kernel által működtetett API-val.

A Linux képességei csak egyike azoknak a problémáknak, amelyeken át kell gondolni, ha nagyon hatékony módszereket akarunk végrehajtani, mint például a root felhasználó felosztása. engedélyek, különféle engedélyek hozzárendelése nem privilegizált felhasználókhoz, és különféle óvintézkedések megtétele az internetes szolgáltatások nyitott portjaival kapcsolatban Linux szerverek.

Növelje Linux szerverének biztonságát ezzel a 7 keményítési lépéssel

Olvassa el a következőt

Ossza megCsipogOssza megEmail

Kapcsolódó témák

  • Linux
  • Programozás
  • Linux kernel
  • Operációs rendszer

A szerzőről

Fatih Küçükkarakurt (8 cikk megjelent)

Mérnök és szoftverfejlesztő, aki a matematika és a technológia rajongója. Mindig is szerette a számítógépeket, a matematikát és a fizikát. Játékmotor-projekteket, valamint gépi tanulást, mesterséges neurális hálózatokat és lineáris algebra-könyvtárakat fejlesztett ki. Továbbá továbbra is dolgozik a gépi tanuláson és a lineáris mátrixokon.

Továbbiak Fatih Küçükkarakurttól

Iratkozzon fel hírlevelünkre

Csatlakozzon hírlevelünkhöz műszaki tippekért, ismertetőkért, ingyenes e-könyvekért és exkluzív ajánlatokért!

Kattintson ide az előfizetéshez