MariaDB
 sql >> Baza danych >  >> RDS >> MariaDB

Łatwe tworzenie zapory SQL dzięki ClusterControl i ProxySQL

Czytanie tytułu tego wpisu na blogu może wywołać pewne pytania. Zapora SQL - co to jest? Co to robi? Po co miałbym w ogóle potrzebować czegoś takiego? Cóż, możliwość blokowania niektórych zapytań może się przydać w określonych sytuacjach. Używając ProxySQL przed serwerami baz danych, proxy może sprawdzać wszystkie wysyłane instrukcje SQL. ProxySQL ma zaawansowany silnik reguł i może dopasowywać zapytania, które mają być dozwolone, blokowane, przepisywane w locie lub kierowane do określonego serwera bazy danych. Przeanalizujmy kilka przykładów.

Masz dedykowane urządzenie podrzędne, które jest używane przez programistów do testowania swoich zapytań na danych produkcyjnych. Chcesz się upewnić, że programiści mogą łączyć się tylko z tym konkretnym hostem i wykonywać tylko zapytania SELECT.

Inny przypadek, załóżmy, że napotkałeś zbyt wiele wypadków z osobami wykonującymi zmiany w schemacie i chciałbyś ograniczyć liczbę użytkowników, którzy mogą wykonać instrukcję ALTER.

Na koniec pomyślmy o paranoicznym podejściu, w którym użytkownicy mogą wykonywać tylko wstępnie zdefiniowany zestaw zapytań z białej listy.

W naszym środowisku mamy konfigurację replikacji z urządzeniem głównym i dwoma urządzeniami podrzędnymi.

Przed naszymi bazami danych mamy trzy węzły ProxySQL z Keepalived zarządzającym Virtual IP. Mamy również skonfigurowany klaster ProxySQL (jak wyjaśniono w tym poprzednim blogu), więc nie musimy się martwić o trzykrotne wprowadzanie zmian w konfiguracji lub regułach zapytań we wszystkich trzech węzłach ProxySQL. W przypadku reguł zapytań skonfigurowany jest prosty podział odczytu i zapisu:

Przyjrzyjmy się, jak ProxySQL, z jego rozbudowanym mechanizmem reguł zapytań, może pomóc nam osiągnąć nasze cele we wszystkich tych trzech przypadkach.

Blokowanie dostępu użytkownika do pojedynczej grupy hostów

Dedykowane urządzenie podrzędne dostępne dla deweloperów - nie jest to rzadka praktyka. Tak długo, jak twoi programiści mają dostęp do danych produkcyjnych (a jeśli nie jest to dozwolone, np. ze względu na zgodność, maskowanie danych, jak wyjaśniono w naszym samouczku ProxySQL, może pomóc), może to pomóc im w testowaniu i optymalizacji zapytań na danych ze świata rzeczywistego ustawić. Pomocna może być również weryfikacja danych przed wykonaniem niektórych zmian w schemacie. Na przykład, czy moja kolumna jest naprawdę unikalna przed dodaniem unikalnego indeksu?

Z ProxySQL dość łatwo jest ograniczyć dostęp. Na początek załóżmy, że grupa hostów 30 zawiera urządzenie podrzędne, do którego programiści mają mieć dostęp.

Potrzebujemy użytkownika, który będzie używany przez programistów, aby uzyskać dostęp do tego urządzenia podrzędnego. Jeśli masz to już w ProxySQL, w porządku. Jeśli nie, być może będziesz musiał zaimportować go do ProxySQL (jeśli jest utworzony w MySQL, ale nie w ProxySQL) lub utworzyć go w obu lokalizacjach (jeśli będziesz tworzył nowego użytkownika). Przejdźmy do ostatniej opcji, tworzenia nowego użytkownika.

Utwórzmy nowego użytkownika z ograniczonymi uprawnieniami zarówno w MySQL, jak i ProxySQL. Użyjemy go w regułach zapytań, aby zidentyfikować ruch pochodzący od programistów.

W tej regule zapytania przekierujemy wszystkie zapytania, które są wykonywane przez użytkownika dev_test do hostgroup 30. Chcemy, aby ta reguła była aktywna i powinna być ostatnią do parsowania, dlatego włączyliśmy opcję „Zastosuj”. Skonfigurowaliśmy również RuleID tak, aby był mniejszy niż identyfikator pierwszej istniejącej reguły, ponieważ chcemy, aby to zapytanie było wykonywane poza zwykłą konfiguracją podziału odczytu/zapisu.

Jak widać, użyliśmy nazwy użytkownika, ale są też inne opcje.

Jeśli możesz przewidzieć, które hosty programistyczne będą wysyłać ruch do bazy danych (na przykład, możesz sprawić, by programiści używali określonego serwera proxy, zanim dotrą do bazy danych), możesz również użyć opcji „Adres klienta”, aby dopasować zapytania wykonywane przez to jednego hosta i przekieruj go do właściwej grupy hostów.

Uniemożliwianie użytkownikowi wykonywania określonych zapytań

Rozważmy teraz przypadek, w którym chcemy ograniczyć wykonywanie określonych poleceń do danego użytkownika. Może to być przydatne, aby zapewnić, że odpowiednie osoby mogą uruchamiać niektóre zapytania mające wpływ na wydajność, takie jak zmiany schematu. ALTER będzie zapytaniem, którego użyjemy w tym przykładzie. Na początek dodajmy nowego użytkownika, który będzie mógł uruchamiać zmiany schematu. Nazwiemy to „admin_user”. Następnie musimy utworzyć wymagane reguły zapytań.

Stworzymy regułę zapytania, która używa wyrażenia regularnego „.*ALTER TABLE.*” do dopasowania zapytań. Ta reguła zapytania powinna zostać wykonana przed innymi regułami podziału odczytu/zapisu. Przypisaliśmy mu identyfikator reguły równy 20. Definiujemy komunikat o błędzie, który zostanie zwrócony klientowi w przypadku uruchomienia tej reguły zapytania. Po zakończeniu przechodzimy do kolejnej reguły zapytania.

Tutaj używamy tego samego wyrażenia regularnego do przechwycenia zapytania, ale nie definiujemy żadnego tekstu błędu (co oznacza, że ​​zapytanie nie zwróci błędu). Określamy również, który użytkownik może go wykonać (w naszym przypadku admin_user). Upewniamy się, że to zapytanie jest sprawdzane przed poprzednim, więc przypisaliśmy mu niższy identyfikator reguły 19.

Po wprowadzeniu tych dwóch reguł zapytań możemy przetestować ich działanie. Spróbujmy zalogować się jako użytkownik aplikacji i uruchomić zapytanie ALTER TABLE:

[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

Zgodnie z oczekiwaniami nie mogliśmy wykonać tego zapytania i otrzymaliśmy komunikat o błędzie. Spróbujmy teraz połączyć się za pomocą naszego „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

Udało nam się wykonać ALTER, gdy logowaliśmy się przy użyciu „admin_user”. Jest to bardzo prosty sposób na zapewnienie, że tylko wyznaczone osoby mogą uruchamiać zmiany schematu w Twoich bazach danych.

Tworzenie białej listy dozwolonych zapytań

Na koniec rozważmy ściśle zablokowane środowisko, w którym mogą być wykonywane tylko predefiniowane zapytania. ProxySQL można łatwo wykorzystać do wdrożenia takiej konfiguracji.

Przede wszystkim musimy usunąć wszystkie istniejące reguły zapytań, zanim będziemy mogli zaimplementować to, czego potrzebujemy. Następnie musimy utworzyć regułę typu catch-all, która zablokuje wszystkie zapytania:

Reszta, którą musimy zrobić, to stworzyć reguły zapytań dla wszystkich dozwolonych zapytań. Możesz wykonać jedną regułę na zapytanie. Możesz też użyć wyrażeń regularnych, jeśli na przykład polecenia SELECT zawsze można uruchomić. Jedyną rzeczą, o której musisz pamiętać, jest to, że identyfikator reguły musi być mniejszy niż identyfikator reguły tej reguły typu catch-all i upewnij się, że zapytanie ostatecznie trafi w regułę z włączoną opcją „Zastosuj”.

Mamy nadzieję, że ten wpis na blogu dał ci pewne informacje o tym, jak możesz wykorzystać ClusterControl i ProxySQL do poprawy bezpieczeństwa i zapewnienia zgodności baz danych.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uaktualnić MariaDB 10.4 do MariaDB 10.5?

  2. Jak działa funkcja INSERT() w MariaDB

  3. Wdrażanie replikacji MariaDB w celu zapewnienia wysokiej dostępności

  4. Przedstawiamy ClusterControl 1.5 — wyposażony w automatyczną weryfikację kopii zapasowych i przesyłanie do chmury

  5. Jak TRIM() działa w MariaDB