LINUX.ORG.RU

Автоматический анализ логов фаервола


0

1

Доброго дня. Вопрос следующий.
Имеется лог фаервола. Точнее, фильтра пакетов. В нём - много строк, каждая отвечает за одно соединение. Строки примерно следующего вида:

<time> <Source_IP> <Destination_IP> <левая инфа> <action[dropped|accepted]>
Требуется следующее:
Составить список следующего вида:
Подсписок_1:
<Source_ip_1> <Destination_IP_1> <Destination_IP_1_resolved_name> <connections_count>
<Source_ip_1> <Destination_IP_2> <Destination_IP_2_resolved_name> <connections_count>
<Source_ip_1> <Destination_IP_n> <Destination_IP_n_resolved_name> <connections_count>

Подсписок_2:
<Source_ip_2> <Destination_IP_1> <Destination_IP_1_resolved_name> <connections_count>
<Source_ip_2> <Destination_IP_2> <Destination_IP_2_resolved_name> <connections_count>
<Source_ip_2> <Destination_IP_n> <Destination_IP_n_resolved_name> <connections_count>

То есть нужно составить список того, кто куда сколько раз подключался, и при этом отрезолвить по возможности эти адреса, чтобы не искать нслукапом соответствия вручную. При этом должны попадать только те пакеты, которые были accepted. Также требуется отсортировать данные внутри подсписков по количеству подключений (столбец <connections_count>) по убывающей, чтобы сразу, глянув на список, можно было сказать: Марья Ивановна больше всего заходила на одноклассники.ру. Я понимаю, что это ни в коей мере не даёт возможности понять, сколько трафика было потрачено, но в данном случае интересует именно количество попыток соединения.

Пример двух реальных строк:
2011:07:11-00:00:02 DesheliGateway ulogd[4137]: id=«2001» severity=«info» sys=«SecureNet» sub=«packetfilter» name=«Packet dropped» action=«drop» fwrule=«60002» initf=«eth1» outitf=«eth0» srcmac=«48:5b:39:3:42:50» dstmac=«0:26:5a:70:45:83» srcip=«192.168.0.11» dstip=«213.170.92.166» proto=«17» length=«429» tos=«0x00» prec=«0x00» ttl=«63» srcport=«5060» dstport=«5068»

2011:07:11-00:00:02 DesheliGateway ulogd[4137]: id=«2001» severity=«info» sys=«SecureNet» sub=«packetfilter» name=«Packet dropped» action=«drop» fwrule=«60002» initf=«eth1» outitf=«eth0» srcmac=«48:5b:39:3:42:50» dstmac=«0:26:5a:70:45:83» srcip=«192.168.0.11» dstip=«91.195.170.37» proto=«17» length=«416» tos=«0x00» prec=«0x00» ttl=«63» srcport=«5060» dstport=«5060»

Кстати, если length - это длина пакета, то в каких единицах, есть идеи? Они бывают совершенно произвольными. Возможно, стоит также добавлять это поле, так как это предположительно даст представление о потраченном трафике в байтах.
Насколько я понимаю, для решения этой задачи потребуются следующие утилиты:
cat, grep, wc, nslookup, sed, а также операторы цикла и знания в области программирования на bash, которыми я не обладаю совершенно.
Если найдутся желающие помочь мне решить эту задачу, буду благодарен. Единственная просьба: не надо предлагать «копать в сторону...». Этой информации мне недостаточно, иначе и сам бы мог написать нужный скрипт. Думаю, что помочь мне может только приблизительный текст программы.



Последнее исправление: Drevoborod (всего исправлений: 2)

>Единственная просьба: не надо предлагать «копать в сторону...»

Тут таких не любят.

aedeph
()

>То есть нужно составить список того, кто куда сколько раз подключался, и при этом отрезолвить по возможности эти адреса, чтобы не искать нслукапом соответствия вручную

Нереально. На одном ip может быть сотни имен, откуда ты узнаешь куда реально ходили? Только сквид.

anonymous
()

отрезолвить по возможности эти адреса, чтобы не искать нслукапом соответствия вручную.

CNAME что такое ты не знаешь, верно?

>>если length - это длина пакета...представление о потраченном трафике в байтах.

Этот лог для этого не подходит

>>Думаю, что помочь мне может только приблизительный текст программы.

Я с удовольствием напишу тебе скрипт за деньги. В Job.

adriano32 ★★★
()

Почему бы просто не поставить squid сделать авторизацию пользователей и парсить его логи чем-то готовым?

Кстати, если length - это длина пакета, то в каких единицах, есть идеи? Они бывают совершенно произвольными.

Неужели бывает over 9000?

mky ★★★★★
()
Ответ на: комментарий от dgeliko

Я не прошу всех бросаться делать за меня мою работу, я лишь прошу внимания тех, для кого это может быть интересно. Им - интерес, мне - помощь в решении проблемы. И речь не идёт о тексте программы, а всего лишь о приблизительном алгоритме. Если вам неинтересно тратить на это время, совершенно ни к чему писать ненужные мне комментарии. Если интересно, пишите то, что мне может помочь. Если это неинтересно никому, я переживу, но решать за меня, люблю ли я халяву и куда мне обращаться, не стоит.
Что касается Сквида, то его надо было поднимать заранее, но у меня не хватало на это времени катастрофически, поэтому приходится пока пользоваться тем, что есть - интересуют подключения за уже ПРОШЕДШИЙ месяц. (Если интересно, это - лог Astaro Security Gateway. Одно из решений для тех, кому некогда ковырять всё руками.)
Впрочем, общую тенденцию я уже понял: тема неинтересная, так что закрываю её.

Drevoborod
() автор топика
Ответ на: комментарий от Drevoborod

Тогда непонятно, в чем заключается вопрос. Приблизительный алгоритм - парсить строки на твоем любимом ЯВУ.

madcore ★★★★★
()
Ответ на: комментарий от adriano32

За мысль о cname спасибо. Я знаю о ней, но как-то заморочился и не подумал. Учту.

Drevoborod
() автор топика
Ответ на: комментарий от madcore

Приблизительный алгоритм, это:
5 шагов:
1) взять яблоко
2) идти прямо
3) повернуть направо
4) идти прямо
5) Положить яблоко

Моя просьба заключается в том, что указать, какими именно инструментами мне брать это самое яблоко. Например: Командой sort можно сделать то-то. И т.д. Слова «напишите программу» - это не алгоритм. Согласен, вопрос довольно расплывчатый, просто именно не хотел делать его более конкретным, чтобы не нарваться на обвинения в поиске халявы. Но всё-таки нарвался. Наверное, надо было подчеркнуть в первом посте то, что просьба принять участие исключительно желающих внести какой-то вклад, и вклад этот остаётся на усмотрение желающих.

Drevoborod
() автор топика
Ответ на: комментарий от Drevoborod

Ну вот тебе лобовой алгоритм, который можно реализовать средствами шела, например:
1. Берем строку лога
2. Выделяем из нее интересующие srcIP, dstIP, action и lenght
3. Если action == accepted, дописываем в файл с именем"srcIP_dstIP" строку lenght
4. П.1, пока не кончится лог
5. На выходе имеем набор файлов srcIP_dstIP, для которых остается просуммировать строки(как вариант, суммировать сразу в п.3)
6. ...
7. profit

Только есть ли уверенность, что логируются все пакеты, а не только NEW?

madcore ★★★★★
()
Ответ на: комментарий от madcore

М. Спасибо, попробуем. Единственно что: я не совсем хорошо представляю, какими именно командами это реализовывать :) Собственно, основная загвоздка именно в этом. Использовать для этого for ... do? Или как-то иначе? (напоминаю: я не программист. Совсем :)

Drevoborod
() автор топика
Ответ на: комментарий от Drevoborod

Drevoborod> Единственно что: я не совсем хорошо представляю, какими именно командами это реализовывать :) Собственно, основная загвоздка именно в этом. Использовать для этого for ... do? Или как-то иначе? (напоминаю: я не программист. Совсем :)

Оперировать тоже легко:

1. Наркоз
2. Разрез
3. Зажать сосуды
4. Вырезать (не)нужное
5. Зашить
6. ...
7. Профит

Ну что, непрофессионал, возьмешься себя оперировать или обратишься к профессионалу, заплатив за нужную тебе работу?

sdio ★★★★★
()
Ответ на: комментарий от sdio

Есть принципиальная разница. Ошибаться, разрезая людей, нельзя. А парся логи - сколько угодно, пока не научишься ;) Так что я научусь. Лично для себя мне это не надо, а заниматься тем, что уговаривать начальство кому-то заплатить, я не собираюсь. Это как-то неинтересно. И вообще, отставим философию. Есть конкретные мысли - милости просим, а для философствования есть флудотопики.

Drevoborod
() автор топика
Ответ на: комментарий от Drevoborod

Чисто ради интереса и чтобы показать, что анализировать логи всё-таки проще, чем оперировать, я разберусь в этом вопросе. И, когда разберусь, выложу сюда решение. Разумеется, любая работа стоит денег. Так что я понимаю желание некоторых товарищей заработать. Но я повторяю, что готовое решение не прошу, прошу всего лишь указать мне путь. Да, чем подробнее, тем лучше, но это совсем не просьба написать всё за меня. Есть желание - помогайте, нет - забейте. Но коммерческих предложений делать не надо.

Drevoborod
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.