вывод команды в cron.d

После некоторых исследований с моей стороны,

  • Моя конфигурация fail2banна основеiptables-блокирует активные сеансы, включая те, которые пытаются войти в систему, и те, которые уже вошли в систему.
  • Моя конфигурация fail2banна основеshorewall-не блокирует активные сеансы, но предотвращает новые попытки подключения.

Вариация сводится к правилам iptables, используемым для запрета трафика, и конкретной конфигурации fail2ban.

Не зная, используете ли вы необработанные iptablesили одну из абстракций более высокого уровня (ufw, shorewallи т. д. )вот несколько указателей:


Использованиеiptables

  1. В jail.localу меня есть следующие определения:

    banaction = iptables-multiport
    action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
    action = %(action_)s
    

    В каждом правиле либо не переопределяйте значение по умолчанию, либо установите banaction = iptables-multiport(, которое совпадает с настройкой по умолчанию ).

  2. Также в jail.localубедитесь, что максимальное количество повторных попыток соответствует вашей предпочтительной политике,либо по умолчанию, либо для набора правил службы:

    maxretries = 3
    
  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-адреса.

  1. В jail.localу меня есть следующие определения:

    banaction = shorewall
    action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
    action = %(action_)s
    

    В каждом правиле либо не переопределяйте значение по умолчанию, либо установите banaction = shorewall(, которое совпадает с настройкой по умолчанию ).

  2. Также в jail.localубедитесь, что максимальное количество повторных попыток соответствует вашей предпочтительной политике либо по умолчанию, либо для каждого набора правил службы:

    maxretries = 3
    
  3. В файле конфигурации Shorewallshorewall.conf

    DYNAMIC_BLACKLIST=Yes
    BLACKLISTNEWONLY=No
    

    Параметр BLACKLISTNEWONLYопределяет, следует ли блокировать все подключения или только новые подключения. Вы бы хотели Noздесь.

0
15.01.2020, 18:15
3 ответа

Правильно процитированная строка должна выглядеть так:

$ 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' ' '
2
28.01.2020, 02:14

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

Ваша проблема со второй командой заключается в том, что команда содержит как одинарные, так и двойные кавычки, поэтому вы не можете надежно просто заключать запись 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}}"]"
4
28.01.2020, 02:14

попробуйте разбить на две строки

echo "*/2 * * * *" /usr/bin/aws ssm-send-command (...) >> /etc/cron.d/lvm_disk_space

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

Обратите внимание, что внешняя цитата удалена.

напр.

--document-name "AWS-RunShellScript"

расширяется как

--document-name AWS-RunShellScript
1
28.01.2020, 02:14

Теги

Похожие вопросы