एक वेबसर्वर के लिए नियम शुरू करने वाले अच्छे iptables?


12

मैं एक नया सेंटो 5.4 सर्वर स्थापित कर रहा हूं और मैं स्टार्टअप के लिए म्यू iptables के लिए स्वच्छ नियमों का एक सेट होना चाहूंगा।

शुरू करने के लिए अच्छे नियम क्या होंगे?

क्या यह एक अच्छा प्रारंभिक बिंदु है:

# Allow outgoing traffic and disallow any passthroughs

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# Allow traffic already established to continue

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow ssh, ftp and web services

iptables -A INPUT -p tcp --dport ssh -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT

# Allow local loopback services

iptables -A INPUT -i lo -j ACCEPT

# Allow pings

iptables -I INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -I INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -I INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

यह नियम क्या है:

iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT

अपडेट करें :

यह एफ़टीपी (आवश्यक), अपाचे, एसएसएच, mysql के साथ एक वेब सर्वर होगा।


मैं इस सरल नियम का उपयोग करता हूं .... सब कुछ बंद करो और पीछे की ओर काम करो और जो आवश्यक है उसे खोलें। एक वेब सर्वर के लिए, पोर्ट 80/443 आमतौर पर केवल सार्वजनिक सामना करने वाली सेवाएं हैं। अन्य सभी चीज़ों को सीमित करें या पहुंच को सीमित करें - उदाहरण के लिए निर्दिष्ट आईपी या निजी नेटवर्क के लिए ssh को सीमित करें।
jeffatrackaid

जवाबों:


13

आपके IPTables नियम आपके सर्वर के लिए अधिकतर उपयुक्त प्रतीत होते हैं। लेकिन मैं कुछ संभावित बदलावों का सुझाव दूंगा:

  • जब तक आपको पूरे इंटरनेट से SSH, MySQL और FTP एक्सेस की अनुमति देने की आवश्यकता नहीं होती, तब तक कुछ स्वीकृत IP पतों से उन पोर्ट पर पहुँच को प्रतिबंधित करने के लिए '--source' विकल्प का उपयोग करना अधिक सुरक्षित होगा। उदाहरण के लिए, केवल IP पता 71.82.93.101 से SSH एक्सेस की अनुमति देने के लिए, आप 5 वें नियम को 'iptables-INPUT -p tcp --dport ssh --source 71.82.93.101 -01-eth -j ACCEPT' में बदल देंगे। आपको संभवतः प्रत्येक व्यक्तिगत आईपी पते के लिए एक अलग नियम जोड़ने की आवश्यकता होगी जिसे आप अनुमति देना चाहते हैं, इस प्रश्न को उस पर अधिक जानकारी के लिए देखें: एकाधिक स्रोत आईपी को iptables

  • जब तक यह मशीन DNS सर्वर नहीं चलाती है, आप संभवतः 'डोमेन' (53) पोर्ट तक पहुंच को रोकना चाहेंगे। ऐसा करने के लिए, बस 'iptables-IN INUTUT -p tcp --dport domain -i eth0 -j ACCEPT' लाइन हटा दें। (यह भी आपके अंतिम प्रश्न का जवाब देना चाहिए, BTW।) यदि आप वास्तव में एक DNS सर्वर चला रहे हैं, हालांकि, इस नियम को जगह में छोड़ दें।

  • यदि आपको नेटवर्क पर दूरस्थ MySQL क्लाइंट एक्सेस की अनुमति देने की आवश्यकता है, तो आपको मानक एसक्यूएल पोर्ट के बाहरी उपयोग को खोलने के लिए लाइन 'iptables-IN INUTUT -p tcp --dport 3306 -i eth0 -j ACCEPT' जोड़ना होगा। । लेकिन यह तब तक न करें जब तक कि यह वास्तव में आवश्यक न हो - यदि आपको केवल स्थानीय MySQL एक्सेस की आवश्यकता है (Apache के तहत चलने वाले PHP ऐप के लिए, तो), आपको दूरस्थ MySQL एक्सेस प्रदान करने की आवश्यकता नहीं है। और जब तक आप हैक होने का जोखिम नहीं उठाना चाहते हैं, यदि आप नेटवर्क को पोर्ट 3306 करते हैं, तो सुनिश्चित करें कि आपको सभी MySQL उपयोगकर्ता खातों के लिए मजबूत पासवर्ड की आवश्यकता है, और यह कि आपके MySQL सर्वर पैकेज अप-टू-डेट हैं।

  • आपकी एक टिप्पणी ('ssh, dns, ldap, ftp और वेब सेवाओं की अनुमति दें') में LDAP सेवाओं का उल्लेख है, लेकिन आपके कॉन्फ़िगरेशन में ऐसा कोई नियम नहीं है। यह मेरे लिए बहुत कुछ होता है जब मैं एक उदाहरण कॉन्फ़िगरेशन की प्रतिलिपि बनाता हूं और इसे संशोधित करता हूं। यह फ़ंक्शन को प्रभावित नहीं करेगा, लेकिन मैं टिप्पणी को ठीक कर दूंगा, क्योंकि भ्रामक टिप्पणियां भविष्य में आपको या किसी अन्य व्यवस्थापक को भ्रमित करके अप्रत्यक्ष रूप से पैदा कर सकती हैं।

मेरे अनुभव में, IPTables नियमों का एक आदर्श सेट के साथ आना मुश्किल है, लेकिन मुझे लगता है कि आप निश्चित रूप से सही रास्ते पर हैं। इसके अलावा, IPTables के बारे में अधिक जानने के लिए शुभकामनाएँ - ये नियम पहली बार में जटिल लग सकते हैं, लेकिन किसी भी Linux sysadmin के लिए यह एक बहुत ही उपयोगी कौशल है।


1
फ़ायरवॉल के माध्यम से दूरस्थ MySQL एक्सेस की अनुमति देने के बजाय आप बस यह सुनिश्चित कर सकते हैं कि MySQL सर्वर तक पहुँचने की आवश्यकता वाले सभी लोगों को SSH पोर्ट फॉरवर्ड करने का अधिकार है।
ptman

SSH पोर्ट फॉरवर्ड पोर्ट खोलने और MySQL परमिशन को लॉक करने का एक संभावित विकल्प है। लेकिन जब तक वह संवेदनशील डेटा और / या वह एक हाई-प्रोफाइल टारगेट (जो SSH की एन्क्रिप्शन सुविधाओं को उपयोगी बना देगा) के साथ काम नहीं कर रहा है, मुझे इसका फायदा नहीं दिखता। आखिरकार, एसएसएच टनलिंग के अपने नुकसान हैं, जिनमें शामिल हैं: सेटअप / कॉन्फ़िगरेशन की परेशानी; सीपीयू उपयोग में वृद्धि, और बैंडविड्थ को सीमित करना (ओपनएसएसएच के स्थिर बफर आकार के कारण)। और क्या होगा अगर वह अपने सभी दूरस्थ MySQL ग्राहकों को स्थानीय लॉगिन नहीं करना चाहता है?
रयान बी। लिंच

जहाँ तक नियमों का मिलान नहीं करने वाली टिप्पणियां हैं, ICMP नियम अनुरेखक, PMTU खोज और अन्य उपयोगी संदेशों की अनुमति देते हैं, लेकिन वे पिंग्स (इको-अनुरोध और प्रतिध्वनि-उत्तर) की अनुमति नहीं देते हैं।
गेराल्ड कॉम्स

जेराल्ड, यह एक अच्छी पकड़ है, मैंने यह भी नहीं देखा। उसे संभवतः टिप्पणी को बदलना चाहिए कि पिंग की अनुमति नहीं है, या उसे ICMP गूंज अनुरोध / उत्तर ट्रैफ़िक की अनुमति देने वाले नियमों को जोड़ना चाहिए।
रयान बी। लिंच

4

निश्चित रूप से अपने आउटबाउंड ट्रैफ़िक को भी प्रतिबंधित करने के लिए देखें।

मैंने ऐसे बहुत से मामले देखे हैं जहां PHP किसी और के दुर्भावनापूर्ण कोड लाने के लिए 'कर्ल' या 'wget' का उपयोग करके किसी का परिणाम देता है, फिर किसी बोटनेट में शामिल होने के लिए इसे अपने सर्वर पर निष्पादित करें।

यदि आप अपाचे की उम्मीद नहीं करते हैं (उदाहरण के रूप में) खुद को अन्य वेबसाइटों से बात करने की ज़रूरत है, तो यातायात को सीमित करें और अपने आप को लाइन के नीचे थोड़ा दर्द बचाएं!


2

ये नियम "iptables-restore" के माध्यम से आयात करने के लिए तैयार हैं:

*filter
:INPUT DROP [20:2036]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [93:16260]
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -m comment --comment "allow ICMP: echo-reply"
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -m comment --comment "allow ICMP: echo-request"
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -m comment --comment "allow ICMP: destination-unreachable"
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT -m comment --comment "allow ICMP: source-quench"
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT  -m comment --comment "allow ICMP: time-exceeded"
-A INPUT -i lo -j ACCEPT -m comment --comment "allow input from the loop-back adapter"
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -m comment --comment "allow SSH: ssh"
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m udp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p udp -m udp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p tcp -m tcp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p udp -m udp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT -m comment --comment "allow MariaDB/MySQL: mysql"
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "allow HTTP (apache/nxing/lighttpd)"
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "allow HTTPS (apache/nxing/lighttpd)"
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  -m comment --comment "allow already established connections"
COMMIT

और सिर्फ रिकॉर्ड के लिए ... इन डिफ़ॉल्ट नीतियों को भी सेट किया जाना चाहिए, यदि उपरोक्त iptables-पुनर्स्थापना का उपयोग नहीं किया गया है:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

मैंने आपकी पोस्ट संपादित कर दी है - StackOverflow एक प्रश्न / उत्तर प्रारूप है। कृपया अक्सर पूछे जाने वाले प्रश्न पढ़ें: stackoverflow.com/faq
89c3b1b8-b1ae-11e6-b842-48d705

यह प्रदर्शन के मुद्दों को पेश करेगा, क्योंकि राज्य का शासन यहां अंतिम रूप से दिखाई देता है, और इसे पहले दिखाई देना चाहिए क्योंकि यह पैकेट के विशाल बहुमत से मेल खाता है।
माइकल हैम्पटन

0

क्यों आप ftp और dns की अनुमति देते हैं? क्या आपका सर्वर उन सेवाओं को प्रदान करता है? एफ़टीपी वास्तव में इस्तेमाल नहीं किया जाना चाहिए, कुछ बहुत विशिष्ट उपयोग के मामलों को छोड़कर, एसएफटीपी का उपयोग करें (एफटीपीएस नहीं)। इसके अलावा, सांकेतिक नामों और http द्वारा सभी अन्य बंदरगाहों को संख्यात्मक 80 से क्यों निर्दिष्ट करें? क्या आपने इसे कहीं और से कॉपी किया था? कोई भी नकल और सलाह समझ की कमी के लिए नहीं जा रही है। सुनिश्चित करें कि आप टीसीपी, आईपी, फायरवॉल और उन सेवाओं के प्रोटोकॉल को समझते हैं जो आप प्रदान करने जा रहे हैं।


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

आप शायद सही हैं। मेरी टिप्पणी नकारात्मक लग सकती है, लेकिन ऐसा नहीं था। मैं उन प्रश्नों को सूचीबद्ध करने की कोशिश कर रहा था जो प्रासंगिक विचार प्रक्रियाओं को ट्रिगर करेंगे। और जब से मुझे समझ में आधार स्तर नहीं पता है कि मैंने एक पाठ्यपुस्तक लिखना शुरू नहीं किया है। लेकिन आप अनहेल्दी टोन के बारे में बिल्कुल सही हैं। सौभाग्य से आपने अधिक उपयोगी उत्तर लिखा है।
ptman
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.