Temel bir HTTP (ler) web sunucusu için güvenli, standart iptables kural kümesi


15

Sadece HTTP (S) ve SSH (bağlantı noktaları 80, 443 & 22) kullanarak temel bir web sunucusu çalıştıran çoğu site için çalışacak bir temel sunucu iptables komut dosyası koymak için çalışıyorum. Sonuçta, çoğu VPS yalnızca bu başlangıç ​​bağlantı noktası kurallarına ihtiyaç duyar ve daha sonra gerektiğinde posta veya oyun bağlantı noktaları ekleyebilir.

Şimdiye kadar aşağıdaki kurallara sahibim ve daha iyi bir komut dosyası veya eklenebilecek herhangi bir geliştirme olup olmadığını merak ediyordum.

*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 kutunuzun güvenliğini sağlamanın en önemli parçalarından biridir (fail2ban'a da bakınız) ve yine de benim gibi sunucularımız için güvenli bir temel güvenlik duvarı oluşturmaya giden her şeyi anlamakta zorluk çeken birçok insan var.

Bir web sunucusu için gereken temel bağlantı noktalarını açmanın en güvenli yolu nedir?

Güncelleme: cyberciti.biz oldukça iyi görünüyor başka bir iptables betiği var.

Ayrıca, Denyhosts veya fail2ban kullanmak yerine iptables'ın kendisini SSH'deki kötü tekrarlanan girişimleri engellemek için kullanabilirsiniz .


Bunun bir VPS olduğunu söylüyorsun. Ben de bir LAN IP varsayalım değil mi? Alt ağınızdaki her makineye güveniyor musunuz? Burada ne kadar paranoyak olmak istiyorsunuz, makinenizi daha da güvenceye almak için ÇIKTI filtrelemesini kullanabilirsiniz. Bana bildirin, kullanmanızı öneririm.
hobodave

İyi bir nokta, çoğu VPS'nin LAN'dan erişilebilen başkaları ile bir VM'de olduğu göz önüne alındığında, onlara güvenmemenin akıllı başlangıç ​​yeri olacağını söyleyebilirim. Ek VPS'niz varsa, daha sonra bunlara erişmek için kurallar ekleyebilirsiniz (yani veritabanına web sunucusu).
Xeoncross

1
UYARI: Belirtilen ve modprobeyüklü olmayan cyberciti.biz komut dosyasını çalıştırırsanız (veya bağlantı noktası 22'yi açmadan önce başka bir hata oluşursa ), kendinizi sunucudan kilitlersiniz.
EoghanM

Yanıtlar:


14

İptables ile çalışmanın en güvenli yolu her şeyi kapatmak ve sadece ihtiyacınız olanı açmaktır. Ben biraz dikkatim dağılmış, bu yüzden her zaman mümkün olduğunca tembel olmaya çalışıyorum, bu yüzden sunucunun güvensiz olmasına yol açabilecek hatalar yapmıyorum.

Bunu kullanıyorum, çalışması için sadece biraz değişken atama yapılmalıdır.

  #!/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 :)

Bir süredir kullanıyorum ve yönetimini kolaylaştırırsa her türlü değişiklik çok takdir edilecektir.


TCP üzerinden SNMP (161) kullanan popüler araçlar var mı? Bu kuralların UDP / 161 olması gerektiğini düşünüyorum.
kubanczyk

1

Bu oldukça iyi görünüyor, ama işleri biraz daha sıkılaştırabilirsiniz. -S bayrağı kaynak IP veya etki alanı adıdır ve "-s 198.23.12.32" veya IP adresiniz yalnızca kaynak IP'nizden SSH'ye izin vermek için ne eklerseniz ekleyin. CIDR stil gösterimini kullanarak bir dizi kaynak IP'si de seçebilirsiniz .

Reddedilen çağrıları günlüğe kaydederken dikkatli olmalısınız. Sunucunuzun IP adresi botlar, komut dosyaları, vb. Tarafından taranır ve günlük dosyası oldukça hızlı bir şekilde büyüyebilir. Güvenlik duvarınızı kırmaya çalışan biriyle ilgili olabileceğini düşündüğünüz belirli bir sorunu teşhis etmeye çalışmadığınız sürece, bu seçeneği kaldıracağım.

Ayrıca sahte-IDS için fail2ban içinde iptables ile bağlayabilirsiniz . fail2ban günlük dosyalarınızı tarar ve sisteminize girmeye zorlarsa bir IP'yi engelleyebilir. Örneğin, belirli bir IP adresi SSH'ye 5 kez giriş yapamazsa, tüm gün boyunca kilitleyebilirsiniz. Aynı zamanda FTP ve diğerleri üzerinde de çalışır (Apache'ye vuran kötü botlar dahil).


Den2Hosts kullanıyorum çünkü fail2ban üzerinde 15MB ya da daha fazla tasarruf sağlıyor. Bununla birlikte, fail2ban daha güçlüdür ve birçok uygulama ile çalışır (sadece DenyHosts gibi SSH ile değil). Saldırganların yasaklandığı göz önüne alındığında, günlük dosyalarının hızla dolduğundan endişelenmeli miyim? Dosyaları dolduğunda döndürmenin bir yolu var mı? Fail2ban'da günlüğe kaydetmeyi devre dışı bırakırsam Denyhosts / Fail2ban'ın taramak için hala günlük girişleri olur mu? Ayrıca, kaynak seçenek bazı insanlar için iyi olurdu - ama benim gibi çok fazla hareket eden varsayılan bir kural kümesi hedeflediğim için bu seçeneği kullanamazsınız.
Xeoncross

@Xeoncross: DenyHosts buğulaması bir yığın imo. Çin'den sürekli olarak izinsiz girişimler yapan bir makinede çalıştırdım. Birkaç ay boyunca /etc/hosts.deny birkaç bin IP'ye sahip oldu, bu noktada sshd'nin kutudaki kaynakları tüketmesine ve tek bir CPU makinesinde yükü 60'dan fazla artırmasına neden oldu. Fail2ban geçti ve asla geri baktım.
hobodave

@hobodave DenyHosts ile yeni başladım, bu yüzden bu sorun haline geldiğinde ilk akla gelen şey olarak kalacağım.
Xeoncross

1
@ Xeoncross iptables günlüğünü döndürmek istiyorsanız, bunun için kendi logrotate.d komut dosyanızı yazabilirsiniz. /Etc/logrotate.d dosyasına bir göz atın ve başka birini kopyalayın ve günlük dosyasının adını değiştirin; diğer günlük dosyalarıyla döndürülecektir. Logrotate kılavuz sayfası çeşitli seçenekleri açıklar.
Alan Ivey

1

Shorewall'a bir göz atın. Tek arayüz varsayılan yapılandırması iyi bir başlangıç ​​noktası olacaktır. Yapılandırması kolaydır ve SSH ve Web erişimi gibi şeyler için makrolara sahiptir. Güvenlik duvarı kapatıldığında sunucuyu istenen düzeye kilitlemek için yapılandırılabilir. Shorewall-lite ile başka bir sunucuda güvenlik duvarı derlemesi çalıştırabilirsiniz. Günlüğe kaydetme istenen seviyeye yapılandırılabilir.

Temel bir HTTP sunucusu için HTTPS kullanıyorsanız 80 numaralı bağlantı noktasına ve 443 numaralı bağlantı noktasına gelen erişimi açın. Genellikle birkaç kısıtlı adresten gelen SSH erişimi istenir. Giden erişimi de kilitlemek isteyebilirsiniz. Güvenlik duvarını yalnızca gerekli sunuculara ve hizmetlere açın. Yamaları getirecek bir kanalın yanı sıra NTP ve DNS açılmalıdır.


1

Bunun oldukça iyi bir güvenlik duvarı olduğunu söyleyebilirim, ancak gelen trafiği durdurmaya yöneliktir ve çıkış veya giden trafiğe odaklanmamıştır. Birçok durumda, bir kutudan gelen bağlantılara gelenler kadar odaklanmak önemlidir. Makineden gerçekten yararlanan talihsiz durumda, ek kök kitlerinin indirilmesini veya komut ve kontrol düğümlerine veya her ne olursa olsun bağlanmayı önlemek güzel olurdu.

BillThor yukarıda bunun hakkında konuşmaya başladı, ama sadece belirli örneklerle cevap veriyorum. Iptables ile ilgili güzel şeylerden biri, bağlantı durumunu hatırlayabilmesidir, bunun yoğun şekilde trafik işlemleri yapılan siteler üzerinde performans etkileri olabilir, ancak http / https'deki gelen erişiminizi yalnızca örneğin kurulan bağlantılarda yanıta izin vermek veya belirli ayrıcalıksızları sınırlamak için değiştirebilirsiniz. kullanıcıların dışarıya erişimi hiç olmaz. O zaman giden kurallarınız, bir dizi yardımcı saldırıyı önleyecek ve çok yaygın olan bir kutuyu gerçekten kullanmak için ikincil bir aşama gerektirenleri yavaşlatan İLGİLİ, KURULUŞ hükümleri olurdu.

Son olarak, iptables politikanızı ayarlamak için daha iyi olduğunu söyleyebilirim. Çoğunlukla bir tercih meselesidir, ancak mevcut kurallara sahip zincirlere ekleme veya yıkama / sıfırlama yerine hataları eklerken hataları azaltabilir.


Bu yüzden değiştireyim -A INPUT -j REJECTiçin -A INPUT -P DROP?
Mart'ta Xeoncross
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.