Сигурността е един от най-важните елементи на правилно проектираната среда на база данни. Има многобройни вектори на атака, използвани като SQL инжекцията е може би най-популярната. Можете да проектирате слоеве на защита в кода на приложението, но какво можете да направите на слоя на базата данни? Днес бихме искали да ви покажем колко лесно можете да внедрите SQL защитна стена върху MySQL с помощта на ProxySQL. Във втората част на този блог ще обясним как можете да създадете бял списък със заявки, на които е разрешен достъп до базата данни.
Първо искаме да внедрим ProxySQL. Най-лесният начин да го направите е да използвате ClusterControl. С няколко щраквания можете да го разположите във вашия клъстер.
Определете къде да го разположите, можете да изберете съществуващ хост в клъстера или просто запишете всяко IP или име на хост. Задайте идентификационни данни за административни и наблюдаващи потребители.
След това можете да създадете нов потребител в базата данни, който да се използва с ProxySQL или можете да импортирате един от съществуващите. Вие също трябва да дефинирате възлите на базата данни, които искате да включите в ProxySQL. Отговорете дали използвате неявни транзакции или не и сте готови да разположите ProxySQL. След няколко минути ProxySQL с конфигурация, подготвена въз основа на вашите данни, е готов за използване.
Като се има предвид, че нашият проблем е сигурността, искаме да можем да кажем на ProxySQL как да обработва неподходящи заявки. Нека да разгледаме правилата за заявка, основния механизъм, който управлява как ProxySQL обработва трафика, който минава през него. Списъкът с правила за заявка може да изглежда така:
Те се прилагат от най-ниския идентификатор нататък.
Нека се опитаме да създадем правило за заявка, което ще позволява само SELECT заявки за конкретен потребител:
Добавяме правило за заявка в началото на списъка с правила. Ще съпоставим всичко, което не е SELECTs (моля, имайте предвид, че шаблонът за отхвърляне на съвпадението е активиран). Правилото за заявка ще се използва само когато потребителското име е „devuser“. Ако всички условия съответстват, потребителят ще види грешката, както е в полето „Съобщение за грешка“.
[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)
Друг пример, този път ще се опитаме да предотвратим инциденти, свързани със ситуацията с Bobby Tables.
С това правило за заявка таблицата ви „студенти“ няма да бъде изхвърлен от Боби:
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;
Както виждате, Боби не успя да премахне нашата таблица „студенти“. Той беше само добре вмъкнат в масата.