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
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/
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
Kapcsolódó témák
- Linux
- Programozás
- Linux kernel
- Operációs rendszer
A szerzőről

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.
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