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


12

Встановлюю новий сервер 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.


Я використовую це просте правило .... Закрийте все і працюйте назад і відкривайте те, що потрібно. Порт 80/443 для веб-сервера, як правило, є єдиними загальнодоступними службами. Блокуйте все інше або обмежте доступ - наприклад, обмежте ssh на вказані IP-адреси або приватну мережу.
jeffatrackaid

Відповіді:


13

Ваші правила IPTables, здається, найбільше підходять для вашого сервера. Але я б запропонував кілька можливих змін:

  • Якщо вам не потрібно дозволити доступ до SSH, MySQL та FTP з усього Інтернету, було б набагато безпечніше використовувати параметр "- джерело" для обмеження доступу до цих портів лише з певних затверджених 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 домен -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-системи.


1
Замість того, щоб дозволяти віддалений доступ MySQL через брандмауер, ви можете просто переконатися, що кожен, кому потрібен доступ до сервера MySQL, має право робити порт SSH вперед.
птман

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

Що стосується коментарів, що не відповідають правилам, правила ICMP дозволяють простежувати, відкриття PMTU та інші корисні повідомлення, але вони не дозволяють виконувати пінг (echo-запит та echo-reply).
Джеральд Гребінь

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

4

Однозначно дивись, щоб також обмежити вихідний трафік.

Я бачив безліч випадків, коли PHP використовує результат, коли хтось використовує 'curl' або 'wget' для отримання шкідливого коду з інших місць, а потім виконує його на своєму сервері, щоб приєднатися до ботнету.

Якщо ви не очікуєте, що Apache (як приклад) повинен самостійно поговорити з іншими веб-сайтами, обмежте трафік і заощадите собі трохи болю!


2

Ці правила готові до імпорту через "iptables-Resto":

*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-відновлення не використовуються:

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

Я відредагував ваше повідомлення - StackOverflow - це формат питання / відповіді. Будь ласка , прочитайте FAQ: 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.