Dává možnost uživateli "john" vykonávat jakýkoliv příkaz, za jakéhokoliv uživatele
Aby to tazatel úplně dobře pochopil, asi by se slušelo říct, jak to funguje:
1. jsem přihlášený jako uživatel "mirda"
2. když napíšu do shellu "sudo -u lojza x", tak se prostě spustí program "sudo" s parametry "-u lojza x"
3. sudo má nastavenou takovou zvláštní vlastnost*, že ať ho spustí jakýkoli uživatel, běží sudo s právy roota - tj. jako kdyby ho spustil root
4. sudo se podívá do své konfigurace (sudoers), jestli má "mirda" právo spustit příkaz "x" pod účtem uživatele "lojza"
5. pokud ano, tak se sudo (běžící pod rootem) přepne, aby že běžel pod uživatelem "lojza"
6. když běží pod uživatelem "lojza", spustí program "x"
Tj. konečný efekt je úplně stejný, jakoby se uživatel lojza přihlásil do systému a do shellu napsal "x".
Z toho taky plyne, že pro účely konfigurace sudo je úplně jedno, jestli program "x" existuje nebo ne. Pokud neexistuje, tak se stane přesně to stejné, jako kdyby lojza napsal do shellu "x" - shell (resp. sudo) mu řekne, že program neexistuje.
$ sudo x
[sudo] password for mprymek:
sudo: x: command not found
Takže kdybysme chtěli být přesní, příkaz se nevykonává "za jiného uživatele", ale skutečně POD tím jiným uživatelem - sudo se na něj prostě přepne.
Taky z toho plyne odpověď na otázku "co se stane, když mám právo X spustit pod uživatelem Y, ale Y nemá právo spustit X" - no stane se přesně to, co se stane, když se Y pokusí spustit X. Protože přesně to se pod kapotou sudo děje.
* v tomhle kontextu to není důležité, proto to dál nerozvádím
A chápu to dobře, že služby jsou také uživatelé?
Ne. Unixové systémy znají uživatele a procesy. Každý proces běží pod nějakým uživatelem (typicky pod tím, který ten proces spustil, spíš výjimečně pod jiným).
"Služba" nemá v unixovém světě přesně daný význam, může být implementována různě. Každopádně je to proces.
kde zjistím, která služba má jaké oprávnění?
To už jsme si řekli, že je blbost, ale pokud by otázka byla "jak zjistím, jaký uživatel má jaké oprávnění", tak to je otázka, která nedává v unixovém světě moc smysl. Jednotlivé spustitelné soubory na disku mají u sebe poznačeno, kdo je může spustit. To je celé. (Resp. to je ten základ, na který se ptáš, kromě něj existují ještě úplně jiné světy, ale ty teď ignoruj)
K tomu sudo a skupině: napsal jste, že jsou nezávislé, ale pokud nemám skupinu sudo, pravidla se neuplatní. Nejsou tyhle věci v rozporu? Nebo můžu uživateli přidat skupinu, kterou vytvořila konfigurace sudoers bez toho, abych ji vytvořil v groups?
Nejsou v rozporu. Sudoers žádné skupiny nevytváří. Do sudeoers se dívá program sudo, nikdo jiný. A program sudo se dívá jestli uživatel "mirda" má právo něco udělat. Popřípadě se dívá, jestli má právo něco udělat někdo, kdo je členem nějaké skupiny a jestli je mirda jejím členem. Pokud tam bude pravidlo, že člen skupiny "admins" může spustit X, tak se sudo podívá, jestli je mirda členem admins. Pokud ta skupina neexistuje, tak logicky mirda jejím členem není -> mirda nemá právo spustit X (jinými slovy: tohle pravidlo se neuplatní pro nikoho).
Neber si to prosím osobně, ale silně bych doporučoval, aby ses tyhle věci snažil nastudovat sám a ptal ses až v případě, že něčemu nebudeš rozumět - tj. stylem:
Přečetl jsem si v knize tohle [...], pochopil jsem to takhle [...], když si to zkusím, stane se tohle [...] a přitom jsem čekal, že by se mělo stát [...]. Co jsem špatně pochopil?
Tohle je daleko lepší způsob, který ušetří čas tazateli i odpovídajícím.