sql >> Database >  >> RDS >> MariaDB

SQL-firewall eenvoudig gemaakt met ClusterControl &ProxySQL

Het lezen van de titel van deze blogpost roept misschien wat vragen op. SQL-firewall - wat is dat? Wat doet het? Waarom zou ik zoiets in de eerste plaats nodig hebben? Welnu, de mogelijkheid om bepaalde zoekopdrachten te blokkeren, kan in bepaalde situaties van pas komen. Wanneer u ProxySQL voor uw databaseservers gebruikt, kan de proxy alle verzonden SQL-instructies inspecteren. ProxySQL heeft een geavanceerde regelengine en kan zoekopdrachten matchen die moeten worden toegestaan, geblokkeerd, direct opnieuw geschreven of naar een specifieke databaseserver moeten worden gerouteerd. Laten we enkele voorbeelden doornemen.

U hebt een speciale slaaf die door ontwikkelaars wordt gebruikt om hun zoekopdrachten te toetsen aan productiegegevens. U wilt er zeker van zijn dat de ontwikkelaars alleen verbinding kunnen maken met die specifieke host en alleen SELECT-query's kunnen uitvoeren.

Een ander geval, laten we zeggen dat je een te veel ongeluk hebt gehad met mensen die schemawijzigingen uitvoeren en dat je wilt beperken welke gebruikers de ALTER-instructie kunnen uitvoeren.

Laten we tot slot eens nadenken over een paranoïde benadering waarbij gebruikers slechts een vooraf gedefinieerde reeks zoekopdrachten op de witte lijst mogen uitvoeren.

In onze omgeving hebben we een replicatie setup met de master en twee slaves.

Voor onze databases hebben we drie ProxySQL-knooppunten met Keepalive die het virtuele IP-adres beheert. We hebben ook een ProxySQL-cluster geconfigureerd (zoals uitgelegd in deze vorige blog), zodat we ons geen zorgen hoeven te maken over het drie keer maken van configuratie- of queryregelwijzigingen op alle drie ProxySQL-knooppunten. Voor de zoekregels is een eenvoudige lees-schrijf-splitsing ingesteld:

Laten we eens kijken hoe ProxySQL, met zijn uitgebreide mechanisme voor queryregels, ons kan helpen onze doelen in al die drie gevallen te bereiken.

Gebruikerstoegang tot een enkele hostgroep vergrendelen

Een toegewijde slaaf die beschikbaar is voor ontwikkelaars - dit is niet ongebruikelijk. Zolang uw ontwikkelaars toegang hebben tot productiegegevens (en als ze niet zijn toegestaan, bijvoorbeeld vanwege nalevingsredenen, kan het maskeren van gegevens zoals uitgelegd in onze ProxySQL-zelfstudie helpen), kan dit hen helpen om query's op de echte wereldgegevens te testen en te optimaliseren set. Het kan ook helpen om gegevens te verifiëren voordat u enkele schemawijzigingen uitvoert. Is mijn kolom bijvoorbeeld echt uniek voordat een unieke index wordt toegevoegd?

Met ProxySQL is het vrij eenvoudig om de toegang te beperken. Laten we om te beginnen aannemen dat de hostgroep 30 de slaaf bevat waartoe ontwikkelaars toegang willen hebben.

We hebben een gebruiker nodig die door de ontwikkelaars zal worden gebruikt om toegang te krijgen tot die slaaf. Als je het al in ProxySQL hebt, is dat prima. Als dat niet het geval is, moet u het misschien importeren in ProxySQL (als het is gemaakt in MySQL maar niet in ProxySQL) of het op beide locaties maken (als u een nieuwe gebruiker gaat maken). Laten we gaan met de laatste optie, een nieuwe gebruiker maken.

Laten we een nieuwe gebruiker maken met beperkte rechten op zowel MySQL als ProxySQL. We zullen het gebruiken in zoekregels om verkeer te identificeren dat van de ontwikkelaars komt.

In deze queryregel gaan we alle query's die door dev_test-gebruiker worden uitgevoerd omleiden naar de hostgroep 30. We willen dat deze regel actief is en dat het de laatste regel moet zijn die moet worden geparseerd, daarom hebben we 'Toepassen' ingeschakeld. We hebben RuleID ook zo geconfigureerd dat deze kleiner is dan de ID van de eerste bestaande regel, omdat we willen dat deze query wordt uitgevoerd buiten de normale lees-/schrijfconfiguratie voor splitsen.

Zoals je kunt zien, hebben we een gebruikersnaam gebruikt, maar er zijn ook andere opties.

Als u kunt voorspellen welke ontwikkelingshosts het verkeer naar de database zullen sturen (u kunt ontwikkelaars bijvoorbeeld een specifieke proxy laten gebruiken voordat ze de database kunnen bereiken), kunt u ook de optie "Client Address" gebruiken om de door die database uitgevoerde query's te matchen enkele host en stuur ze door naar een juiste hostgroep.

Gebruiker niet toestaan ​​bepaalde zoekopdrachten uit te voeren

Laten we nu eens kijken naar het geval waarin we de uitvoering van bepaalde opdrachten tot een bepaalde gebruiker willen beperken. Dit kan handig zijn om ervoor te zorgen dat de juiste mensen sommige van de prestaties kunnen uitvoeren die van invloed zijn op query's, zoals schemawijzigingen. ALTER is de query die we in dit voorbeeld zullen gebruiken. Laten we om te beginnen een nieuwe gebruiker toevoegen die schemawijzigingen mag uitvoeren. We zullen het 'admin_user' noemen. Vervolgens moeten we de vereiste queryregels maken.

We zullen een queryregel maken die de reguliere expressie '.*ALTER TABLE.*' gebruikt om de query's te matchen. Deze queryregel moet worden uitgevoerd vóór andere lees-/schrijfregels voor splitsen. We hebben er een regel-ID van 20 aan toegewezen. We definiëren een foutmelding die naar de klant wordt teruggestuurd als deze queryregel wordt geactiveerd. Als we klaar zijn, gaan we verder met een andere queryregel.

Hier gebruiken we dezelfde reguliere expressie om de query op te vangen, maar we definiëren geen fouttekst (wat betekent dat de query geen fout retourneert). We definiëren ook welke gebruiker het mag uitvoeren (admin_user in ons geval). We zorgen ervoor dat deze zoekopdracht vóór de vorige wordt gecontroleerd, dus hebben we er een lagere regel-ID van 19 aan toegewezen.

Zodra deze twee zoekregels zijn ingevoerd, kunnen we testen hoe ze werken. Laten we proberen in te loggen als een applicatiegebruiker en een ALTER TABLE-query uit te voeren:

[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

Zoals verwacht konden we deze query niet uitvoeren en kregen we een foutmelding. Laten we nu proberen verbinding te maken met onze '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

We zijn erin geslaagd om de ALTER uit te voeren terwijl we inlogden met 'admin_user'. Dit is een heel eenvoudige manier om ervoor te zorgen dat alleen benoemde mensen schemawijzigingen in uw databases kunnen uitvoeren.

Een witte lijst met toegestane zoekopdrachten maken

Laten we tot slot eens kijken naar een strak vergrendelde omgeving waarin alleen vooraf gedefinieerde query's kunnen worden uitgevoerd. ProxySQL kan eenvoudig worden gebruikt om dergelijke instellingen te implementeren.

Allereerst moeten we alle bestaande queryregels verwijderen voordat we kunnen implementeren wat we nodig hebben. Vervolgens moeten we een verzamelregel voor zoekopdrachten maken, die alle zoekopdrachten blokkeert:

De rest die we moeten doen, is queryregels maken voor alle toegestane query's. U kunt één regel per query uitvoeren. Of u kunt reguliere expressies gebruiken als SELECT's bijvoorbeeld altijd goed kunnen worden uitgevoerd. Het enige dat u moet onthouden, is dat de regel-ID kleiner moet zijn dan de regel-ID van deze allesomvattende regel, en ervoor moet zorgen dat de zoekopdracht uiteindelijk de regel raakt met 'Toepassen' ingeschakeld.

We hopen dat deze blogpost u enig inzicht heeft gegeven in hoe u ClusterControl en ProxySQL kunt gebruiken om de beveiliging te verbeteren en naleving van uw databases te garanderen.


  1. Equivalent van varchar(max) in MySQL?

  2. Hoe MySQL starten met --skip-grant-tables?

  3. script om mysql dump sql-bestand te converteren naar een formaat dat kan worden geïmporteerd in sqlite3 db

  4. Een Enum-veld wijzigen met Alembic