Database
 sql >> डेटाबेस >  >> RDS >> Database

क्या आपका डेटाबेस सुरक्षित है? फिर से विचार करना

<मजबूत>1. अपने सर्वर को सुरक्षित करें

कई ज्ञात हमले केवल एक बार भौतिक रूप से मशीन तक पहुँचने के बाद ही संभव हैं। इस कारण से, एप्लिकेशन सर्वर और डेटाबेस सर्वर को विभिन्न मशीनों पर रखना सबसे अच्छा है। यदि यह संभव नहीं है, तो अधिक सावधानी बरती जानी चाहिए, अन्यथा, किसी एप्लिकेशन सर्वर के माध्यम से दूरस्थ कमांड निष्पादित करके, एक हमलावर बिना अनुमति के भी आपके डेटाबेस को नुकसान पहुंचाने में सक्षम हो सकता है। इस कारण से, डेटाबेस के समान मशीन पर चलने वाली किसी भी सेवा को न्यूनतम संभव अनुमति दी जानी चाहिए जो अभी भी सेवा को संचालित करने की अनुमति देती है।


संपूर्ण सुरक्षा पैकेज स्थापित करना न भूलें:एंटीवायरस और एंटी-स्पैम, फ़ायरवॉल, और आपके ऑपरेटिंग सिस्टम के विक्रेता द्वारा अनुशंसित सभी सुरक्षा पैकेज। इसके अलावा, अपने सर्वर के भौतिक स्थान के बारे में सोचकर 10 मिनट बिताना न भूलें - गलत स्थान पर, आपका सर्वर चोरी हो सकता है, बाढ़ आ सकती है, जंगली जानवरों या आवारा लोगों द्वारा नुकसान पहुँचाया जा सकता है।

<मजबूत>2. लोकलहोस्ट सुरक्षा या रिमोट एक्सेस को अक्षम या प्रतिबंधित करें

विचार करें कि क्या MySQL को सिस्टम से पुनर्प्राप्त किया जाएगा या सीधे अपने सर्वर से एक्सेस किया जाएगा। यदि रिमोट एक्सेस का उपयोग किया जाता है, तो गारंटी दें कि केवल विशिष्ट होस्ट सर्वर तक पहुंच सकते हैं। यह आमतौर पर टीसीपी रैपर, आईपी टेबल, या कुछ अन्य फ़ायरवॉल प्रोग्रामिंग या हार्डवेयर एक्सेसिबिलिटी टूल के माध्यम से किया जाता है।
MySQL को नेटवर्क सॉकेट खोलने से रोकने के लिए, संबंधित पैरामीटर को my.cnf या my.ini के [mysqld] क्षेत्र में शामिल किया जाना चाहिए:

स्किप-नेटवर्किंग

दस्तावेज़ "C:\Program Files\MySQL\MySQL Server 5.1" में स्थित है विंडोज ऑपरेटिंग सिस्टम पर कैटलॉग या "/etc/my.cnf" या "/etc/mysql/my.cnf" लिनक्स पर।
यह लाइन MySQL स्टार्टअप के बीच में सिस्टम एडमिनिस्ट्रेशन की शुरुआत को पंगु बना देती है। यह आदर्श होगा यदि आप इस बात को ध्यान में रखें कि MySQL सर्वर से कनेक्शन सेट अप करने के लिए स्थानीय कनेक्शन का उपयोग किया जा सकता है।

एक अन्य संभावित समाधान यह है कि [mysqld] में निम्न पंक्ति जोड़कर MySQL को केवल लोकलहोस्ट को सुनने के लिए बाध्य किया जाए। my.cnf . का अनुभाग बाइंड-एड्रेस=127.0.0.1
हो सकता है कि आप अपने डेटाबेस सर्वर तक सिस्टम एक्सेस को अक्षम करने के इच्छुक न हों, यदि आपके संगठन के क्लाइंट अपनी मशीनों के सर्वर या किसी वैकल्पिक मशीन पर पेश किए गए वेब सर्वर के साथ इंटरफेस करते हैं। उस स्थिति में, निम्नलिखित प्रतिबंधात्मक अनुदान सिंटैक्स पर विचार किया जाना चाहिए:

mysql> GRANT SELECT, INSERT ON mydb.\* TO 'someuser'@'somehost';  

<मजबूत>3. LOCAL INFILE का उपयोग अक्षम करें

अगला परिवर्तन "LOAD DATA LOCAL INFILE" के उपयोग को अक्षम करना है आदेश, जो पड़ोस के रिकॉर्ड से अस्वीकृत अवलोकन रखने में मदद करेगा। यह विशेष रूप से महत्वपूर्ण है जब PHP अनुप्रयोगों में नई SQL इंजेक्शन कमजोरियाँ पाई जाती हैं।
इसके अलावा, कुछ मामलों में, "LOCAL INFILE" कमांड का उपयोग ऑपरेटिंग सिस्टम पर अन्य फाइलों तक पहुंच प्राप्त करने के लिए किया जा सकता है, उदाहरण के लिए "/etc/passwd" , निम्न आदेश का उपयोग करते हुए:

mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1

या उससे भी कम कठिन:

mysql> SELECT load\_file("/etc/passwd")

"LOCAL INFILE" . के उपयोग को अक्षम करने के लिए कमांड, निम्न पैरामीटर को [mysqld] . में जोड़ा जाना चाहिए MySQL कॉन्फ़िगरेशन फ़ाइल का अनुभाग।

set-variable=local-infile=0

<मजबूत>4. रूट यूजरनेम और पासवर्ड बदलें, उन्हें मजबूत रखें।

MySQL सर्वर पर डिफ़ॉल्ट व्यवस्थापक उपयोगकर्ता नाम "रूट" . है . हैकर्स अक्सर इसकी अनुमतियों तक पहुंच हासिल करने का प्रयास करते हैं। इस कार्य को कठिन बनाने के लिए, "root" . का नाम बदलें किसी और चीज़ के लिए और उसे एक लंबा, जटिल अल्फ़ान्यूमेरिक पासवर्ड प्रदान करें।

व्यवस्थापक के उपयोगकर्ता नाम का नाम बदलने के लिए, MySQL कंसोल में नाम बदलें कमांड का उपयोग करें:

mysql> RENAME USER root TO new\_user;

MySQL "उपयोगकर्ता का नाम बदलें" कमांड पहली बार MySQL संस्करण 5.0.2 में दिखाई दिया। यदि आप MySQL के पुराने संस्करण का उपयोग करते हैं, तो आप उपयोगकर्ता का नाम बदलने के लिए अन्य कमांड का उपयोग कर सकते हैं:

mysql> use mysql;

mysql> update user set user="new\_user" where user="root";

mysql> flush privileges;

उपयोगकर्ता का पासवर्ड बदलने के लिए, निम्न कमांड-लाइन कमांड का उपयोग करें:

mysql> SET PASSWORD FOR 'username'@'%hostname' = PASSWORD('newpass');

"mysqladmin" . का उपयोग करके पासवर्ड बदलना भी संभव है उपयोगिता:

shell> mysqladmin -u username -p password newpass

<मजबूत>5. "परीक्षण" डेटाबेस निकालें

MySQL एक "टेस्ट" डेटाबेस के साथ आता है जिसे टेस्ट स्पेस के रूप में लक्षित किया जाता है। इसे अनाम उपयोगकर्ता द्वारा एक्सेस किया जा सकता है, और इसलिए इसका उपयोग कई हमलों द्वारा किया जाता है।
इस डेटाबेस को हटाने के लिए, ड्रॉप कमांड का उपयोग इस प्रकार करें:

mysql> drop database test;  

या "mysqladmin" . का उपयोग करें आदेश:

shell> mysqladmin -u username -p drop test  

<मजबूत>6. अनाम और पुराने खाते निकालें

MySQL डेटाबेस कुछ अनाम उपयोगकर्ताओं के साथ रिक्त पासवर्ड के साथ आता है। नतीजतन, कोई भी डेटाबेस से जुड़ सकता है यह जांचने के लिए कि क्या यह मामला है, निम्न कार्य करें:

mysql> select \* from mysql.user where user="";  

एक सुरक्षित प्रणाली में, कोई भी रेखा वापस प्रतिध्वनित नहीं होनी चाहिए। ऐसा करने का दूसरा तरीका:

mysql> SHOW GRANTS FOR ''@'localhost';

mysql> SHOW GRANTS FOR ''@'myhost';

यदि अनुदान मौजूद है, तो कोई भी डेटाबेस तक पहुंच सकता है और कम से कम डिफ़ॉल्ट डेटाबेस का उपयोग कर सकता है"test" . इसके साथ जांचें:

shell> mysql -u blablabla

खाता हटाने के लिए, निम्न आदेश निष्पादित करें:

mysql> DROP USER "";

MySQL "DROP USER" कमांड MySQL संस्करण 5.0 से शुरू होकर समर्थित है। यदि आप MySQL के पुराने संस्करण का उपयोग करते हैं, तो आप निम्न प्रकार से खाते को हटा सकते हैं:

mysql> use mysql;

mysql> DELETE FROM user WHERE user="";

mysql> flush privileges;  

<मजबूत>7. भूमिका आधारित अभिगम नियंत्रण के साथ सुरक्षा बढ़ाएँ

विभिन्न पक्षों को दी गई अनुमतियों को कम करने के लिए एक बहुत ही सामान्य डेटाबेस सुरक्षा अनुशंसा है। MySQL अलग नहीं है। आमतौर पर, जब डेवलपर्स काम करते हैं, तो वे सिस्टम की अधिकतम अनुमति का उपयोग करते हैं और अनुमति सिद्धांतों पर हमारी अपेक्षा से कम ध्यान देते हैं। यह अभ्यास डेटाबेस को महत्वपूर्ण जोखिम में डाल सकता है।
* कोई भी नया MySQL 5.x इंस्टॉलेशन पहले से ही सही सुरक्षा उपायों का उपयोग करके स्थापित किया गया है।
अपने डेटाबेस की सुरक्षा के लिए, सुनिश्चित करें कि फ़ाइल निर्देशिका जिसमें MySQL डेटाबेस वास्तव में संग्रहीत है, उपयोगकर्ता "mysql" और समूह "mysql" के स्वामित्व में है।

shell>ls -l /var/lib/mysql

इसके अलावा, सुनिश्चित करें कि केवल उपयोगकर्ता "mysql" और "रूट" के पास निर्देशिका /var/lib/mysql तक पहुंच है .
mysql बायनेरिज़, जो /usr/bin/ निर्देशिका के अंतर्गत रहते हैं, का स्वामित्व "रूट" या विशिष्ट सिस्टम "mysql" उपयोगकर्ता के पास होना चाहिए। अन्य उपयोगकर्ताओं के पास इन फ़ाइलों तक लिखने की पहुंच नहीं होनी चाहिए।

shell>ls -l /usr/bin/my\*  

<मजबूत>8. डेटाबेस विशेषाधिकारों पर नज़र रखें

ऑपरेटिंग सिस्टम की अनुमतियां पूर्ववर्ती खंड में तय की गई थीं। अब बात करते हैं डेटाबेस अनुमतियों की। ज्यादातर मामलों में, एक व्यवस्थापक उपयोगकर्ता (बदला हुआ "रूट") और एक या अधिक वास्तविक उपयोगकर्ता होते हैं जो डेटाबेस में सह-अस्तित्व में होते हैं। आमतौर पर, "रूट" का डेटाबेस में डेटा से कोई लेना-देना नहीं है; इसके बजाय, इसका उपयोग सर्वर और उसकी तालिकाओं को बनाए रखने, अनुमति देने और रद्द करने आदि के लिए किया जाता है।
दूसरी ओर, कुछ यूजर आईडी का उपयोग डेटा तक पहुंचने के लिए किया जाता है, जैसे कि वेब सर्वर को "सेलेक्ट\अपडेट\इंसर्ट\डिलीट" क्वेरी को निष्पादित करने और संग्रहीत प्रक्रियाओं को निष्पादित करने के लिए निर्दिष्ट यूजर आईडी। ज्यादातर मामलों में, किसी अन्य उपयोगकर्ता की आवश्यकता नहीं होती है; हालांकि, एक सिस्टम व्यवस्थापक के रूप में केवल आप ही वास्तव में आपके एप्लिकेशन की ज़रूरतों को जान सकते हैं।

केवल व्यवस्थापक खातों को सुपर/प्रोसेस/फ़ाइल विशेषाधिकार और MySQL डेटाबेस तक पहुंच प्रदान करने की आवश्यकता है। आमतौर पर, डेटा तक पहुँचने के लिए व्यवस्थापक की अनुमतियों को कम करना एक अच्छा विचार है।

शेष उपयोगकर्ताओं के विशेषाधिकारों की समीक्षा करें और सुनिश्चित करें कि ये उचित रूप से सेट किए गए हैं। यह निम्न चरणों का उपयोग करके किया जा सकता है।

mysql> use mysql;  

[उपयोगकर्ताओं की पहचान करें]

mysql> select \* from users;  

[सभी उपयोगकर्ताओं के अनुदान की सूची]

mysql> show grants for ‘root’@’localhost’;

उपरोक्त कथन को प्रत्येक उपयोगकर्ता के लिए निष्पादित किया जाना है! ध्यान दें कि केवल उन उपयोगकर्ताओं को ही अनुमति दी जानी चाहिए जिन्हें वास्तव में रूट विशेषाधिकारों की आवश्यकता है।

एक और दिलचस्प विशेषाधिकार "डेटाबेस दिखाएं" है। डिफ़ॉल्ट रूप से, कमांड का उपयोग उन सभी के द्वारा किया जा सकता है जिनके पास MySQL प्रॉम्प्ट तक पहुंच है। उदाहरण के लिए, डेटा चोरी करके, वे डेटाबेस पर हमला करने से पहले जानकारी इकट्ठा करने के लिए इसका उपयोग कर सकते हैं (उदाहरण के लिए, डेटाबेस नाम प्राप्त करना)। इसे रोकने के लिए, यह अनुशंसा की जाती है कि आप नीचे वर्णित प्रक्रियाओं का पालन करें।

  • MySQL की स्टार्टअप स्क्रिप्ट में " --स्किप-शो-डेटाबेस" जोड़ें या इसे MySQL कॉन्फ़िगरेशन फ़ाइल में जोड़ें
  • डेटाबेस दिखाएं विशेषाधिकार केवल उन उपयोगकर्ताओं को प्रदान करें जिन्हें आप इस आदेश का उपयोग करना चाहते हैं

"डेटाबेस दिखाएं" कमांड के उपयोग को अक्षम करने के लिए, निम्न पैरामीटर को /etc/my.cnf के [mysqld] खंड में जोड़ा जाना चाहिए। :

[mysqld]

skip-show-database  

<मजबूत>9. लॉगिंग सक्षम करें

यदि आपका डेटाबेस सर्वर कई प्रश्नों को निष्पादित नहीं करता है, तो यह अनुशंसा की जाती है कि आप /etc/my.cnf के [mysqld] अनुभाग में निम्न पंक्ति जोड़कर लेनदेन लॉगिंग को सक्षम करें। फ़ाइल:

[mysqld]

log =/var/log/mylogfile  

यह भारी उत्पादन MySQL सर्वर के लिए अनुशंसित नहीं है क्योंकि यह सर्वर पर उच्च ओवरहेड का कारण बनता है।
इसके अलावा, सत्यापित करें कि केवल "रूट" और "mysql" आईडी के पास इन लॉगफाइल्स तक पहुंच है (कम से कम राइट एक्सेस)।

त्रुटि लॉग सुनिश्चित करें कि केवल "रूट" और "mysql" के पास लॉग फ़ाइल "hostname.err" तक पहुंच है। फ़ाइल को mysql डेटा निर्देशिका में संग्रहीत किया जाता है। इस फ़ाइल में पासवर्ड, पते, तालिका के नाम, संग्रहीत कार्यविधि नाम और कोड भाग जैसी बहुत संवेदनशील जानकारी है। इसका उपयोग सूचना एकत्र करने के लिए किया जा सकता है, और कुछ मामलों में, हमलावर को डेटाबेस, जिस मशीन पर डेटाबेस स्थापित है, या उसके अंदर डेटा का शोषण करने के लिए आवश्यक जानकारी प्रदान कर सकता है।

MySQL लॉग सुनिश्चित करें कि केवल "रूट" और "mysql" के पास लॉगफाइल "लॉगफाइल XY" तक पहुंच है। फ़ाइल को mysql डेटा निर्देशिका में संग्रहीत किया जाता है।

<मजबूत>10. मूल निर्देशिका बदलें

UNIX {ऑपरेटिंग सिस्टम} ऑपरेटिंग सिस्टम पर एक क्रोट एक ऑपरेशन है जो वर्तमान चल रही विधि और उसके बच्चों के लिए स्पष्ट डिस्क रूट निर्देशिका को बदलता है। एक प्रोग्राम जिसे किसी भिन्न निर्देशिका में फिर से रूट किया गया है, उस निर्देशिका के बाहर फ़ाइलों को एक्सेस या नाम नहीं दे सकता है, और इसलिए निर्देशिका को "chroot gel" या (कम सामान्यतः) "chroot जेल" नाम दिया गया है।

चेरोट वातावरण का उपयोग करके, सर्वर की सुरक्षा को बढ़ाते हुए, mySQL प्रक्रियाओं (और चाइल्ड प्रोसेस) की लेखन पहुंच को सीमित किया जा सकता है।

सुनिश्चित करें कि क्रोटेड वातावरण के लिए एक समर्पित निर्देशिका मौजूद है। यह कुछ इस तरह होना चाहिए:/chroot/mysql इसके अलावा, डेटाबेस प्रशासनिक उपकरणों के उपयोग को सुविधाजनक बनाने के लिए, निम्नलिखित पैरामीटर को MySQL कॉन्फ़िगरेशन फ़ाइल के [क्लाइंट] अनुभाग में बदला जाना चाहिए:

[ग्राहक]

socket = /chroot/mysql/tmp/mysql.sock

कोड की उस पंक्ति के लिए धन्यवाद, --socket=/chroot/mysql/tmp/mysql.sock के साथ mysql, mysqladmin, mysqldump आदि कमांड की आपूर्ति करने की कोई आवश्यकता नहीं होगी। हर बार जब ये उपकरण चलाए जाते हैं तो पैरामीटर।

<मजबूत>11. पुराने लॉग नियमित रूप से हटाएं

स्थापना प्रक्रियाओं के दौरान, बहुत सारे संवेदनशील डेटा होते हैं जो अवांछित उपयोगकर्ताओं को डेटाबेस पर हमला करने में सहायता करेंगे। यह डेटा सर्वर के इतिहास में रखा जाता है और अगर स्थापना के दौरान एक चीज गलत हो जाती है तो यह बहुत उपयोगी हो सकता है। इतिहास की फाइलों का विश्लेषण करके, प्रशासक यह पता लगा सकते हैं कि क्या गलत हुआ है और संभवत:चीजों को ठीक कर सकते हैं। हालाँकि, स्थापना पूर्ण होने के बाद इन फ़ाइलों की आवश्यकता नहीं है।
हमें MySQL इतिहास फ़ाइल (~/.mysql_history) की सामग्री को हटा देना चाहिए, जहाँ भी सभी मृत SQL कमांड रखे जाते हैं (विशेषकर पासवर्ड, जिन्हें सादे पाठ के रूप में रखा जाता है):

cat /dev/null > ~/.mysql\_history

अंत में, हमें डेटाबेस सुरक्षा पर जोर देना चाहिए। हालांकि किसी भी व्यक्ति या कंपनी के लिए यह पहली बात होनी चाहिए।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अधिक ऑनलाइन संचालन अभी उपलब्ध हैं - या जल्द ही

  2. Java से 4D से कनेक्ट करना

  3. NetBeans 9.0, भाग 4 में Java 9 में JShell का उपयोग करना

  4. मांग के साथ आपूर्ति का मिलान - समाधान, भाग 1

  5. उपयोगकर्ता परिभाषित रिकॉर्ड डेटाटाइप के साथ पीएल/एसक्यूएल मजबूत रेफरी कर्सर