sql >> Databáze >  >> RDS >> MariaDB

SQL Firewalling snadno s ClusterControl &ProxySQL

Čtení názvu tohoto blogového příspěvku může vyvolat některé otázky. SQL firewall - co to je? Co to dělá? Proč bych něco takového vůbec potřeboval? Schopnost blokovat určité dotazy by se v určitých situacích mohla hodit. Při použití ProxySQL před vašimi databázovými servery je proxy schopen kontrolovat všechny odesílané SQL příkazy. ProxySQL má sofistikovaný modul pravidel a dokáže porovnat dotazy, které mají být povoleny, blokovány, přepsány za běhu nebo směrovány na konkrétní databázový server. Pojďme si projít několik příkladů.

Máte vyhrazeného otroka, který používají vývojáři k testování svých dotazů na produkčních datech. Chcete se ujistit, že se vývojáři mohou připojit pouze k tomuto konkrétnímu hostiteli a provádět pouze SELECT dotazy.

Jiný případ, řekněme, že jste se setkali s příliš mnoha nehodami s lidmi spouštějícími změny schématu a chtěli byste omezit, kteří uživatelé mohou provádět příkaz ALTER.

Nakonec se zamysleme nad paranoidním přístupem, ve kterém mohou uživatelé provádět pouze předem definovanou sadu dotazů na seznamu povolených.

V našem prostředí máme nastavení replikace s hlavním a dvěma podřízenými.

Před našimi databázemi máme tři ProxySQL uzly s Keepalived spravující virtuální IP. Máme také nakonfigurovaný cluster ProxySQL (jak je vysvětleno v tomto předchozím blogu), takže se nemusíme starat o provádění změn konfigurace nebo pravidel dotazu třikrát na všech třech uzlech ProxySQL. Pro pravidla dotazu je nastaveno jednoduché rozdělení pro čtení a zápis:

Pojďme se podívat na to, jak nám může ProxySQL se svým rozsáhlým mechanismem pravidel dotazů pomoci dosáhnout našich cílů ve všech těchto třech případech.

Zamknutí uživatelského přístupu k jedné hostitelské skupině

Dedikovaný slave dostupný vývojářům - to není neobvyklá praxe. Dokud budou mít vaši vývojáři přístup k produkčním datům (a pokud jim to není povoleno, např. z důvodu dodržování předpisů, může jim pomoci maskování dat, jak je vysvětleno v našem tutoriálu ProxySQL), může jim to pomoci testovat a optimalizovat dotazy na reálná data. soubor. Může také pomoci ověřit data před provedením některých změn schématu. Je například můj sloupec před přidáním jedinečného indexu skutečně jedinečný?

S ProxySQL je poměrně snadné omezit přístup. Pro začátek předpokládejme, že hostitelská skupina 30 obsahuje slave, ke kterému chceme, aby vývojáři měli přístup.

Potřebujeme uživatele, kterého vývojáři použijí pro přístup k tomuto otroku. Pokud to již máte v ProxySQL, je to v pořádku. Pokud ne, možná jej budete muset importovat do ProxySQL (pokud je vytvořen v MySQL, ale ne v ProxySQL), nebo jej vytvořit v obou umístěních (pokud budete vytvářet nového uživatele). Pojďme k poslední možnosti, vytvoření nového uživatele.

Vytvořme nového uživatele s omezenými oprávněními pro MySQL i ProxySQL. Použijeme jej v pravidlech dotazů k identifikaci provozu přicházejícího od vývojářů.

V tomto pravidle dotazu přesměrujeme všechny dotazy, které provádí uživatel dev_test, do hostitelské skupiny 30. Chceme, aby toto pravidlo bylo aktivní a mělo by to být poslední, které se má analyzovat, proto jsme povolili ‚Použít‘. Také jsme nakonfigurovali RuleID tak, aby bylo menší než ID prvního existujícího pravidla, protože chceme, aby se tento dotaz spouštěl mimo běžné nastavení rozdělení čtení/zápisu.

Jak můžete vidět, použili jsme uživatelské jméno, ale existují i ​​další možnosti.

Pokud můžete předvídat, kteří vývojoví hostitelé budou posílat provoz do databáze (například můžete vývojářům umožnit, aby předtím, než se dostanou do databáze, použili konkrétní proxy), můžete také použít možnost „Adresa klienta“ k přiřazení dotazů provedených tímto serverem. jednoho hostitele a přesměrujte je na správnou hostitelskou skupinu.

Zakázání uživateli provádět určité dotazy

Nyní se podívejme na případ, kdy chceme omezit provádění některých konkrétních příkazů na daného uživatele. To by mohlo být užitečné, abyste zajistili, že ti správní lidé budou moci spouštět některé z dotazů ovlivňujících výkon, jako jsou změny schématu. ALTER bude dotaz, který použijeme v tomto příkladu. Pro začátek přidejte nového uživatele, který bude moci spouštět změny schématu. Budeme to nazývat ‚admin_user‘. Dále musíme vytvořit požadovaná pravidla dotazu.

Vytvoříme pravidlo dotazu, které používá regulární výraz „.*ALTER TABLE.*“ pro shodu s dotazy. Toto pravidlo dotazu by mělo být provedeno před jinými pravidly rozdělení pro čtení/zápis. Přiřadili jsme mu ID pravidla 20. Definujeme chybovou zprávu, která bude vrácena klientovi v případě, že bude spuštěno toto pravidlo dotazu. Po dokončení přejdeme k dalšímu pravidlu dotazu.

Zde používáme stejný regulární výraz k zachycení dotazu, ale nedefinujeme žádný text chyby (což znamená, že dotaz nevrátí chybu). Také definujeme, který uživatel jej může spustit (v našem případě admin_user). Dbáme na to, aby byl tento dotaz zkontrolován před předchozím, proto jsme mu přiřadili nižší ID pravidla 19.

Jakmile budou tato dvě pravidla dotazu zavedena, můžeme otestovat, jak fungují. Zkusme se přihlásit jako uživatel aplikace a spustit dotaz ALTER TABLE:

[email protected]:~# mysql -P6033 -usbtest -ppass -h10.0.0.111
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 43160
Server version: 5.5.30 (ProxySQL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use sbtest;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> alter table sbtest1 add index (pad);
ERROR 1148 (42000): You are not allowed to execute ALTER
mysql> ^DBye

Podle očekávání jsme tento dotaz nemohli provést a obdrželi jsme chybovou zprávu. Zkusme se nyní připojit pomocí našeho ‚admin_user‘:

[email protected]:~# mysql -P6033 -uadmin_user -ppass -h10.0.0.111
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 43180
Server version: 5.5.30 (ProxySQL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use sbtest;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> alter table sbtest1 add index (pad);
Query OK, 0 rows affected (0.99 sec)
Records: 0  Duplicates: 0  Warnings: 0

Podařilo se nám provést ALTER, když jsme se přihlásili pomocí „admin_user“. Jedná se o velmi jednoduchý způsob, jak zajistit, že změny schémat ve vašich databázích mohou provádět pouze jmenovaní lidé.

Vytvoření seznamu povolených dotazů

Nakonec se podívejme na pevně uzamčené prostředí, kde lze provádět pouze předdefinované dotazy. ProxySQL lze snadno použít k implementaci takového nastavení.

Nejprve musíme odstranit všechna existující pravidla dotazů, než budeme moci implementovat to, co potřebujeme. Potom musíme vytvořit pravidlo catch-all dotazu, které zablokuje všechny dotazy:

Zbytek, který musíme udělat, je vytvořit pravidla dotazů pro všechny povolené dotazy. Pro každý dotaz můžete vytvořit jedno pravidlo. Nebo můžete použít regulární výrazy, pokud je například spuštění příkazů SELECT vždy v pořádku. Jediná věc, kterou si musíte zapamatovat, je, že ID pravidla musí být menší než ID pravidla tohoto univerzálního pravidla a zajistit, že dotaz nakonec narazí na pravidlo se zapnutou možností „Použít“.

Doufáme, že vám tento příspěvek na blogu poskytl určitý přehled o tom, jak můžete využít ClusterControl a ProxySQL ke zlepšení zabezpečení a zajištění souladu vašich databází.


  1. T-SQL dotaz pro zobrazení definice tabulky?

  2. SQL - Jak vybrat řádek se sloupcem s maximální hodnotou

  3. Salesforce SOQL ze serveru SQL Server

  4. Vertikální škálování PostgreSQL