Глава 8. Мониторинг журналов в режиме реального времени 139
trap interval SIGUSR1
shopt -s lastpipe
tail -f --pid=$$ ${1:-log.file} | while read aline
do let cnt++
done
.Функция.
interval
.будет.вызываться.при.получении.каждого.сигнала..Конечно,.
интервал.должен.быть.определен.до.того,.как.мы.сможем.его.назвать.и.использо- вать.в.нашем.выражении.
trap
.Команда.
date
.вызывается,.чтобы.предоставить.временную.метку.для.значения.
переменной.
cnt
,.которое.мы.распечатываем..После.вывода.показания.счетчика.мы.
сбрасываем.это.значение.на.
0
,.чтобы.начать.отсчет.следующего.интервала.
.Теперь,.когда.интервал.определен,.мы.можем.указать,.чтобы.функция.вызыва- лась.всякий.раз,.когда.наш.процесс.получает.сигнал.
SIGUSR1
.Это.очень.важный.шаг..Обычно,.когда.есть.конвейер.команд.(например,.
ls-l
|
grep
rwx
|
wc
),.части.конвейера.(каждая.команда).выполняются.в.подсетях.
и.каждый.процесс.заканчивается.своим.собственным.идентификатором.процес- са..Это.могло.бы.стать.проблемой.для.данного.сценария,.потому.что.цикл.
while будет.находиться.в.подоболочке.с.другим.идентификатором.процесса..Какой.бы.
процесс.ни.начался,.сценарий.
looper.sh
.не.будет.знать.идентификатора.процес- са.цикла.
while
,.чтобы.отправить.ему.сигнал..Кроме.того,.изменение.значения.
переменной.
cnt
.в.подоболочке.не.изменяет.значение.
cnt
.в.основном.процес- се,.поэтому.сигнал.для.основного.процесса.каждый.раз.приведет.к.установке.
значения.
0
..Решить.эту.проблему.можно.с.помощью.команды.
shopt
,.которая.
устанавливает.(
-s
).параметр.
lastpipe
..Он.указывает.оболочке.не.создавать.для.
последней.команды.в.конвейере.подоболочку,.а.запускать.эту.команду.в.том.же.
процессе,.в.котором.запущен.сам.сценарий..В.нашем.случае.это.означает,.что.
команда.
tail
.будет.выполняться.в.подоболочке.(то.есть.в.другом.процессе),.
а.цикл.
while
.станет.частью.основного.процесса.сценария..Внимание:.эта.опция.
оболочки.доступна.только.в.bash.версии.4.x.и.выше.и.только.для.неинтерактив- ных.оболочек.(то.есть.сценариев).
.Это.команда.
tail
-f
.еще.с.одним.параметром.
--pid
..Мы.указываем.идентифика- тор.процесса,.который.по.завершении.данного.процесса.завершит.работу.команды.
tail
..Мы.указываем.идентификатор.процесса.текущего.сценария.оболочки.
$$
,.ко- торый.нужно.просмотреть..Это.действие.позволяет.очистить.процессы.и.не.остав- лять.команду.
tail
.выполняться.в.фоновом.режиме.(если,.скажем,.этот.сценарий.
выполняется.в.фоновом.режиме;.пример.8.4).
140 Часть II • Защитные операции с использованием bash
Сценарий.
tailcount.sh
.запускает.и.останавливает.сценарий.с.секундомером.(тай- мер).и.ведет.подсчет.временных.интервалов.
Пример 8.4. tailcount.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# tailcount.sh
#
# Описание:
# Подсчет строк каждые n секунд
#
# Использование: ./tailcount.sh [filename]
# filename: проанализировать looper.sh
#
# очистка — другие процессы на выходе function cleanup ()
{
[[ -n $LOPID ]] && kill $LOPID
}
trap cleanup EXIT
bash looper.sh $1 &
LOPID=$!
# даем возможность начать sleep 3
while true do kill -SIGUSR1 $LOPID
sleep 5
done >&2
.Поскольку.этот.сценарий.будет.запускать.другие.сценарии,.после.работы.он.
должен.выполнить.очистку..Если.идентификатор.процесса.был.сохранен.в.
LOPID
,.
переменная.будет.хранить.значение,.поэтому.функция.с.помощью.команды.
kill отправит.этому.процессу.сигнал..Если.в.команде.
kill
.не.указать.конкретный.сиг- нал,.то.по.умолчанию.будет.отправлен.сигнал.
SIGTERM
.Команда.
EXIT
.не.является.сигналом..Это.специальный.случай,.когда.оператор.
trap
.указывает.оболочке.вызвать.эту.функцию.(в.данном.случае.
cleanup
),.если.
оболочка,.выполняющая.данный.сценарий,.собирается.завершить.работу.
.Теперь.начинается.настоящая.работа..Запускается.сценарий.
looper.sh
,.который.
будет.работать.в.фоновом.режиме:.чтобы.этот.сценарий.работал.на.протяжении.
всего.цикла.(не.дожидаясь.команды.на.завершение.работы),.он.отсоединяется.от.
клавиатуры.
Глава 8. Мониторинг журналов в режиме реального времени
1 ... 9 10 11 12 13 14 15 16 ... 23
141.Здесь.сохраняется.идентификатор.процесса.сценария,.который.мы.только.что.
запустили.в.фоновом.режиме.
.Данное.перенаправление.—.просто.мера.предосторожности..Весь.вывод,.посту- пающий.из.цикла.
while
.или.от.операторов.
kill
/
sleep
.(хотя.их.мы.не.ожидаем),.
не.должен.смешиваться.с.любыми.выводами.функции.
looper.sh
,.которая,.хотя.
и.работает.в.фоновом.режиме,.все.равно.отправляет.их.в.stdout..Поэтому.мы.пере- направляем.данные.из.stdout.в.stderr.
Подводя.итог,.мы.видим,.что,.хотя.функция.
looper.sh
.была.помещена.в.фоновый.
режим,.идентификатор.ее.процесса.сохраняется.в.переменной.оболочки..Каждые.
пять.секунд.сценарий.
tailcount.sh
.отправляет.данному.процессу.(который.выпол- няется.в.функции.
looper.sh
).сигнал.
SIGUSR1
,.который,.в.свою.очередь,.вызывает.
сценарий.
looper.sh
,.чтобы.распечатать.зафиксированное.в.нем.текущее.количество.
строк.и.перезапустить.подсчет..После.выхода.сценарий.
tailcount.sh
.очистится,.
отправив.сигнал.
SIGTERM
.в.функцию.
looper.sh
.для.ее.прерывания.
С.помощью.двух.сценариев.—.сценария,.выполняющего.подсчет.строк,.и.сцена- рия.с.секундомером.(таймера),.управляющего.первым.сценарием,.—.вы.можете.
получить.вывод.(количество.строк.за.определенный.период),.на.основе.которого.
следующий.сценарий.построит.гистограмму..Он.вызывается.таким.образом:
bash tailcount.sh | bash livebar.sh
Сценарий.
livebar.sh
.считывает.данные.из.stdin.и.печатает.вывод.в.stdout,.по.одной.
строке.для.каждой.строки.ввода.(пример.8.5).
Пример 8.5. livebar.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# livebar.sh
#
# Описание:
# Создание горизонтальной гистограммы «живых» данных
#
# Использование:
#
152 Часть II • Защитные операции с использованием bash действительно.только.на.время.выполнения.данной.команды..К.своему.преды- дущему.значению.переменная.возвращается.сразу.после.выполнения.команды..
Вот.почему.мы.в.этой.строке.не.повторяем.
$LOOKFOR
.—.это.не.будет.действительным.
значением..Мы.бы.могли.разделить.это.выражение.на.две.отдельные.команды.—.
присваивание.переменной.и.вызов.функции..Но.тогда.бы.вы.не.узнали.об.этой.
функции.в.bash.
.Здесь.демонстрируется.новый.вариант.использования.файловых.дескрипто- ров..Файловый.дескриптор.4.получает.«перенаправление».для.чтения.входных.
данных.из.файла,.указанного.в.первом.аргументе.сценария..Соответственно.
дескриптор.5.получает.свои.входные.данные.из.второго.аргумента..Если.один.
или.оба.параметра.не.заданы,.сценарий.будет.использовать.имена,.указанные.по.
умолчанию.
Шаг 3. Автоматизация и уведомление
Хотя.вы.можете.выполнять.сценарий.вручную,.было.бы.гораздо.лучше,.если.бы.он.
автоматически.запускался.каждый.день.или.каждые.несколько.дней.и.уведомлял.
вас.о.любых.обнаруженных.изменениях..Сценарий.
autoscan.sh
,.показанный.в.при- мере.9.4,.является.единственным.сценарием,.использующим.для.сканирования.сети.
и.вывода.любых.изменений.файлы.
scan.sh
.и.
fd2.sh
Пример 9.4. autoscan.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# autoscan.sh
#
# Описание:
# Автоматическое сканирование портов (с помощью сценария scan.sh)
# Сравнение вывода с предыдущими результатами и e-mail пользователя
# Предполагается, что сценарий scan.sh находится в текущем каталоге
#
# Использование: ./autoscan.sh
#
./scan.sh < hostlist
FILELIST=$(ls scan_* | tail -2)
FILES=( $FILELIST )
TMPFILE=$(tempfile)
Глава 9. Инструмент: мониторинг сети 153
./fd2.sh ${FILES[0]} ${FILES[1]} > $TMPFILE
if [[ -s $TMPFILE ]] # не пустой
then echo "mailing today's port differences to $USER"
mail -s "today's port differences" $USER < $TMPFILE
fi
# очистка rm -f $TMPFILE
.При.выполнении.сценария.
scan.sh
.будут.проверены.все.хосты,.находящиеся.
в.файле.с.именем.
hostlist
..Поскольку.сценарию.
scan.sh
.имя.файла.в.качестве.
аргумента.мы.не.предоставляем,.это.имя.сценарий.сгенерирует.сам..При.этом.ис- пользуется.числовой.формат.«год-месяц-день».
.Проименованные.файлы,.выводимые.из.сценария.
scan.sh
,.по.умолчанию.будут.
отсортированы..Команда.
ls
.вернет.эти.файлы.в.порядке,.определенном.датами.
их.создания..При.этом.не.потребуется.указывать.команде.
ls
.какие-либо.специ- альные.параметры..Используя.команду.
tail
,.мы.получим.два.последних.имени.
из.данного.списка..Чтобы.облегчить.разделение.на.две.части,.поместим.имена.
в.массив.
.Создание.с.помощью.команды.
tempfile
.временного.имени.файла.—.самый.
надежный.способ.убедиться,.что.файл.не.используется.или.не.может.быть.за- писан.
.С.помощью.параметра.
-s
.проверяется.размер.файла:.если.он.больше.нуля,.
значит,.файл.не.пустой..Временный.файл.не.будет.пустым,.если.при.сравнении.
его.размера.с.размером.файла.
fd2.sh
.обнаружится.разница.
.Для.переменной.
$USER
.автоматически.устанавливается.идентификатор.поль- зователя,.однако,.если.адрес.электронной.почты.отличается.от.идентификатора.
пользователя,.в.эту.переменную.может.потребоваться.поместить.другое.зна- чение.
.Существуют.более.надежные.способы.убедиться,.что.файл.удален,.независимо.
от.того,.где.и.когда.сценарий.будет.завершен..Но.это.минимум,.позволяющий.
предотвратить.накопление.рабочих.файлов..Сценарии.захвата,.использующие.
встроенную.команду.
trap
,.вы.найдете.далее.
В.операционной.системе.Windows.запуск.сценария.
autoscan.sh
.с.заданным.интер- валом.можно.настроить.с.помощью.команды.
schtasks
..Для.запуска.этого.сценария.
в.Linux.с.заданным.интервалом.следует.воспользоваться.командой.
crontab
154 Часть II • Защитные операции с использованием bash
Планирование задачи в Linux
Чтобы.запланировать.выполнение.задачи.в.Linux,.сначала.нужно.перечислить.все.
существующие.файлы.cron:
$ crontab -l no crontab for paul
Как.вы.можете.убедиться,.файла.cron.пока.не.существует..Для.создания.и.редак- тирования.нового.файла.cron.укажите.параметр.
-e
:
$ crontab -e no crontab for paul - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
Choose 1-4 [2]:
В.любом.редакторе.добавьте.в.файл.cron.следующую.строку,.чтобы.сценарий.
autoscan.sh
.запускался.в.08:00.утра.каждый.день:
0 8 * * * /home/paul/autoscan.sh
Первые.пять.элементов.определяют.дату.и.время,.когда.будет.выполняться.зада- ча,.а.шестой.элемент.—.это.команда.или.файл,.которые.должны.быть.выполнены..
В.табл..9.1.описаны.поля.файла.cron.и.их.допустимые.значения.
Для выполнения сценария autoscan.sh в качестве команды (вместо использования bash auto scan.sh) необходимо предоставить ему соответствующие полномочия.
Например, с помощью строки chmod 750/home/paul/autoscan.sh владельцу файла
(возможно, Paul) предоставляются права на чтение, запись и выполнение, а также разрешение на чтение и выполнение для группы и никаких других разрешений.
Таблица 9.1. Поля файла cron
Поле
Разрешенные значения
Пример
Значение
Минута
0–59 0
00.минут
Час
0–23 8
8.часов
День.месяца
1–31
*
Любой.день
Месяц
1–12,.January.—.December,.Jan.—.Dec
Mar
Март
День.недели
1–7,.Monday.—.Sunday,.Mon–Sun
1
Понедельник
Глава 9. Инструмент: мониторинг сети 155
В.примере,.показанном.в.табл..9.1,.выполнение.задачи.начинается.каждый.поне- дельник.марта,.в.08:00.утра..В.любом.поле.может.быть.установлено.значение.
*
,.что.
эквивалентно.любому.значению.
Планирование задач в Windows
Запланировать.автоматический.запуск.сценария.
autoscan.sh
.в.Windows.немного.
сложнее,.так.как.изначально.этот.сценарий.не.будет.работать.из.командной.строки..
Вместо.этого.вам.нужно.запланировать.запуск.Git.Bash.и.в.качестве.аргумента.ука- зать.файл.
autoscan.sh
..Чтобы.в.системе.Windows.запланировать.запуск.сценария.
autoscan.sh
.каждый.день.в.08:00,.напишите.следующее:
schtasks //Create //TN "Network Scanner" //SC DAILY //ST 08:00
//TR "C:\Users\Paul\AppData\Local\Programs\Git\git-bash.exe
C:\Users\Paul\autoscan."
Обратите.внимание:.чтобы.задача.выполнялась.правильно,.нужно.точно.указать.
путь.к.Git.Bash.и.сценарию.
autoscan.sh
..При.указании.параметров.обязательно.
используйте.двойной.слеш,.так.как.сценарий.будет.выполняться.не.из.командной.
строки.Windows,.а.из.Git.Bash..В.табл..9.2.подробно.описывается.значение.каждого.
из.параметров.
Таблица 9.2. Параметры команды schtasks
Параметр
Описание
//Create
Создание.новой.задачи
//TN
Имя.задачи
//SC
Частота.расписания..Допустимые.значения:.минута,.час,.день,.неделя,.месяц,.
единожды.при.запуске,.при.входе.в.систему,.при.простое,.при.событии
//ST
Время.запуска
//TR
Задание.для.выполнения
Выводы
Способность.обнаруживать.отклонения.от.установленного.базового.уровня.является.
одной.из.самых.эффективных.при.выявлении.аномальной.активности..Неожидан- ное.открытие.системой.порта.сервера.может.указывать.на.наличие.сетевого.бэкдора.
(backdoor)..В.следующей.главе.мы.рассмотрим,.как.для.обнаружения.в.локальной.
файловой.системе.подозрительной.активности.можно.использовать.определение.
исходного.состояния.этой.системы.