सुरक्षा उचित रूप से डिज़ाइन किए गए डेटाबेस वातावरण के सबसे महत्वपूर्ण तत्वों में से एक है। SQL इंजेक्शन के साथ उपयोग किए जाने वाले कई अटैक वैक्टर हैं जो शायद सबसे लोकप्रिय हैं। आप एप्लिकेशन कोड में रक्षा की परतें डिज़ाइन कर सकते हैं लेकिन डेटाबेस परत पर आप क्या कर सकते हैं? आज हम आपको दिखाना चाहते हैं कि आप कितनी आसानी से ProxySQL का उपयोग करके MySQL के शीर्ष पर SQL फ़ायरवॉल को लागू कर सकते हैं। इस ब्लॉग के दूसरे भाग में हम बताएंगे कि आप कैसे क्वेरी की श्वेतसूची बना सकते हैं जिन्हें डेटाबेस तक पहुंचने की अनुमति है।
सबसे पहले, हम ProxySQL को परिनियोजित करना चाहते हैं। इसे करने का सबसे आसान तरीका ClusterControl का उपयोग करना है। कुछ क्लिक से आप इसे अपने क्लस्टर में परिनियोजित कर सकते हैं।
परिभाषित करें कि इसे कहां परिनियोजित करना है, आप या तो क्लस्टर में मौजूदा होस्ट चुन सकते हैं या बस कोई आईपी या होस्टनाम लिखें। प्रशासनिक और निगरानी करने वाले उपयोगकर्ताओं के लिए क्रेडेंशियल सेट करें।
फिर आप ProxySQL के साथ उपयोग करने के लिए डेटाबेस में एक नया उपयोगकर्ता बना सकते हैं या आप मौजूदा में से किसी एक को आयात कर सकते हैं। आपको उस डेटाबेस नोड को भी परिभाषित करने की आवश्यकता है जिसे आप ProxySQL में शामिल करना चाहते हैं। उत्तर दें कि आप निहित लेनदेन का उपयोग करते हैं या नहीं और आप ProxySQL को परिनियोजित करने के लिए पूरी तरह तैयार हैं। कुछ ही मिनटों में आपके इनपुट के आधार पर तैयार कॉन्फ़िगरेशन वाला ProxySQL उपयोग के लिए तैयार है।
यह देखते हुए कि हमारा मुद्दा सुरक्षा है, हम प्रॉक्सीएसक्यूएल को यह बताना चाहते हैं कि अनुपयुक्त प्रश्नों को कैसे संभालना है। आइए क्वेरी नियमों पर एक नज़र डालें, मुख्य तंत्र जो यह नियंत्रित करता है कि ProxySQL इससे गुजरने वाले ट्रैफ़िक को कैसे संभालता है। क्वेरी नियमों की सूची इस तरह दिख सकती है:
उन्हें निम्नतम आईडी से लागू किया जा रहा है।
आइए एक क्वेरी नियम बनाने का प्रयास करते हैं जो किसी विशेष उपयोगकर्ता के लिए केवल चुनिंदा प्रश्नों की अनुमति देगा:
हम नियम सूची की शुरुआत में एक क्वेरी नियम जोड़ रहे हैं। हम कुछ भी मिलान करने जा रहे हैं जो चयन नहीं है (कृपया ध्यान दें कि नकारात्मक मिलान पैटर्न सक्षम है)। क्वेरी नियम का उपयोग तभी किया जाएगा जब उपयोगकर्ता नाम 'देवसर' होगा। यदि सभी शर्तें मेल खाती हैं, तो उपयोगकर्ता को "त्रुटि संदेश" फ़ील्ड में त्रुटि दिखाई देगी।
[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)
एक और उदाहरण, इस बार हम बॉबी टेबल्स की स्थिति से संबंधित दुर्घटनाओं को रोकने की कोशिश करेंगे।
इस क्वेरी नियम के लागू होने से, आपकी 'छात्र' तालिका नहीं चलेगी बॉबी द्वारा छोड़ा जा सकता है:
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;
जैसा कि आप देख सकते हैं, बॉबी हमारे 'छात्रों' तालिका को हटाने में सक्षम नहीं था। वह केवल अच्छी तरह से टेबल में डाला गया था।