Szerkesztő:Saras
A cikk a 2.6.26-os kernel verzióban megvalósított capability-k általános áttekintése.
1 Fogalma
A capability alapú biztonság egy biztonságosan elkészített rendszer tervezésének a koncepciója. Az alap ötlete a "mindenható" root jogosultságainak particionálása kisebb jogkörökre amelyek a thread-ekhez(process-ekhez) és a futtatható állományokhoz rendelhetünk.
2 Capability-k Lista
Az alábbi felsorolás tartalmazza a Linuxon implementált capability-ket, és a megengedett műveleteket minden egyes capability-re:
- CAP_AUDIT_CONTROL(Linux 2.6.11)
- A kernel auditing ki, és bekapcsolása; auditing szűrési szabályok megváltoztatása; lekérdezése auditing az státusz és szűrési szabályoknak.
- CAP_AUDIT_WRITE(Linux 2.6.11)
- Rekordok írása a kernel ellenőrzési logjába
- CAP_CHOWN
- Tetszés szerint lehet változtatni egy fájl UID-jét és GID-jét
- CAP_DAC_OVERRIDE
- Fájlrendszer-jogok figyelmen kívül hagyása. (DAC= "discretionary access control".)
- CAP_DAC_READ_SEARCH
- Kereshetünk az egész fájlrendszerben.
- CAP_FOWNER
- Jogosultságok ellenőrzés kikerülése (ha más a fájl rendszer UID és process UID)
- kiterjesztett fájlattribútumok beállítása tetszőleges fájlra
- ACL-ek beállítása tetszőleges fájlra
- sticky bit figyelmen kívül hagyása fájl törlésnél
- O_NOATIME tetszőleges fájl műveletnél
- CAP_FSETID
- Nem törli a Set-UID és a Set-GID biteket amikor a fájlt módosítják
- beállítja a Set-GID-et
- CAP_IPC_LOCK
- Memória Lockolás
- CAP_IPC_OWNER
- Engedély figyelmen kívül hagyása System V IPC objektumokon végezett műveleteknél
- CAP_KILL
- Jogosultságok figyelmen kívül hagyása szignál küldésnél.
- CAP_LEASE(Linux 2.4)
- fcntl()
- CAP_LINUX_IMMUTABLE
- Az FS_APPEND_FL és a FS_IMMUTABLE_FL i-node flagek beállítása.
- CAP_MAC_ADMIN(Linux 2.6.25)
- Felülbírálja Mandatory Access Control (MAC). Implementálva a Smack Linux Security Module (LSM)-nek.
- CAP_MAC_OVERRIDE(Linux 2.6.25)
- Engedélyezi MAC konfigurációt vagy státusz váltást. Implementálva a Smack LSM-nek.
- CAP_MKNOD(Linux 2.4)
- Speciális fájlok használata
- CAP_NET_ADMIN
- Hálózati műveletek engedélyezése (routing tábla módosítása, multicast engedélyezése ).
- CAP_NET_BIND_SERVICE
- 1024 alatti porthoz bindol
- CAP_NET_BROADCAST
- (Unused) Broadcast socketet csinál, és multicast figyel
- CAP_NET_RAW
- Használja a RAW és a PACKET socketeket.
- CAP_SETGID
- Tetszőlegesen beállítható a process GID és a kiegészítő GID lista
- CAP_SETFCAP(Linux 2.6.24)
- Fájl capability-k beállítása
- CAP_SETPCAP
- Ha a fájl capability-k nem támogatottak: akkor beállít vagy eltávolít bármely capability-t. A hívó megengedett capability-t állíthat bármely más processznek( ha a kernel támogatja a capabiliiket akkor ezt tiltja)
- Ha a fájl capability-k támogatottak akkor bármely capability hozzáadható a hívó folyamathoz a hívó beállíthatja a thread's bounding set-et inheritable set-re, vagy eldobhatja a capability-ket a bounding set
- CAP_SETUID
- Tetszőleges process UID manipuláció
- CAP_SYS_ADMIN
- Az alábbi műveletekre lesz jogunk:quotactl(), mount(), umount(), swapon(), swapoff(),setdomainname()
- elvégezhető IPC_SET és az IPC_RMID művelet bármely System V IPCobjektumon;
- Műveletek a megbízható és a biztonsági kiterjesztett attribútumokon
- lookup_dcookie();
- Használja ioprio_set()-nél az OPRIO_CLASS_RT és (Linux 2.6.25) IOPRIO_CLASS_IDLE I / O ütemezés osztályokat
- Haladja meg a /proc/sys/fs/file-max, a rendszer-szintű korlátozása száma a megnyitott fájlokat a rendszer hívásoknál
- CAP_SYS_BOOT
- reboot() és kexec_load() használata.
- CAP_SYS_CHROOT
- CAP_SYS_MODULE
- Kernel modulok ki- és betöltése
- CAP_SYS_NICE
- A nice érték beállítása
- CAP_SYS_PACCT
- acct()
- CAP_SYS_PTRACE
- Nyomon követés tetszőleges eljárások segíségével
- CAP_SYS_RAWIO
- I/O port műveletek végrehejtása (iopl() és ioperm()); hozzáférés a /proc/kcore-hoz
- CAP_SYS_RESOURCE
- fenntartott hely használata ext2-n
- octl() hívással kontrollja az ext3 journalinget;
- felül írja a diszk kvóta limiteket
- CAP_SYS_TIME
- Óra beállítása
- CAP_SYS_TTY_CONFIG
- használja a vhangup().
3 Implementáció feltételi
A capability-k teljes megvalósítására szükség van:
- Minden privilegizált műveletet a kernelnek ellenőriznie kell, hogy a szál a szükséges capability-t a effektívre megállapított.
- A kernelnek biztosítania kell rendszer hívásokat, amelyek lehetővé teszik egy szál capability beállításainak megváltoztatását
- A fájl rendszernek támogatni kell a futtatható fájlokhoz rendelhető capabilitket, annak érdekében hogy a processek kihasználhassák a capability-ket ha futnak.
A 2.6.24-es kernel verzió előtt csak az első kettő teljesült, a 2.6.24-től minden meg van hogy hatékonyan használhassuk a capabilitket.
4 Capability-k a fájlrendszerben
A fájl rendszer egy bővített attribútumban tárolja a binárisokhoz rendelt capability-ket. A capability-k jelenleg (2.6.24-es kernel) ext2, ext3 és XFS fájl rendszerekben támogatottak. Három halmazuk van:
- Permitted (megengedett):
- A futtatás során létrejövő process megengedett halmaza kiegészül a binárisnak megengedett halmaz elemeivel
- Inheritable (örökölhető):
- Ez egy maszk a mi ÉS kapcsolatban van a hívó process örökölhető halmazával. Az itt "megörökölt" jogokhoz hozzáadjuk hozzáadjuk a fenti megengedett halmazt.
- Effective (hasznos):
- jelző bit ként funkciónál, Ha értéke 1 akkor a megengedett halmazban lévő összes capability azonnal megjelenik az hasznos készletben is. 0 esetén nem.
5 Capability-k átalakulása az execve() alatt
A execve() hívásnál a kernel kiszámolja a használandó capabilitket amiket a process használni fog az alábbi algoritmussal:
P'(permitted) = (P(inheritable) & F(inheritable)) |(F(permitted) & cap_bset) P'(effective) = F(effective) ? P'(permitted) : 0 P'(inheritable) = P(inheritable) [nem változott]
ahol:
- P jelöli az értéket amit egy szál capability beállított az execve() előtt
- P'azok a capability-k amikre az execve() után volt szükség
- F a fájl capability beállítások
- cap_bset a capability bounding set értéke.
6 Capability-ket használó rendszerben root jogosultságú program futattása
Capability-t használóprogram rootként fusson az execve()-et használva:
- A set-user-ID-root program futtatásával, vagy a valós UID jét a processnek 0-ra állítjuk akkor a fájl számára örökölhető és engedélyezett lesz minden jogosultság ( minden capability engedélyezett)
- Ha a set-user-ID-root programmal hajtjuk végre akkora fájl effektív bitje definició szerint egy(engedélyezett).
7 Capabilityk hatása a User ID-re
Megőrzi a hagyományos szemantikát átjárhatóan a 0 és a "nem nulla " user ID-k között. A kernelen az alábbi változtatásokat eszközölték a szálak capability-ének beállításához: a szál valós, effektív, mentett állapotú:
- Ha egy vagy több valós, effektív vagy mentett user id volt előzőleg 0 és a UID megváltozik mindegyik hatására akkor ezek az "ID-k nem null értékűek", akkor a capability-k törölve lesznek a megengedett és az effektív capability beállításokból.
- Ha az effektív user ID megváltozott 0-ról "nem nullára", akkor minden capability törlődik az effektív beállításból.
- Ha az effektív user ID megváltozik "nem nulláról" 0-ra akkor a megengedő beállítások be másolódnak az effektív beállításokba
- Ha a fájlrendszer user ID-je megváltozott 0-ról nem nullára akkor a következő capability-k törölve lesznek az effektív beállításból:CAP_CHOWN, CAP_DAC_OVERRIDE, CAP_DAC_READ_SEARCH, CAP_FOWNER, CAP_FSETID,CAP_LINUX_IMMUTABLE (Linux 2.2.30), CAP_MAC_OVERRIDE, and CAP_MKNOD(Linux 2.2.30)
Ha a fájlrendszer UID-je "nem nulláról" 0-ra változik akkor a fent felsorolt capabilitk mind engedélyezettek lesznek az effektív beállításban
8 Programból beállítható capability sets
Amikor egy threaden betöltödnek vagy megváltoznak a capability beállítások a capget()-et és a capset()-et rendszer hívást használják, ezenfelül a cap_get_proc() használata és a cap_set_proc() is benne van a libcap csomagban. A következő szabályok irányítják a változásokat a szál capability beállításokban:
- Ha a hívónak nincs CAP_SETPCAP capability-je, akkor az új örökölhető beállításnak rendelkeznie kell az al-beállításával a jelenlegi örökölhető és megengedett beállításoknak
- (kernel 2.6.25) Az új örökölhető beállítás kötlelezően részhalmaza az örökölhető beállításoknak és a bounding set-nek
- Az új megengedett beállítás az al-beállítása a létező megengedett beállításnak
- Az új effektív beállítás az al-beállítása az új megengedett beállításnak.
9 A "securebits" flagek:"Létrehozni egy csak capability-s környezetet"
2.6.26-os kerneltől és a kernelben engedélyezett fájl capability-kkel , a linux megvalósítja a pre-thread(elő-szál??) securebit flag beállításokat. Ezek az alábbiak:
- SECBIT_KEEP_CAPS: Engedélyezi a szálnak egy vagy több 0 UID-t megörizen.Eza flag minden execve()-nél törlődik
- SECBIT_NO_SETUID_FIXUP: A flag hatására meg áll a kernel capability beállító képessége
- SECBIT_NOROOT: Ha bit aktív akkor a kernel nem tudja garantálni a capability-ket amikor a set-user-ID-root program fut, vagy amikor a process effektív vagy valós UID-je 0