Однажды взглянув в логи любимого, только что поднятого сервера (/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 .
< Предыдущая |
---|