Вопрос: Хорошие правила 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.


11
2018-03-03 09:47


Источник


Я использую это простое правило ... Закройте все и работайте назад и откройте то, что нужно. Для веб-сервера порт 80/443, как правило, является единственным публичным сервисом. Блокировать все остальное или ограничивать доступ - например, ограничение ssh для указанных IP-адресов или частной сети. - jeffatrackaid


Ответы:


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

  • Если вам не нужно разрешать SSH, MySQL и FTP доступ со всего Интернета, было бы гораздо безопаснее использовать параметр «- source», чтобы ограничивать доступ только к этим портам с определенных утвержденных IP-адресов. Например, чтобы разрешить доступ только SSH с IP-адреса 71.82.93.101, вы измените пятое правило на «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». (Это также должно ответить на ваш последний вопрос, BTW.) Если вы действительно используете 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.


13
2018-03-03 17:40



Вместо того, чтобы разрешать удаленный доступ к MySQL через брандмауэр, вы можете просто убедиться, что каждый, кому нужен доступ к серверу MySQL, имеет право сделать SSH-порт вперед. - ptman
Перспективы портов SSH являются потенциальной альтернативой открытию порта и блокировкой разрешений MySQL. Но если он не имеет дело с конфиденциальными данными и / или он является высокопрофильной целью (что сделало бы функции шифрования SSH полезными), я не вижу преимущества. В конце концов, SSH-туннелирование имеет свои недостатки, в том числе: проблемы с настройкой / конфигурацией; увеличение загрузки процессора и ограничение полосы пропускания (из-за статического размера буфера OpenSSH). И что, если он не хочет, чтобы все его удаленные клиенты MySQL имели локальные логины? - Ryan B. Lynch
Что касается комментариев, не соответствующих правилам, правила ICMP допускают трассировки, обнаружение PMTU и другие полезные сообщения, но они не разрешить пинги (эхо-запрос и эхо-ответ). - Gerald Combs
Джеральд, это хороший улов, я этого даже не заметил. Вероятно, он должен либо изменить комментарий, чтобы отметить, что ping НЕ разрешен, либо он должен добавить правила, позволяющие трафик echo request / reply ICMP. - Ryan B. Lynch


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

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

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


3
2017-12-27 00:16





Эти правила готовы для импорта через «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

1
2017-07-10 08:27



Я отредактировал ваше сообщение - StackOverflow - это вопрос / формат ответа. Пожалуйста, прочтите FAQ: stackoverflow.com/faq - 89c3b1b8-b1ae-11e6-b842-48d705
Это вызовет проблемы с производительностью, поскольку правило stateful появляется здесь последним и должно появиться первым, так как оно соответствует подавляющему большинству пакетов. - Michael Hampton♦


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


0
2018-03-03 11:11



Я не собираюсь оскорблять, птман, но я думаю, что ваш ответ можно рассматривать как несколько неуважительный и снисходительный. Кроме того, вы на самом деле не отвечаете на вопрос. Если у искателя не хватает понимания, разве вы не думаете, что было бы лучше говорить с уважением и дать ему определенное образование по этой теме? - Ryan B. Lynch
Возможно, вы правы. Мои комментарии могут звучать отрицательно, но они не подразумеваются как таковые. Я пытался перечислить вопросы, которые могут вызвать соответствующие мыслительные процессы. И поскольку я не знаю базового уровня понимания, я не начал писать учебник. Но вы абсолютно правы в бесполезном тоне. К счастью, вы написали гораздо более полезный ответ. - ptman