Bezpieczeństwo to jeden z najważniejszych elementów odpowiednio zaprojektowanego środowiska bazodanowego. Istnieje wiele wektorów ataku, z których prawdopodobnie najbardziej popularnym jest wstrzykiwanie SQL. Możesz zaprojektować warstwy obrony w kodzie aplikacji, ale co możesz zrobić w warstwie bazy danych? Dzisiaj chcielibyśmy pokazać, jak łatwo można zaimplementować zaporę SQL na MySQL przy użyciu ProxySQL. W drugiej części tego bloga wyjaśnimy, jak utworzyć białą listę zapytań, które mają dostęp do bazy danych.
Najpierw chcemy wdrożyć ProxySQL. Najłatwiej to zrobić za pomocą ClusterControl. Za pomocą kilku kliknięć możesz wdrożyć go w swoim klastrze.
Określ, gdzie go wdrożyć, możesz wybrać istniejący host w klastrze lub po prostu zapisz dowolny adres IP lub nazwę hosta. Ustaw dane uwierzytelniające dla użytkowników administracyjnych i monitorujących.
Następnie możesz utworzyć nowego użytkownika w bazie danych, który będzie używany z ProxySQL lub możesz zaimportować jeden z istniejących. Musisz również zdefiniować węzły bazy danych, które chcesz uwzględnić w ProxySQL. Odpowiedz, czy używasz transakcji niejawnych, czy nie, i jesteś gotowy do wdrożenia ProxySQL. W ciągu kilku minut ProxySQL z konfiguracją przygotowaną na podstawie wprowadzonych danych jest gotowy do użycia.
Zważywszy, że naszym problemem jest bezpieczeństwo, chcemy być w stanie powiedzieć ProxySQL, jak radzić sobie z nieodpowiednimi zapytaniami. Przyjrzyjmy się regułom zapytań, podstawowemu mechanizmowi, który reguluje sposób, w jaki ProxySQL obsługuje ruch, który przez niego przechodzi. Lista reguł zapytań może wyglądać tak:
Są one stosowane od najniższego identyfikatora.
Spróbujmy stworzyć regułę zapytań, która pozwoli tylko na zapytania SELECT dla konkretnego użytkownika:
Dodajemy regułę zapytania na początku listy reguł. Zamierzamy dopasować wszystko, co nie jest SELECT (proszę zauważyć, że opcja Negate Match Pattern jest włączona). Reguła zapytania będzie używana tylko wtedy, gdy nazwa użytkownika to „devuser”. Jeśli wszystkie warunki są spełnione, użytkownik zobaczy błąd jak w polu „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)
Inny przykład, tym razem postaramy się zapobiec wypadkom związanym z sytuacją z Bobby Tables.
Po wdrożeniu tej reguły zapytania tabela uczniów nie będzie zostać upuszczony przez Bobby'ego:
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;
Jak widać, Bobby nie był w stanie usunąć naszego stolika „uczniowie”. Był tylko ładnie włożony do stołu.