Image
24.5.2016 0 Comments

Databázy / 10. časť

Späť na úvod >> Späť na seriál

V predošlej časti sme si vysvetlili, ako sa definujú globálne a lokálne prístupové práva. Sľúbil som, že si tentoraz ukážeme oveľa jednoduchší a efektívnejší spôsob. Asi sa pýtate, prečo som vám to neukázal hneď, ale som vás nechal trápiť sa s nejakými grant tabuľkami. No, aby sme rozumeli, čo vlastne konáme, bola prepotrebná predchádzajúca teória. A bez nej by sme neboli schopní analyzovať, čo ktorý používateľ môže alebo nie. (A takáto analýza sa robí veľmi často! Veď uvidíte!) Ostatné dôvody vyplynú z tejto časti.

TROCHA TEÓRIE. Vieme, že ak chceme definovať globálne práva k celému SQL serveru, upravujeme tabuľku USER. Ak definujeme lokálne práva k niektorej databáze, upravujeme tabuľku DB. (My dokážeme dokonca definovať práva k jednotlivej tabuľke alebo stĺpcu tabuľky, vtedy upravujeme tabuľky Tables_Priv a Columns_Priv. Ako sme si však povedali, toto si vysvetlíme inokedy, zatiaľ stačí ten základ – tabuľky USER, DB a HOST.)
Ak chceme definovať práva ešte podrobnejšie, upravujeme aj tabuľku HOST.  Po potrebnej úprave musíme grant tabuľky reflušovať.
Od verzie 3.23.xx je možné na definíciu prístupových práv použiť príkazy GRANT a REVOKE. Tie obdobným spôsobom upravia grant tabuľky v databáze mysql, ako sme to my robili ručne v predchádzajúcej časti seriálu.
GRANT. Príkaz GRANT umožňuje pridávanie nových používateľov a definovanie prístupových práv nových alebo už existujúcich používateľov.
Syntaktický zápis príkazu GRANT je takýto:
GRANT privilégiá ON čo TO používateľ IDENTIFIED BY ”heslo“ [WITH GRANT OPTION]

Pozrime sa na jednotlivé parametre príkazu:
Privilégiá
Tu definujeme privilégiá, ktoré chceme danému používateľovi prideliť. Môže to byť len jedno privilégium alebo dve-tri a viac, alebo všetky privilégiá. Jednotlivé privilégiá oddeľujeme čiarkou.
V tabuľke č. 1 sú opísané jednotlivé privilégiá a ich význam, čo umožňujú. Isto sa vám mnohé z nich budú zdať veľmi podobné privilégiám, ktoré sú definované v grant tabuľkách.

Privilégium              Umožňuje

ALTER

Pozmenenie tabuľky alebo indexu

CREATE

Vytvorenie databázy alebo tabuľky

DELETE

Vymazanie existujúceho záznamu z tabuľky

DROP

Odstránenie databázy alebo tabuľky

INDEX

Vytvorenie alebo zmazanie indexu

INSERT

Vloženie nového záznamu do tabuľky

REFERENCES

Nepoužité

SELECT

Vybratie existujúcich záznamov z tabuľky

UPDATE

Úprava existujúcich záznamov

FILE

Čítanie a zápis súborov na server

PROCESS

Prezretie informácií o serveri

RELOAD

Znovunačítanie grant tabuliek a cache tabuliek

SHUTDOWN

Zastavenie servera

ALL

Všetky práva

USAGE

Iba definovať používateľa bez práv

Tab. 1  Definície privilégií v príkazoch GRANT a REVOKE

Vidíme, že prvá skupina parametrov slúži na manipuláciu s databázami a tabuľkami. Druhá skupina je skupina administrátorských práv k SQL serveru. Trietia skupina je špecifická – ALL znamená všetky opisované práva a USAGE slúži na vytvorenie nového používateľa bez všetkých práv.
čo
definuje, k čomu budú stanovené privilégiá definované, teda ku ktorej databáze alebo tabuľke k nej. V tomto prípade sa využíva nám už známy „bodkový zápis“ – databáza.tabuľka.
Napríklad kniznica.kniha značí, že konkrétne privilégiá budú nastavené k tabuľke kniha v databáze kniznica.
Existujú aj špecifické „žolíkové“ zápisy:
- *.* – značí všetky tabuľky všetkých databáz, teda všade – globálne privilégiá,
- kniznica.* – značí všetky tabuľky v databáze kniznica.
užívateľ
značí, ktorému používateľovi budú konkrétne privilégiá nastavené. Jednotlivý používateľ sa definuje menom a klientom, z ktorého sa môže konektovať na server. Takto teda môžeme definovať používateľa pod rovnakým menom pristupujúceho z rôznych počítačov. Zápis je veľmi podobný emailovej adrese typu meno@názov_počítača, napr.:

  • mior@localhost značí používateľa mior pristupujúceho z lokálnej konzoly
  • mior@192.168.10.152 značí používateľa mior z IP adresy 192.168.10.152
  • mior@doma značí používateľa mior z počítača s názvom doma.

Ak zadáme iba meno, ale nedefinujeme klienta, z ktorého sa môže hlásiť, znamená to, ako keby sme definovali “%” – teda ľubovoľný klient, napr.:

  • mior
  • mior@
  • mior@%

Keby MySQL server protestoval, vložíme meno aj klienta do úvodzoviek alebo apostrofov, každého zvlášť, napr. “mior”@”doma”.
Ak nezadáme meno, ale len klienta, napr. “”@localhost, značí to, že definujeme ľubovoľného používateľa – známeho ako anonymous.
heslo
je heslo, ktorým sa bude daný používateľ autentifikovať. Heslo uvádzame vždy v úvodzovkách alebo v apostrofoch.

WITH GRANT OPTION. Tento voliteľný parameter znamená, že takto definovaný používateľ môže svoje stanovené práva ku konkrétnej databáze alebo tabuľke preniesť na iného používateľa. Keďže je táto vlastnosť pomerne nebezpečná, používajme ju len v najnevyhnutnejších prípadoch.
Ako by sme si teda predstavili uvedený zápis?
Zvoľme si príklad:
GRANT SELECT, INSERT ON kniznica.zaner TO mior@doma IDENTIFIED BY “newpass”

Skúsme si to preložiť ako:
Prideľ práva na selekt a vkladanie k tabuľke ZANER v databáze KNIZNICA pre používateľa mior z klientskeho počítača s názvom doma, ktorý sa bude autorizovať nielen svojím menom mior, ale aj heslom newpass.
Zložité? Ale ani nie.

Ak nie je ešte používateľ mior z klientskeho počítača doma definovaný v grant tabuľkách, tak sa automaticky vytvorí. V prípade, že už existuje, vykonajú sa iba príslušné zmeny privilégií. V takom prípade už nie je potrebné definovať heslo, a tak celú sekciu IDENTIFIED BY vynecháme. Samozrejme, predtým definované heslo sa zachováva.
Ak chceme pridať používateľa, ale mu nechceme (zatiaľ) definovať žiadne práva, použijeme privilégium USAGE takto:
GRANT USAGE ON *.* to citatel IDENTIFIED BY “heshes”

Poznámka:
Na rozdiel od ručnej manipulácie s grant tabuľkami NIE JE POTREBNÉ tabuľky reflušovať! Toto zabezpečí príkaz GRAND (aj REVOKE) sám.
REVOKE. Ak chceme nejakému používateľovi niektoré (alebo aj všetky) privilégiá odobrať, použijeme príkaz REVOKE.
Jeho syntaktický zápis je:
REVOKE privilégiá ON čo FROM používateľ

Zápis je veľmi podobný príkazu GRANT, ibaže privilégiá sa nepridávajú k niekomu (TO), ale odoberajú od niekoho (FROM).
Príkaz REVOKE nie je schopný používateľa z grant tabuľky vymazať, vie mu iba odobrať práva. Preto ak chceme niektorého používateľa z grant tabuliek vymazať, musíme použiť klasický spôsob, napr.:
mysql> DELETE from USER where user = ‘meno_pouzivatela’ AND host = ‘meno_pocitaca’;
mysql> FLUSH PRIVILEGES;

Tento príkaz je nám už dobre známy, a tak si ho nebudeme vysvetľovať. V tomto prípade však nesmieme zabudnúť grant tabuľky reflušovať!
Vysvetlili sme si základnú teóriu, ale poďme si to teraz ukázať na príkladoch.

TROCHU PRAXE. Aby sme si mohli precvičiť príkazy GRANT a REVOKE, nadefinujeme si ďalších činovníkov v našej imaginárnej knižnici. Budú to akoby dvojičky k už definovaným používateľom, ktorým budeme definovať rovnaké práva ako ich vzorom. Veď zastupiteľnosť alebo duplicita je stále aktuálna v štátnej správe. Rovnaké práva nadefinujeme preto, aby sme si mohli pohľadom do grant tabuliek porovnať, že definovanie práv pomocou GRANT/REVOKE je identické s klasickým zadávaním. (Teda skoro, o tom ďalej.)
Takže pán riaditeľ bude mať svojho námestníka (kto nevie, čo to znamená, nech sa spýta svojich rodičov), pani vedúcu bude zastupovať pani účtovníčka a slečnu referentku stará pani kuchárka. A čitateľov bude zastupovať pán Karafiát. A do knižnice sa prihlásil aj mladík menom Chytrý, ale ešte nezaplatil členské.
Aha, ešte nám tu chýba jeden veľmi dôležitý človek. Bude to administrátor, pomenujme si ho admin. A prisúdime mu najvyššie správcovské práva. To preto, aby aj root mohol ísť spokojne na dovolenku...
Aby sme mohli overiť ich práva, budeme predpokladať, že všetci pracujú na lokále.
Spomeňme si, aké prístupové práva majú nadefinované pán riaditeľ, pani vedúca, slečna referentka a ľubovoľný čitateľ.
Teraz príkazom GRANT vytvoríme pána administrátora, ako aj jednotlivých zástupcov a zároveň im priradíme zodpovedajúce privilégiá.
Vieme, že administrátor admin s heslom super dostane superpoužívateľské, teda globálne práva. Preto ich definujeme ako *.*. Potom príkaz GRANT vyzerá takto:
mysql> GRANT ALL ON *.* TO admin@localhost
IDENTIFIED BY ‘super’;

Čo vlastne tento príkaz vykoná? Opíšme si ho „manuálnym“ klasickým spôsobom.

mysql>  insert into USER (host, user, password,
select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, Reload_priv, shutdown_priv, process_priv, file_priv, grant_priv, references_priv, index_priv, alter_priv)
VALUES (‘localhost’,’admin’,password(‘super’),
‘Y’,’Y’,’Y’, ‘Y’,’Y’,’Y’, ‘Y’,’Y’,’Y’, ‘Y’,’Y’,’Y’, ‘Y’,’Y’);

A aby sa aktivovali zmeny, musíme zadať:
mysql> Flush Privileges;

Teraz zadefinujeme pána námestníka, ktorý sa bude hlásiť heslom ‘zastup’. Tento však už nemá globálne práva, ale len lokálne práva ku všetkým tabuľkám v databáze KNIZNICA:

mysql> GRANT ALL ON kniznica.* TO namestnik@localhost
IDENTIFIED BY ‘zastup’;

Ako by sme to urobili ručne, keby neexistoval príkaz GRANT?
Naprv by sme ho mali zadefinovať v tabuľke USER, ale nepridelili by sme mu žiadne globálne práva:

mysql>  insert into USER (host, user, password,
select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, Reload_priv, shutdown_priv, process_priv, file_priv, grant_priv, references_priv, index_priv, alter_priv)
VALUES (‘localhost’,’namestnik’,password(‘zastup’),
      ‘N’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’);

Teraz v zmysle predošlej časti by sme museli definovať lokálne práva, a to v tabuľke DB:

mysql> insert into DB (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv)
VALUES (‘localhost’,’kniznica’, ’riaditel’, ‘Y’,’Y’,’Y’, ‘Y’,’Y’,’Y’, ‘Y’,’Y’,’Y’,’Y’);

Nesmieme zabudnúť na:
mysql> Flush Privileges;

Vidíme, koľko práce nám ušetrí príkaz GRANT!
odobným spôsobom definujeme pani účtovníčku ucto s heslom financ:

mysql> grant select, insert, update, delete on kniznica.* TO ucto@localhost
identified by ‘financ’;

a veľmi obdobne by to v manuálnom zadávaní vyzeralo takto:

mysql>  insert into USER (host, user, password,
select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, Reload_priv, shutdown_priv, process_priv, file_priv, grant_priv, references_priv, index_priv, alter_priv)
VALUES (‘localhost’,’ucto’,password(‘financ’),
      ‘N’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’);

mysql> insert into DB (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv)
VALUES (‘localhost’,’kniznica’, ’ucto’, ‘Y’,’Y’,’Y’, ‘Y’,’N’,’N’, ‘N’,’N’,’N’,’N’);
mysql> Flush Privileges;

Teraz vytvoríme pani kuchárku, ktorá si zvolila priliehavé heslo varecha:
mysql> GRANT SELECT, INSERT ON kniznica.* TO kucharka@localhost
IDENTIFIED BY 'varecha';

Teraz už tušíte, že tento príkaz v skutočnosti vykoná túto trojicu príkazov:

mysql>  insert into USER (host, user, password,
select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, Reload_priv, shutdown_priv, process_priv, file_priv, grant_priv, references_priv, index_priv, alter_priv)
VALUES (‘localhost’,’kuchárka’,password(‘varecha’),
      ‘N’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’);

mysql> insert into DB (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv)
VALUES (‘localhost’,’kniznica’, ’kucharka’, ‘Y’,’Y’,’N’, ‘N’,’N’,’N’, ‘N’,’N’,’N’,’N’);

mysql> Flush Privileges;

Nesmieme zabudnúť na pána Karafiáta s heslom klincek, ktorý môže ako anonymous iba prezerať záznamy (select):

mysql> GRANT SELECT ON kniznica.* TO karafiat@localhost
      IDENTIFIED BY 'klincek';

A čo sa v skutočnosti vykoná?
No predsa:

mysql>  insert into USER (host, user, password,
select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, Reload_priv, shutdown_priv, process_priv, file_priv, grant_priv, references_priv, index_priv, alter_priv)
VALUES (‘localhost’,’karafiat’,password(‘klincek’),
      ‘N’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’);

mysql> insert into DB (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv)
VALUES (‘localhost’,’kniznica’, ’karafiat’, ‘Y’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’,’N’,’N’);

mysql> Flush Privileges;

A nakoniec definujeme mladíka Chytrého. Keďže ani po opakovanej výzve nezaplatil členské príspevky, nepridelíme mu zatiaľ žiadne privilégium a ani heslo:
mysql> GRANT USAGE ON kniznica.* TO chytry@localhost;

Aj u neho by to bolo ručne prácne:

mysql>  insert into USER (host, user, password,
select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, Reload_priv, shutdown_priv, process_priv, file_priv, grant_priv, references_priv, index_priv, alter_priv)
VALUES (‘localhost’,’chytry’,password(‘’),
      ‘N’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’);

mysql> insert into DB (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv)
VALUES (‘localhost’,’kniznica’, ’chytry’, ‘N’,’N’,’N’, ‘N’,’N’,’N’, ‘N’,’N’,’N’,’N’);

mysql> Flush Privileges;

(Asi vás napadne jedna vec: Ak príde pán Chytrý a prihlási sa ako chytry, nebude môcť vykonať nič okrem spojenia. Ale keďže je chytrý, prihlási sa ako anonymous, teda vymyslí si ľubovoľné meno, ktoré v knižnici definované nie je, bude môcť aspoň selektovať! Tu vidíme dobrý príklad bezpečnostnej diery! Alebo sú to tzv. zadné dvierka?)

POROVNANIE. Teraz si porovnáme pridelené globálne prístupové práva, ktoré sme pridelili príkazom GRANT,  s tými, ktoré sme pridelili klasickým spôsobom v predchádzajúcej časti.
Na obr. 1 je výpis tabuľky USER (tabuľky sú opticky upravené, aby neboli veľmi rozsiahle; jednotlivé stĺpce zodpovedajú konkrétnym právam):

Porovnajme vytvorené dvojice:

  • riaditel – namestnik
  • veduca – ucto
  • referent – kucharka
  • “” (anonymous) – karafiat

V tomto prípade vidíme, že nemajú pridelené žiadne globálne práva.

Pozrime sa teraz na dvojicu root – admin. Obidvaja majú nastavené globálne práva. Sú skoro rovnaké, s výnimkou jedného práva – Grant_Privileges. Root ho má povolený, admin nie. To preto, že pri jeho definícii sme nepoužili parameter WITH GRANT OPTION. V takom prípade admin nemôže odovzdať svoje práva niekomu inému. Ako sa vlastne odovzdávajú také práva? No predsa tak, že ten, kto má túto možnosť povolenú, použije príkaz GRANT. Tak prenesie práva na inú osobu. Môžu to byť všetky alebo len niektoré práva.

Ako vidíme, pán Chytrý nemá páru. A ani on nemá pridelené žiadne globálne práva.
Na obr. 2 je výpis tabuľky DB, kde sú definované lokálne práva:

Porovnajme naše dvojice:
 Vidíme, že riaditel a namestnik majú rovnaké práva okrem Grant_Privileges. To preto, lebo sme ani v tomto prípade nepoužili parameter WITH GRANT OPTION.
Veduca a ucto majú takisto rovnaké práva a úplne zodpovedajú našim požiadavkám. Takisto aj referent a kucharka alebo anonymous a karafiat.
Len pán chytry nemá povolené žiadne právo, pokým nezaplatí členský poplatok.
V tejto tabuľke nie je ani zmienka o rootovi a adminovi. My už vieme, prečo je to tak. Ak má niekto definované globálne práva (v tabuľke USER), už nepotrebuje lokálne práva (v tabuľke DB). Globálne práva sú nadradené lokálnym právam.

Ak ste dávali pozor, všimli ste si, že príkazy GRANT a REVOKE neovplyvňujú tabuľku HOST, ktorá slúži na jemnejšie definovanie prístupových práv. Preto ak potrebujeme takéto členenie, musíme použiť klasické definovanie práv v tejto tabuľke. No v mnohých prípadoch si vystačíme s použitými postupmi.
Za domácu úlohu si vyskúšajte konektovanie ako jednotliví pracovníci knižnice a skúšajte, čo všetko je vám v databáze knižnica dovolené.
Tým sme prvý diel seriálu doviedli do konca. Nabudúce sa začneme venovať trochu efektívnejšej práci – tvorbe klientskeho, používateľsky príjemnejšieho prostredia.

Zobrazit Galériu

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 2

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá