После некоторых исследований с моей стороны,
fail2ban
на основеiptables
-блокирует активные сеансы, включая те, которые пытаются войти в систему, и те, которые уже вошли в систему. fail2ban
на основеshorewall
-не блокирует активные сеансы, но предотвращает новые попытки подключения. Вариация сводится к правилам iptables
, используемым для запрета трафика, и конкретной конфигурации fail2ban
.
Не зная, используете ли вы необработанные iptables
или одну из абстракций более высокого уровня (ufw
, shorewall
и т. д. )вот несколько указателей:
Использованиеiptables
В jail.local
у меня есть следующие определения:
banaction = iptables-multiport
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
action = %(action_)s
В каждом правиле либо не переопределяйте значение по умолчанию, либо установите banaction = iptables-multiport
(, которое совпадает с настройкой по умолчанию ).
Также в jail.local
убедитесь, что максимальное количество повторных попыток соответствует вашей предпочтительной политике,либо по умолчанию, либо для набора правил службы:
maxretries = 3
В action.d/iptables-multiport.conf
убедитесь, что у вас есть такие определения для правил бана и разбана:
actionban = iptables -I fail2ban- 1 -s -j DROP
actionunban = iptables -D fail2ban- -s -j DROP
Использование Shorewall
При использовании коннектора Shorewall для fail2ban
вам потребуется настроить правила по умолчанию, чтобы Shorewall применял блокировки не только к начальным сеансам, но и ко всему трафику для IP-адреса.
В jail.local
у меня есть следующие определения:
banaction = shorewall
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
action = %(action_)s
В каждом правиле либо не переопределяйте значение по умолчанию, либо установите banaction = shorewall
(, которое совпадает с настройкой по умолчанию ).
Также в jail.local
убедитесь, что максимальное количество повторных попыток соответствует вашей предпочтительной политике либо по умолчанию, либо для каждого набора правил службы:
maxretries = 3
В файле конфигурации Shorewallshorewall.conf
DYNAMIC_BLACKLIST=Yes
BLACKLISTNEWONLY=No
Параметр BLACKLISTNEWONLY
определяет, следует ли блокировать все подключения или только новые подключения. Вы бы хотели No
здесь.
Правильно процитированная строка должна выглядеть так:
$ echo \*/2\ \*\ \*\ \*\ \*\ /usr/bin/aws\ ssm-send-command\ --document-name\ \"AWS-RunShellScript\"\ --parameters\ \'\{\"commands\":\[\"echo\ \{\{ssm:/mr2/cloudwatch-custom\}\}\"\]\"\}\'\ --instance-ids\ \"\$INSTANCE_ID\"\ --region\ us-east-1
Конечно, я не сам придумал это безумное цитирование, я использовал этот скрипт, который использует спецификатор %q
:
#!/usr/bin/env sh
read
printf "%q\n" "$REPLY" | tr '\n' ' '
Проблема с первой командой заключается в том, что символы *
не заключены в кавычки. Поэтому оболочка расширит их до любых совпадающих имен файлов в текущем каталоге.
Ваша проблема со второй командой заключается в том, что команда содержит как одинарные, так и двойные кавычки, поэтому вы не можете надежно просто заключать запись crontab в двойные кавычки, как вы пытаетесь сделать. Вам придется переписать его так, чтобы в первую очередь он содержал только один тип кавычек (, например. двойные кавычки ), а затем используйте другие типы кавычек (одинарные кавычки ), чтобы заключить всю команду в кавычки. Запись crontab также содержит опечатку (, которую я не собираюсь исправлять, потому что я не знаю, какой она должна быть )в том смысле, что она имеет нечетное количество двойных кавычек..
Лучше использовать цитируемый здесь -документ:
cat >>/etc/cron.d/lvm_disk_space <<'END_CRON'
*/2 * * * * /usr/bin/aws ssm-send-command --document-name "AWS-RunShellScript" --parameters '{"commands":["echo {{ssm:/mr2/cloudwatch-custom}}"]"}' --instance-ids "$INSTANCE_ID" --region us-east-1
END_CRON
Здесь используется цитируемое здесь перенаправление документа -для записи буквального текста в конец файла. Содержимое документа здесь -не будет «расширено» (или иным образом изменено )оболочкой из-за кавычек вокруг начального тега END_CRON
.
Обратите внимание, что ваша команда по-прежнему содержит открытую двойную кавычку, которую вам придется исправить самостоятельно:
["echo {{ssm:/mr2/cloudwatch-custom}}"]"
попробуйте разбить на две строки
echo "*/2 * * * *" /usr/bin/aws ssm-send-command (...) >> /etc/cron.d/lvm_disk_space
таким образом *
не будет расширяться до локальных имен файлов, и вы получите оставшийся аргумент.
Обратите внимание, что внешняя цитата удалена.
напр.
--document-name "AWS-RunShellScript"
расширяется как
--document-name AWS-RunShellScript