sql >> Database teknologi >  >> RDS >> MariaDB

SQL Firewalling gjort let med ClusterControl &ProxySQL

At læse titlen på dette blogindlæg kan rejse nogle spørgsmål. SQL firewall - hvad er det? Hvad gør den? Hvorfor skulle jeg have brug for sådan noget i første omgang? Nå, muligheden for at blokere visse forespørgsler kan være nyttig i visse situationer. Når du bruger ProxySQL foran dine databaseservere, er proxyen i stand til at inspicere alle SQL-sætninger, der sendes. ProxySQL har en sofistikeret regelmotor og kan matche forespørgsler, der skal tillades, blokeres, omskrives på farten eller dirigeres til en specifik databaseserver. Lad os gennemgå nogle eksempler.

Du har en dedikeret slave, som bruges af udviklere til at teste deres forespørgsler mod produktionsdata. Du vil sikre dig, at udviklerne kun kan oprette forbindelse til den pågældende vært og kun udføre SELECT-forespørgsler.

Et andet tilfælde, lad os sige, at du stødte på én for mange ulykker med folk, der kørte skemaændringer, og du vil gerne begrænse, hvilke brugere der kan udføre ALTER-sætningen.

Lad os endelig tænke på en paranoid tilgang, hvor brugere får lov til at udføre kun et foruddefineret sæt af hvidlistede forespørgsler.

I vores miljø har vi en replikeringsopsætning med masteren og to slaver.

Foran vores databaser har vi tre ProxySQL-noder med Keepalved, der administrerer Virtual IP. Vi har også ProxySQL-klynge konfigureret (som forklaret i denne tidligere blog), så vi ikke behøver at bekymre os om at lave konfigurations- eller forespørgselsregelændringer tre gange på alle tre ProxySQL-noder. For forespørgselsreglerne er der opsat en simpel læse-skriveopdeling:

Lad os tage et kig på, hvordan ProxySQL med sin omfattende forespørgselsreglermekanisme kan hjælpe os med at nå vores mål i alle disse tre tilfælde.

Låsning af brugeradgang til en enkelt værtsgruppe

En dedikeret slave tilgængelig for udviklere - dette er ikke usædvanlig praksis. Så længe dine udviklere kan få adgang til produktionsdata (og hvis de ikke er tilladt, f.eks. på grund af overholdelsesårsager, kan datamaskering som forklaret i vores ProxySQL-tutorial hjælpe), kan dette hjælpe dem med at teste og optimere forespørgsler på data fra den virkelige verden sæt. Det kan også hjælpe at verificere data, før du udfører nogle af skemaændringerne. For eksempel, er min kolonne virkelig unik før tilføjelse af et unikt indeks?

Med ProxySQL er det ret nemt at begrænse adgangen. Lad os for det første antage, at værtsgruppen 30 indeholder den slave, som vi ønsker, at udviklere skal have adgang til.

Vi har brug for en bruger, som vil blive brugt af udviklerne til at få adgang til den slave. Hvis du allerede har det i ProxySQL, er det fint. Hvis ikke, skal du muligvis enten importere den til ProxySQL (hvis den er oprettet i MySQL, men ikke i ProxySQL) eller oprette den begge steder (hvis du vil oprette en ny bruger). Lad os gå med den sidste mulighed, oprette en ny bruger.

Lad os oprette en ny bruger med begrænsede privilegier på både MySQL og ProxySQL. Vi vil bruge det i forespørgselsregler til at identificere trafik, der kommer fra udviklerne.

I denne forespørgselsregel vil vi omdirigere alle de forespørgsler, som udføres af dev_test-brugeren, til værtsgruppen 30. Vi ønsker, at denne regel skal være aktiv, og den skal være den sidste, der skal parses, derfor aktiverede vi 'Anvend'. Vi har også konfigureret RuleID til at være mindre end ID'et for den første eksisterende regel, da vi ønsker, at denne forespørgsel skal udføres uden for den almindelige læse/skrive split-opsætning.

Som du kan se, brugte vi et brugernavn, men der er også andre muligheder.

Hvis du kan forudsige, hvilke udviklingsværter der vil sende trafikken til databasen (du kan f.eks. få udviklere til at bruge en specifik proxy, før de kan nå databasen), kan du også bruge muligheden "Client Address" til at matche forespørgsler udført af den enkelt vært og omdirigere dem til en korrekt værtsgruppe.

Tillader brugeren at udføre visse forespørgsler

Lad os nu overveje det tilfælde, hvor vi ønsker at begrænse udførelsen af ​​nogle bestemte kommandoer til en given bruger. Dette kan være praktisk for at sikre, at de rigtige personer kan køre nogle af de præstationspåvirkende forespørgsler som f.eks. skemaændringer. ALTER vil være den forespørgsel, som vi vil bruge i dette eksempel. For det første, lad os tilføje en ny bruger, som får lov til at køre skemaændringer. Vi vil kalde det 'admin_user'. Dernæst skal vi oprette de nødvendige forespørgselsregler.

Vi vil oprette en forespørgselsregel, som bruger '.*ALTER TABLE.*' regulære udtryk til at matche forespørgslerne. Denne forespørgselsregel skal udføres før andre læse/skrive opdelte regler. Vi tildelte et regel-id på 20 til det. Vi definerer en fejlmeddelelse, som vil blive returneret til klienten, hvis denne forespørgselsregel udløses. Når det er gjort, fortsætter vi til en anden forespørgselsregel.

Her bruger vi det samme regulære udtryk til at fange forespørgslen, men vi definerer ikke nogen fejltekst (hvilket betyder, at forespørgslen ikke returnerer en fejl). Vi definerer også, hvilken bruger der har tilladelse til at udføre det (admin_user i vores tilfælde). Vi sørger for, at denne forespørgsel er kontrolleret før den forrige, så vi tildelte den et lavere regel-id på 19.

Når disse to forespørgselsregler er på plads, kan vi teste, hvordan de fungerer. Lad os prøve at logge ind som en applikationsbruger og køre en ALTER TABLE-forespørgsel:

[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

Som forventet kunne vi ikke udføre denne forespørgsel, og vi modtog en fejlmeddelelse. Lad os nu prøve at oprette forbindelse ved hjælp af vores '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

Det lykkedes os at udføre ALTER, da vi loggede på ved hjælp af 'admin_user'. Dette er en meget enkel måde at sikre, at kun udpegede personer kan køre skemaændringer på dine databaser.

Oprettelse af en hvidliste over tilladte forespørgsler

Lad os endelig overveje et tæt aflåst miljø, hvor kun foruddefinerede forespørgsler kan udføres. ProxySQL kan nemt bruges til at implementere en sådan opsætning.

Først og fremmest skal vi fjerne alle eksisterende forespørgselsregler, før vi kan implementere det, vi har brug for. Derefter skal vi oprette en catch-all-forespørgselsregel, som blokerer alle forespørgslerne:

Resten, vi skal gøre, er at oprette forespørgselsregler for alle de forespørgsler, der er tilladt. Du kan lave én regel pr. forespørgsel. Eller du kan bruge regulære udtryk, hvis for eksempel SELECT'er altid er ok at køre. Det eneste du skal huske er, at regel-id'et skal være mindre end regel-id'et for denne opsamlingsregel, og sikre dig, at forespørgslen til sidst rammer reglen med "Anvend" aktiveret.

Vi håber, at dette blogindlæg gav dig et indblik i, hvordan du kan bruge ClusterControl og ProxySQL til at forbedre sikkerheden og sikre overholdelse af dine databaser.


  1. 5 måder at køre et SQL-script fra en fil i SQLite

  2. Ydeevne overraskelser og antagelser:Vilkårlig TOP 1

  3. SQL-serveren skal kun vælge forskellige rækker med den nyeste værdi

  4. mysqli:kan det forberede flere forespørgsler i en erklæring?