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

अपने PostgreSQL डेटाबेस को कैसे सुरक्षित करें - 10 टिप्स

एक बार जब आप अपने PostgreSQL डेटाबेस सर्वर की स्थापना प्रक्रिया पूरी कर लेते हैं तो उत्पादन में जाने से पहले इसे सुरक्षित रखना आवश्यक है। इस पोस्ट में, हम आपको दिखाएंगे कि अपने डेटा को सुरक्षित और सुरक्षित रखने के लिए अपने डेटाबेस के आसपास की सुरक्षा को कैसे सख्त किया जाए।

1. क्लाइंट प्रमाणीकरण नियंत्रण

PostgreSQL को स्थापित करते समय डेटाबेस क्लस्टर की डेटा निर्देशिका में pg_hba.conf नाम की एक फ़ाइल बनाई जाती है। यह फ़ाइल क्लाइंट प्रमाणीकरण को नियंत्रित करती है।

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

तो सामान्य प्रारूप कुछ इस तरह होगा:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

कॉन्फ़िगरेशन का एक उदाहरण इस प्रकार हो सकता है:

# Allow any user from any host with IP address 192.168.93.x to connect
# to database "postgres" as the same user name that ident reports for
# the connection (typically the operating system user name).
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
 host     postgres              all             192.168.93.0/24         ident
# Reject any user from any host with IP address 192.168.94.x to connect
# to database "postgres
# TYPE  DATABASE        USER            ADDRESS                 METHOD
 host     postgres              all             192.168.94.0/24         reject

नियमों को परिशोधित करने के लिए आप बहुत से संयोजन कर सकते हैं (आधिकारिक दस्तावेज़ीकरण प्रत्येक विकल्प का विस्तार से वर्णन करता है और इसके कुछ बेहतरीन उदाहरण हैं), लेकिन उन नियमों से बचना याद रखें जो बहुत अधिक अनुमेय हैं, जैसे कि DATABASE all या ADDRESS का उपयोग करके लाइनों तक पहुंच की अनुमति देना 0.0.0.0/0.

सुरक्षा सुनिश्चित करने के लिए, भले ही आप कोई नियम जोड़ना भूल रहे हों, आप नीचे निम्न पंक्ति जोड़ सकते हैं:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
 host     all              all             0.0.0.0/0         reject

जैसा कि मेल खाने वाले नियमों को खोजने के लिए फ़ाइल को ऊपर से नीचे तक पढ़ा जाता है, इस तरह आप यह सुनिश्चित करते हैं कि अनुमति की अनुमति के लिए आपको उपरोक्त मिलान नियम को स्पष्ट रूप से जोड़ना होगा।

2. सर्वर कॉन्फ़िगरेशन

Postgresql.conf पर कुछ पैरामीटर हैं जिन्हें हम सुरक्षा बढ़ाने के लिए संशोधित कर सकते हैं।

सर्वर से कनेक्ट करने के लिए कौन से ips को अनुमति दी जाएगी, इसे नियंत्रित करने के लिए आप पैरामीटर सुनो_एड्रेस का उपयोग कर सकते हैं। यहां केवल ज्ञात ips या आपके नेटवर्क से कनेक्शन की अनुमति देने और "*", "0.0.0.0:0" या "::" जैसे सामान्य मानों से बचने का एक अच्छा अभ्यास है, जो PostgreSQL को किसी भी IP से कनेक्शन स्वीकार करने के लिए कहेगा।

पोर्ट को बदलना जो पोस्टग्रेस्क्ल सुनेगा (डिफ़ॉल्ट रूप से 5432) भी एक विकल्प है। आप पोर्ट पैरामीटर के मान को संशोधित करके ऐसा कर सकते हैं।

वर्क_मेम, मेंटेनेंस_वर्क_मेम, temp_buffer , max_prepared_transactions, temp_file_limit जैसे पैरामीटर्स को ध्यान में रखना महत्वपूर्ण है यदि आपके पास सर्विस अटैक से इनकार है। ये कथन/सत्र पैरामीटर हैं जिन्हें विभिन्न स्तरों (डीबी, उपयोगकर्ता, सत्र) पर सेट किया जा सकता है, इसलिए इन्हें बुद्धिमानी से प्रबंधित करने से हमें हमले के प्रभाव को कम करने में मदद मिल सकती है।

3. उपयोगकर्ता और भूमिका प्रबंधन

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

इसे प्रबंधित करना हमेशा आसान नहीं होता है और अगर शुरुआत से ही इसे ठीक से नहीं किया गया तो यह वास्तव में गड़बड़ हो सकता है।

विशेषाधिकारों को नियंत्रण में रखने का एक अच्छा तरीका भूमिका, समूह, उपयोगकर्ता रणनीति का उपयोग करना है।

Postgresql में सब कुछ एक भूमिका माना जाता है, लेकिन हम इसमें कुछ बदलाव करने जा रहे हैं।

इस रणनीति में आप तीन अलग-अलग प्रकार या भूमिकाएँ बनाएंगे:

  • भूमिका भूमिका (उपसर्ग r_ द्वारा पहचानी गई)
  • समूह भूमिका (उपसर्ग g_ द्वारा पहचाना गया)
  • उपयोगकर्ता की भूमिका (आमतौर पर व्यक्तिगत या एप्लिकेशन नाम)

भूमिकाएँ (r_ भूमिकाएँ) वही होंगी जिनके पास वस्तुओं पर विशेषाधिकार होंगे। समूह भूमिकाएं (g_ भूमिकाएं) r_ भूमिकाओं के साथ दी जाएंगी, इसलिए वे r_ भूमिकाओं का एक संग्रह होंगी। और अंत में, उपयोगकर्ता भूमिकाएं एक या अधिक समूह भूमिकाओं के साथ प्रदान की जाएंगी और वे लॉगिन विशेषाधिकार वाली होंगी।

आइए इसका एक उदाहरण दिखाते हैं। हम example_schema के लिए केवल पढ़ने के लिए एक समूह बनाएंगे और फिर इसे उपयोगकर्ता को प्रदान करेंगे:

हम केवल पढ़ने के लिए भूमिका बनाते हैं और इसे ऑब्जेक्ट विशेषाधिकार प्रदान करते हैं

CREATE ROLE r_example_ro NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
GRANT USAGE ON SCHEMA example to r_example_ro;
GRANT SELECT ON ALL TABLES IN SCHEMA example to r_example_ro;
ALTER DEFAULT PRIVILEGES IN SCHEMA example GRANT SELECT ON TABLES TO r_example_ro;

हम केवल पढ़ने के लिए समूह बनाते हैं और उस समूह को भूमिका प्रदान करते हैं

CREATE ROLE g_example_ro NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION';
GRANT r_example_ro to g_example_ro;

हम app_user भूमिका बनाते हैं और इसे केवल पढ़ने के लिए समूह में "शामिल" करते हैं

CREATE ROLE app_user WITH LOGIN ;
ALTER ROLE app_user WITH PASSWORD 'somePassword' ;
ALTER ROLE app_user VALID UNTIL 'infinity' ;
GRANT g_example_ro TO app_user;

इस पद्धति का उपयोग करके आप विशेषाधिकारों की ग्रैन्युलैरिटी को प्रबंधित कर सकते हैं और आप उपयोगकर्ताओं को एक्सेस के समूहों को आसानी से प्रदान और निरस्त कर सकते हैं। भूमिकाओं को सीधे उपयोगकर्ताओं के लिए करने के बजाय केवल ऑब्जेक्ट विशेषाधिकार देना और केवल उपयोगकर्ताओं को लॉगिन विशेषाधिकार देना याद रखें।

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

REVOKE CONNECT ON my_database FROM PUBLIC;
GRANT CONNECT ON my_database TO r_example_ro;

SUPERUSER एक्सेस को प्रतिबंधित करें, केवल लोकलहोस्ट/यूनिक्स डोमेन से सुपरयूज़र कनेक्शन की अनुमति दें।

अलग-अलग उद्देश्यों के लिए विशिष्ट उपयोगकर्ताओं का उपयोग करें, जैसे विशिष्ट ऐप उपयोगकर्ता या बैकअप उपयोगकर्ता, और केवल आवश्यक आईपी से उस उपयोगकर्ता के लिए कनेक्शन सीमित करें।

4. सुपर उपयोगकर्ता प्रबंधन

अपने डेटाबेस को सुरक्षित रखने और पासवर्ड हैक से बचने के लिए एक मजबूत पासवर्ड नीति बनाए रखना आवश्यक है। एक मजबूत नीति के लिए अधिमानतः विशेष वर्णों, संख्याओं, अपरकेस और लोअरकेस वर्णों का उपयोग करें और उनमें कम से कम 10 वर्ण हों।

एलडीएपी या पीएएम जैसे बाहरी प्रमाणीकरण उपकरण भी हैं, जो आपके पासवर्ड की समाप्ति और पुन:उपयोग नीति सुनिश्चित करने में आपकी सहायता कर सकते हैं, और प्रमाणीकरण त्रुटियों पर खाता लॉकिंग को भी संभाल सकते हैं।

5. डेटा एन्क्रिप्शन (कनेक्शन एसएसएल पर)

बढ़ी हुई सुरक्षा के लिए क्लाइंट/सर्वर संचार को एन्क्रिप्ट करने के लिए एसएसएल कनेक्शन का उपयोग करने के लिए PostgreSQL के पास मूल समर्थन है। एसएसएल (सिक्योर सॉकेट लेयर) एक वेब सर्वर और एक ब्राउज़र के बीच एक एन्क्रिप्टेड लिंक स्थापित करने के लिए मानक सुरक्षा तकनीक है। यह लिंक सुनिश्चित करता है कि वेब सर्वर और ब्राउज़र के बीच पारित सभी डेटा निजी और अभिन्न बने रहें।

चूंकि पोस्टग्रेस्क्ल क्लाइंट सादे-पाठ में प्रश्न भेजते हैं और डेटा भी अनएन्क्रिप्टेड भेजा जाता है, यह नेटवर्क स्पूफिंग के लिए असुरक्षित है।

आप postgresql.conf में ssl पैरामीटर को चालू करके SSL सक्षम कर सकते हैं।

सर्वर एक ही टीसीपी पोर्ट पर सामान्य और एसएसएल कनेक्शन दोनों के लिए सुनेगा, और एसएसएल का उपयोग करने के लिए किसी भी कनेक्टिंग क्लाइंट के साथ बातचीत करेगा। डिफ़ॉल्ट रूप से, यह क्लाइंट के विकल्प पर होता है, लेकिन आपके पास ऊपर वर्णित pg_hba कॉन्फ़िग फ़ाइल का उपयोग करके कुछ या सभी कनेक्शनों के लिए SSL के उपयोग की आवश्यकता के लिए सर्वर को सेटअप करने का विकल्प होता है।

6. आराम पर डेटा एन्क्रिप्शन (pg_crypto)

एन्क्रिप्शन के दो बुनियादी प्रकार हैं, एक तरह से और दो तरह से। एक तरह से आप कभी भी डेटा को पठनीय रूप में डिक्रिप्ट करने की परवाह नहीं करते हैं, लेकिन आप केवल यह सत्यापित करना चाहते हैं कि उपयोगकर्ता जानता है कि अंतर्निहित गुप्त पाठ क्या है। यह आमतौर पर पासवर्ड के लिए उपयोग किया जाता है। दो तरह से एन्क्रिप्शन में, आप डेटा को एन्क्रिप्ट करने की क्षमता के साथ-साथ अधिकृत उपयोगकर्ताओं को इसे एक सार्थक रूप में डिक्रिप्ट करने की अनुमति देना चाहते हैं। क्रेडिट कार्ड और एसएसएन जैसे डेटा इस श्रेणी में आते हैं।

एक तरह से एन्क्रिप्शन के लिए, pgcrypto में पैक किया गया क्रिप्ट फ़ंक्शन md5 तरीके से सुरक्षा का एक अतिरिक्त स्तर प्रदान करता है। इसका कारण यह है कि एमडी 5 के साथ, आप बता सकते हैं कि किसके पास एक ही पासवर्ड है क्योंकि कोई नमक नहीं है (क्रिप्टोग्राफी में, एक नमक यादृच्छिक डेटा होता है जिसे एक तरफा फ़ंक्शन के अतिरिक्त इनपुट के रूप में उपयोग किया जाता है जो "हैश" डेटा, एक पासवर्ड या पासफ़्रेज़), इसलिए समान पासवर्ड वाले सभी लोगों के पास समान एन्कोडेड md5 स्ट्रिंग होगी। क्रिप्ट के साथ, वे अलग होंगे।

डेटा के लिए जिसे आप पुनर्प्राप्त करना चाहते हैं, आप यह नहीं जानना चाहते हैं कि जानकारी के दो टुकड़े समान हैं, लेकिन आप उस जानकारी को नहीं जानते हैं, और आप चाहते हैं कि केवल अधिकृत उपयोगकर्ता ही इसे पुनर्प्राप्त करने में सक्षम हों। Pgcrypto इसे पूरा करने के कई तरीके प्रदान करता है, इसलिए इसका उपयोग करने के तरीके के बारे में आगे पढ़ने के लिए आप https://www.postgresql.org/docs/current/static/pgcrypto.html पर आधिकारिक पोस्टग्रेस्क्ल दस्तावेज़ देख सकते हैं।

7. लॉगिंग

Postgresql क्या, कब और कहाँ लॉग इन करना है, इसे नियंत्रित करने के लिए कई प्रकार के कॉन्फ़िगरेशन पैरामीटर प्रदान करता है।

आप सत्र कनेक्शन/डिस्कनेक्शन, लंबे समय तक चलने वाले प्रश्न, अस्थायी फ़ाइल आकार आदि को सक्षम कर सकते हैं। यह अजीब व्यवहारों की पहचान करने के लिए आपको अपने कार्यभार का बेहतर ज्ञान प्राप्त करने में मदद कर सकता है। आप निम्न लिंक https://www.postgresql.org/docs/9.6/static/runtime-config-logging.html

पर लॉगिंग के लिए सभी विकल्प प्राप्त कर सकते हैं।

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

अधिक जानकारी के लिए https://www.postgresql.org/docs/9.6/static/pgstatstatements.html।

आज श्वेतपत्र डाउनलोड करें क्लस्टर नियंत्रण के साथ पोस्टग्रेएसक्यूएल प्रबंधन और स्वचालन इस बारे में जानें कि पोस्टग्रेएसक्यूएल को तैनात करने, निगरानी करने, प्रबंधित करने और स्केल करने के लिए आपको क्या जानना चाहिए। श्वेतपत्र डाउनलोड करें

8. ऑडिटिंग

PostgreSQL ऑडिट एक्सटेंशन (pgAudit) मानक PostgreSQL लॉगिंग सुविधा के माध्यम से विस्तृत सत्र और/या ऑब्जेक्ट ऑडिट लॉगिंग प्रदान करता है।

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

9. पैचिंग

महत्वपूर्ण सुरक्षा अपडेट और पैच के लिए PostgreSQL के सुरक्षा सूचना पृष्ठ को नियमित रूप से और बार-बार देखें।

ध्यान रखें कि OS या लाइब्रेरी सुरक्षा बग भी डेटाबेस लीक का कारण बन सकते हैं, इसलिए सुनिश्चित करें कि आप इनके लिए पैचिंग अप टू डेट रखें।

ClusterControl एक परिचालन रिपोर्ट प्रदान करता है जो आपको यह जानकारी देता है और आपके लिए पैच और अपग्रेड निष्पादित करेगा।

<एच2>10. पंक्ति स्तरीय सुरक्षा

GRANT के माध्यम से उपलब्ध SQL-मानक विशेषाधिकार प्रणाली के अलावा, तालिकाओं में पंक्ति सुरक्षा नीतियां हो सकती हैं जो प्रति-उपयोगकर्ता के आधार पर प्रतिबंधित करती हैं, कौन सी पंक्तियों को सामान्य प्रश्नों द्वारा वापस किया जा सकता है या डेटा संशोधन आदेशों द्वारा सम्मिलित, अद्यतन या हटाया जा सकता है। इस सुविधा को पंक्ति-स्तरीय सुरक्षा के रूप में भी जाना जाता है।

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

यहां एक सरल उदाहरण दिया गया है कि केवल प्रबंधकों की भूमिका के सदस्यों को पंक्तियों और उनके खातों की पंक्तियों तक पहुंचने की अनुमति देने के लिए खाता संबंध पर एक नीति कैसे बनाई जाए:

CREATE TABLE accounts (manager text, company text, contact_email text);
ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;
CREATE POLICY account_managers ON accounts TO managers USING (manager = current_user);

आप इस सुविधा के बारे में आधिकारिक पोस्टग्रेस्क्ल दस्तावेज़ीकरण https://www.postgresql.org/docs/9.6/static/ddl-rowsecurity.html

पर अधिक जानकारी प्राप्त कर सकते हैं।

यदि आप अधिक जानना चाहते हैं, तो यहां कुछ संसाधन दिए गए हैं जो आपकी डेटाबेस सुरक्षा को बेहतर ढंग से मजबूत करने में आपकी सहायता कर सकते हैं…

  • https://www.postgresql.org/docs/9.6/static/auth-pg-hba-conf.html
  • https://www.postgresql.org/docs/9.6/static/ssl-tcp.html
  • https://www.postgresql.org/docs/current/static/pgcrypto.html
  • http://www.postgresonline.com/journal/archives/165-Encrypting-data-with-pgcrypto.html
  • https://github.com/pgaudit/pgaudit
  • https://www.postgresql.org/docs/9.6/static/pgstatstatements.html

निष्कर्ष

यदि आप ऊपर दिए गए सुझावों का पालन करते हैं तो आपका सर्वर सुरक्षित रहेगा, लेकिन इसका मतलब यह नहीं है कि यह अटूट होगा।

आपकी अपनी सुरक्षा के लिए हम अनुशंसा करते हैं कि आप Nessus जैसे सुरक्षा परीक्षण टूल का उपयोग करें, ताकि यह जान सकें कि आपकी मुख्य कमजोरियां क्या हैं और उन्हें हल करने का प्रयास करें।

आप ClusterControl के साथ अपने डेटाबेस की निगरानी भी कर सकते हैं। इससे आप रीयल टाइम में देख सकते हैं कि आपके डेटाबेस के अंदर क्या हो रहा है और उसका विश्लेषण करें।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सभी स्कीमा में PostgreSQL एक्सटेंशन स्थापित करना

  2. PostgreSQL में समय मान से मिनट घटाएं

  3. WHERE क्लॉज में एक कॉलम नाम उपनाम का संदर्भ लें

  4. PostgreSQL:'मिनट के हिसाब से' क्वेरी के लिए पंक्तियों की गिनती चल रही है

  5. कैसे LocalTime () PostgreSQL में काम करता है