Bộ quy tắc iptables tiêu chuẩn, an toàn cho máy chủ web HTTP cơ bản


15

Tôi đã cố gắng kết hợp một tập lệnh iptables máy chủ cơ bản sẽ hoạt động cho hầu hết các trang web chỉ chạy một máy chủ web cơ bản sử dụng HTTP (S) và SSH (cổng 80, 443, & 22). Rốt cuộc, hầu hết VPS chỉ cần các quy tắc cổng bắt đầu này và có thể thêm các cổng thư hoặc trò chơi sau này khi cần.

Cho đến nay tôi có các quy tắc sau đây và tôi đã tự hỏi nếu có ai biết về một kịch bản tốt hơn hoặc bất kỳ cải tiến nào có thể được thêm vào.

*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 là một trong những phần quan trọng nhất trong việc bảo vệ hộp của bạn (cũng xem fail2ban) và có nhiều người như tôi gặp khó khăn trong việc hiểu mọi thứ tạo ra tường lửa cơ bản an toàn cho máy chủ của chúng tôi.

Cách an toàn nhất để chỉ mở các cổng cơ bản cần thiết cho máy chủ web là gì?

Cập nhật: cyberciti.biz có một kịch bản iptables khác trông khá tốt.

Ngoài ra, thay vì sử dụng Denyhosts hoặc fail2ban, bạn có thể sử dụng chính iptables để chặn các nỗ lực lặp lại tồi tệ tại SSH .


Bạn nói đó là VPS. Tôi giả sử nó có IP LAN đúng không? Bạn có tin tưởng mọi máy trên mạng con của bạn? Bạn muốn ở đây hoang tưởng đến mức nào, bạn có thể sử dụng bộ lọc OUTPUT để bảo mật hơn cho máy của mình. Hãy cho tôi biết và tôi có thể trả lời với những gì tôi đề nghị bạn sử dụng.
hobodave

Điểm hay, vì hầu hết VPS đều ở trong VM với những người khác có thể truy cập từ LAN Tôi sẽ nói rằng không tin tưởng họ sẽ là nơi khởi đầu thông minh. Nếu bạn có thêm VPS thì bạn có thể thêm các quy tắc sau để truy cập chúng (tức là máy chủ web vào cơ sở dữ liệu).
Xeoncross

1
CẢNH BÁO: nếu bạn thực thi tập lệnh cyberciti.biz được đề cập và modprobekhông được cài đặt (hoặc có bất kỳ lỗi nào khác trước khi bạn mở cổng 22), bạn sẽ tự khóa máy chủ.
EoghanM

Câu trả lời:


14

Cách an toàn nhất để làm việc với iptables là đóng mọi thứ và chỉ mở những gì bạn cần. Tôi bị phân tâm, vì vậy tôi luôn cố gắng lười biếng nhất có thể, vì vậy tôi không phạm sai lầm có thể khiến máy chủ không an toàn.

Tôi sử dụng cái này, chỉ một chút phân công biến đổi phải được thực hiện để làm cho nó hoạt động.

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

Tôi đã sử dụng nó một thời gian và bất kỳ loại sửa đổi nào cũng sẽ được đánh giá cao nếu việc quản trị dễ dàng hơn.


Có công cụ phổ biến nào sử dụng SNMP (161) trên TCP không? Tôi nghĩ các quy tắc này phải là UDP / 161.
kubanchot

1

Điều này có vẻ khá tốt, nhưng bạn có thể thắt chặt mọi thứ hơn một chút. Cờ -s là IP nguồn hoặc tên miền và bạn thêm "-s 198,23.12.32" hoặc bất cứ địa chỉ IP nào của bạn là chỉ cho phép SSH từ IP nguồn của bạn. Bạn cũng có thể chọn một dải IP nguồn bằng cách sử dụng ký hiệu kiểu CIDR .

Bạn nên thận trọng khi đăng nhập các cuộc gọi bị từ chối. Địa chỉ IP của máy chủ của bạn sẽ được quét bởi bot, tập lệnh script, v.v. và tệp nhật ký có thể trở nên lớn khá nhanh. Trừ khi bạn đang cố gắng chẩn đoán một vấn đề cụ thể mà bạn nghĩ có thể liên quan đến ai đó đang cố phá vỡ tường lửa của bạn, tôi sẽ xóa tùy chọn này.

Bạn cũng có thể liên kết fail2ban với iptables cho ID giả. fail2ban sẽ quét các tệp nhật ký của bạn và có thể chặn IP nếu chúng cố gắng xâm nhập vào hệ thống của bạn. Ví dụ: nếu một địa chỉ IP nhất định không thể đăng nhập vào SSH 5 lần, bạn có thể khóa chúng trong cả ngày. Nó cũng hoạt động trên FTP và nhiều người khác (bao gồm cả các bot xấu tấn công Apache). Tôi sử dụng nó trên tất cả các máy chủ của mình để cung cấp thêm một số đệm từ các cuộc tấn công vũ phu.


Tôi thực sự sử dụng Denyhost vì nó tiết kiệm được 15 MB hoặc hơn fail2ban. Tuy nhiên, fail2ban mạnh hơn và hoạt động với nhiều ứng dụng (không chỉ SSH như Denyhosts). Cho rằng những kẻ tấn công bị cấm, tôi có nên lo lắng về việc các tệp nhật ký điền vào nhanh không? Có cách nào để xoay tập tin khi chúng đầy đủ không? Nếu tôi vô hiệu hóa đăng nhập fail2ban thì Denyhosts / Fail2ban vẫn có các mục nhật ký để quét? Ngoài ra, tùy chọn nguồn sẽ tốt cho một số người - nhưng vì tôi đang nhắm đến một quy tắc mặc định, những người như tôi di chuyển xung quanh rất nhiều không thể sử dụng tùy chọn đó.
Xeoncross

@Xeoncross: Denyhosts là một imo cọc hấp. Tôi đã có nó chạy trên một máy liên tục nhận được các nỗ lực xâm nhập từ Trung Quốc. Trong khoảng thời gian vài tháng /etc/hosts.deny đã phát triển để có một vài nghìn IP trong đó, tại thời điểm đó, nó đã khiến sshd cạn kiệt tài nguyên trên hộp, tăng tải lên tới 60+ trên một máy CPU. Tôi chuyển sang fail2ban và không bao giờ nhìn lại.
hobodave

@hobodave Tôi mới bắt đầu với Denyhosts vì vậy tôi sẽ giữ suy nghĩ này là điều đầu tiên để chuyển đổi khi điều này trở thành vấn đề.
Xeoncross

1
@Xeoncross nếu bạn muốn xoay nhật ký iptables, bạn có thể viết tập lệnh logrotate.d của riêng bạn cho nó. Hãy xem /etc/logrotate.d và sao chép một cái khác và thay đổi tên tệp nhật ký và nó sẽ được xoay cùng với các tệp nhật ký khác. Trang man cho logrotate giải thích các tùy chọn khác nhau.
Alan Ivey

1

Hãy nhìn vào Shorewall. Cấu hình mặc định giao diện đơn sẽ là điểm khởi đầu tốt. Nó rất dễ cấu hình và có các macro cho những thứ như truy cập SSH và Web. Nó có thể được cấu hình để khóa máy chủ đến mức mong muốn khi tắt tường lửa. Với Shorewall-lite, bạn có thể chạy xây dựng tường lửa trên một máy chủ khác. Ghi nhật ký dễ dàng để cấu hình đến mức mong muốn.

Đối với máy chủ HTTP cơ bản, bạn muốn mở quyền truy cập vào cổng 80 và cổng 443 nếu bạn sử dụng HTTPS. Truy cập SSH đến từ một vài địa chỉ bị hạn chế thường được mong muốn. Bạn có thể muốn khóa truy cập đi. Chỉ mở tường lửa cho các máy chủ và dịch vụ cần thiết. NTP và DNS nên được mở, cũng như một kênh để tìm nạp các bản vá.


1

Tôi sẽ nói rằng đây là một tường lửa khá tốt, ngoại trừ việc nó hướng đến việc dừng lưu lượng truy cập vào và không tập trung vào lưu lượng đi ra hoặc lưu lượng đi. Trong nhiều trường hợp, việc tập trung vào các kết nối ra khỏi hộp cũng quan trọng không kém so với các kết nối bên trong. Trong trường hợp không may là máy thực sự bị khai thác, thật tuyệt khi có thể ngăn tải xuống bộ công cụ gốc bổ sung, hoặc kết nối với các nút lệnh và điều khiển, hoặc bất cứ điều gì.

BillThor bắt đầu nói về điều này ở trên, nhưng tôi chỉ trả lời bằng các ví dụ cụ thể. Một trong những điều hay về iptables là nó có thể nhớ trạng thái kết nối, điều này có thể có ý nghĩa về hiệu suất trên các trang web bị buôn bán nặng nề nhưng bạn có thể thay đổi quyền truy cập trong nước của mình trên http / https để chỉ cho phép trả lời các kết nối đã thiết lập, hoặc hạn chế cụ thể một số đặc quyền không được ưu tiên người dùng không có quyền truy cập ra nước ngoài. Sau đó, các quy tắc ra bên ngoài của bạn sẽ có các mệnh đề LIÊN QUAN, THÀNH LẬP, điều này sẽ ngăn chặn một loạt các cuộc tấn công phụ trợ và làm chậm các điều kiện đòi hỏi giai đoạn thứ cấp để thực sự khai thác một hộp, rất phổ biến.

Cuối cùng, tôi sẽ nói rằng tốt hơn là nên đặt chính sách iptables của bạn -P DROP thay vì có một DỰ ÁN được nối thêm vào cuối. Đây chủ yếu là vấn đề ưu tiên, nhưng có thể giảm sai lầm khi gắn vào chuỗi với các quy tắc hiện có thay vì chèn hoặc xả / đặt lại.


Vậy tôi có nên đổi -A INPUT -j REJECTsang -A INPUT -P DROP?
Xeoncross
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.