Подстановка команд с использованием grep'ed и sed'ed tail -f output в качестве источника аргумента в команду 'at'

Это для домашней системы наблюдения, безголовый сервер под управлением Ubuntu 15.04, и я хочу, чтобы его безопасность была образцовой. Я предвижу решение командной строки (с необязательным сценарием, если это абсолютно необходимо), отслеживая IP-зонды от поисковиков / хакеров, зарегистрированных в моем ufw.log и занесенных в черный список в реальном времени, если они не портят правильно со временем. До сих пор у меня есть:

tail -n+1 -F /var/log/ufw.log | 
  grep -v --line-buffered '0.0.0.0' | 
    sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g'

, который выводит на stdout прямой поток зондов, попадающих в IP. Это IP-адреса, которые я хочу занести в черный список x (3?) Минут от «сейчас». Это дает законным пользователям время, чтобы получить белый список сначала с помощью портового детонации. Я использую команду вставки ufw для черных и белых списков, что означает, что в листинге первое доминирует.

Теперь часть белого списка работает нормально. Затем я хочу разработать команду «at», которая правильно выполняет команду ufw insert 1 deny from x.x.x.x, где xxxx происходит из вышеупомянутой команды хвоста.

Моя первая попытка - это что-то вроде

ufw insert 1 deny from $(tail -n+1 -F /var/log/ufw.log | 
   grep -v --line-buffered '0.0.0.0' | 
   sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g');
ufw reload | 
   at now +3 minute`

но команда at не генерируется, как показано в at -l. Может ли кто-нибудь увидеть, что я делаю неправильно с этой командой?

NEW THOUGHT - Я думаю, что команда tail -F должна быть началом. Любой другой способ, по-видимому, обрабатывает только одну строку из файла журнала ufw.

Для вас любопытно, что правила деблокирования портов, которые у меня есть, теперь могут и выполняются в черном списке, но очень ограничены, потому что я должен заранее определите поведение зондирования в правилах. Так что если они идут на порты 22 дважды или 21 дважды или 443 два раза, они теперь попадают в черный список. Но я вижу, что для портов в диапазоне 55xxx, 4 или 5 зондов используются разные порты. Я не вижу, как это можно разумно охарактеризовать в правилах брандмауэра, но я, безусловно, могу сделать это с помощью ufw всех зондов, попадающих через белый список и черный список в последний раздел deny + log. Я хочу дать им x минут для правильного ввода порта, затем будет выполняться часть 'ufw' этой команды, запланированная частью 'at'.

Спасибо!

muru got я очень близко. Вот текущее состояние прогресса, но обратите внимание, что ufw имеет склонность к этой ошибке: ERROR: initcaps
[Errno 2] iptables: Chain already exists. Поэтому я не думаю, что это работает достаточно эффективно с iptables, чтобы справиться с этой интеграцией очень хорошо. Я думаю, что лучше использовать команды iptable напрямую, вместо того, чтобы интерпретировать ufw.

tail -F /var/log/ufw.log | 
  grep -v --line-buffered '0.0.0.0' | 
  sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g' | 
  while read IP; do
    echo ufw insert 1 deny from "$IP" | 
      at now +3 minute;
    echo ufw reload | at now +3 minute; 
  done 

ПРИМЕЧАНИЕ. БЫСТРЫЕ ЗАПИСИ НЕ ВИДИМО В ЭТОМ ТЕКСТЕ, НО Я НЕОБХОДИЛ ДОБАВИТЬ ИХ Я ДУМАЮ. ОНИ НАПРАВЛЯЮТСЯ ДО ПРИНЯТИЯ КАЖДОЙ КОМАНДЫ ЭХО И ПОСЛЕ КАЖДОГО МИНУТНОГО КЛЮЧА.

То, как это не удается, теперь связано с «хвостом -F», связанным с конструкцией «while»: каждая строка добавляется к ufw. файл журнала, файл ENTIRE повторно загружается в цикл while, а не только добавленную строку. Я искал свое сердце и не могу найти способ обойти это. Помогите пожалуйста.

1
задан 27 September 2015 в 08:59

1 ответ

Если ufw reload и ufw insert вывести набор команд, которые перезагружают брандмауэр, то его не будет at.

Возможно, вы имели в виду:

echo ufw insert 1 deny from $(tail -n+1 -F /var/log/ufw.log | 
   grep -v --line-buffered '0.0.0.0' | 
   sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g') | at now +3 minute
echo ufw reload | at now +3 minute

Или, в сочетании:

at now +3 minute <<EOF
ufw insert 1 deny from $(tail -n+1 -F /var/log/ufw.log | grep -v --line-buffered '0.0.0.0' | sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g')
ufw reload
EOF
2
ответ дан 23 May 2018 в 17:13
  • 1
    перезагрузка и вставка перезагрузить брандмауэр, но нет, они не относятся к «набору», команд – kenneth558 24 September 2015 в 01:15
  • 2
    Я пытаюсь сделать второе предложение. Я очень надеюсь ... – kenneth558 24 September 2015 в 01:19
  • 3
    Используя второе предложение, я не вижу запись «at» с «at -l», показывая, когда это нужно. – kenneth558 24 September 2015 в 01:23
  • 4
    @ kenneth558, что крайне странно. Что-то не так с вашим at? – muru 24 September 2015 в 01:33
  • 5
    Я тестировал свой «at» из командной строки, прежде чем я даже начал. Обратите внимание, что я видел одну запись «в» один раз, а затем два из них, но не изменил таблицу ufw. Обратите также внимание на то, что я еще не знаю, как увидеть детали в очереди, поэтому я не знаю, является ли запланированная команда ufw безошибочной. Прямо сейчас, некоторые хиты входят без какой-либо активности, показанной в 'at -l' – kenneth558 24 September 2015 в 01:56

Другие вопросы по тегам:

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