একটি সুরক্ষিত, বেসিক HTTP (গুলি) ওয়েব সার্ভারের জন্য স্ট্যান্ডার্ড আইপটিবলস নিয়ম-সেট


15

আমি একটি বেসিক সার্ভার iptables স্ক্রিপ্ট একসাথে রাখার চেষ্টা করছি যা বেশিরভাগ সাইটের জন্য কাজ করবে কেবলমাত্র HTTP (এস) এবং এসএসএইচ (পোর্টস 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

আইপটিবলগুলি আপনার বাক্সটি সুরক্ষিত করার অন্যতম গুরুত্বপূর্ণ অঙ্গ (এছাড়াও ব্যর্থ2ban দেখুন) এবং তবুও আমার মতো অনেক লোক আছেন যা আমাদের সার্ভারগুলির জন্য সুরক্ষিত বেসিক ফায়ারওয়াল তৈরির ক্ষেত্রে যা কিছু বোঝে তা বুঝতে সমস্যা হয়।

কেবলমাত্র কোনও ওয়েবসভারের জন্য প্রয়োজনীয় বুনিয়াদি বন্দরগুলি খোলার সর্বাধিক সুরক্ষিত উপায় কী?

আপডেট: সাইবারসিটি.বিজের আরও একটি iptables স্ক্রিপ্ট রয়েছে যা দেখতে বেশ সুন্দর দেখাচ্ছে।

এছাড়াও, আপনি ড্যানিহোস্ট বা ব্যর্থ 2 ব্যাবহার না করে আপনি এসপিএজে খারাপ পুনরাবৃত্তি প্রচেষ্টা অবরুদ্ধ করতে iptables নিজেই ব্যবহার করতে পারেন ।


আপনি বলছেন এটি একটি ভিপিএস। আমি ধরে নিলাম এর ল্যান আইপি আছে ঠিক আছে? আপনি কি আপনার সাবনেটের প্রতিটি মেশিনকে বিশ্বাস করেন? আপনি এখানে কীভাবে বেহাল হতে চান, আপনি নিজের মেশিনটিকে আরও সুরক্ষিত করতে OUTPUT ফিল্টারিং ব্যবহার করতে পারেন। আমাকে জানিয়ে দিন এবং আমি আপনাকে ব্যবহার করার পরামর্শ দিচ্ছি তার সাথে আমি প্রতিক্রিয়া জানাতে পারি।
হোবডেভ

ভাল পয়েন্ট, বেশিরভাগ ভিপিএস অন্যদের সাথে ল্যান থেকে সম্ভবত অ্যাক্সেসযোগ্য হিসাবে একটি ভিএম এ রয়েছে তা আমি বলব যে তাদের উপর বিশ্বাস না করা স্মার্ট শুরুর জায়গা হবে। আপনার যদি অতিরিক্ত ভিপিএস থাকে তবে সেগুলি অ্যাক্সেস করার জন্য আপনি পরে বিধিগুলি যুক্ত করতে পারেন (অর্থাত্ ডাটাবেসে ওয়েবসারভার)।
Xeoncross

1
সতর্কতা: যদি আপনি উল্লিখিত সাইবারসিটি.বিজ স্ক্রিপ্টটি কার্যকর করেন এবং modprobeইনস্টল না করা থাকে (বা 22 পোর্ট খোলার আগে অন্য কোনও ত্রুটি রয়েছে), আপনি নিজেকে সার্ভার থেকে লক আউট করবেন।
ইওহানম

উত্তর:


14

আইপটিবলগুলির সাথে কাজ করার সর্বাধিক সুরক্ষিত উপায় হ'ল সবকিছু বন্ধ করে দেওয়া এবং কেবল আপনার যা প্রয়োজন তা খুলুন। আমি এক ধরনের বিভ্রান্ত, তাই আমি সর্বদা চেষ্টা করি যতটা সম্ভব অলস হওয়ার চেষ্টা করি, তাই আমি এমন ভুল করি না যা সার্ভারকে অনিরাপদ হতে পারে।

আমি এটি ব্যবহার করি, এটির কাজটি করার জন্য সামান্য কিছুটা ভেরিয়েবল অ্যাসাইনমেন্ট করা উচিত।

  #!/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" যুক্ত করেন বা আপনার আইপি ঠিকানা যাই হোক না কেন কেবল আপনার উত্স আইপি থেকে এসএসএইচকে অনুমতি দেয়। আপনি সিআইডিআর স্টাইল স্বরলিপি ব্যবহার করে বিভিন্ন সূত্রের আইপিও চয়ন করতে পারেন ।

লগিং অস্বীকৃত কল করার সময় আপনার সাবধানতা অবলম্বন করা উচিত। আপনার সার্ভারের আইপি ঠিকানাটি বট, স্ক্রিপ্ট কীডিজ ইত্যাদি দ্বারা স্ক্যান হয়ে যাবে এবং লগ ফাইলটি দ্রুত বড় হয়ে উঠতে পারে। আপনি যদি কোনও নির্দিষ্ট সমস্যা যা আপনার ফায়ারওয়াল ভাঙার চেষ্টা করছেন এর সাথে সম্পর্কিত হতে পারে বলে চিহ্নিত করার চেষ্টা না করে আমি এই বিকল্পটি সরিয়ে ফেলব।

তুমিও গিঁট পারে fail2ban একটি সিউডো-ID র জন্য iptables- র জন্য। ব্যর্থ 2ban আপনার লগ ফাইলগুলি স্ক্যান করবে এবং কোনও আইপি তারা যদি আপনার সিস্টেমে তাদের পথে যেতে বাধ্য করে তবে তাদের ব্লক করতে পারে। উদাহরণস্বরূপ, যদি কোনও নির্দিষ্ট আইপি ঠিকানা এসএসএইচ-এ 5 বার লগইন করতে ব্যর্থ হয়, আপনি সেগুলি পুরো দিনের জন্য লক আউট করতে পারেন। এটি এফটিপি এবং আরও অনেকগুলিতেও কাজ করে (অ্যাপাচে আঘাতকারী খারাপ বটগুলি সহ)।


আমি আসলেই ডিনিহোস্টগুলি ব্যবহার করি যেহেতু এটি 15 এমবি বা তার বেশি ফেলফল 2 সাশ্রয় করে। তবে ফেলফ্যানবান আরও শক্তিশালী এবং অনেক অ্যাপ্লিকেশনের সাথে কাজ করে (ডেনিহোস্টের মতো এসএসএইচ নয়)। আক্রমণকারীদের নিষিদ্ধ করা হয়েছে তা দেওয়া, আমি কি এখনও লগ ফাইলগুলি দ্রুত পূরণ করার বিষয়ে চিন্তা করব? ফাইলগুলি পূর্ণ হয়ে যাওয়ার পরে কি কোনও ঘোরানোর উপায় আছে? যদি আমি ব্যর্থ 2 বাটিতে লগিং অক্ষম করি তবে ড্যানিহোস্টগুলি / ফেইল 2 বামে স্ক্যান করার জন্য লগ এন্ট্রি থাকবে? এছাড়াও, উত্স বিকল্পটি কিছু লোকের পক্ষে ভাল হবে - তবে যেহেতু আমি আমার মতো একটি ডিফল্ট রোলসেট লোকের জন্য লক্ষ্য রাখছি যারা প্রচুর চলাফেরা করে সেই বিকল্পটি ব্যবহার করতে পারে না।
জিওনক্রস

@ এক্সনক্রস: ড্যানিহোস্টগুলি একটি স্টিমিং পাইল ইমো। আমার এটি এমন একটি মেশিনে চলছিল যা চীনাদের কাছ থেকে নিয়মিত প্রবেশের চেষ্টা করছিল। কয়েক মাসের মধ্যে /etc/hosts.deny এর কয়েক হাজার আইপি বৃদ্ধি পেয়েছিল, যার ফলে এসএসডি একটি বাক্সে রিসোর্সগুলি সরিয়ে দেয় এবং একক সিপিইউ মেশিনে 60+ পর্যন্ত লোড ছড়িয়ে দেয়। আমি ব্যর্থ 2ban এ চলেছি এবং কখনই পিছনে ফিরে তাকাতে পারি নি।
হোবডেভ

@ হোবোডেভ আমি সবেমাত্র ড্যানিহোস্টগুলি দিয়ে শুরু করেছি যাতে আমি যখন এই সমস্যা হয়ে উঠি তখন আমি প্রথমে এই বিষয়টিকে স্যুইচ করার প্রথম জিনিস হিসাবে রাখব।
শিওনক্রস

1
@ এক্সনক্রস যদি আপনি iptables লগটি ঘুরতে চান তবে আপনি এটির জন্য নিজের লোগ্রোটেট.ডি স্ক্রিপ্ট লিখতে পারেন। /Etc/logrotate.d দেখুন এবং অন্য একটি অনুলিপি করুন এবং লগ ফাইলের নাম পরিবর্তন করুন এবং এটি অন্যান্য লগ ফাইলের সাথে ঘোরানো হবে। লোগ্রোটেটের ম্যান পেজটি বিভিন্ন অপশন ব্যাখ্যা করে।
অ্যালান আইভে

1

শোরওয়াল দেখে নিন। একক ইন্টারফেস ডিফল্ট কনফিগারেশন একটি ভাল সূচনা পয়েন্ট হবে। এটি কনফিগার করা সহজ, এবং এসএসএইচ এবং ওয়েব অ্যাক্সেসের মতো জিনিসের জন্য ম্যাক্রোগুলি রয়েছে। ফায়ারওয়ালটি বন্ধ হয়ে গেলে সার্ভারটিকে কাঙ্ক্ষিত স্তরে লক ডাউন কনফিগার করা যেতে পারে। শোরওয়াল-লাইটের সাহায্যে আপনি অন্য সার্ভারে ফায়ারওয়াল বিল্ড চালাতে পারেন। লগিং পছন্দসই স্তরে কনফিগার করা সহজ is

একটি বেসিক এইচটিটিপি সার্ভারের জন্য আপনি এইচটিটিপিএস ব্যবহার করে 80 এবং পোর্ট 443 বন্দরটিতে খোলা আগত অ্যাক্সেস চান। কয়েকটি সীমাবদ্ধ ঠিকানা থেকে এসএসএইচ আগত অ্যাক্সেস সাধারণত পছন্দসই হয়। আপনি বহির্গামী অ্যাক্সেসও লক ডাউন করতে চাইতে পারেন। ফায়ারওয়ালটি কেবলমাত্র সার্ভার এবং পরিষেবাগুলিতে খুলুন। এনটিপি এবং ডিএনএস, পাশাপাশি প্যাচ আনার জন্য একটি চ্যানেল খোলা উচিত।


1

আমি বলব এটি একটি দুর্দান্ত ফায়ারওয়াল, এটি অন্তর্ভুক্ত ট্র্যাফিক বন্ধ করার দিকে মনোনিবেশ করা এবং এড্রেস বা বহির্মুখী ট্র্যাফিকের দিকে মনোনিবেশ না করে। কোনও বাক্স থেকে আউটবাউন্ড সংযোগগুলিতে যেগুলি অন্তর্দিকের দিকে ফোকাস করা ঠিক ততটাই গুরুত্বপূর্ণ। দুর্ভাগ্যজনক ক্ষেত্রে যে মেশিনটি আসলে ব্যবহার করা হয়েছে, অতিরিক্ত রুট কিটগুলি ডাউনলোড করা বা কমান্ড এবং নিয়ন্ত্রণ নোডগুলিতে সংযুক্ত হওয়া বা যে কোনও কিছুই রোধ করতে সক্ষম হওয়াই ভাল লাগবে।

বিলথর উপরে এটি সম্পর্কে কথা বলতে শুরু করেছিলেন, তবে আমি কেবল নির্দিষ্ট উদাহরণ দিয়ে উত্তর দিচ্ছি। আইপটিবলগুলি সম্পর্কে একটি দুর্দান্ত বিষয় হ'ল এটি সংযোগের অবস্থাটি মনে করতে পারে, এতে ভারী পাচার হওয়া সাইটগুলিতে পারফরম্যান্সের প্রভাব থাকতে পারে তবে আপনি কেবলমাত্র প্রতিষ্ঠিত সংযোগগুলিতে উত্তর দেওয়ার অনুমতি দিতে বা নির্দিষ্টভাবে অনিরাপদকে সীমাবদ্ধ রাখতে HTTP / https এ আপনার অভ্যন্তরীণ অ্যাক্সেস পরিবর্তন করতে পারেন specifically মোটামুটি বহির্মুখী অ্যাক্সেস থাকা থেকে ব্যবহারকারীরা। তারপরে আপনার আউটবাউন্ড বিধিগুলি সম্পর্কিত, প্রবর্তিত ধারাগুলি থাকতে পারে যা আনুষঙ্গিক আক্রমণগুলির পুরো হোস্টকে আটকাতে পারে এবং একটি বাক্সকে সত্যিকার অর্থে শোষণ করার জন্য একটি মাধ্যমিক পর্যায়ে প্রয়োজন এমনগুলি ধীর করে দেয় যা খুব সাধারণ very

পরিশেষে, আমি বলব যে আপনার iptables পলিসি -P DROP সেট করা ভাল তবে শেষে যুক্ত হওয়া REJECT এর চেয়ে ভাল। এটি বেশিরভাগ পছন্দের বিষয়, তবে সন্নিবেশ বা ফ্লাশিং / রিসেটের পরিবর্তে বিদ্যমান নিয়মগুলি শৃঙ্খলে যুক্ত করার সময় ভুলগুলি হ্রাস করতে পারে।


তাহলে আমার কি বদলে -A INPUT -j REJECTযাওয়া উচিত -A INPUT -P DROP?
শিওনক্রস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.