MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

So schützen Sie Ihre MySQL- oder MariaDB-Datenbank vor SQL-Injection:Teil Eins

Sicherheit ist eines der wichtigsten Elemente einer richtig gestalteten Datenbankumgebung. Es gibt zahlreiche Angriffsvektoren, wobei die SQL-Injection wahrscheinlich der beliebteste ist. Sie können Verteidigungsebenen im Anwendungscode entwerfen, aber was können Sie auf der Datenbankebene tun? Heute möchten wir Ihnen zeigen, wie einfach Sie mit ProxySQL eine SQL-Firewall auf MySQL implementieren können. Im zweiten Teil dieses Blogs erklären wir, wie Sie eine Whitelist von Abfragen erstellen können, die auf die Datenbank zugreifen dürfen.

Zunächst wollen wir ProxySQL bereitstellen. Der einfachste Weg, dies zu tun, ist die Verwendung von ClusterControl. Mit ein paar Klicks können Sie es in Ihrem Cluster bereitstellen.

Definieren Sie, wo es bereitgestellt werden soll, Sie können entweder einen vorhandenen Host im Cluster auswählen oder notieren Sie sich einfach eine IP oder einen Hostnamen. Legen Sie Anmeldeinformationen für Verwaltungs- und Überwachungsbenutzer fest.

Dann können Sie einen neuen Benutzer in der Datenbank erstellen, der mit ProxySQL verwendet werden soll oder Sie können eine der vorhandenen importieren. Sie müssen auch die Datenbankknoten definieren, die Sie in ProxySQL einschließen möchten. Antworten Sie, ob Sie implizite Transaktionen verwenden oder nicht, und Sie bereit sind, ProxySQL bereitzustellen. In wenigen Minuten ist ein ProxySQL mit einer Konfiguration, die basierend auf Ihren Eingaben erstellt wurde, einsatzbereit.

Da es um Sicherheit geht, möchten wir ProxySQL mitteilen können, wie es mit unangemessenen Abfragen umgehen soll. Werfen wir einen Blick auf die Abfrageregeln, den Kernmechanismus, der regelt, wie ProxySQL den Datenverkehr verarbeitet, der es durchläuft. Die Liste der Abfrageregeln könnte wie folgt aussehen:

Sie werden ab der niedrigsten ID angewendet.

Versuchen wir, eine Abfrageregel zu erstellen, die nur SELECT-Abfragen für einen bestimmten Benutzer zulässt:

Wir fügen eine Abfrageregel am Anfang der Regelliste hinzu. Wir werden alles abgleichen, was keine SELECTs sind (bitte beachten Sie, dass Negate Match Pattern aktiviert ist). Die Abfrageregel wird nur verwendet, wenn der Benutzername „devuser“ ist. Wenn alle Bedingungen erfüllt sind, sieht der Benutzer den Fehler im Feld „Error Msg“.

[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)

Ein weiteres Beispiel, dieses Mal werden wir versuchen, Unfälle im Zusammenhang mit der Bobby Tables-Situation zu verhindern.

Wenn diese Abfrageregel vorhanden ist, wird Ihre Tabelle „Studenten“ dies nicht tun von Bobby gedroppt werden:

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;

Wie Sie sehen können, konnte Bobby unseren „Studenten“-Tisch nicht entfernen. Er wurde nur schön in den Tisch eingefügt.