Zmogljivosti omogočajo oceno nekaterih pomembnih sistemskih privilegijev v ločeni niti, ki se razlikuje od trenutnega procesa. Na ta način vam ni treba zagnati programa kot root, da lahko dostopa do določenih delov sistema.

Kot rešitev, ki izhaja iz potreb, je razdelek 25 POSIX.1e o tem vprašanju. Razvoj privilegijev, opredeljenih v tem razdelku in še več, je bil zaključen z izdajo jedra Linuxa različice 2.6.26. Tukaj je vse, kar morate vedeti o zmogljivostih v jedru Linuxa.

Razumevanje logike API-ja za zmogljivosti

Nadzor avtorizacije v sistemih, ki temeljijo na Unixu, je sestavljen iz dveh korakov:

  • Če je trenutni lastnik (dejanski ID uporabnika, EUID) zagnane aplikacije nič, sistem ne preverja avtorizacije
  • Če je vrednost EUID drugačna od nič, sistem izvede kontrolni postopek v skladu s pooblastili dejanskega uporabnika in skupine ustrezne aplikacije.

Nekatere aplikacije morajo med izvajanjem imeti širše privilegije (SUID, SGIT biti). Kot najbolj tipičen primer si lahko omislite aplikacijo passwd

instagram viewer
. S tem lahko uporabniki v sistemu spremenijo svoja gesla. Vendar pa pisati na /etc/shadow datoteko, kjer so shranjena šifrirana gesla, je treba delati s pravicami root uporabnika (t.j. ID uporabnika = 0).

Za rešitev te težave ima aplikacija passwd bit SUID. Ne glede na to, kateri uporabnik zažene to aplikacijo, bo aktivni lastnik (EUID) vedno root:

ls -l /usr/bin/passwd

# Izhod
-rwsr-xr-x. 1 korenski koren 32552 23. julij 2021 /usr/bin/passwd

Zdi se, da je možnost zagona aplikacij SUID v tradicionalnem modelu preverjanja pristnosti Unix rešila težavo. Vendar pa kritične napake v aplikacijah z biti SUID odpirajo vrata za izvajanje neželenih kod za uporabnike s polnimi pooblastili v sistemu. Idealna aplikacija bi morala biti sposobna zagnati brez potrebe po pravicah root uporabnika, če je to mogoče.

Težava se ne konča samo z bitom SUID. Če želite poslušati na a privilegirana vrata TCP ali UDP manj kot 1024 na sistemih, ki temeljijo na Unixu. Če želite na primer poslušati vrata TCP 80 spletnega strežnika, morate zagnati aplikacijo kot root uporabnik.

Z leti se je razumelo, kako uničujoče je izvajati programsko opremo, ki zagotavlja storitve omrežnemu okolju s popolnoma pooblaščenim uporabniškim računom. Kot vmesna rešitev je bilo sprejeto, da le določen in manjši del programa posluša na privilegiranih vratih kot root, in nato spremeni ID aktivnega uporabnika v drugega uporabnika za nadaljnje postopke (na primer uporabnik nihče z omejenimi pravicami).

Ta sistem, ki se uporablja že leta, je dobro deloval s svojo preprostostjo in se še vedno učinkovito uporablja. Vendar pa je dandanes mogoče dobiti nekatere dodatne zmogljivosti, specifične za aplikacijo, prek API-ja zmožnosti Linuxa, brez potrebe po korenskih pravicah, razen zgoraj omenjenega sistem.

Model zmogljivosti Linuxa, razloženo!

Najobsežnejšo implementacijo API-ja za zmogljivosti najdete v jedru Linuxa. Sodobne distribucije Linuxa tudi poskušajo uporabiti ta novi model na celotnem sistemu, kolikor je le mogoče.

Na primer, da aplikacija ping deluje, mora imeti možnost odpreti vtičnice RAW, ki so na splošno rezervirane samo za uporabnike root. V starih distribucijah Linuxa je težava dati aplikaciji bit SUID, da ga lahko uporabljajo običajni uporabniki. V teh različicah, ko odstranite bit SUID iz aplikacije in poskusite zagnati aplikacijo kot običajen uporabnik, se prikaže naslednja napaka:

ping 8.8.8.8

# Izhod
ping: icmp odprta vtičnica: delovanje ni dovoljeno

Medtem ko v sodobnih distribucijah Linuxa aplikacija ping verjetno nima bita SUID:

ls -l /bin/ping 

# Izhod
-rwxr-xr-x. 1 korenski koren 95232 25. julij 2021 /bin/ping

Kljub temu lahko aplikacijo uspešno zaženete kot običajen uporabnik. Mehanizem, ki to omogoča je, da ima aplikacija ping posebno sposobnost CAP_NET_RAW.

Dodatne zmožnosti aplikacije se lahko naučite z getcap ukaz takole:

sudo getcap /bin/ping

# Izhod
/bin/ping cap_net_raw=ep

Če ukaz getcap vrne prazen odgovor, lahko to vrednost ročno nastavite z:

sudo setcap cap_net_raw+ep /bin/ping

Model zmogljivosti procesa

Pri implementaciji Linuxa so zmogljivosti vsakega procesa združene v tri naslove:

Zmogljivost Izjava
dovoljeno V tej gruči je seznam dovoljenih dodatnih zmogljivosti za ustrezen proces. Podelitev dovoljenja ne pomeni, da ga je takrat mogoče aktivno uporabljati. Tukaj je možno vključiti pooblastila v nabor učinkovitih zmogljivosti z dodatnim dejanjem.
učinkovito Prikazuje trenutno aktivni seznam zmožnosti povezanega procesa. S pomožnimi funkcijami, ki uravnavajo sistem spretnosti, je mogoče veščino opustiti ali jo ponovno pridobiti. V vsakem primeru pa je to mogoče storiti le med že pooblaščenimi v dovoljeni skupini.
dedno Ko aplikacija zažene nov proces, novo zagnani proces prikaže seznam zmogljivosti, ki jih bo podedoval s seznama dovoljenih.

Seznam dovoljenih, učinkovitih in podedovanih zmožnosti za izvajanje procesov v vsakem trenutku je prikazan kot bitna maska ​​v vrsticah CapPrm, CapEff, in CapInh v datoteki /proc//status. Poleg tega je CapBnd vrstica vsebuje bitno masko, uporabljeno v operaciji nadzora meje zmogljivosti.

Na primer, poskusite prebrati vrednosti vaše delujoče lupine aplikacije iz /proc/self/status mapa:

mačka /proc/sebe/status | grep Cap

# Izhod
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000

Model zmogljivosti datotek v Linuxu

Delovanje sistema zmogljivosti za datoteke je odvisno od predpogoja, da se te lastnosti lahko shranijo v sloj navideznega datotečnega sistema (VFS). Podobno kot pri modelu procesa se zmogljivosti za datoteke uvrščajo v tri naslove:

1. Dovoljeno

Sistem določi dovoljene zmogljivosti procesa, ko se ustrezna izvedljiva datoteka zažene v tej gruči.

2. Učinkovito

Za razliko od modela zmogljivosti procesa, ta glava shranjuje samo en bit: aktiven ali neaktiven. Če je bit aktiven, so zmožnosti, določene na seznamu dovoljenih datotek, samodejno prenese na seznam učinkovitih zmogljivosti ustreznega procesa, ko se ta datoteka zažene in proces ustvaril. Če bit ni aktiven, se samodejni prenos dovoljenih zmogljivosti datoteke v proces, ki se izvaja, ne izvede.

Če pa je koda ustrezne aplikacije integrirana s sistemom zmogljivosti, lahko s sistemskimi klici aktivira dovoljenja v dovoljenem nizu datoteke. Glavni namen tega vedenja je zagotoviti, da stare aplikacije, ki ne vključujejo zmogljivosti, specifične za sistem kodo, lahko razvoj na ravni programske kode deluje s sistemom zmogljivosti brez potrebe po kakršni koli izvorni kodi spremembe.

Morda mislite, da bodo bolje napisane aplikacije uporabljale zmogljivosti le, ko bodo potrebne. Če je bit aktiven, postanejo vse zmogljivosti na seznamu dovoljenih aktivnih, ko se aplikacija zažene.

3. Podedovano

Kot v modelu procesa se ustrezna datoteka zažene in pride do procesa. Če se po tem iz procesa zažene druga aplikacija, je vključena na dovoljeni seznam novega procesa. Če povzamemo, označuje seznam sposobnosti, ki jih je treba podedovati.

Vloga zmogljivosti v sistemu Linux

Ko zaženete določen proces kot običajen uporabnik, nimate nobenih privilegijev. Posledično lahko dostopate samo do particij, ki jih sistem omogoča običajnim uporabnikom. Glavni razlog za to je poostriti varnost sistema in izvajati takšne ukrepe.

Če vsem uporabnikom omogočite dostop do vseh virov, lahko ustvarite resno varnostno ranljivost. Za ljudi, ki uporabljajo sistem za zlonamerne namene, bo zelo enostavno izkoriščati sistemske ranljivosti. Zmogljivosti Linuxa pridejo prav pri takšnih zadevah. Varnost svojih aplikacij lahko enostavno okrepite z API-ji za zmogljivosti, ki jih poganja jedro.

Zmogljivosti Linuxa so le eno od vprašanj, o katerih je treba razmišljati, da bi naredili zelo zmogljive metode, kot je delitev korenskih uporabnikov dovoljenja, dodeljevanje različnih dovoljenj neprivilegiranim uporabnikom in sprejemanje različnih previdnostnih ukrepov glede odprtih vrat v internetnih storitvah z Linux strežniki.

Izboljšajte varnost svojega strežnika Linux s temi 7 koraki utrjevanja

Preberite Naprej

DelitiTweetDelitiE-naslov

Povezane teme

  • Linux
  • Programiranje
  • Jedro Linuxa
  • operacijski sistem

O avtorju

Fatih Küçükkarakurt (8 objavljenih člankov)

Inženir in razvijalec programske opreme, ki je ljubitelj matematike in tehnologije. Od nekdaj je imel rad računalništvo, matematiko in fiziko. Razvil je projekte motorjev za igre, pa tudi strojno učenje, umetne nevronske mreže in knjižnice linearne algebre. Poleg tega še naprej dela na strojnem učenju in linearnih matrikah.

Več od Fatih Küçükkarakurt

Naročite se na naše novice

Pridružite se našemu glasilu za tehnične nasvete, ocene, brezplačne e-knjige in ekskluzivne ponudbe!

Kliknite tukaj, da se naročite