Я использую сервер CentOS 6.3 и в настоящее время получаю электронные письма с заголовком «Большое количество неудачных попыток входа в систему с IP-адреса» с моего сервера каждые 15 минут или около того.
Конечно, с настройкой ниже это должно означать, что только человек, использующий (мой статический IP-адрес), должен иметь возможность даже попытаться войти в систему?
Если это так, то где эти удаленные неизвестные пользователи пытаются войти в систему, которая генерирует эти электронные письма?
Текущие меры безопасности:
without-password
StrictModes yes
PasswordAuthentication no
sshd_config
user@static.ip.address
hosts.allow
ALL : <Static IP>
hosts.deny
ALL : ALL
iptables
iptables -I INPUT -s <Static IP> -p tcp -m tcp --dport 22 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 22 -j REJECT
Я бы использовал Fail2Ban и укажите его в свой файл журнала ssh. Таким образом, если вы получаете указанное количество неудачных попыток с одного и того же IP-адреса, fail2ban автоматически добавляет правило брандмауэра для отбрасывания пакетов с этих IP-адресов в течение указанного вами периода времени.
Спереди одна маленькая деталь. Записи журнала, которые вы видите, выглядят так, как будто они происходят из hosts.deny
, так как sshd
"TCP-wrapped" (обычно в Linux). Подробную информацию смотрите man tcpd
.
Используя правила брандмауэра, вы можете лучше настроить то, что попадает в журнал (sys). Так что это место для внесения вашего статического IP-адреса в белый список и в черный список для всех остальных.
Если вы хотите преобразовать существующие правила в iptables
вы можете использовать следующий сценарий оболочки (замените PORTS
и MYIP
с переменными, соответствующими вашим потребностям):
#!/bin/bash
IPT="echo /sbin/iptables"
MYIP=1.2.3.4
PORTS="22 443 8080"
$IPT -P INPUT DROP
for port in $PORTS; do
$IPT -I INPUT -p tcp --dport $port -s $MYIP -j ACCEPT
done
... или короче:
#!/bin/bash
IPT="echo /sbin/iptables"
MYIP=1.2.3.4
PORTS="22 443 8080"
$IPT -P INPUT DROP
$IPT -I INPUT -p tcp -m multiport --dports ${PORTS// /,} -s $MYIP -j ACCEPT
... или двумя жестко запрограммированными строками:
/sbin/iptables -P INPUT DROP
/sbin/iptables -I INPUT -p tcp -m multiport --dports 22,443,8080 -s 1.2.3.4 -j ACCEPT
К сожалению, нет хорошего способа заставить его выводить номера портов, поэтому вы, вероятно, в конечном итоге их жестко закодируете.
Также имейте в виду, что вы можете промыть INPUT
таблицу перед установкой политики, используя iptables -X INPUT
.
Вышеупомянутое, объясненное в нескольких словах, устанавливает политику по умолчанию для INPUT
стол к DROP
а затем разрешает только TCP-соединения с указанными портами ($PORTS
) с данного IP ($MYIP
).
Кажется, вас интересует очень строгая блокировка, за исключением вашего собственного статического IP-адреса, поэтому ничего из следующего может вообще не потребоваться.
Я использовал следующие netfilter
rules, как указано мной в более ранней публикации на ServerFault: Нормально ли получать сотни попыток взлома в день?
Я не буду здесь повторять правила, потому что они уже существуют на этот сайт. Однако вы должны помнить, что вы все равно будете получать сообщения журнала, пока IP-адрес не будет автоматически помещен в tarpit. В общем, я не думаю, что вам нужно так сильно беспокоиться о количестве попыток, учитывая сам ваш звук sshd
конфигурация. Отрегулируйте время защиты от брезента, чтобы злоумышленники задержали нападавших дольше или начали действовать быстрее, но помните, что не блокируйте себя.
Кроме того, в недавнем прошлом я испытал и очень полюбил sshguard. Хотя многие сравнивают его с Fail2Ban, я думаю, что его область применения намного шире (также не ограничиваясь sshd
). Этот инструмент может использовать различные средства для анализа журналов (непосредственно или после того, как средство системного журнала помещает его в файл) и различные средства для блокировки (например, netfilter
/iptables
).
Всякий раз, когда люди проявляли упорство в своих попытках, я ставил полные блокировки (брандмауэр).
Если раздражают только записи журнала, вы настраиваете logcheck
(или другой инструмент), чтобы отфильтровать их или изменить порт, на который sshd
связывает. Однако с точки зрения безопасности я считаю это змеиным маслом.
При такой конфигурации sshd будет по-прежнему сообщать о неудачных попытках в следующих строках:
Dec 3 00:56:35 servername sshd[31242]: refused connect from li471-78.members.linode.com (50.116.13.78)
Dec 3 00:56:40 servername sshd[31244]: refused connect from li471-78.members.linode.com (50.116.13.78)
Возможно, ваше предупреждение в журнале срабатывает по этому поводу? Проверьте свои журналы, чтобы убедиться, что это так.
Вы можете избавиться от этого, изменив чувствительность / шаблон поиска вашей функции оповещения.
Вы также можете отключить его, заблокировав весь входящий трафик SSH, кроме вашего IP-адреса, с помощью брандмауэра. Если вы используете брандмауэр, ничего не ударит по sshd, поэтому в вашем журнале ничего не появится.
Возможно, вас взломали.
Сделать rpm -Vv keyutils-libs
как root на вашем сервере.
Вы видите 5? В таком случае одна из библиотек была заменена атакующей версией.
Более подробную информацию об атаке (возможно, с использованием cPanel) можно найти Вот.
Я использую это лицо, чтобы ограничить доступ к некоторым портам на моих серверах:
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSHACCESS --rsource
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 180 --hitcount 20 --name SSHACCESS --rsource -j DROP
ты можешь играть с --seconds
и --hitcounts
чтобы соответствовать вашему контексту.
Также вы можете использовать более сложные правила, например, выбивание портов. в этом случае вы отправляете запросы (это может быть ping, tcp, telnet или что угодно), а затем система открывает, например, порт SSH на несколько секунд только для этого IP-адреса, и вы можете выполнить ssh на сервере. проверьте эту ссылку, чтобы реализовать это с iptables
это простой порт, постукивающий по порту 1000:
-A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1000 -m recent --set --name KNOCKING --rsource
-A INPUT -p tcp -m tcp --dport 22 -m recent --rcheck --seconds 5 --name KNOCKING --rsource -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j DROP
теперь вы можете использовать ssh на своем сервере следующим образом:
telnet <ip> 1000 ; ssh <ip>
если вам нужна дополнительная помощь, дайте мне знать.
вы также можете использовать -m connlimit, чтобы ограничить количество неправильных попыток замедлить злоумышленников, как они объясняют здесь: http://www.cyberciti.biz/faq/iptables-connection-limits-howto/.
Добавление исключений и / или разных таймингов для разных IP-блоков возможно и просто.
Я бы также подумал об изменении порта sshd по умолчанию на что-то необычное.
К счастью, у меня есть ситуация с местным интернет-провайдером, и я знаю, что мой платный статический IP-адрес будет никогда изменить без предварительного уведомления, так как мне нужно только внести изменения на сервер из этого места, поэтому я могу заблокировать весь доступ SSH за пределами этого места через iptables и более высокий порт ssh.
Поэтому я применил следующее изменение в sshd_config
:
#example
Port 40000
а также создал iptables
запись с моим статическим IP-адресом и портом ssh:
iptables -A INPUT -p tcp -s 1.1.1.1 --dport 40000 -j ACCEPT
Пока что, похоже, это помогло!