SSL की आवश्यकता है, SELinux चालू रखें, लॉग की निगरानी करें, और एक वर्तमान PostgreSQL संस्करण का उपयोग करें ।
सर्वर साइड
SSL की आवश्यकता है
में postgresql.conf
सेट ssl=on
है और आप अपने keyfile और certfile उचित रूप से स्थापित किया है (डॉक्स और में टिप्पणियों को देखने के लिए सुनिश्चित करें postgresql.conf
)।
यदि आप इसे क्लाइंट पर विशेष सेटअप के बिना ग्राहकों द्वारा विश्वसनीय होना चाहते हैं, तो आपको CA से एक प्रमाण पत्र खरीदने की आवश्यकता हो सकती है।
में pg_hba.conf
की तरह कुछ का उपयोग करें:
hostssl theuser thedatabase 1.2.3.4/32 md5
... संभवतः उपयोगकर्ता और / या डेटाबेस के लिए "सभी" के साथ, और संभवतः एक व्यापक स्रोत आईपी एड्रेस फिल्टर के साथ।
उन उपयोगकर्ताओं को सीमित करें जो लॉग इन कर सकते हैं, दूरस्थ सुपरयुसर लॉगिन को अस्वीकार कर सकते हैं
यदि संभव हो तो उपयोगकर्ताओं के लिए "सभी" की अनुमति न दें; यदि आप इसके लिए आवश्यकता से बच सकते हैं तो आप दूरस्थ रूप से सुपरयुसर लॉगिन की अनुमति नहीं देना चाहते हैं।
उपयोगकर्ताओं के अधिकार सीमित करें
उस उपयोगकर्ता के अधिकारों को प्रतिबंधित करें जो लॉग इन कर सकते हैं। उन्हें CREATEDB
या CREATEUSER
अधिकार न दें ।
REVOKE
CONNECT
से सही PUBLIC
अपने सभी डेटाबेस पर, फिर इसे वापस केवल उन / भूमिकाओं कि डेटाबेस का उपयोग करने के लिए सक्षम होना चाहिए करने के लिए दे। (समूह उपयोगकर्ताओं को भूमिकाओं में और भूमिकाओं के अधिकार प्रदान करते हैं, बजाय सीधे व्यक्तिगत उपयोगकर्ताओं को)।
सुनिश्चित करें कि रिमोट एक्सेस वाले उपयोगकर्ता केवल उन DBs से कनेक्ट कर सकते हैं जिनकी उन्हें आवश्यकता है, और केवल स्कीमा, टेबल और कॉलम के अधिकार हैं जिनके भीतर उन्हें वास्तव में आवश्यकता है। यह स्थानीय उपयोगकर्ताओं के लिए भी अच्छा अभ्यास है, यह सिर्फ समझदार सुरक्षा है।
क्लाइंट सेटअप
PgJDBC में, पैरामीटर पास करेंssl=true
:
JDBC ड्राइवर को SSL कनेक्शन आज़माने और स्थापित करने के लिए आपको कनेक्शन URL पैरामीटर ssl = true जोड़ना होगा।
... और क्लाइंट सर्टिफिकेट में सर्वर सर्टिफिकेट स्थापित करें, या एक सर्टिफिकेट सर्टिफिकेट का उपयोग करें, जो कि जावा के बिल्ट-इन ट्रस्टस्टोर्स में से एक के द्वारा भरोसा किया जाता है यदि आप नहीं चाहते कि उपयोगकर्ता को सर्टिफिकेट स्थापित करना पड़े।
जारी कार्रवाई
अब सुनिश्चित करें कि आप PostgreSQL को अपडेट रखें । PostgreSQL में केवल कुछ पूर्व-सुरक्षा सुरक्षा छेद हैं, लेकिन यह शून्य से अधिक है, इसलिए अद्यतित रहें। आप वैसे भी, Bugfixes अच्छी चीजें हैं होना चाहिए।
अगर आपके पास कभी पता नहीं है कि बड़े नेटब्लॉक / क्षेत्र हैं तो फायरवॉल जोड़ें।
लॉग कनेक्शन और डिस्कनेक्ट (देखें postgresql.conf
)। यदि व्यावहारिक हो तो लॉग इन करें। यदि कोई प्रैक्टिकल डिटेक्शन सिस्टम या फेल 2 एबन या इसके समान सामने है तो प्रैक्टिकल चलाएं। Post2es के साथ विफलता के लिए, यहाँ एक सुविधाजनक तरीका है
लॉग फ़ाइलों की निगरानी करें।
बोनस व्यामोह
सोचने के लिए अतिरिक्त कदम ...
क्लाइंट सर्टिफिकेट चाहिए
यदि आप चाहते हैं, तो आप यह भी उपयोग pg_hba.conf
करने के लिए उपयोग कर सकते हैं कि क्लाइंट सर्वर द्वारा विश्वसनीय X.509 क्लाइंट प्रमाणपत्र प्रस्तुत करता है। यह सर्वर प्रमाण के रूप में एक ही सीए का उपयोग करने की आवश्यकता नहीं है, आप एक homebrew ओपनएसएल सीए के साथ ऐसा कर सकते हैं। एक JDBC उपयोगकर्ता को अपने जावा कीस्टोर में क्लाइंट सर्टिफिकेट आयात करने की आवश्यकता होती है keytool
और संभवत: जावा को उनके कीस्टॉर पर इंगित करने के लिए कुछ JSSE सिस्टम गुण कॉन्फ़िगर करते हैं, इसलिए यह पूरी तरह से पारदर्शी नहीं है।
उदाहरण को छोड़ें
यदि आप वास्तव में पागल होना चाहते हैं, तो क्लाइंट के लिए एक अलग कंटेनर / वीएम में, या कम से कम एक अलग उपयोगकर्ता खाते के तहत, केवल डेटाबेस (ओं) के साथ उन्हें चलाने की आवश्यकता है।
इस तरह अगर वे PostgreSQL उदाहरण से समझौता करते हैं तो उन्हें आगे नहीं मिलेगा।
SELinux का प्रयोग करें
मुझे यह कहना नहीं चाहिए, लेकिन ...
SELinux सपोर्ट वाली मशीन को RHEL 6 या 7 की तरह चलाएं, और SELinux को बंद न करें या इसे परमिशन मोड पर सेट न करें । इसे लागू करने की विधि में रखें।
एक गैर-डिफ़ॉल्ट पोर्ट का उपयोग करें
केवल अस्पष्टता से सुरक्षा मूर्खता है। एक बार जब आप समझदार सामान कर लेते हैं तो थोड़ी अस्पष्टता का उपयोग करने वाली सुरक्षा संभवतः चोट नहीं पहुंचाएगी।
स्वचालित हमलावरों के लिए जीवन को थोड़ा कठिन बनाने के लिए एक गैर-डिफ़ॉल्ट पोर्ट पर पीजी चलाएं।
सामने एक छद्म रखो
आप कनेक्शन पूल और प्रॉक्सी के रूप में कार्य करते हुए PostgreSQL के सामने PgBouncer या PgPool-II भी चला सकते हैं। इस तरह से आप प्रॉक्सी को एसएसएल को हैंडल कर सकते हैं, न कि असली डेटाबेस होस्ट को। प्रॉक्सी एक अलग वीएम या मशीन पर हो सकती है।
कनेक्शन पूलिंग प्रॉक्सी का उपयोग आमतौर पर वैसे भी PostgreSQL के साथ एक अच्छा विचार है, जब तक कि क्लाइंट ऐप में पहले से ही एक अंतर्निहित पूल नहीं है। अधिकांश जावा एप्लिकेशन सर्वर, रेल, आदि में अंतर्निहित पूलिंग है। फिर भी, सर्वर साइड पूलिंग प्रॉक्सी सबसे अधिक हानिरहित है।