Uživatelé, skupiny a oprávnění v Linuxu
Uživatelé
Mnohdy je v různých distribucím Linuxu po čerstvé instalace k dispozici pouze jeden uživatel, pomocí něhož se můžeme do systému přihlásit. Standardně jde o uživatele pojmenovaného jako root, který má nejvyšší oprávnění. Takový uživatel může číst a měnit libovolné položky (složky, soubory) kdekoliv v rámci celé adresářové struktury, stejně tak jako spouštět jakékoliv skripty.
Domovské adresáře /home/user, /root
Vedle nejvyššího uživatele root
se můžeme v systému Linux setkat také s „běžnými“ uživateli. Jak se liší? Běžný uživatel nemusí mít ani zdaleka taková oprávnění jako root
.
Kam ale může takový uživatel přistupovat? Obecně má tento uživatel vytvořen svůj tzv. „domovský adresář“, a to formou podsložky v /home
. Běžný uživatel Linuxu user tedy bude za normálních okolností mít vytvořen adresář /home/user
, v němž bude moci provádět cokoliv.
Jak vytvořit uživatele?
Uživatele lze vytvořit příkazem adduser
, za nímž bude bezprostředně po mezeře následovat jméno uživatele. Například takto
root@ubuntu:~$ adduser user
Každý uživatel musí mít unikátní uživatelské jméno. Chceme-li uživateli zároveň vytvořit i domovskou složku v již výše zmiňovaném adresáři /home
, docílíme toho pomocí přepínače -m
root@ubuntu:~$ adduser -m user
Aby se však uživatel mohl přihlásit do terminálu, musíme mu říci, jaké prostředí má používat. Pomocí přepínače -s mu proto nastavíme defaultní shell na bash, který se nachází v /bin/bash
takto
root@ubuntu:~$ adduser -m -s /bin/bash user
Jak nastavit uživateli heslo?
Uživatele máme vytvořeného, ale aby se mohl přihlásit, je vhodné mu nastavit také heslo. To učiníme příkazem passwd
následovaným již existujícím uživatelem (tzn. nejdříve vytvořme uživatele pomocí adduser
a až následně mu nastavme heslo)
root@ubuntu:~$ passwd user
Prompt (v terminálu) nás nyní vyzve k zadání nového hesla. Potvrdíme Enterem a pro ověření zopakujeme heslo znovu.
Co když nejsem root? Vhod přijde sudo
Pokud nejsi root
a přesto chceš vytvořit libovolného uživatele či mu změnit heslo, musíš mít odpovídající oprávnění. Těm se budeme věnovat v závěru kapitoly. Pokud však nejsi rootem, ale máš oprávnění používat jako root určité příkazy, přidáš před ně tzv. sudo
jinyuzivatel@ubuntu:~$ sudo adduser -m -s /bin/bash user
jinyuzivatel@ubuntu:~$ sudo passwd user
Daemon – uživatel s omezenými právy
Vedle uživatelských účtů typu root
, běžné účtu s privilegii root
a běžného účtu existují ještě takzvaní daemons
. Jde o speciální uživatelé, kteří nemají heslo a nemohou se přihlásit.
I přesto však mají oprávnění. K čemu je to dobré? Představme si webovou aplikaci, která běží pod uživatelem root. Záškodnický hacker ji napadne pomocí dosud neobjevené zranitelnosti a rázem má plnou kontrolu nad systémem, neboť může systém ovládat příkazy jako root.
Toto nechceme. Proto je vhodné každou aplikaci či skript spouštět pod individuálním uživatelem, respektive nyní daemonem
, který bude mít práva omezena pouze na nezbytné minimum. Bude moci nahlížet jen do nutných složek, aby se v případě napadení minimalizovaly škody v rámci systému.
UID
Pod zkratkou UID
se skrývá „User Identification Number“, tedy uživatelské identifikační číslo, které je napříč všemi uživateli v daném systému unikátní. Dva uživatelé nemohou mít, stejně jako uživatelské jméno, totožné UID
. Uživatel root má zpravidla UID 0.
Tato ID lze zjistit ze souboru /etc/passwd
.
Skupiny
Skupiny v operačním systému Linux nám umožňuje velmi jednoduše a intuitivně přidělovat hromadně oprávnění jednotlivým uživatelům. Díky tomu získají uživatelé přístup k souborům, které potřebují ke své práci, a ke zbytku se nedostanou, popřípadě budou moci některé soubory jen číst, kdežto jiné i editovat.
Lze vytvářet neomezeně mnoho skupin, přidávat do nich libovolné množství uživatelů a nastavovat jim různá oprávnění. Jak na to?
Root s omezenými právy? To je sudoers
V kapitole zaměřené na uživatele jsme se seznámili s tím, jakým způsobem spouštět určité commandy i za situace, kdy nemáte root
oprávnění. Tím je příkaz sudo. Ovšem co když nechceme, aby si daný uživatel (v rámci skupiny) mohl dělat, co bude chtít?
Pomůže nám v tom soubor /etc/sudoerrs
, v němž můžeme snadno definovat, jaké uživatelské skupiny mohou spouštět jaké příkazy. Tím zcela jasně omezíme činnost „falešných“ (ale chtěných) root uživatelů.
Zobrazíme-li si tento soubor, např. takto
root@ubuntu:~$ cat /etc/sudoerrs
uvidíme něco v tomto formátu
root ALL=(ALL) ALL
Pokud tedy chceme dovolit uživateli user
, aby měl privilegia totožná s uživatelem nginx
, provedeme to následovně
user localhost = (nginx) ALL, (root) /usr/bin/su nginx
Tím jsme doslovně nastavili, že uživatel user může spouštět lokálně (localhost
) jakékoliv commandy jménem (a oprávněními) uživatele nginx
a zároveň dovolujeme pomocí příkazu su
(switch users) se za tohoto uživatele přihlásit do shellu (terminálu).
GID
Podobně jako UID
je GID
„Group Identification Number“, tedy jednoznačný číselný identifikátor skupiny v systému unikátní.
Vytvoření nové skupiny
Podobně, jako jsme přidávali nové uživatele do systému, můžeme vytvářet také nové skupiny. Například tímto příkazem
root@ubuntu:~$ addgroup mojeskupina
vytvoříme novou skupinu mojeskupina
. Nemáme-li oprávnění (nejsme přihlášení za uživatele root), použijme na začátku příkaz sudo.
Přidání uživatele do skupiny
Chceme-li přidat uživatele user do skupiny mojeskupina
, učiníme tak přepínačem -G
u příkazu useradd
, kde prvním parametrem je název již existující skupiny a druhým parametrem je jméno uživatele.
root@ubuntu:~$ useradd -G mojeskupina user
Každý uživatel má však také svou tzv. primární skupina. Zpravidla je její název shodný s názvem uživatelského účtu. Primární skupinu změníme u uživatele takto
root@ubuntu:~$ usermod -g jinaskupina user
Seznam všech skupin v systému
Pro výpis všech skupin využijme commandu groups
, chceme-li vypsat i jejich ID, příkaz je jednoduše id
root@ubuntu:~$ groups
root@ubuntu:~$ id
Změna skupiny u souboru
Nyní jsme nakousli problematiku samotných oprávnění, kterou detailněji probereme až v následující kapitole. Prozatím si však alespoň prozraďme, že každý soubor a složka má tzv. svou vlastnickou skupinu a vlastníka (uživatele).
Chceme-li změnit vlastnickou skupinu na mojeskupina
souboru ahoj.txt
, provedeme to následujícím příkazem
root@ubuntu:~$ chgrp mojeskupina ahoj.txt
Více v další kapitole...
Oprávnění
Základní práva rwx
- read, write, execute
Aby si v Linuxu nemohl kdokoliv dělat cokoliv, existují oprávnění. Ta udávají, kdo daný soubor či složku může zobrazit, kdo editovat a kdo spustit (jedná-li se o skript). Jednoduše lze oprávnění rozdělit na 3 atributy bash rwx
, a to read, write, execute, tedy čtení, zápis a spouštění.
Na první pohled by se mohlo zdát, že mám-li oprávnění ke čtení zápisu i spouštění v rámci složky, mohu takto manipulovat i s každým jednotlivým souborem v této složce. Ale opak je pravdou – i na toto potřebuji jednotlivá oprávnění u každého takového souboru.
Práva na souboru vs. na složce
Podívej se do tabulky níže pro názorné vysvětlení.
právo | soubor | složka |
---|---|---|
read (r) | čtení souboru | čtení složky a názvů souborů v ní |
write (w) | zápis do souboru | vytváření souborů a složek |
execute (x) | spuštění souboru | vstup do adresáře |
Práva pro vlastníka, skupinu a ostatní
Aby to nebylo tak jednoduché, každý soubor i adresář disponuje hned třemi úrovněmi oprávnění. Jiná práva ke stejnému objektu může mít vlastník, skupina a ostatní. Mezi tzv. „ostatní“ se řadí tací uživatelé, kteří nejsou vlastníky a ani nejsou členy vlastnické skupiny souboru/složky.
V důsledku proto máme hned 9 tzv. atributů oprávnění, a to rwxrwxrwx
. Opakuje se nám zde třikrát rwx
– jednou pro vlastníka, poté pro skupinu a nakonec pro ostatní.
Že to není srozumitelné? Řekněme, že chceme, aby soubor
- vlastník mohl číst, měnit a spouštět
- skupina mohla číst a spouštět
- ostatní nemohli nic
V případě, že některé oprávnění „chybí“ (není přiděleno – např. skupina nemůže měnit - zapisovat), nahradí se pomlčkou. Oprávnění souboru dle zadání výše by vypadalo následovně
rwx
pro vlastníkar-x
pro skupinu (chybí w, nemůže zapisovat)---
pro ostatní (nemohou nic, nemají žádná oprávnění k souboru)
Finální zápis proto bude znít rwxr-x---
.
Práva rwx
číslicově aneb rw-r-----
== 640
Aby byl zápis jednodušší, každému právu (rwx
- čtení, zápisu a spouštění) je přiděleno číslo, jejichž sečtením získáme hodnotu oprávnění pro vlastníka, skupinu či ostatní.
Následující zápisy jsou ekvivalentní
právo textově | právo číslicově |
---|---|
read (r ) |
4 |
write (w ) |
2 |
execute (x ) |
1 |
Čísla jsou záměrně tvůrci tohoto systému volena tak, aby jejich součet vždy dával jednoznačné oprávnění. Vezmeme-li příklad uvedený výše (rwxr-x---
) a sečteme oprávnění vždy pro vlastníka, skupinu a ostatní zvlášť, získáme 750
.
Jak jsme k tomu došli?
- vlastník může číst (
4
), zapisovat (2
) a spouštět (1
), součet je7
- skupina může číst (
4
) a spouštět (1
), součet je5
- ostatní nemohou nic, součet je
0
Proto například zápis rw-r-----
, který „lidsky“ znamená toto
- vlastník může číst a zapisovat (celkem
4
+2
+0
=6
) - skupina může pouze číst (celkem
4
+0
+0
=4
) - ostatní nemohou nic (celkem
0
+0
+0
=0
)
můžeme zapsat jako 640
.
chown
V závěru kapitoly o skupinách jsme si prozradili, jakým způsobem lze měnit vlastnickou skupinu. Změnit vlastníka (tedy uživatele) souboru ahoj.txt
na uživatele user je velmi jednoduché a provedeme to následujícím příkazem
root@ubuntu:~$ chown user ahoj.txt
chmod
Díky tomu, že víme, jakým způsobem funguje číslicové znázornění práv, můžeme jednoduše měnit oprávnění u souborů i složek tímto zápisem složeným z čísel. Jak na to? Pokud chceme změnit oprávnění souboru ahoj.txt
na 640
, provedeme to takto
root@ubuntu:~$ chmod 640 user ahoj.txt
Udělení sudo (root) oprávnění běžnému uživateli usermod
Chceme-li uživateli user přidělit oprávnění uživatele root
, provedeme to velmi jednoduše pomocí commandu
root@ubuntu:~$ usermod -a -G sudo user
Tím jsme uživatele user přidali do skupiny sudo, která má plná oprávnění. Pouze bude nutné před každým příkazem, který má být spuštěný jako root, uvést frázi „sudo
“ (tedy zkratku „super user do“ – česky „superuživateli udělej”).