Basia

мой бложек

 
  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

iptables настройка

Однажды взглянув в логи любимого, только что поднятого сервера (/var/log/auth.log) вы наверняка озадачитесь проблемой безопасности. К примеру увидев там такую картину:

May  2 11:57:40 myhostname sshd[22106]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=c-68-36-226-180.hsd1.nj.comcast.net

May  2 11:57:42 myhostname sshd[22106]: Failed password for invalid user oracle from 68.36.226.180 port 50159 ssh2

May  2 11:57:43 myhostname sshd[22108]: Invalid user oracle from 68.36.226.180

May  2 11:57:43 myhostname sshd[22108]: pam_unix(sshd:auth): check pass; user unknown

May  2 11:57:43 myhostname sshd[22108]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=c-68-36-226-180.hsd1.nj.comcast.net

May  2 11:57:45 myhostname sshd[22108]: Failed password for invalid user oracle from 68.36.226.180 port 50311 ssh2

May  2 11:57:47 myhostname sshd[22110]: Invalid user oracle from 68.36.226.180

May  2 11:57:47 myhostname sshd[22110]: pam_unix(sshd:auth): check pass; user unknown

May  2 11:57:47 myhostname sshd[22110]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=c-68-36-226-180.hsd1.nj.comcast.net

May  2 11:57:49 myhostname sshd[22110]: Failed password for invalid user oracle from 68.36.226.180 port 50442 ssh2

May  2 11:57:50 myhostname sshd[22112]: Invalid user oracle from 68.36.226.180

May  2 11:57:50 myhostname sshd[22112]: pam_unix(sshd:auth): check pass; user unknown

May  2 11:57:50 myhostname sshd[22112]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=c-68-36-226-180.hsd1.nj.comcast.net

May  2 11:57:52 myhostname sshd[22112]: Failed password for invalid user oracle from 68.36.226.180 port 50597 ssh2

May  2 11:57:53 myhostname sshd[22114]: Invalid user oracle from 68.36.226.180

May  2 11:57:54 myhostname sshd[22114]: pam_unix(sshd:auth): check pass; user unknown

May  2 11:57:54 myhostname sshd[22114]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=c-68-36-226-180.hsd1.nj.comcast.net

May  2 11:57:56 myhostname sshd[22114]: Failed password for invalid user oracle from 68.36.226.180 port 50724 ssh2

May  2 11:57:57 myhostname sshd[22116]: Invalid user test from 68.36.226.180

May  2 11:57:57 myhostname sshd[22116]: pam_unix(sshd:auth): check pass; user unknown

May  2 11:57:57 myhostname sshd[22116]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=c-68-36-226-180.hsd1.nj.comcast.net

May  2 11:57:58 myhostname sshd[22116]: Failed password for invalid user test from 68.36.226.180 port 50853 ssh2

May  2 11:58:00 myhostname sshd[22118]: Invalid user test from 68.36.226.180

 

Ну что уже страшно? Без паники и паранои! Всегда есть решение, как минимум 2, а то и больше. Так что начнем с настройки iptables стандартный файрволл (он же сетевой экран) для Linux, у BSD систем это ipfw. В Linux файрволл по умолчанию выключен, но не торопитесь быстрее его включать! Особенно, если у вас нет локального доступа на сервер. По умолчанию он запрещает все. Так что сначала тщательно подготовимся. Настройки iptables можно делать построчно через консоль, через webmin, графические утилитки. Но я выбрала способ поудобнее. Создадим файлик rc.iptables  с настройками и запуском в /etc/init.d . Если там уже имеется conf файл для iptables (что то вроде rc.firewall или rc.iptables) его нужно будет удалить. Делаем его исполняемым для всех через chmod .Вот содержимое моего файла:

#!/bin/sh

 

##переменная задающая путь к файлу iptables.

IPT="/sbin/iptables"

 

##Ваш сетевой интерфейс.

INET_IFACE="eth0"

 

start_fw()

{

    #Включаем перенаправление пакетов через ядро

    echo 1 > /proc/sys/net/ipv4/ip_forward

 

    #Сбросить правила и удалить цепочки

    $IPT -F

    $IPT -X

 

##Отбрасывать все пакеты которые не могут быть идентифицированы и поэтому не могут иметь определенного статуса

$IPT -A INPUT   -m state --state INVALID -j DROP

$IPT -A FORWARD -m state --state INVALID -j DROP

 

##Порпускать все входящие ICMP-эхо запросы (пинги)

$IPT -A INPUT -i INET_IFACE -p icmp --icmp-type echo-request -j ACCEPT

 

##Разрешаем прохождение любого трафика по интерфейсу обратной петли

$IPT -A INPUT -i lo -j ACCEPT

$IPT -A OUTPUT -o lo -j ACCEPT

 

##будет препятствовать спуфингу от нашего имени

$IPT -I INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT --reject-with tcp-reset

 

##Защищаем от сканирования портов

#Очищаем цепочку INPUT

$IPT -F INPUT

#Разрешаем пакеты по уже установленным соединениям

$IPT -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

#Если за последничай час было 10 и более запросов на нерабочие порты- блокируем

$IPT -A INPUT -m recent --rcheck --seconds 3600 --hitcount 10 --rttl --name BRUT -j LOG --log-prefix "**BRUT**"

$IPT -A INPUT -m recent --rcheck --seconds 3600 --hitcount 10 --rttl -j RETURN

#Если за последнюю минуту было 2 и более запросов на нерабочие порты- блокируем

$IPT -A INPUT -m recent --rcheck --seconds 60 --hitcount 2 --rttl -j RETURN

#Разрешаем рабочие порты

$IPT -A INPUT -m conntrack --ctstate NEW -p tcp -m multiport --dport 20,21,43,53,70,79,80,81,111,139,161,443,445,745,2049 -j ACCEPT

$IPT -A INPUT -m conntrack --ctstate NEW -p udp -m multiport --dport 53,111,123,137,138,747,2049 -j ACCEPT

#Всех кто ломится в нерабочие порты-регистрируем

$IPT -A INPUT -m recent --set

##Для защиты от brute force (перебора паролей), можно ограничить количество подключений на 22 порт

##С одного ip адреса до 2 раз в минуту, после чего блокировать попытки подключения для данного ip.

#Создание цепочки sshguard

#Максимум 2 новых запроса в минуту для одного ip

$IPT -N sshguard

#Включить лог по желанию

$IPT -A sshguard -m state --state NEW -m recent --name SSH --rcheck --seconds 60 --hitcount 2 -j LOG --log-prefix "SSH-shield:"

$IPT -A sshguard -m state --state NEW -m recent --name SSH --update --seconds 60 --hitcount 2 -j REJECT

$IPT -A sshguard -m state --state NEW -m recent --name SSH --set -j ACCEPT

$IPT -A sshguard -j ACCEPT

#Применение для трафика ssh цепочку sshguard

$IPT -A INPUT -p tcp --dport 22 -j sshguard

 

##На выход- можно все

$IPT -P OUTPUT ACCEPT

 

#Что не разрешено- то запрещено

$IPT -P INPUT DROP

 

}

 

case "$1" in

start)  echo -n "Starting firewall:"

        start_fw

        echo "."

        ;;

stop)   echo -n "Stopping firewall:"

        iptables -F

        iptables -X

        echo "."

        ;;

save)   echo -n "Saving firewall:"

        iptables-save > /etc/rules-save

        echo "."

        ;;

restart) echo -n "Restarting firewall:"

        iptables -F

        iptables -X

        cat /etc/rules-save | iptables-restore

        echo "."

        ;;

reload|force-reload) echo -n "Reloading configuration files for firewall:"

        echo "."

        ;;

*)      echo "Usage: /etc/init.d/rc.iptables start|stop|restart|reload|force-reload"

        exit 1

        ;;

esac

exit 0

 

 

Будьте внимательны с написанием, не теряйте буквы и не опечатайтесь, иначе при запуске выйдет сообщение об ошибках. Иногда для некоторых цепей по умолчанию (например INPUT) не принимает действие например REJECT  (тогда замените на DROP) или не принимает команду –I .

 

Так, что сначала попробуйте его просто запустить и посмотреть что скажет.

 

Сначала сохраним полученную конфигурацию!

/etc/init.d/rc.iptables save

она запишется сюда /etc/rules-save

А то при сбросе правил в дефолт командой iptables –F, будет действовать правило «что не разрешено, то запрещено», в данном случае запрещено все.

 

Дальше сделайте, чтобы новый скрипт инициализации запускался во время загрузки:

update-rc.d new.rc.iptables start 40 S . stop 89 0 6 .

 

Теперь останавливать можно так:

/etc/init.d/rc.iptables stop

 

Запускать

/etc/init.d/rc.iptables start

 

Правда заметила маленькую странность, поэтому советую, сделав изменения в conf файле, запустите сервер (НЕ ОСТАНАВЛИВАЯ!!!) а потом сохраните измененную конфигурацию с изменениями, тогда и настройки в дефолт не сбросятся и новая конфигурация запишется в файл rules-save.

 

Посмотреть список всех правил и заданий iptables можно командой:

iptables -L

 

Вот то что увидите в ответ:

Chain INPUT (policy DROP)

target     prot opt source               destination

ACCEPT     all  --  anywhere             anywhere            ctstate RELATED,ESTABLISHED

LOG        all  --  anywhere             anywhere            recent: CHECK seconds: 3600 hit_count: 10 TTL-Match name: BRUT side: source LOG level warning prefix `**BRUT**'

RETURN     all  --  anywhere             anywhere            recent: CHECK seconds: 3600 hit_count: 10 TTL-Match name: DEFAULT side: source

RETURN     all  --  anywhere             anywhere            recent: CHECK seconds: 60 hit_count: 2 TTL-Match name: DEFAULT side: source

ACCEPT     tcp  --  anywhere             anywhere            ctstate NEW multiport dports ftp-data,ftp,whois,domain,gopher,finger,www,81,sunrpc,netbios-ssn,snmp,https,microsoft-ds,745,nfs

ACCEPT     udp  --  anywhere             anywhere            ctstate NEW multiport dports domain,sunrpc,ntp,netbios-ns,netbios-dgm,747,nfs

           all  --  anywhere             anywhere            recent: SET name: DEFAULT side: source

sshguard   tcp  --  anywhere             anywhere            tcp dpt:ssh

 

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination

DROP       all  --  anywhere             anywhere            state INVALID

ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED

ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED

 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination

ACCEPT     all  --  anywhere             anywhere

 

Chain sshguard (1 references)

target     prot opt source               destination

LOG        all  --  anywhere             anywhere            state NEW recent: CHECK seconds: 60 hit_count: 2 name: SSH side: source LOG level warning prefix `SSH-shield:'

REJECT     all  --  anywhere             anywhere            state NEW recent: UPDATE seconds: 60 hit_count: 2 name: SSH side: source reject-with icmp-port-unreachable

ACCEPT     all  --  anywhere             anywhere            state NEW recent: SET name: SSH side: source

ACCEPT     all  --  anywhere             anywhere

 

 

А так выглядит содержимое rules-save

# Generated by iptables-save v1.4.2 on Tue May 11 15:58:18 2010

*filter

:INPUT DROP [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [12:1184]

:sshguard - [0:0]

-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-A INPUT -m recent --rcheck --seconds 3600 --hitcount 10 --rttl --name BRUT --rsource -j LOG --log-prefix "**BRUT**"

-A INPUT -m recent --rcheck --seconds 3600 --hitcount 10 --rttl --name DEFAULT --rsource -j RETURN

-A INPUT -m recent --rcheck --seconds 60 --hitcount 2 --rttl --name DEFAULT --rsource -j RETURN

-A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 20,21,43,53,70,79,80,81,111,139,161,443,445,745,2049 -j ACCEPT

-A INPUT -p udp -m conntrack --ctstate NEW -m multiport --dports 53,111,123,137,138,747,2049 -j ACCEPT

-A INPUT -m recent --set --name DEFAULT --rsource

-A INPUT -p tcp -m tcp --dport 22 -j sshguard

-A FORWARD -m state --state INVALID -j DROP

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

-A OUTPUT -o lo -j ACCEPT

-A sshguard -m state --state NEW -m recent --rcheck --seconds 60 --hitcount 2 --name SSH --rsource -j LOG --log-prefix "SSH-shield:"

-A sshguard -m state --state NEW -m recent --update --seconds 60 --hitcount 2 --name SSH --rsource -j REJECT --reject-with icmp-port-unreachable

-A sshguard -m state --state NEW -m recent --set --name SSH --rsource -j ACCEPT

-A sshguard -j ACCEPT

COMMIT

# Completed on Tue May 11 15:58:18 2010

 

Полезные составляющие взяты из этих статей:

http://www.opennet.ru/tips/sml/41.shtml   разные варианты настройки для защиты на разные случаи

http://www.opennet.ru/docs/RUS/iptables/#EXAMPLERCFIREWALL   огромное руководство с полным описанием

http://www.posix.ru/network/iptables/  создание файла настройки, почти половина взята оттуда

http://wiki.opennet.ru/Iptables_-m_recent  и http://wiki.enchtex.info/howto/iptables/ssh-guard    полезно почитать, варианты настроек

Все это я проштудировала, обдумала и свела воедино.

 

Это только часть того что, можно сделать для защиты.

 

Увидеть предварительный результат своих трудов можно будет в том же файле /var/log/auth.log

 

И не пугайтесь, увидев там активность с именем CRON такого вида:

 

May 14 11:09:01 myhostname CRON[11340]: pam_unix(cron:session): session opened for user root by (uid=0)

May 14 11:09:01 myhostname CRON[11340]: pam_unix(cron:session): session closed for user root

May 14 11:17:01 myhostname CRON[11354]: pam_unix(cron:session): session opened for user root by (uid=0)

May 14 11:17:01 myhostname CRON[11354]: pam_unix(cron:session): session closed for user root

May 14 11:23:01 myhostname CRON[11358]: pam_unix(cron:session): session opened for user mail by (uid=0)

May 14 11:23:01 myhostname CRON[11358]: pam_unix(cron:session): session closed for user mail

May 14 11:38:01 myhostname CRON[11364]: pam_unix(cron:session): session opened for user mail by (uid=0)

May 14 11:38:01 myhostname CRON[11364]: pam_unix(cron:session): session closed for user mail

 

Покопавшись в остальных логах, все сведется с двум строкам из логов:

 

это активность почтового клиента exim

May 15 07:08:01 myhostname /USR/SBIN/CRON[12535]: (mail) CMD (  if [ -x /usr/lib/exim/exim3 -a -f /etc/exim/exim.conf ]; then /usr/lib/exim/exim3 -q ; fi)

 

 

 

это очистка кэша сессий на вашем сайте

May 15 07:09:01 myhostname /USR/SBIN/CRON[12538]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmi$

 

это сам cron каждый час проверяет свою папку заданий hourly

May 15 07:17:01 myhostname /USR/SBIN/CRON[12552]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

 

 

Дальше хочу продолжить о еще одном способе отсечь нежелательных гостей. Это можно сделать с помощью файликов hosts.allow и hosts.deny .

 

Баннер