GNU/Linux >> Znalost Linux >  >> Linux

Pochopení oprávnění UNIX a typů souborů

Na vaše otázky odpovím ve třech částech:typy souborů, oprávnění a případy použití pro různé formy chmod .

Typy souborů

První znak v ls -l výstup představuje typ souboru; d znamená, že je to adresář. Nelze jej nastavit ani zrušit, záleží na tom, jak byl soubor vytvořen. Úplný seznam typů souborů naleznete v dokumentaci ls; ti, na které pravděpodobně narazíte, jsou

  • - :„běžný“ soubor vytvořený jakýmkoli programem, který umí zapisovat soubor
  • b :speciální blokový soubor, obvykle disková nebo oddílová zařízení, lze vytvořit pomocí mknod
  • c :znakový speciální soubor, lze také vytvořit pomocí mknod (viz /dev pro příklady)
  • d :adresář, lze vytvořit pomocí mkdir
  • l :symbolický odkaz, lze vytvořit pomocí ln -s
  • p :pojmenované potrubí, lze vytvořit pomocí mkfifo
  • s :socket, lze vytvořit pomocí nc -U
  • D :door, vytvořený některými serverovými procesy na Solaris/openindiana.

Oprávnění

chmod 0777 se používá k nastavení všech oprávnění v jednom chmod provedení, spíše než kombinování změn s u+ atd. Každá ze čtyř číslic je osmičková hodnota představující sadu oprávnění:

  • suid , sgid a „lepkavý“ (viz níže)
  • uživatelská oprávnění
  • skupinová oprávnění
  • „jiná“ oprávnění

Osmičková hodnota se vypočítá jako součet oprávnění:

  • „přečíst“ je 4
  • „zapsat“ je 2
  • „provést“ je 1

Pro první číslici:

  • suid je 4; binární soubory s touto bitovou sadou běží jako uživatel vlastníka (obvykle root )
  • sgid je 2; binární soubory s touto bitovou sadou běží jako jejich skupina vlastníků (toto bylo používáno pro hry, takže bylo možné sdílet vysoké skóre, ale v kombinaci se zranitelností ve hrách je to často bezpečnostní riziko) a soubory vytvořené v adresářích s touto bitovou sadou patří do ve výchozím nastavení skupina vlastníků adresáře (toto je užitečné pro vytváření sdílených složek)
  • „sticky“ (nebo „omezené mazání“) je 1; soubory v adresářích s touto bitovou sadou může smazat pouze jejich vlastník, vlastník adresáře nebo root (viz /tmp pro běžný příklad tohoto).

Viz chmod manuálová stránka pro podrobnosti. Všimněte si, že v tom všem ignoruji další bezpečnostní funkce, které mohou změnit uživatelská oprávnění k souborům (SELinux, souborové ACL...).

Se speciálními bity se zachází odlišně v závislosti na typu souboru (běžný soubor nebo adresář) a základním systému. (To je zmíněno v chmod manpage.) Na systému, který jsem použil k testování (s coreutils 8.23 na ext4 souborový systém s linuxovým jádrem 3.16.7-ckt2), chování je následující. U souboru jsou speciální bity vždy vymazány, pokud nejsou explicitně nastaveny, takže chmod 0777 je ekvivalentní chmod 777 a oba příkazy vymažou speciální bity a dají všem plná oprávnění k souboru. U adresáře nejsou speciální bity nikdy zcela vymazány pomocí čtyřmístné číselné formy, takže ve skutečnosti chmod 0777 je také ekvivalentní chmod 777 ale je to zavádějící, protože některé speciální bity zůstanou tak, jak jsou. (Předchozí verze této odpovědi to měla špatně.) Chcete-li vymazat speciální bity v adresářích, musíte použít u-s , g-s a/nebo o-t explicitně nebo zadejte zápornou číselnou hodnotu, takže chmod -7000 vymaže všechny speciální bity v adresáři.

V ls -l výstup, suid , sgid a „sticky“ se objeví místo x záznam:suid je s nebo S namísto x uživatele , sgid je s nebo S namísto skupiny x a „sticky“ je t nebo T místo x ostatních . Malé písmeno označuje, že jsou nastaveny speciální bit i spustitelný bit; velké písmeno znamená, že je nastaven pouze speciální bit.

Různé formy chmod

Kvůli výše popsanému chování se používají celé čtyři číslice v chmod může být matoucí (alespoň se ukázalo, že jsem byl zmatený). Je to užitečné, když chcete nastavit speciální bity i bity oprávnění; jinak jsou bity vymazány, pokud manipulujete se souborem, zachovány, pokud manipulujete s adresářem. Takže chmod 2750 zajišťuje, že získáte alespoň sgid a přesně u=rwx,g=rx,o=; ale chmod 0750 nemusí nutně vymazat speciální bity.

Použití numerických režimů místo textových příkazů ([ugo][=+-][rwxXst] ) jde pravděpodobně spíše o zvyk a cíl příkazu. Jakmile jste si zvykli na používání numerických režimů, je často snazší určit celý režim tímto způsobem; a je užitečné mít možnost myslet na oprávnění pomocí číselných režimů, protože je může používat mnoho dalších příkazů (install , mknod ...).

Některé textové varianty se mohou hodit:pokud chcete jednoduše zajistit, aby soubor mohl spustit kdokoli, chmod a+x to udělá bez ohledu na to, jaká jsou ostatní oprávnění. Podobně +X přidá oprávnění ke spuštění pouze v případě, že je jedno z oprávnění ke spuštění již nastaveno nebo je soubor adresář; to může být užitečné pro globální obnovení oprávnění, aniž byste museli používat speciální případy souborů v. adresáře. Tedy chmod -R ug=rX,u+w,o= je ekvivalentní použití chmod -R 750 do všech adresářů a spustitelných souborů a chmod -R 640 do všech ostatních souborů.


Oprávnění v Linuxu jsou tedy velmi důležitá. Pokusím se o krátké vysvětlení.

Pro části režimu souboru

Každý soubor Unix má sadu oprávnění, která určují, zda můžete soubor číst, zapisovat nebo spouštět. Runningls -l zobrazí oprávnění. Zde je příklad takového zobrazení:

-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile

Přikládám obrázek částí režimu souboru:

Typ může být jiný. Například:

  • d (adresář)
  • c (znakové zařízení)
  • l (symlink)
  • p (pojmenovaný kanál)
  • s (zásuvka)
  • b (zablokovat zařízení)
  • D (dveře, nejsou běžné v systémech Linux, ale byly přeneseny)

Pokud chcete nastavit některá oprávnění pro všechny adresáře, můžete použít atribut R, například:

chmod -R 777 /some/directory/

Pro chmod 777 vs 0777

chmod příkaz obvykle očekává, že vstup bude osmičkové číslo, úvodní nula odkazuje na hodnotu trojice bitů sticky/sgid/suid. V C by to však znamenalo rozdíl, protože 777 by bylo přeloženo do 01411 (osmičková), čímž se nastaví lepivý bit (viz chmod(2) manuálová stránka), oprávnění ke čtení pro vlastníka a spustitelný bit pro skupinu a další (což je poněkud zvláštní kombinace).

UPRAVIT 1

Našel jsem další obrázek o oprávněních Linuxu a přiložím jej, abych to snadněji pochopil:


d znamená, že je to adresář, pokud máte soubor, je to - a pokud se jedná o odkaz, najdete l . Nelze jej nastavit/zrušit.

Pokud jako oprávnění použijete 0777, dáváte plnou kontrolu (čtení+zápis+spouštění) každému uživateli/skupině systému. Je to líný způsob, jak řešit problémy, když máte uživatele/skupiny, které nemají přístup k adresářům/souborům.

Pokud například vypíšete obsah adresáře a dostanete toto:

-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so

preloadable_libintl.so je soubor vlastněný uživatelem root a root skupiny. Vlastník má přístup pro čtení a zápis, skupinu má přístup pouze pro čtení a jakýkoli jiný uživatel má přístup pro čtení. To lze přeložit jako 644.

Pokud to změním na 777, bude to vypadat takto:

-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so


Linux
  1. Oprávnění pro Linux:Úvod do chmod

  2. UNIX / Linux:Průvodce pro začátečníky k oprávněním k souborům a adresářům (umask, chmod, čtení, zápis, spouštění)

  3. Tabulka oprávnění pro soubor/adresář a typy uživatelů souborového systému

  1. Linux chmod and chown – Jak změnit oprávnění a vlastnictví souborů v Linuxu

  2. Linux – Rozumíte unixovým oprávněním a typům souborů?

  3. Priorita uživatele a vlastníka skupiny v oprávněních k souboru?

  1. Oprávnění a ukládání souborů?

  2. unix - hlava A konec souboru

  3. Jak odstranit setgid (linux/unix)?