Kategória: Linux všeobecne

Zmenené: 13. marec 2011

Používate sudo?

Nástroj sudo slúži na dočasné poskytnutie práv superpoužívateľa root (Super User DO). Na rozdiel od známeho nástroja su neslúži na získanie shellu, ale len vykoná zadaný príkaz s právami zadaného používateľa. Ale hlavne je detailne prispôsobiteľný. V tomto článku nájdete úvod do týchto nastavení.

Použitie

Použitie príkazu sudo je veľmi jednoduché. Stačí napísať:

sudo príkaz

Ak má na to používateľ právo, bude zadaný príkaz vykonaný s právami používateľa root. Samozrejme, príkazy je možné spúšťať spolu s ich parametrami. Príkazy však možno vykonávať aj s právam i iného používateľa, napríklad vykonať príkaz ako ejabberd zaistí:

sudo -u ejabberd prikaz

Zaujímavou možnosťou je nechať si vypísať aké máte nastavenia a čo môžete robiť:

sudo -l

Prípadne ukončiť aktuálnu reláciu hesla (vynúti opätovné zadanie hesla, bez ohľadu na čas od posledného zadania):

sudo -K

A kopu ďalších možností, pozrite si sudo(1).

Nastavenie

Na nastavenie sudo poslúži príkaz:

visudo

Po spustení príkazu sa otvorí prednastavený editor a v ňom obsah súboru /etc/sudoers. Tento súbor je možné upravovať aj priamo, ale príkaz visudo vykoná aj kontrolu správnosti syntaxe, takže je určite vhodnejší. Ak urobíte chybu, pri pokuse o uloženie a ukončenie zobrazí otázku:

>>> /etc/sudoers: syntax error near line 12 <<<
What now?

Options are:
(e)dit sudoers file again
(x)it without saving changes to sudoers file
(Q)uit and save changes to sudoers file (DANGER!)

Prípadne, ak to nie je fatálna chyba, zobrazí len upozornenie:

visudo: Warning: unused Cmnd_Alias SHUTDOWN

Nastavenie používateľov

V nastavení sudo možno prideliť práva získania práv root používateľom alebo skupinám a všeobecná syntax takéhoto povolenia má formát:

kto stroj=(koho) aplikácie

Inými slovami, každý zápis udáva kto a na ktorom stroji môže spúšťať zadané aplikácie a v koho mene. Najjednoduchší zápis pritom môže vyzerať takto:

root ALL=(ALL) ALL

Tento jednoduchý zápis povoľuje používateľovi root spúšťať kdekoľvek, čokoľvek a v mene kohokoľvek. Poskytnutie rovnakých práv bežnému používateľovi je však nebezpečné!

Takéto vypisovanie práv pre každého používateľa môže byť problematické, najmä ak je tých používateľov veľa. V takom pripade môžu pomôcť aliasy a používateľské skupiny. Pridelenie práv členom skupiny možno docieliť obdobným zápisom, len miesto mena používateľa patrí meno skupiny, ktoré je odlíšené znakom %:

%sudo ALL=(ALL) ALL

Takto môžu členovia skupiny sudo robiť všetko, podobne ako root. Takéto nastavenie vyžaduje manipuláciu s členstvom používateľov v skupinách, čo nie je v podstate zlé, ale je tu aj možnosť použiť aliasy. V nastavení sudo možno vytvoriť viac typov aliasov, ten ktorý sa týka používateľov je označovaný User_Alias a jeho definícia môže vyzerať takto:

User_Alias ADMINI = jozo, fero, #1245

Definícia aliasu patrí na začiatok súboru sudoers (alebo teda aspoň pred jeho prvé použitie) a v tomto prípade sa skladá z mena aliasu (musí začínať veľkým písmenom) a zoznamom používateľov, oddelenom čiarkami. Používateľov možno zadať pomocou ich prihlasovacieho mena alebo UID s predponou #. Do zoznamu používateľov možno pridať aj systémovú skupinu (predpona %), sieťovú skupinu (prepdona +) alebo iné aliasy používateľov.

Dobrým zvykom je nazývať aliasy veľkými písmenami, pretože takto na prvý pohľad možno odlíšiť alias od bežného mena. Pridelenie práv takémuto aliasu používateľov potom môže vyzerať takto:

ADMINI ALL=(ALL) ALL

Nastavenie programov

Predchádzajúce príklady používali miesto zoznamu povolených programov preddefinovaný alias ALL, ktorý jednoducho znamená všetky programy. Takáto špecifikácia však nie je veľmi bezpečná, pretože používateľ potom môže urobiť v systéme naozaj všetko, vrátane pátrania po heslách ostatných používateľov, či meniť systémové nastavenia. V podstate takýto používateľ nepotrebuje sudo, ale vystačí so su

Veľkou silou nástroja sudo však je, že môžete presne vymenovať programy, ktoré používateľ môže spúšťať. Možnosti definícií sú rozsiahle a zahŕňajú možnosti definície programov pomocou zástupných znakov, či definície aliasov príkazov, ale postupne. Zdôrazním, že príkazy musia byť zadané pomocou úplnej cesty a musia byť oddelené čiarkami, napríklad:

ADMINI ALL=(ALL) /sbin/shutdown, /usr/sbin/ejabberdctl

Čiže používatelia z aliasu ADMINI môžu spúšťať príkazy shutdown a ejabberdctl. Pokus o spustenie iného programu skončí chybovým hlásením, napríklad pri preklepe:

Sorry, user jozo is not allowed to execute '/usr/sbin/ejabberdctl' as root on soumat.skk.

Povolenie samotného príkazu shutdown nedáva veľký zmysel, pretože pomocou neho môže používateľ systém nie len vypnúť, ale i reštartovať a na to sú k dispozícii aj príkazy halt, či reboot. Je preto vhodné ich používateľovi sprístupniť tiež, a to je vhodné miesto na alias príkazu, ktorý možno definovať napríklad takto:

Cmnd_Alias SHUTDOWN = /sbin/shutdown, /sbin/halt, /sbin/reboot

Práva používateľov ADMINI potom možno definovať takto:

ADMINI ALL=(ALL) SHUTDOWN, /usr/sbin/ejabberdctl

Pri ejabberdctl sa zastavím a využijem ho na ďalší príklad. Aj tento príkaz je potenciálne nebezpečný, pretože umožňuje vypísať všetky účty jabberového servera, vrátane ich hesiel. Povolím preto len vypisovanie štatistík. Výpis štatistík pomocou ejabberdctl poskytne jeho príkaz stats, ktorý však vyžaduje ešte ďalší parameter, a to, ktorú štatistiku vypísať. Samozrejme možno do povolení zapísať všetky štyri tvary príkazu, ale v tomto prípade si vystačím s použitím zástupného znaku:

ADMINI ALL=(ALL) SHUTDOWN, /usr/sbin/ejabberdctl stats *

Obmedzenie

Povolenia, nastavené vyššie, možno obmedzovať. Jednak možno definovať na ktorých strojoch môžu byť spúšťané a jednak možno definovať, ako ktorí používatelia môžu byť príkazy spúšťané. V prípade zobrazovania štatistík nie je potrebné spúšťať príkaz ako root, ale stačí povoliť spúšťanie len ako používateľ ejabberd:

ADMINI ALL=(ejabberd) /usr/sbin/ejabberdctl stats *

Možnosti zástupných znakov sú rozsiahlejšie ako spomínaná hviezdička, ale je nutné upozorniť, že sa nejedná o regulárne výrazy, ale len o zástupné znaky, podobné tým zo shellu.

Heslá a iné drobnosti

Vo východzom nastavení musí používateľ pri použití sudo zadať heslo. Nie zakaždým, pretože heslo je ukladané na určitú dobu, východzia doba je 20 minút a možno ju zmeniť. Dôležité je vedieť, že zadáva svoje heslo. Najmä v prípade, že nastavujete sudo na spustenie programov z rôznych skriptov je vhodné, aby príslušný používateľ mohol vykonávať príkaz bez zadania hesla. Toto správanie je možné nastaviť pomocou značky NOPASSWD:

ADMINI ALL=(ejabberd) NOPASSWD: /usr/sbin/ejabberdctl stats *

Takto budú členovia ADMINI môcť zobrazovať štatistiky bez toho, aby museli zadávať heslo. Značka NOPASSWD bude platiť na všetky príkazy, ktoré sú za ňou, takže zápis:

ADMINI ALL=(ALL) SHUTDOWN, NOPASSWD: /usr/sbin/ejabberdctl stats *

bude znamenať, že ADMINI musia stále zadať heslo pri vypínaná/reštarte počítača. Existuje i opačná značka, PASSWD, ktorá naopak zadávanie hesla zapína:

ADMINI ALL=(ALL) NOPASSWD: SHUTDOWN, PASSWD: /usr/sbin/ejabberdctl stats *

Takto zase ADMINI nemusia zadávať heslo pri vypínaní/reštarte, ale naopak musia pri zobrazovaní štatistík ejabberd. S heslom súvisí aj iné nastavenie, a to či bude zadávanie hesla mať vizuálnu odozvu alebo nie.

Konfiguračný adresár

Najnovšie už dokonca nie je ani potrebné upravovať centrálny súbor /etc/sudoers, pretože nastavenie sudo umožňuje použiť súbory v adresári /etc/sudoers.d. Použitie tohoto konfiguračného adresára umožňuje direktíva:

#includedir /etc/sudoers.d

Je možná aj podoba na použite konkrétneho súboru pomocou:

#include /etc/sudoers.local

Dajte však pozor, mriežka na začiatku riadku neudáva, že je direktíva zakomentovaná a neodstraňujte ju! V prípade konfiguračného adresára je treba dodržať niekoľko zásad. Najprv, ignorované sú všetky súbory, ktoré končia znakom vlnovka alebo bodka (aby neboli spracovávané záložné súbory, vytvárané niektorými GUI editormi). Súbory sú spracovávané v abecednom poradí, preto je vhodné použiť pomenovanie, ktoré začína číslami, napr 01_prvý, 10_druhý, atď.

Neviem ako v iných distribúciách, ale v Debiane musí tento adresár obsahovať aspoň jeden súbor a všetky súbory v ňom musia mať nastavené práva na 440.

Ak na úpravu konfigurácie sudo používate visudo, nebudú súbory z konfiguračného adresára zahrnuté (editovateľné) s hlavným konfiguračným súborom, bude však kontrolovaná ich syntax. Takéto súbory potom možno pomocou visudo upravovať pomocou voľby -f súbor.

Zaznamenávanie

Nástroj sudo predvolene zaznamenáva všetky použitia do súboru /var/log/auth.log, záznam úspešného použitia môže vyzerať takto:

Nov 17 09:37:40 soumat sudo: jozo : TTY=pts/1 ; PWD=/home/jozo ; USER=ejabberd ; COMMAND=/usr/sbin/ejabberdctl stats onlineusers

Naopak, neúspešný pokus môže vyzerať takto:

Nov 17 09:39:26 soumat sudo: jozo : command not allowed ; TTY=pts/1 ; PWD=/home/jozo ; USER=ejabberd ; COMMAND=/usr/sbin/ejabberdctl astats onlineusers

Ako sami vidíte, zaznamenaný je čas, stroj (soumat), používateľ (jozo) a okrem iného aj príkaz (COMMAND). Ohľadom príkazu stojí za zmienku, že nie sú zaznamenávané celé príkazy, ale len po znak presmerovania, preto zadanie príkazu v tvare:

sudo -u ejabberd ejabberdctl stats onlineusers > /tmp/ejabb.stat

Bude zaznamenaný len po značku >, teda rovnako ako bez presmerovania… Možno však nastaviť aj posielanie upozornení emailom.

Informácie emailom

Ohľadom zasielania emailov možno nastaviť viacero parametrov. Ako prvý spomeniem voľbu mailto, ktorá udáva komu posielať emaily (predvolene root). Okrem toho možno nastaviť kedy budú emaily posielané:

  • mail_always – posiela email o každom použití sudo, čo môže byť dosť otravné, aj preto je predvolene vypnuté;
  • mail_badpass – informuje o zadaní nesprávneho hesla;
  • mail_no_host – informuje, ak používateľ síce môže používať sudo (je v súbore sudoers), ale nie na danom stroji;
  • mail_no_perms – informuje, ak sa používateľ pokúsi použiť sudo s príkazom, ktorý nemá povolený alebo ho má zakázaný;
  • mail_no_user – informuje, ak používateľ nemá právo používať sudo, predvolene zapnuté.

Samotné nastavenie potom môže vyzerať takto:

Defaults mailto=feroadmin, mail_badpass, mail_no_user, mail_no_perms

Premenné prostredia

Od verzie 1.7.4 došlo k zmene východzieho nastavenia spracovania premenných prostredia tak, že pri použití sudo sú tieto premenné vymazané. Čo to znamená? Napríklad to, že pomocou sudo nespustíte grafický program:

sudo xeyes
No protocol specified
Error: Can't open display: :0

Za toto nastavenie môže riadok konfiguračného súboru (/etc/sudoers):

Defaults env_reset

Náprava je jednoduchá, stačí pridať voľbu, ktorá obsahuje zoznam premenných, ktorých hodnota má byť zachovaná aj pri použití sudo. Aby ste sa vyhli problémom pri aktualizácii (správy, že konfigurácia bola zmenená), je dobré využiť na to konfiguračný adresár, kde si vytvorte súbor, napríklad s menom 99default_env s obsahom:

Defaults env_keep += HOME
Defaults env_keep += DISPLAY
Defaults env_keep += XAUTHORITY

Prvý riadok sa postará o premennú $HOME, ktorá obsahuje cestu domovského adresára, ale ďalšie dve sú tie, ktoré sa postarajú o bezproblémové použitie sudo a grafických programov… Len pripomeniem, že tento súbor musí mať nastavené práva na hodnotu 440:

chmod 440 /etc/sudoers.d/99default_env

Záver

Hoci článok narástol viac ako som pôvodne chcel, ani zďaleka to nie je kompletný popis možností. Ďalšie podrobnosti nájdete v man sudoers alebo v inej forme http://www.gratisoft.us/sudo/sudoers.man.html.