इस ब्लॉग पोस्ट का शीर्षक पढ़कर कुछ सवाल उठ सकते हैं। एसक्यूएल फ़ायरवॉल - वह क्या है? वह क्या करता है? मुझे पहली बार ऐसा कुछ क्यों चाहिए? खैर, कुछ प्रश्नों को ब्लॉक करने की क्षमता कुछ स्थितियों में काम आ सकती है। अपने डेटाबेस सर्वर के सामने ProxySQL का उपयोग करते समय, प्रॉक्सी भेजे जा रहे सभी SQL स्टेटमेंट का निरीक्षण करने में सक्षम होता है। प्रॉक्सीएसक्यूएल में एक परिष्कृत नियम इंजन है, और उन प्रश्नों से मेल खा सकता है जिन्हें अनुमति दी जानी चाहिए, अवरुद्ध किया जाना चाहिए, फ्लाई पर फिर से लिखा जाना चाहिए या किसी विशिष्ट डेटाबेस सर्वर पर रूट किया जाना चाहिए। आइए कुछ उदाहरण देखें।
आपके पास एक समर्पित दास है जिसका उपयोग डेवलपर्स द्वारा उत्पादन डेटा के विरुद्ध अपने प्रश्नों का परीक्षण करने के लिए किया जाता है। आप यह सुनिश्चित करना चाहते हैं कि डेवलपर्स केवल उस विशेष होस्ट से जुड़ सकें और केवल SELECT क्वेरीज़ को ही निष्पादित कर सकें।
एक और मामला, मान लें कि स्कीमा परिवर्तन चलाने वाले लोगों के साथ आपको एक से अधिक दुर्घटनाओं का सामना करना पड़ा और आप उन उपयोगकर्ताओं को सीमित करना चाहेंगे जो ALTER कथन निष्पादित कर सकते हैं।
अंत में, आइए एक पागल दृष्टिकोण के बारे में सोचें जिसमें उपयोगकर्ताओं को केवल पूर्व-निर्धारित श्वेतसूचीबद्ध प्रश्नों को निष्पादित करने की अनुमति है।
हमारे परिवेश में हमारे पास मास्टर और दो दासों के साथ एक प्रतिकृति सेटअप है।
हमारे डेटाबेस के सामने, हमारे पास वर्चुअल आईपी को प्रबंधित करने वाले Keepalived के साथ तीन ProxySQL नोड्स हैं। हमारे पास ProxySQL क्लस्टर भी कॉन्फ़िगर किया गया है (जैसा कि इस पिछले ब्लॉग में बताया गया है) इसलिए हमें तीनों ProxySQL नोड्स पर कॉन्फ़िगरेशन या क्वेरी नियम में तीन बार बदलाव करने के बारे में चिंता करने की ज़रूरत नहीं है। क्वेरी नियमों के लिए, एक साधारण पठन-लेखन विभाजन स्थापित किया गया है:
आइए एक नज़र डालते हैं कि कैसे ProxySQL, अपने विस्तृत क्वेरी नियम तंत्र के साथ, उन तीनों मामलों में अपने लक्ष्यों को प्राप्त करने में हमारी मदद कर सकता है।
एकल होस्टग्रुप में उपयोगकर्ता एक्सेस को लॉक करना
डेवलपर्स के लिए उपलब्ध एक समर्पित दास - यह असामान्य अभ्यास नहीं है। जब तक आपके डेवलपर्स उत्पादन डेटा तक पहुंच सकते हैं (और यदि उन्हें अनुमति नहीं है, उदाहरण के लिए, अनुपालन कारणों से, हमारे प्रॉक्सीएसक्यूएल ट्यूटोरियल में बताए गए डेटा मास्किंग से मदद मिल सकती है), इससे उन्हें वास्तविक दुनिया डेटा पर प्रश्नों का परीक्षण और अनुकूलन करने में मदद मिल सकती है। सेट। यह कुछ स्कीमा परिवर्तनों को निष्पादित करने से पहले डेटा को सत्यापित करने में भी मदद कर सकता है। उदाहरण के लिए, क्या अद्वितीय अनुक्रमणिका जोड़ने से पहले मेरा स्तंभ वास्तव में अद्वितीय है?
ProxySQL के साथ पहुंच को प्रतिबंधित करना काफी आसान है। शुरुआत के लिए, मान लें कि होस्टग्रुप 30 में वह दास है जिसे हम डेवलपर्स तक पहुंचाना चाहते हैं।
हमें एक उपयोगकर्ता की आवश्यकता है जिसका उपयोग डेवलपर्स द्वारा उस दास तक पहुंचने के लिए किया जाएगा। यदि आपके पास यह पहले से ही ProxySQL में है, तो यह ठीक है। यदि नहीं, तो आपको या तो इसे ProxySQL में आयात करने की आवश्यकता हो सकती है (यदि यह MySQL में बनाया गया है लेकिन ProxySQL में नहीं) या इसे दोनों स्थानों पर बनाएं (यदि आप एक नया उपयोगकर्ता बना रहे हैं)। एक नया उपयोगकर्ता बनाते हुए, अंतिम विकल्प के साथ चलते हैं।
आइए MySQL और ProxySQL दोनों पर सीमित विशेषाधिकारों के साथ एक नया उपयोगकर्ता बनाएं। हम डेवलपर से आने वाले ट्रैफ़िक की पहचान करने के लिए क्वेरी नियमों में इसका उपयोग करेंगे।
इस क्वेरी नियम में हम उन सभी प्रश्नों को पुनर्निर्देशित करने जा रहे हैं जो dev_test उपयोगकर्ता द्वारा होस्टग्रुप 30 पर निष्पादित किए जाते हैं। हम चाहते हैं कि यह नियम सक्रिय हो और यह पार्स करने के लिए अंतिम होना चाहिए, इसलिए हमने 'लागू करें' को सक्षम किया। हमने नियम आईडी को पहले मौजूदा नियम की आईडी से छोटा होने के लिए भी कॉन्फ़िगर किया है क्योंकि हम चाहते हैं कि यह क्वेरी नियमित पढ़ने/लिखने के विभाजन सेटअप के बाहर निष्पादित की जाए।
जैसा कि आप देख सकते हैं, हमने एक उपयोगकर्ता नाम का उपयोग किया है लेकिन अन्य विकल्प भी हैं।
यदि आप यह अनुमान लगा सकते हैं कि कौन से विकास होस्ट डेटाबेस को ट्रैफ़िक भेजेंगे (उदाहरण के लिए, आप डेवलपर्स को डेटाबेस तक पहुंचने से पहले एक विशिष्ट प्रॉक्सी का उपयोग कर सकते हैं), तो आप "क्लाइंट एड्रेस" विकल्प का उपयोग क्वेरी द्वारा निष्पादित क्वेरी से मिलान करने के लिए भी कर सकते हैं। एकल होस्ट और उन्हें एक सही होस्टग्रुप पर रीडायरेक्ट करें।
उपयोगकर्ता को कुछ क्वेरी निष्पादित करने से रोक रहा है
अब, उस मामले पर विचार करें जहां हम किसी विशेष कमांड के निष्पादन को किसी दिए गए उपयोगकर्ता तक सीमित करना चाहते हैं। यह सुनिश्चित करने के लिए आसान हो सकता है कि सही लोग स्कीमा परिवर्तन जैसे कुछ प्रदर्शन को प्रभावित करने वाले प्रश्नों को चला सकें। ALTER वह क्वेरी होगी जिसका उपयोग हम इस उदाहरण में करेंगे। शुरुआत के लिए, आइए एक नया उपयोगकर्ता जोड़ें जिसे स्कीमा परिवर्तन चलाने की अनुमति होगी। हम इसे 'admin_user' कहेंगे। इसके बाद, हमें आवश्यक क्वेरी नियम बनाने होंगे।
हम एक क्वेरी नियम बनाएंगे जो प्रश्नों से मेल खाने के लिए '.*ALTER TABLE.*' रेगुलर एक्सप्रेशन का उपयोग करता है। इस क्वेरी नियम को दूसरे से पहले निष्पादित किया जाना चाहिए, विभाजित नियम पढ़ें/लिखें। हमने इसे 20 की एक नियम आईडी सौंपी है। हम एक त्रुटि संदेश परिभाषित करते हैं जो इस क्वेरी नियम के ट्रिगर होने की स्थिति में क्लाइंट को वापस कर दिया जाएगा। एक बार हो जाने के बाद, हम दूसरे क्वेरी नियम पर आगे बढ़ते हैं।
यहां हम क्वेरी को पकड़ने के लिए उसी रेगुलर एक्सप्रेशन का उपयोग करते हैं लेकिन हम किसी भी त्रुटि टेक्स्ट को परिभाषित नहीं करते हैं (जिसका अर्थ है कि क्वेरी कोई त्रुटि नहीं लौटाएगी)। हम यह भी परिभाषित करते हैं कि किस उपयोगकर्ता को इसे निष्पादित करने की अनुमति है (हमारे मामले में admin_user)। हम सुनिश्चित करते हैं कि इस क्वेरी को पिछले एक से पहले चेक किया गया है, इसलिए हमने इसे 19 की निचली नियम आईडी असाइन की है।
एक बार ये दो क्वेरी नियम लागू हो जाने के बाद, हम परीक्षण कर सकते हैं कि वे कैसे काम करते हैं। आइए एक एप्लिकेशन उपयोगकर्ता के रूप में लॉग इन करने का प्रयास करें और एक वैकल्पिक तालिका क्वेरी चलाएं:
[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
जैसा कि अपेक्षित था, हम इस क्वेरी को निष्पादित नहीं कर सके और हमें एक त्रुटि संदेश प्राप्त हुआ। आइए अब अपने '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
हम ALTER को निष्पादित करने में कामयाब रहे क्योंकि हमने 'admin_user' का उपयोग करके लॉग इन किया था। यह सुनिश्चित करने का एक बहुत ही सरल तरीका है कि केवल नियुक्त लोग ही आपके डेटाबेस पर स्कीमा परिवर्तन चला सकते हैं।
अनुमत क्वेरी की श्वेतसूची बनाना
अंत में, आइए एक कसकर बंद वातावरण पर विचार करें जहां केवल पूर्वनिर्धारित प्रश्नों को ही निष्पादित किया जा सकता है। ऐसे सेटअप को लागू करने के लिए ProxySQL का आसानी से उपयोग किया जा सकता है।
सबसे पहले, हमें जो चाहिए उसे लागू करने से पहले हमें सभी मौजूदा क्वेरी नियमों को हटाने की जरूरत है। फिर, हमें एक कैच-ऑल क्वेरी नियम बनाने की आवश्यकता है, जो सभी प्रश्नों को ब्लॉक कर देगा:
बाकी हमें उन सभी प्रश्नों के लिए क्वेरी नियम बनाना है जिनकी अनुमति है। आप प्रति प्रश्न एक नियम कर सकते हैं। या आप नियमित अभिव्यक्तियों का उपयोग कर सकते हैं, उदाहरण के लिए, चयन हमेशा चलाने के लिए ठीक हैं। केवल एक चीज जो आपको याद रखनी है वह यह है कि नियम आईडी इस कैच-ऑल नियम के नियम आईडी से छोटा होना चाहिए, और सुनिश्चित करें कि क्वेरी अंततः 'लागू करें' सक्षम होने के साथ नियम पर आ जाएगी।
हम आशा करते हैं कि इस ब्लॉग पोस्ट ने आपको इस बारे में कुछ जानकारी दी होगी कि आप सुरक्षा को बेहतर बनाने और अपने डेटाबेस का अनुपालन सुनिश्चित करने के लिए ClusterControl और ProxySQL का उपयोग कैसे कर सकते हैं।