Sikkerhed er et af de vigtigste elementer i det korrekt designede databasemiljø. Der er talrige angrebsvektorer, der bruges med SQL-injektion, som nok er den mest populære. Du kan designe forsvarslag i applikationskoden, men hvad kan du gøre på databaselaget? I dag vil vi gerne vise dig, hvor nemt du kan implementere SQL firewall oven på MySQL ved hjælp af ProxySQL. I den anden del af denne blog vil vi forklare, hvordan du kan oprette en hvidliste over forespørgsler, der har tilladelse til at få adgang til databasen.
For det første ønsker vi at implementere ProxySQL. Den nemmeste måde at gøre det på er at bruge ClusterControl. Med et par klik kan du implementere den til din klynge.
Definer, hvor den skal installeres, du kan enten vælge eksisterende vært i klyngen eller bare skriv en hvilken som helst IP eller værtsnavn ned. Indstil legitimationsoplysninger til administrations- og overvågningsbrugere.
Så kan du oprette en ny bruger i databasen, der skal bruges med ProxySQL eller du kan importere en af de eksisterende. Du skal også definere de databasenoder, du vil inkludere i ProxySQL. Svar, hvis du bruger implicitte transaktioner eller ej, og du er klar til at implementere ProxySQL. Om et par minutter er en ProxySQL med konfiguration forberedt baseret på dit input klar til brug.
I betragtning af vores problem er sikkerhed, vil vi gerne være i stand til at fortælle ProxySQL, hvordan man håndterer upassende forespørgsler. Lad os tage et kig på forespørgselsreglerne, kernemekanismen, der styrer, hvordan ProxySQL håndterer den trafik, der passerer gennem den. Listen over forespørgselsregler kan se sådan ud:
De anvendes fra det laveste ID og fremefter.
Lad os prøve at oprette en forespørgselsregel, som kun tillader SELECT-forespørgsler for en bestemt bruger:
Vi tilføjer en forespørgselsregel i begyndelsen af regellisten. Vi vil matche alt, der ikke er SELECTs (bemærk venligst, at Negate Match Pattern er aktiveret). Forespørgselsreglen vil kun blive brugt, når brugernavnet er 'devuser'. Hvis alle betingelserne er opfyldt, vil brugeren se fejlen som i feltet "Fejlmeddelelse".
[email protected]:~# mysql -u devuser -h 10.0.0.144 -P6033 -ppass
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 3024
Server version: 5.5.30 (ProxySQL)
Copyright (c) 2009-2019 Percona LLC and/or its affiliates
Copyright (c) 2000, 2019, 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> create schema myschema;
ERROR 1148 (42000): The query is not allowed
mysql> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.01 sec)
mysql> SELECT * FROM sbtest.sbtest1 LIMIT 1\G
*************************** 1. row ***************************
id: 1
k: 503019
c: 18034632456-32298647298-82351096178-60420120042-90070228681-93395382793-96740777141-18710455882-88896678134-41810932745
pad: 43683718329-48150560094-43449649167-51455516141-06448225399
1 row in set (0.00 sec)
Et andet eksempel, denne gang vil vi forsøge at forhindre ulykker relateret til Bobby Tables-situationen.
Med denne forespørgselsregel på plads vil din 'studerende'-tabel ikke blive droppet af Bobby:
mysql> use school;
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> INSERT INTO students VALUES (1, 'Robert');DROP TABLE students;--
Query OK, 1 row affected (0.01 sec)
ERROR 1148 (42000): Only superuser can execute DROP TABLE;
Som du kan se, var Bobby ikke i stand til at fjerne vores 'studerende'-tabel. Han var kun pænt sat ind i bordet.