MySQL (62) - Oprávnění podruhé
Jak zajistit, aby se nám k databázi připojovali jen správní lidé ze správného místa?
10.3.2006 06:00 |
Petr Zajíc
| Články autora
| přečteno 20981×
Co můžeme udělat pro nastavení zabezpečení databáze MySQL v praxi a
jak na to jít? O tom bude řeč v dnešním díle seriálu. Zpočátku se Vám
možná bude zdát celá problematika dosti spletitá, ale nakonec zjistíte,
že celý systém je velmi logický a přehledný. Takže, vzhůru na věc!
Jak MySQL ukládá oprávnění
Veškerá oprávnění jsou v MySQL uložena ve zvláštní databázi, která
se jmenuje mysql. V ní je pět tabulek, které s oprávněním tak či onak
souvisejí. MySQL při požadavku na provedení nějaké operace tyto
tabulky dotazuje, a podle výsledku se rozhodne, zda dané oprávnění
přidělí či nikoli. Těmito pěti tabulkami jsou:
- user
- db
- host
- tables_priv
- columns_priv
a v zásadě se dá říci, že se s jejich obsahem dá za určitých
okolností manipulovat přímo. Abychom to celé trochu zjednodušili,
vynecháme z dobrých důvodů tabulku host a budeme se věnovat zbylým
čtyřem. Pro experimenty je dobré v tomto případě mít k dispozici
testovací server s administrátorským přístupem.
MySQL provádí v podstatě dvojí ověřování. První se nazývá ověření při připojení a stanovuje
kdo se odkud smí nebo nesmí k našemu serveru připojit. Pokud to projde
nastupuje druhá
fáze, nazývaná ověření při požadavku.
Ta poskytuje uživatelům ověřeným při připojení práva pro konkrétní akce
na serveru (jako je třeba vkládání dat do tabulek).
Pozn.: V těchto dvou věcech je
podstatný rozdíl. Je klidně možné nakonfigurovat správu uživatelů tak,
aby se někdo mohl připojit, ale potom nemohl provést prakticky žádnou
myslitelnou akci na serveru.
Ověření při připojení
Tady platí, že pro ověření při připojení se používají údaje, které
jsou uloženy v tabulce user. Pokud jste přihlášen jako superuživatel,
můžete si je prohlédnout pomocí
use mysql;
select * from user;
nebo ještě stručněji - protože nás v tuto chvíli zajímají pouze tři
pole - pomocí něčeho jako
select host, user,
password from user;
Jak asi tušíte, ověření při připojení zjišťuje, zda daný uživatel se
smí připojit z daného hostitele - a zda přitom použil správné heslo.
Pokud je všechno v pořádku, pustí MySQL uživatele dál. Pokud ne,
skončíte při přihlašování chybou ve stylu:
ERROR 1045 (28000):
Access denied for user 'xxx'@'host' (using password: NO)
Do tabulky user může
superuživatel (nebo jiný uživatel, pokud má k tomu práva) zapisovat
přímo. Můžete tak například založit uživatele franta s heslem atnarf,
který bude smět přistupovat k serveru z hostitele 192.168.0.100. První,
co Vás asi napadne je provést to pomocí INSERT prostě takto:
insert into user (user,
host, password) values ('franta','192.168.0.100','atnarf');
To nebude fungovat! Důvodem je, že MySQL neukládá hesla ve sloupci
password jako prostý text, ale - zjednodušeně řečeno - ukládá jejich
hash. Ten lze vytovřit pomocí MySQL funkce PASSWORD,
takže vylepšená verze příkazu pro vložení do tabulky user by mohla znít
nějak takto (nesprávně založeného uživatele jsem odstranil):
delete from user where
user = 'franta' and host = '192.168.0.100' and password = 'atnarf';
insert into user (user, host, password) values
('franta','192.168.0.100',password('atnarf'));
Jestliže si to vyzkoušíte, zjistíte pravděpodobně, že to zase nebude
fungovat. Důvodem je tentokrát mechanismus, jakým MySQL obsluhuje
mezipaměť. Je třeba přikázat databázi, aby nový
obsah tabulky user zapsala na disk. To provedete pomocí příkazu flush:
flush privileges;
K čemu dojde? MySQL vyprázdní cache a znovunačte oprávnění. V našem
případě i s nově založeným uživatelem, který se od této chvíle smí se
svým heslem připojit ze stroje 192.168.0.100.
K celému mechanismu bych si dovolil několik poznámek:
- V tabulce user smíte mít jednoho uživatele vícekrát. Například
budete chtít, aby se franta mohl připojit i z hostitele 10.0.0.5. Tudíž
je jedině logické, že pro jednoho uživatele a dva hostitele budou v
tabulce user dva řádky. To není chyba
- Ve výše popsaném případě smí mít tentýž uživatel přistupující k
serveru z různých míst různá hesla. Je to sice hezká funkce, ale moc se
to nepoužívá. Důvodem je to, že by si uživatel musel na každém stroji
pamatovat jiné heslo, což může být poněkud náročné.
- MySQL dovolí nechat políčko host prázdné. V zásadě to znamená,
že daný hostitel se pak může připojit odkudkoli. Nedoporučuji to.
Jednak to asi není to, co chcete, a jednak pak není jasné, zda jste
hostitele pouze zapomněli specifikovat nebo zda má být prázdný.
- MySQL dovolí nechat prázdné políčko pro heslo. Význam je takový,
že heslo pak není pro spojení vůbec požadováno. To sice rovněž nelze
doporučit, ale v praxi se to někdy používá, třeba pro lokální přístup.
- Hostitele lze zadat mnoha způsoby, příklady jsou dostupné v dokumentaci.
Já jsem si například zapamatoval, že při připojení z místního PC lze
zadat jako název hostitele localhost.
Za určitých podmínek lze rovněž zadat více hostitelů - například jednu
podsíť.
- Pochopitelně nesmíte zadat stejnou kombinaci uživatele a
hostitele do tabulky user vícekrát. Jednak je to logický nesmysl, a
jednak je na tabulce user na sloupcích user a host primární klíč - a
ten jak víte musí být unikátní.
- Smíte zadat prázdný název uživatele. To má význam ten, že pak
povolujete anonymní přihlášení. Moc se to nepoužívá. Lze samozřejmě
povolit anonymní přihlášení pouze z určitých hostitelů pomocí prázdného
jména a zadaného hostitele.
Příkaz GRANT
Prozradím rovnou, že přímá modifikace systémových tabulek s
oprávněními
není jediná možnost, jak tato oprávnění spravovat. Přesto je velmi
rozumné vědět, že to můžete provést. Činnosti přidávání uživatelů však
můžeme udělat mnohem jednodušeji pomocí vestavěného SQL příkazu GRANT.
Než bych pracně vysvětloval, jak takový příkaz funguje uvedu příklad.
Stejného efektu, kterého jsme předtím dosáhli ručním vyplněním tabulky
user lze pomocí GRANT dosáhnout takto:
GRANT USAGE ON *.* TO
franta@'192.168.0.100' IDENTIFIED by 'atnarf';
Použití GRANT je mnohem pružnější než přímý zápis do tabulek s
oprávněními nejméně z následujících důvodů:
- Jeho použití nevyžaduje FLUSH PRIVILEGES.
- Heslo se nemusí hashovat pomocí PASSWORD.
- Při změně formátu tabulek s oprávněními (jakože se to v případě
MySQL občas stává) funguje příkaz GRANT konzistentně.
- Narozdíl od vkládání do tabulky pomocí INSERT lze GRANT bezpečně
libovolněkrát opakovat.
- V jednom příkazu GRANT lze vložit více uživatelů nebo více
kombinací uživatel+hostitel.
- Jak uvidíme příště - GRANT může ovlivňovat data ve více
tabulkách, takže je mnohem rychlejší než zadávání několika příkazů
INSERT
Bude dobré si říci, že svoje oprávnění (a leckdy i
oprávnění ostatních) můžete zkontrolovat příkazem SHOW
GRANTS:
show grants;
show grants for 'franta'@'192.168.0.100';
Tím jsme zhruba dokončili ověřování při připojení a příště se
podíváme na to, jak zajistit a spravovat oprávnění při
požadavku.
Verze pro tisk
|
Nejsou žádné diskuzní příspěvky u dané položky.
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|