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


12

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

Каковы будут хорошие правила для начала?

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

# 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.


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

Ответы:


13

Ваши правила 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 ПРИНЯТЬ». Вероятно, вам потребуется добавить отдельное правило для каждого отдельного IP-адреса, который вы хотите разрешить, см. Этот вопрос для получения дополнительной информации об этом: iptables несколько исходных IP-адресов .

  • Если на этой машине не установлен DNS-сервер, возможно, вы захотите заблокировать доступ к порту «домен» (53). Для этого просто удалите строку «iptables -A INPUT -p tcp --dport domain -i eth0 -j ПРИНЯТЬ». (Это также должно ответить на ваш последний вопрос, кстати.) Если вы действительно используете 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.


1
Вместо того, чтобы разрешить удаленный доступ к MySQL через брандмауэр, вы можете просто убедиться, что каждый, кому нужен доступ к серверу MySQL, имеет право на переадресацию порта SSH.
2010 года

Переадресация порта SSH является потенциальной альтернативой открытию порта и блокированию разрешений MySQL. Но если он не имеет дело с конфиденциальными данными и / или не является высокопоставленной целью (что сделало бы полезными функции шифрования SSH), я не вижу преимущества. В конце концов, SSH-туннелирование имеет свои недостатки, в том числе: проблемы с настройкой / настройкой; повышенная загрузка ЦП и ограничение пропускной способности (из-за размера статического буфера OpenSSH). А что если он не хочет, чтобы все его удаленные клиенты MySQL имели локальные логины?
Райан Б. Линч

Что касается комментариев, не соответствующих правилам, то правила ICMP разрешают трассировки, обнаружение PMTU и другие полезные сообщения, но не разрешают эхо-запросы (echo-request и echo-reply).
Джеральд Комбс

Джеральд, это хороший улов, я даже этого не заметил. Вероятно, ему следует либо изменить комментарий, чтобы отметить, что ping НЕ разрешен, либо добавить правила, разрешающие трафик эхо-запросов / ответов ICMP.
Райан Б. Линч

4

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

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

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


2

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

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

Это создаст проблемы с производительностью, поскольку правило с сохранением состояния появляется здесь последним и должно появляться первым, поскольку оно соответствует подавляющему большинству пакетов.
Майкл Хэмптон

0

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


Я не хочу обидеть, Птман, но я думаю, что твой ответ может быть расценен как неумелый и снисходительный. Кроме того, вы на самом деле не отвечаете на вопрос. Если спрашивающему не хватает понимания, не думаете ли вы, что было бы лучше говорить с уважением и дать ему определенное образование по этой теме?
Райан Б. Линч

Вы, наверное, правы. Мои комментарии могут звучать негативно, но не были таковыми. Я пытался перечислить вопросы, которые могли бы вызвать соответствующие мыслительные процессы. И так как я не знаю базовый уровень понимания, я не начал писать учебник. Но вы абсолютно правы насчет бесполезного тона. К счастью, вы написали гораздо более полезный ответ.
Птман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.