एक बेसिक HTTP (s) वेबसर्वर के लिए एक सुरक्षित, मानक iptables नियम-सेट


15

मैं एक मूल सर्वर iptables स्क्रिप्ट को एक साथ रखने की कोशिश कर रहा हूं जो कि HTTP (S) और SSH (पोर्ट 80, 443, और 22) का उपयोग करके एक मूल वेबसर्वर चलाने वाली अधिकांश साइटों के लिए काम करेगा। आखिरकार, अधिकांश वीपीएस को केवल इन शुरुआती पोर्ट नियमों की आवश्यकता होती है और बाद में आवश्यकतानुसार मेल या गेम पोर्ट जोड़ सकते हैं।

अब तक मेरे पास निम्नलिखित नियम हैं और मैं सोच रहा था कि क्या किसी को बेहतर स्क्रिप्ट या किसी सुधार के बारे में पता है जिसे जोड़ा जा सकता है।

*filter

#  Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

#  Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#  Allows all outbound traffic
#  You can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allows SSH connections (only 4 attempts by an IP every 3 minutes, drop the rest)
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --rsource
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 180 --hitcount 4 --name DEFAULT --rsource -j DROP
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

iptables आपके बॉक्स को सुरक्षित करने के सबसे महत्वपूर्ण हिस्सों में से एक है (यह भी विफल 2ban देखें) और फिर भी खुद के जैसे कई लोग हैं जिन्हें हमारे सर्वर के लिए एक सुरक्षित बुनियादी फ़ायरवॉल बनाने में जाने वाली हर चीज़ को समझने में परेशानी होती है।

वेबसर्वर के लिए आवश्यक बुनियादी बंदरगाहों को खोलने का सबसे सुरक्षित तरीका क्या है?

अद्यतन: cyberciti.biz में एक और iptables स्क्रिप्ट है जो बहुत अच्छी लगती है।

इसके अलावा, Denyhosts या fail2ban का उपयोग करने के बजाय आप SSH पर खराब दोहराए गए प्रयासों को अवरुद्ध करने के लिए खुद iptables का उपयोग कर सकते हैं ।


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

अच्छी बात है, यह देखते हुए कि अधिकांश वीपीएस संभवतः वीएम के साथ वीएम में हैं जो लैन से सुलभ हैं, मैं कहूंगा कि उन पर भरोसा नहीं करना स्मार्ट सिटी जगह होगी। यदि आपके पास अतिरिक्त वीपीएस है तो आप उन्हें (यानी वेबसर्वर को डेटाबेस तक) पहुंचाने के लिए बाद में नियम जोड़ सकते हैं।
Xeoncross

1
चेतावनी: यदि आप उल्लिखित cyberciti.biz स्क्रिप्ट निष्पादित करते हैं और modprobeस्थापित नहीं है (या पोर्ट 22 खोलने से पहले कोई अन्य त्रुटि है), तो आप अपने आप को सर्वर से बाहर कर देंगे।
ईघनम

जवाबों:


14

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

मैं इसका उपयोग करता हूं, इसे काम करने के लिए केवल थोड़ा सा परिवर्तनीय असाइनमेंट किया जाना चाहिए।

  #!/bin/bash +x

  # first author: marcos de vera
  # second: joan marc riera

  ip=/sbin/iptables
  mriera="xx.xx.xx.xx"
  nsancho="yy.yy.yy.yy"
  admins="$mriera $nsancho "
  sshers=""
  mysqlrs="zz.zz.zz.zz/23"
  snmprs="uu.uu.uu.uu"
  tcpservices="80 443 22"
  udpservices=""

  # Firewall script for servername

  echo -n ">> Applying iptables rules... "

  ## flushing...
  $ip -F
  $ip -X
  $ip -Z
  $ip -t nat -F

  # default: DROP!
  $ip -P INPUT DROP
  $ip -P OUTPUT DROP
  $ip -P FORWARD DROP

  # filtering...

  # localhost: free pass!
  $ip -A INPUT -i lo -j ACCEPT
  $ip -A OUTPUT -o lo -j ACCEPT

  # administration ips: free pass!
  for admin in $admins ; do
      $ip -A INPUT -s $admin -j ACCEPT
      $ip -A OUTPUT -d $admin -j ACCEPT
  done

  # allow ssh access to sshers
  for ssher in $sshers ; do
      $ip -A INPUT -s $ssher -p tcp -m tcp --dport 22 -j ACCEPT
      $ip -A OUTPUT -d $ssher -p tcp -m tcp --sport 22 -j ACCEPT
  done

  # allow access to mysql port to iReport on sugar

  for mysql in $mysqlrs ; do
      $ip -A INPUT -s $mysql -p tcp -m tcp --dport 3306 -j ACCEPT
      $ip -A OUTPUT -d $mysql -p tcp -m tcp --sport 3306 -j ACCEPT
      $ip -A INPUT -s $mysql -p udp -m udp --dport 3306 -j ACCEPT
      $ip -A OUTPUT -d $mysql -p udp -m udp --sport 3306 -j ACCEPT
  done


  # allowed services
  for service in $tcpservices ; do
      $ip -A INPUT -p tcp -m tcp --dport $service -j ACCEPT
      $ip -A OUTPUT -p tcp -m tcp --sport $service -m state --state RELATED,ESTABLISHED -j ACCEPT
  done
  for service in $udpservices ; do
      $ip -A INPUT -p udp -m udp --dport $service -j ACCEPT
      $ip -A OUTPUT -p udp -m udp --sport $service -m state --state RELATED,ESTABLISHED -j ACCEPT
  done

  $ip -A INPUT -j LOG --log-level 4
  # VAS and VGP
  #88 tcp udp
  #389 tcp ldap queries , udp ldap ping
  #464 tcp upd kerberos
  #3268 tcp global catalog access
  for dc in ip.ip.ip.ip ; do # our dc servers for some ldap auth
      vas=88
      $ip -A INPUT -s $dc -p tcp -m tcp --dport $vas -j ACCEPT
      $ip -A OUTPUT -d $dc -p tcp -m tcp --dport $vas -j ACCEPT
      $ip -A INPUT -s $dc -p udp -m udp --dport $vas -j ACCEPT
      $ip -A OUTPUT -d $dc -p udp -m udp --dport $vas -j ACCEPT
      ldap=389
      $ip -A INPUT -s $dc -p tcp -m tcp --dport $ldap -j ACCEPT
      $ip -A OUTPUT -d $dc -p tcp -m tcp --dport $ldap -j ACCEPT
      $ip -A INPUT -s $dc -p udp -m udp --dport $ldap -j ACCEPT
      $ip -A OUTPUT -d $dc -p udp -m udp --dport $ldap -j ACCEPT
      kpasswd=464
      $ip -A INPUT -s $dc -p tcp -m tcp --dport $kpasswd -j ACCEPT
      $ip -A OUTPUT -d $dc -p tcp -m tcp --dport $kpasswd -j ACCEPT
      $ip -A INPUT -s $dc -p udp -m udp --dport $kpasswd -j ACCEPT
      $ip -A OUTPUT -d $dc -p udp -m udp --dport $kpasswd -j ACCEPT
      gca=3268
      $ip -A INPUT -s $dc -p tcp -m tcp --dport $gca -j ACCEPT
      $ip -A OUTPUT -d $dc -p tcp -m tcp --dport $gca -j ACCEPT
      vgp=445
      $ip -A INPUT -s $dc -p tcp -m tcp --dport $vgp -j ACCEPT
      $ip -A OUTPUT -d $dc -p tcp -m tcp --dport $vgp -j ACCEPT
  done


  # allow the machine to browse the internet
  $ip -A INPUT -p tcp -m tcp --sport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT
  $ip -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
  $ip -A INPUT -p tcp -m tcp --sport 443 -m state --state RELATED,ESTABLISHED -j ACCEPT
  $ip -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT

  $ip -A INPUT -p tcp -m tcp --sport 8080 -m state --state RELATED,ESTABLISHED -j ACCEPT
  $ip -A OUTPUT -p tcp -m tcp --dport 8080 -j ACCEPT


  # don't forget the dns...
  $ip -A INPUT -p udp -m udp --sport 53 -j ACCEPT
  $ip -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
  $ip -A INPUT -p tcp -m tcp --sport 53 -j ACCEPT
  $ip -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT

  # ... neither the ntp... (hora.rediris.es)
  #$ip -A INPUT -s 130.206.3.166 -p udp -m udp --dport 123 -j ACCEPT
  #$ip -A OUTPUT -d 130.206.3.166 -p udp -m udp --sport 123 -j ACCEPT

  $ip -A INPUT -p udp -m udp --dport 123 -j ACCEPT
  $ip -A OUTPUT -p udp -m udp --sport 123 -j ACCEPT


  # and last but not least, the snmp access
  for monitor in $snmprs ; do
      $ip -A INPUT -s $monitor -p tcp -m tcp --sport 161 -j ACCEPT   # monitoring service
      $ip -A OUTPUT -d $monitor -p tcp -m tcp --dport 161 -j ACCEPT  # monitoring service
  end
  # outgoing SMTP
  $ip -A INPUT -p tcp -m tcp --sport 25 -j ACCEPT
  $ip -A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT


  # temporary backup if we change from DROP to ACCEPT policies
  $ip -A INPUT -p tcp -m tcp --dport 1:1024 -j DROP
  $ip -A INPUT -p udp -m udp --dport 1:1024 -j DROP


  echo "OK. Check rules with iptables -L -n"

  # end :)

मैं इसे कुछ समय के लिए उपयोग कर रहा हूं, और किसी भी प्रकार के संशोधन की बहुत सराहना की जाएगी अगर इसे प्रशासित करना आसान हो जाता है।


कोई भी लोकप्रिय उपकरण जो टीसीपी पर एसएनएमपी (161) का उपयोग करता है? मुझे लगता है कि ये नियम यूडीपी / 161 होना चाहिए।
kubanczyk

1

यह बहुत अच्छा लग रहा है, लेकिन आप चीजों को थोड़ा और नीचे कस सकते हैं। -S झंडा स्रोत आईपी या डोमेन नाम है, और आप "-s 198.23.12.32" या जो कुछ भी आपके आईपी पते को जोड़ने के लिए है, केवल एसएसएच को आपके स्रोत आईपी से अनुमति देता है। आप CIDR शैली संकेतन का उपयोग करके स्रोत IP की एक श्रृंखला भी चुन सकते हैं ।

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

आप एक छद्म आईडी के लिए iptables में विफल 2ban में भी टाई कर सकते हैं । fail2ban आपकी लॉग फ़ाइलों को स्कैन करेगा और अगर वे आपके सिस्टम में अपना रास्ता मजबूर करने का प्रयास करते हैं तो एक आईपी को ब्लॉक कर सकते हैं। उदाहरण के लिए, यदि कोई निश्चित IP पता SSH में 5 बार लॉगिन करने में विफल रहता है, तो आप उन्हें पूरे दिन के लिए लॉक कर सकते हैं। यह FTP और अन्य पर भी काम करता है (अपाचे को मारने वाले खराब बॉट्स सहित)। मैं अपने सभी सर्वरों पर इसका उपयोग ब्रूट-फोर्स हमलों से कुछ अतिरिक्त कुशन प्रदान करने के लिए करता हूं।


मैं वास्तव में DenyHosts का उपयोग करता हूं क्योंकि यह 15MB या इससे अधिक विफल रहता है। हालाँकि, fail2ban अधिक शक्तिशाली है और कई अनुप्रयोगों के साथ काम करता है (न कि SSH जैसे DenyHosts)। यह देखते हुए कि हमलावरों पर प्रतिबंध लगा दिया गया है, क्या मुझे अभी भी लॉग फ़ाइलों को तेजी से भरने की चिंता करनी चाहिए? क्या फाइलों को घुमाने का एक तरीका है जब वे पूर्ण हो जाते हैं? अगर मैं fail2ban में लॉगिंग को अक्षम करता हूं तो क्या Denyhosts / Fail2ban को स्कैन करने के लिए अभी भी लॉग एंट्री हैं? इसके अलावा, स्रोत का विकल्प कुछ लोगों के लिए अच्छा होगा - लेकिन जब से मैं अपने जैसे डिफ़ॉल्ट नियमों वाले लोगों के लिए लक्ष्य बना रहा हूं जो बहुत अधिक घूमते हैं, उस विकल्प का उपयोग नहीं कर सकते हैं।
Xeoncross

@Xeoncross: DenyHosts एक स्टीमिंग पाइल इमो है। मेरे पास यह एक मशीन पर चल रहा था जो लगातार चीनी से घुसपैठ की कोशिश कर रहा था। कुछ महीनों की अवधि के दौरान /etc/hosts.deny में कुछ हज़ार IP तक बढ़ गए, जिसके कारण इसने बॉक्स पर संसाधनों को बहुत कम कर दिया, एक CPU मशीन पर लोड 60+ तक फैल गया। मैंने विफल 2बान पर स्विच किया और कभी पीछे मुड़कर नहीं देखा।
होबोडेव

@ ओहोबोडेव मैंने अभी डेनिहोस्ट्स के साथ शुरू किया था इसलिए मैं इस समस्या को हल करने के लिए पहली बात के रूप में रखूंगा।
Xeoncross

1
@Xeoncross अगर आप iptables लॉग को घुमाना चाहते हैं, तो आप इसके लिए अपनी खुद की logrotate.d स्क्रिप्ट लिख सकते हैं। /Etc/logrotate.d पर एक नज़र डालें और एक दूसरे को कॉपी करें और लॉग फ़ाइल का नाम बदलें और इसे अन्य लॉग फ़ाइलों के साथ घुमाया जाएगा। लॉगरोट के लिए मैन पेज विभिन्न विकल्पों की व्याख्या करता है।
एलन आइवी

1

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

यदि आप HTTPS का उपयोग करते हैं तो एक बेसिक HTTP सर्वर के लिए आप इनकमिंग एक्सेस को पोर्ट 80 और पोर्ट 443 पर खोलना चाहते हैं। कुछ प्रतिबंधित पतों से SSH की आवक आम तौर पर वांछित है। आप आउटगोइंग एक्सेस को भी लॉक कर सकते हैं। आवश्यक सर्वर और सेवाओं के लिए फ़ायरवॉल खोलें। NTP और DNS को खोला जाना चाहिए, साथ ही पैच लाने के लिए एक चैनल भी होना चाहिए।


1

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

BillThor ने इसके बारे में ऊपर बात करना शुरू किया, लेकिन मैं केवल विशिष्ट उदाहरणों के साथ उत्तर दे रहा हूं। Iptables के बारे में एक अच्छी बात यह है कि यह कनेक्शन स्थिति को याद रख सकता है, इसमें भारी तस्करी वाली साइटों पर प्रदर्शन के निहितार्थ हो सकते हैं, लेकिन आप http / https पर अपने इनबाउंड एक्सेस को बदल सकते हैं, उदाहरण के लिए स्थापित कनेक्शन पर केवल उत्तर देने के लिए, या विशेष रूप से कुछ निश्चित सीमाओं को सीमित करने के लिए उपयोगकर्ताओं के पास आउटबाउंड पहुँच बिल्कुल नहीं है। तब आपके आउटबाउंड नियमों से संबंधित, असंबद्ध खंड होते हैं जो सहायक हमलों के एक पूरे मेजबान को रोकते हैं और उन लोगों को धीमा कर देते हैं जिन्हें वास्तव में एक बॉक्स का शोषण करने के लिए एक द्वितीयक चरण की आवश्यकता होती है, जो बहुत आम है।

अंत में, मैं कहूंगा कि अपनी iptables नीति को सेट करना बेहतर है-DROP के बजाय अंत में एक उपयुक्त REJECT है। यह ज्यादातर वरीयता का विषय है, लेकिन गलतियाँ कम कर सकते हैं जब मौजूदा नियमों के साथ जंजीरों को जोड़ने या फ्लशिंग / रीसेट करने के बजाय।


इसलिए मैं बदलना चाहिए -A INPUT -j REJECTकरने के लिए -A INPUT -P DROP?
Xeoncross
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.