ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Как обеспечить безопасность VPS на базе Ubuntu/Debian с помощью IPTABLES/Netfilter

Как обеспечить безопасность VPS на базе Ubuntu/Debian с помощью IPTABLES/Netfilter

Что такое Iptables?

Это прикладная программа, которая позволяет системному администратору настраивать таблицы, предоставляемые брандмауэром ядра Linux (реализованы в виде различных модулей Netfilter), цепей и правил.

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

Для того, чтобы сделать управление правилами брандмауэра вашего сервера проще, мы предоставим вам простой скрипт, который поможет с управлением правил брандмауэра. В принципе, всякий раз, когда вам необходимо изменить правила брандмауэра, вы будете использовать этот скрипт для добавления/удаления желаемого правила(ы).

Установка правил межсетевого экрана

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

Очистка старых правил

Правила брандмауэра могут быть сброшены с помощью следующих команд:

## iptables --flush
## iptables --delete-chain
## iptables --table nat --flush
## iptables --table nat --delete-chain

Сервис распознавания портов

Вы должны знать, какие порты у вас открыты, так что вы можете установить соответствующие правила для них. Один из способов найти какие порты прослушиваются можно с использованием команды netstat или ss:

## netstat -tunlp

or

## ss -tunlp

например, мы используем один из наших виртуальных серверов Ubuntu 12.04 LTS и следующий вывод команды netstat:

## netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      296/mysqld
tcp        0      0 0.0.0.0:587             0.0.0.0:*               LISTEN      449/sendmail: MTA:
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN      261/dovecot
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN      261/dovecot
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      590/apache2
tcp        0      0 209.135.140.77:53       0.0.0.0:*               LISTEN      353/named
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      353/named
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      173/vsftpd
tcp        0      0 0.0.0.0:5622            0.0.0.0:*               LISTEN      630/sshd
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      449/sendmail: MTA:
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      353/named
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      590/apache2
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN      261/dovecot
tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN      261/dovecot
udp        0      0 209.135.140.77:53       0.0.0.0:*                           353/named
udp        0      0 127.0.0.1:53            0.0.0.0:*                           353/named

это означает, что мы открыли следующие порты для публики:

Установка политики

ОК, так что теперь мы можем настроить политику нашего брандмауэра, настроить на DROPINPUT и FORWARD и разрешить прохождение трафика в цепочке OUTPUT.

таблица по умолчанию filter содержит три встроенных цепочки:

  1. Входящий трафик на имя самой машины попадает на входную цепочку.
  2. Outbound, локально сгенерированный трафик попадает в цепочку OUTPUT.
  3. Уходящий трафик, который не должен быть доставлен локально попадает в цепь FORWARD.

Проверить можно, набрав команду man 8 iptables для получения дополнительной информации.

Политику по умолчанию можно установить с помощью следующих команд:

## iptables -P INPUT DROP # <- не запускайте это через SSH, а то будете заперты
## iptables -P FORWARD DROP
## iptables -P OUTPUT ACCEPT

Установка правила межсетевого экрана

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

## iptables -A INPUT -i lo -j ACCEPT
## iptables -A OUTPUT -o lo -j ACCEPT
## iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
## iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Далее, давайте откроем наши порты служб с помощью правил брандмауэра, так:

### SSH
## iptables -A INPUT -p tcp --dport 5622  -m state --state NEW -j ACCEPT

### HTTP
## iptables -A INPUT -p tcp --dport 80  -m state --state NEW -j ACCEPT

### SMTP
## iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT

и так далее. После того, как все эти услуги будут занесены в белый список, необходимо разрешить ICMP-пакеты, LOG и DROP все остальное во входной цепи.

## iptables -A INPUT -p ICMP --icmp-type 8 -j ACCEPT
## iptables -A INPUT -j LOG
## iptables -A INPUT -j DROP

Сохранение/разворачивание правил межсетевого экрана

Правила брандмауэра не сохраняются по умолчанию, что означает, что они будут потеряны при перезагрузке виртуального сервера. Чтобы сохранить текущий брандмауэр /etc/fwall.rules вы должны использовать что – то вроде этого:

## iptables-save > /etc/fwall.rules

и для восстановления сохраненных правил, вы будете использовать что-то вроде:

## iptables-restore -c /etc/fwall.rules

Чтобы сделать правила автоматически восстанавливать на старте системы, вы должны либо использовать пакет с именем iptables-persistent или вы можете просто создать сценарий в /etc/network/if-pre-up.d в котором будет загружаться правила, сохраненные в /etc/fwall.rules, например:

## vim /etc/network/if-pre-up.d/iptables

#!/bin/bash
test -e /etc/fwall.rules && iptables-restore -c /etc/fwall.rules

## chmod +x /etc/network/if-pre-up.d/iptables

Сценарий брандмауэра

Сохраним сценарий в /usr/local/bin/fwall-rules и сделаем его исполняемым

#!/bin/bash

IPTABLES=/sbin/iptables

echo " * удаление старых правил"
${IPTABLES} --flush
${IPTABLES} --delete-chain
${IPTABLES} --table nat --flush
${IPTABLES} --table nat --delete-chain

echo " * настройка политике по умолчанию"
${IPTABLES} -P INPUT DROP
${IPTABLES} -P FORWARD DROP
${IPTABLES} -P OUTPUT ACCEPT

echo " * разрешение loopback devices"
${IPTABLES} -A INPUT -i lo -j ACCEPT
${IPTABLES} -A OUTPUT -o lo -j ACCEPT

${IPTABLES} -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
${IPTABLES} -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

## здесь блокируются нежелательные IPs ##
#echo " * BLACKLIST"
#${IPTABLES} -A INPUT -s _ABUSIVE_IP_ -j DROP
#${IPTABLES} -A INPUT -s _ABUSIVE_IP2_ -j DROP

echo " * разрешение ssh по порту 5622"
${IPTABLES} -A INPUT -p tcp --dport 5622  -m state --state NEW -j ACCEPT

echo " * разрешение ftp по порту 21"
${IPTABLES} -A INPUT -p tcp --dport 21  -m state --state NEW -j ACCEPT

echo " * разрешение dns по порту 53 udp"
${IPTABLES} -A INPUT -p udp -m udp --dport 53 -j ACCEPT

echo " * разрешение dns по порту 53 tcp"
${IPTABLES} -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT

echo " * разрешение http по порту 80"
${IPTABLES} -A INPUT -p tcp --dport 80  -m state --state NEW -j ACCEPT

echo " * разрешение https по порту 443"
${IPTABLES} -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT

echo " * разрешение smtp по порту 25"
${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT

echo " * разрешение submission по порту 587"
${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT

echo " * разрешение imaps по порту 993"
${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT

echo " * разрешение pop3s по порту 995"
${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT

echo " * разрешение imap по порту 143"
${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 143 -j ACCEPT

echo " * разрешение pop3 по порту 110"
${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT

echo " * разрешение ping responses"
${IPTABLES} -A INPUT -p ICMP --icmp-type 8 -j ACCEPT

# DROP everything else and Log it
${IPTABLES} -A INPUT -j LOG
${IPTABLES} -A INPUT -j DROP

#
# Сохранение настроек
#
echo " * СОХРАНЕНИЕ ПРАВИЛ"

if [[ -d /etc/network/if-pre-up.d ]]; then
    if [[ ! -f /etc/network/if-pre-up.d/iptables ]]; then
        echo -e "#!/bin/bash" > /etc/network/if-pre-up.d/iptables
        echo -e "test -e /etc/iptables.rules && iptables-restore -c /etc/iptables.rules" >> /etc/network/if-pre-up.d/iptables
        chmod +x /etc/network/if-pre-up.d/iptables
    fi
fi

iptables-save > /etc/fwall.rules
iptables-restore -c /etc/fwall.rules
## chmod +x /usr/local/bin/fwall-rules

для активации правил вы подготовили сценарии, просто выполните его

## fwall-rules

из командной строки. Чтобы добавить или удалить правило, вам просто нужно просто открыть скрипт, добавить или удалить желаемое правило, сохранить и запустить его снова, например:

## fwall-rules
 * удаление старых правил
 * настройка политики по умолчанию
 * разрешение loopback devices
 * разрешение ssh по порту 5622
 * разрешение ftp по порту 21
 * разрешение dns по порту 53 udp
 * разрешение dns по порту 53 tcp
 * разрешение http по порту 80
 * разрешение https по порту 443
 * разрешение smtp по порту 25
 * разрешение submission по порту 587
 * разрешение imaps по порту 993
 * разрешение pop3s по порту 995
 * разрешение imap по порту 143
 * разрешение pop3 по порту 110
 * разрешение ping responses
 * СОХРАНЕНИЕ ПРАВИЛ

В следующей статье мы покажем вам, как вы можете обеспечить и защитить виртуальный сервер Ubuntu или Debian с помощью брандмауэра Iptables.

PS. Если вам понравился этот пост, поделитесь им с друзьями в социальных сетях помощью кнопок внизу поста или просто оставьте комментарий ниже. Заранее благодарю.

Как обеспечить безопасность VPS на базе Ubuntu/Debian с помощью IPTABLES/Netfilter

Exit mobile version