
Db डेटाबेस मूल्यांकन उपकरण
Db डेटाबेस मूल्यांकन उपकरण
DbDat सुरक्षा का मूल्यांकन करने के लिए डेटाबेस पर अनेक जाँच करता है। जाँच की श्रेणियाँ कॉन्फ़िगरेशन, विशेषाधिकार, उपयोगकर्ता और जानकारी हैं। जाँच क्वेरी चलाकर या डेटाबेस कॉन्फ़िगरेशन फ़ाइलें पढ़कर की जाती हैं। इस उपकरण का उद्देश्य उन मुद्दों को उजागर करना है जिन पर तत्काल ध्यान देने की आवश्यकता है और उन कॉन्फ़िगरेशन सेटिंग्स की पहचान करना है जिनकी उपयुक्तता के लिए समीक्षा की जानी चाहिए। यह उपकरण किसी एप्लिकेशन में SQL इंजेक्शन कमजोरियों की पहचान करने के लिए नहीं है, इसके लिए पहले से ही अच्छे उपकरण उपलब्ध हैं (जैसे https://github.com/sqlmapproject)। साथ ही, यह उपकरण यह निर्धारित करने का प्रयास नहीं करता कि लक्ष्य डेटाबेस के संस्करण को कौन से CVE प्रभावित कर सकते हैं (लेकिन भविष्य में ऐसा कर सकता है - शायद)। बल्कि, यह उपकरण आपको कमजोर कॉन्फ़िगरेशन या एक्सेस नियंत्रण के कारण सफल SQL इंजेक्शन हमले के संभावित प्रभाव को बेहतर ढंग से समझने में मदद कर सकता है। अधिकांश जाँचें CIS (https://cisecurity.org) सुरक्षा बेंचमार्क से हैं, तो CIS को धन्यवाद! बेंचमार्क दस्तावेज़ यहां पाए जा सकते हैं: https://benchmarks.cisecurity.org/downloads/browse/index.cfm?category=benchmarks.servers.database
मैं दृढ़ता से अनुशंसा करता हूं कि आप अपने लक्ष्य डेटाबेस के लिए बेंचमार्क दस्तावेज़ डाउनलोड करें क्योंकि इसमें किए गए जाँचों के बारे में अतिरिक्त जानकारी है।
अंत में, DbDat को एक ढांचा (फ्रेमवर्क) के रूप में डिज़ाइन किया गया है जो नए प्लगइन्स और जाँचों को आसानी से बनाने में सक्षम बनाता है। सुरक्षा या यहां तक कि डेटाबेस प्रशासक समुदाय से योगदान ही इसे एक महान उपकरण बनाएगा। जाँचों का वर्तमान सेट किसी भी तरह से पूर्ण नहीं है, निश्चित रूप से और अधिक करने की आवश्यकता है। कृपया योगदान दें!
नए डेटाबेस जाँच विकसित करना
Pull requests are very welcome! जाँचें डेटाबेस प्रकार (जैसे MySQL, Oracle, MS SQL, आदि) के अनुसार प्लगइन्स फ़ोल्डर में संगठित की गई हैं। प्रत्येक जाँच एक एकल पायथन फ़ाइल है जिसके फ़ाइल नाम की शुरुआत में check_ होना चाहिए। प्रत्येक फ़ाइल में एक क्लास होती है जिसमें एक do_check विधि होती है। यह विधि जाँचों के लिए प्राथमिक तर्क है। शुरू करने का त्वरित तरीका किसी मौजूदा जाँच फ़ाइल को कॉपी करके उसे संशोधित करना है। हालाँकि, अधिक विवरण के लिए नीचे 'डिवेलपिंग प्लगइन्स' अनुभाग देखें।
etc/dbdat.conf फ़ाइल में एक कनेक्शन प्रोफ़ाइल प्रविष्टि जोड़ें।python dbdat.py -p <profile name>cd करें और python -m SimpleHTTPServer 9000 चलाएँ (या अपनी पसंद का पोर्ट नंबर चुनें)। फिर अपना ब्राउज़र खोलें और http://localhost:9000 पर जाएँ।अतिरिक्त कमांड लाइन तर्कों की सूची देखने के लिए python dbdat.py -h चलाएँ।
रिपोर्ट परिणामों को स्तरों द्वारा व्यवस्थित करती है, जो हैं RED, YELLOW, ORANGE, GRAY और GREEN।
अब तक DbDat का परीक्षण Debian Linux, CentOS Linux और Windows 7 पर Python 2.7 के साथ किया गया है।
चलाएँ: pip install MySQL-python
या Debian पर, चलाएँ: apt-get install python-mysqldb
चलाएँ: pip install psycopg2
चलाएँ: pip install cx_Oracle
नोट: इसके काम करने के लिए आपको Oracle क्लाइंट लाइब्रेरीज़ स्थापित करनी होंगी।
चलाएँ: pip install pymssql
चलाएँ: pip install ibm_db या easy_install ibm_db
नोट: आपको यह सुनिश्चित करना होगा कि DbDat चलाने वाले उपयोगकर्ता के पास DB2 CLP कमांड (जैसे db2 और db2level) निष्पादित करने की पहुंच हो।
चलाएँ: pip install pymongo
MongoDB YAML कॉन्फ़िगरेशन फ़ाइलों को समर्थन देने के लिए चलाएँ: pip install pyyaml
चलाएँ: pip install couchdb
प्लगइन्स फ़ोल्डर में प्रत्येक प्रकार के डेटाबेस के लिए एक फ़ोल्डर है, और प्रत्येक फ़ोल्डर में जाँच फ़ाइलें होती हैं। यह एक बहुत ही सरल संरचना है, लेकिन आप परिचित होने के लिए प्लगइन्स फ़ोल्डर भी ब्राउज़ कर सकते हैं https://github.com/foospidy/DbDat/tree/master/plugins
डेटाबेस फ़ोल्डर्स में शामिल होंगे:
__init.py - इनिट फ़ाइल में प्रत्येक जाँच फ़ाइल के लिए एक इम्पोर्ट स्टेटमेंट होता है।check_ फ़ाइलें - ये वास्तविक फ़ाइलें हैं जो डेटाबेस जाँच करती हैं। फ़ाइल और उसके अंदर परिभाषित क्लास का नाम समान होना चाहिए।helper.py - सामान्य कार्यों वाली फ़ाइल। जाँच फ़ाइलें सामान्य कार्यों का लाभ उठाने के लिए helper.py को इम्पोर्ट कर सकती हैं।नई जाँच फ़ाइल जोड़ते समय संबंधित प्लगइन निर्देशिका की __init__.py फ़ाइल में एक इम्पोर्ट स्टेटमेंट जोड़ना आवश्यक है। जाँचों के लिए कोड पैटर्न काफी सुसंगत हैं। यह समझने के लिए मौजूदा फ़ाइलों की समीक्षा करें कि वे कैसे संरचित हैं। sql और configuration_file प्रकार की जाँचों के बीच अंतर पर ध्यान दें।
जाँचों के विभिन्न "प्रकार" परिभाषित किए जा सकते हैं। जाँच प्रकार TYPE चर द्वारा निर्धारित किया जाता है और sql, configurtion_file, nosql या clp हो सकता है। नीचे विभिन्न जाँच प्रकार परिदृश्यों के लिए उदाहरण कार्यान्वयन हैं।
sql जाँचों के लिए do_check विधि हस्ताक्षर होना चाहिए: do_check(self, *results)
https://github.com/foospidy/DbDat/blob/master/plugins/mysql/check_user_empty_password.py
इस उदाहरण में हमें कॉल करने वाले पैरेंट क्लास से appuser चर की आवश्यकता है। appuser को sql स्टेटमेंट में गतिशील रूप से जोड़ने की आवश्यकता है, इसलिए self.SQL चर को __init__ विधि में सेट किया जा रहा है। साथ ही, चूंकि इस do_check विधि को sql निष्पादित करने की आवश्यकता है, हमें DB कर्सर (कनेक्शन) की भी आवश्यकता है, यह __init__ विधि में self.dbcurs = parent.dbcurs के साथ सेट किया गया है।
https://github.com/foospidy/DbDat/blob/master/plugins/mysql/check_privilege_user_grants.py
configuration_file जाँचों के लिए do_check विधि हस्ताक्षर होना चाहिए: do_check(self, configuration_file)
https://github.com/foospidy/DbDat/blob/master/plugins/mysql/check_configuration_general_log.py
इस उदाहरण में, PostgreSQL कॉन्फ़िगरेशन फ़ाइल में अनुभाग (जैसे [section_name]) नहीं हैं, इसलिए PostgreSQL फ़ोल्डर में हेल्पर मॉड्यूल में एक फ़ंक्शन है जो इसे संभालता है। helper.py में परिभाषित get_config_value फ़ंक्शन देखें।
अन्य कॉन्फ़िगरेशन फ़ाइल प्रारूपों के लिए आपको अपना स्वयं का पार्सिंग तर्क परिभाषित करना होगा।
nosql जाँचों के लिए do_check विधि हस्ताक्षर होना चाहिए: do_check(self)
NoSQL क्वेरी को do_check विधि में निष्पादित करने की आवश्यकता है, इसलिए क्लास __init__ विधि को self.db = parent.db लागू करना होगा। self.db चर का उपयोग तब do_check विधि में NoSQL क्वेरी निष्पादित करने के लिए किया जा सकता है।
https://github.com/foospidy/DbDat/blob/master/plugins/mongodb/check_information_banner.py
clp जाँचों के लिए do_check विधि हस्ताक्षर होना चाहिए: do_check(self, *results). clp जाँच IBM DB2 डेटाबेस के लिए आवश्यक हैं ताकि डेटाबेस के बारे में जानकारी प्राप्त करने के लिए db2 कमांड लाइन प्रोसेसर को निष्पादित किया जा सके। हालाँकि, इस प्रकार की जाँच का उपयोग किसी भी मनमाने कमांड लाइन कमांड को निष्पादित करने के लिए किया जा सकता है। सभी कमांड लाइन आउटपुट को do_check विधि में पास किए गए results चर से पार्स किया जा सकता है। इसके अलावा, आपको CMD क्लास विधि को परिभाषित करना होगा। यह चर कमांड और संबंधित तर्कों की सूची है।
https://github.com/foospidy/DbDat/blob/master/plugins/db2/check_privilege_group_entitlements.py
प्रत्येक जाँच में CATEGORY चर का उपयोग करके एक श्रेणी निर्दिष्ट होनी चाहिए। श्रेणी जाँचों को व्यवस्थित करने का एक तरीका है। संभावित श्रेणियां हैं: Information, Configuration, Privilege और User। वह श्रेणी निर्दिष्ट करें जो जाँच के संदर्भ में सबसे अधिक प्रासंगिक हो।
यह एक मोटा उदाहरण है जो एक जाँच फ़ाइल के पैटर्न को प्रदर्शित करता है:
# (OPTIONAL): Add import statements, include any necessary modules to support this check
import helper
# (REQUIRED): Define class, the class must have the same name as its file name.
class check_configuration_evaluate_something():
# (REQUIRED): Add documentation, provide information on this check as this will be displayed in the report.
"""
check_configuration_evaluate_something:
Some description goes here!
"""
# (OPTIONAL): Add references, this is only comments in code, adding references is helpful to others.
# References:
# https://www.percona.com/blog/2012/12/28/auditing-login-attempts-in-mysql/
# https://dev.mysql.com/doc/refman/5.7/en/password-security-user.html
# (REQUIRED): Add the standard set of variables
TITLE = 'Client Password'
CATEGORY = 'Configuration'
TYPE = 'configuration_file'
SQL = None
verbose = False
skip = False
result = {}
# (OPTIONAL): Add any custom variables specific to this check
custom_var = 'custom_val'
# (REQUIRED): Define the do_check method, this is the actual check logic and is called by the main program.
def do_check(self, *results):
# (REQUIRED): check logic goes here, besure to set values for self.result['level'] and self.result['output']
# Results from the SQL variable can be processed using:
for rows in results:
for row in rows:
# (REQUIRED):
# Always set the self.result['level'] and self.result['output'] variables before returning.
if row[0] == 'bad':
self.result['level'] = 'RED'
self.result['output'] = 'Result is %s' % (row[0])
elif row[0] == 'needs review':
self.result['level'] = 'YELLOW'
self.result['output'] = 'Result is %s' % (row[0])
else:
self.result['level'] = 'GREEN'
self.result['output'] = 'Result is %s' % (row[0])
# Always return self.result
return self.result
# (REQUIRED): at minimum the __init__ method should print the check being performed.
def __init__(self, parent):
print('Performing check: ' + self.TITLE)
# get values from the parent calling class
self.verbose = parent.verbose