Назад | Перейти на главную страницу

Безопасный стандартный набор правил iptables для базового веб-сервера HTTP (ов)

Я пытался собрать базовый серверный скрипт iptables, который будет работать для большинства сайтов, на которых просто запущен базовый веб-сервер с использованием HTTP (S) и SSH (порты 80, 443 и 22). В конце концов, большинству VPS нужны только эти правила для начальных портов, и при необходимости они могут добавить почтовые или игровые порты позже.

Пока у меня есть следующий набор правил, и мне было интересно, знает ли кто-нибудь лучший сценарий или какие-либо улучшения, которые можно было бы добавить.

*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 - одна из наиболее важных частей защиты вашего компьютера (см. также fail2ban), и все же есть много людей, подобных мне, которые не могут понять все, что входит в создание безопасного базового брандмауэра для наших серверов.

Каков наиболее безопасный способ открыть только основные порты, необходимые для веб-сервера?

Обновить: cyberciti.biz имеет еще один сценарий iptables выглядит неплохо.

Кроме того, вместо использования Denyhosts или fail2ban вы можете использовать сам iptables блокирует повторные неудачные попытки SSH.

Самый безопасный способ работы с 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 :)

Я использую его в течение некоторого времени, и мы будем очень признательны за любые модификации, если они упростят администрирование.

Я бы сказал, что это довольно хороший брандмауэр, за исключением того, что он предназначен для остановки входящего трафика, а не ориентирован на исходящий или исходящий трафик. Во многих случаях так же важно сосредоточиться на исходящих соединениях из ящика, как и на входящих. В том случае, если машина действительно эксплуатируется, было бы неплохо иметь возможность предотвратить загрузку дополнительных руткитов, подключение к узлам управления и контроля или что-то еще.

BillThor начал говорить об этом выше, но я просто отвечаю конкретными примерами. Одна из приятных особенностей iptables заключается в том, что он может запоминать состояние подключения, это может повлиять на производительность на сайтах с интенсивным трафиком, но вы можете изменить свой входящий доступ на http / https, чтобы, например, разрешать только ответы на установленные соединения или специально ограничивать определенные непривилегированные пользователям вообще не предоставляется исходящий доступ. Тогда ваши исходящие правила будут иметь предложения RELATED, ESTABLISHED, которые предотвратят целый ряд вспомогательных атак и замедлят те, которые требуют вторичного уровня для фактического использования ящика, что очень часто.

Наконец, я бы сказал, что лучше установить политику iptables -P DROP, чем добавлять REJECT в конце. Это в основном вопрос предпочтений, но может уменьшить количество ошибок при добавлении в цепочки с существующими правилами вместо вставки или сброса / сброса.

Взгляните на Shorewall. Конфигурация единого интерфейса по умолчанию была бы хорошей отправной точкой. Его легко настроить, и в нем есть макросы для таких вещей, как SSH и доступ в Интернет. Его можно настроить для блокировки сервера до желаемого уровня при выключении брандмауэра. С Shorewall-lite вы можете запустить сборку брандмауэра на другом сервере. Ведение журнала легко настроить до желаемого уровня.

Для базового HTTP-сервера вы хотите открыть входящий доступ к порту 80 и порту 443, если вы используете HTTPS. Входящий доступ SSH с нескольких ограниченных адресов обычно желателен. Вы также можете заблокировать исходящий доступ. Откройте брандмауэр только для необходимых серверов и служб. Должны быть открыты NTP и DNS, а также канал для получения патчей.

Выглядит неплохо, но вы могли бы немного упростить. Флаг -s - это исходный IP-адрес или доменное имя, и вы добавляете «-s 198.23.12.32» или любой другой IP-адрес, чтобы разрешить SSH только с вашего исходного IP-адреса. Вы также можете выбрать диапазон исходных IP-адресов, используя CIDR обозначение стиля.

Вы должны соблюдать осторожность при регистрации отклоненных вызовов. IP-адрес вашего сервера будет сканироваться ботами, скриптами и т. Д., И файл журнала может довольно быстро стать большим. Если вы не пытаетесь диагностировать конкретную проблему, которая, по вашему мнению, может быть связана с попыткой взлома вашего брандмауэра, я бы удалил этот параметр.

Вы также можете связать fail2ban в iptables для псевдо-IDS. fail2ban просканирует ваши файлы журналов и может заблокировать IP-адрес, если они попытаются проникнуть в вашу систему. Например, если с определенного IP-адреса не удается войти в SSH 5 раз, вы можете заблокировать его на целый день. Он также работает на FTP и многих других (включая плохих ботов, поражающих Apache). Я использую его на всех своих серверах, чтобы обеспечить дополнительную защиту от атак грубой силы.