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

Хорошие правила запуска iptables для веб-сервера?

Я устанавливаю новый сервер centos 5.4 и хотел бы иметь набор чистых правил для запуска mu iptables.

С каких правил следует начать?

Это хорошая отправная точка:

# Allow outgoing traffic and disallow any passthroughs

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# Allow traffic already established to continue

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow ssh, ftp and web services

iptables -A INPUT -p tcp --dport ssh -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT

# Allow local loopback services

iptables -A INPUT -i lo -j ACCEPT

# Allow pings

iptables -I INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -I INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -I INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

Для чего это правило:

iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT

ОБНОВИТЬ :

Это будет веб-сервер с FTP (обязательно), apache, SSH, mysql.

Ваши правила IPTables кажутся наиболее подходящими для вашего сервера. Но я бы предложил пару возможных изменений:

  • Если вам не нужно разрешать доступ по SSH, MySQL и FTP со всего Интернета, было бы гораздо безопаснее использовать параметр --source, чтобы ограничить доступ к этим портам только с определенных утвержденных IP-адресов. Например, чтобы разрешить доступ SSH только с IP-адреса 71.82.93.101, вы должны изменить 5-е правило на 'iptables -A INPUT -p tcp --dport ssh --source 71.82.93.101 -i eth0 -j ACCEPT'. Вероятно, вам нужно будет добавить отдельное правило для каждого отдельного IP-адреса, который вы хотите разрешить, см. Этот вопрос для получения дополнительной информации об этом: iptables несколько исходных IP-адресов.

  • Если на этом компьютере не установлен DNS-сервер, вы, вероятно, захотите заблокировать доступ к порту «домен» (53). Для этого просто удалите строку «iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT». (Это также должно ответить на ваш последний вопрос, кстати.) Если вы действительно используете DNS-сервер, оставьте это правило в силе.

  • Если вам нужно разрешить удаленный доступ клиента MySQL по сети, вам нужно добавить строку iptables -A INPUT -p tcp --dport 3306 -i eth0 -j ACCEPT, чтобы открыть внешний доступ к стандартному порту MySQL. . Но НЕ делайте этого, если это действительно необходимо - если вам нужен только локальный доступ к MySQL (например, для приложения PHP, работающего под Apache), вам не нужно предоставлять удаленный доступ к MySQL. И если вы не хотите рискнуть быть взломанным, если вы действительно откроете порт 3306 для сети, убедитесь, что вам требуются надежные пароли для всех учетных записей пользователей MySQL и что пакеты сервера MySQL обновлены.

  • В одном из ваших комментариев («Разрешить ssh, dns, ldap, ftp и веб-службы») упоминаются службы LDAP, но в вашей конфигурации такого правила нет. Это часто случается со мной, когда я копирую пример конфигурации и изменяю его. Это не повлияет на функцию, но я бы исправил комментарий, поскольку вводящие в заблуждение комментарии могут косвенно привести к путанице вас или другого администратора в будущем.

По моему опыту, сложно придумать идеальный набор правил IPTables, но я думаю, что вы определенно на правильном пути. Кроме того, удачи в изучении IPTables - эти правила поначалу могут показаться сложными, но это очень полезный навык для любого системного администратора Linux.

Определенно постарайтесь ограничить и свой исходящий трафик.

Я видел множество случаев, когда эксплойты PHP приводили к тому, что кто-то использовал curl или wget для извлечения вредоносного кода из другого места, а затем выполнял его на вашем сервере, чтобы присоединиться к ботнету.

Если вы не ожидаете, что Apache (в качестве примера) будет нуждаться в общении с другими веб-сайтами, ограничьте трафик и избавьтесь от небольшой боли в будущем!

Эти правила готовы к импорту через "iptables-restore":

*filter
:INPUT DROP [20:2036]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [93:16260]
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -m comment --comment "allow ICMP: echo-reply"
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -m comment --comment "allow ICMP: echo-request"
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -m comment --comment "allow ICMP: destination-unreachable"
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT -m comment --comment "allow ICMP: source-quench"
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT  -m comment --comment "allow ICMP: time-exceeded"
-A INPUT -i lo -j ACCEPT -m comment --comment "allow input from the loop-back adapter"
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -m comment --comment "allow SSH: ssh"
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m udp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p udp -m udp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p tcp -m tcp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p udp -m udp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT -m comment --comment "allow MariaDB/MySQL: mysql"
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "allow HTTP (apache/nxing/lighttpd)"
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "allow HTTPS (apache/nxing/lighttpd)"
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  -m comment --comment "allow already established connections"
COMMIT

И просто для записи ... эти политики по умолчанию тоже должны быть установлены, ЕСЛИ вышеуказанный iptables-restore не используется:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

Почему вы разрешаете ftp и dns? Предоставляет ли ваш сервер эти услуги? На самом деле FTP не следует использовать, за исключением некоторых очень конкретных случаев использования, вместо этого используйте SFTP (не FTPS). Кроме того, зачем указывать все остальные порты символическими именами, а http - числом 80? Вы только что скопировали это откуда-то еще? Никакое копирование и советы не восполнят недостаток понимания. Убедитесь, что вы понимаете TCP, IP, брандмауэры и протоколы служб, которые собираетесь предоставлять.