Логирование Tshark по локальному имени пользователя - PullRequest
1 голос
/ 26 февраля 2020

Я пытаюсь приписать сетевой трафик c в дампе tshark с зарегистрированным пользователем, с которым связан соответствующий трафик c.

Я запускаю сервер Ubuntu на корпоративном сервере. сеть, в которой пользователи входят через RDP или S SH с переадресацией x. Мое приложение написано на bash и использует tshark для регистрации всего сетевого трафика c с помощью следующей команды:

 tshark -b filesize:1024 -w traffic.pcap

У меня есть некоторое время l oop, которое выполняется на задании chron для анализа через файлы pcap извлеките нужные мне поля и сохраните их в json:

for f in *.pcap
do
    tshark -r $f -T json > $f.json
    cat $f.json | jq .[]._source.layers | jq -r '.frame_time_epoch[],.frame_number[],.tcp_stream[],.ip_src[],.tcp_srcport[],.ip_dst[],.tcp_dstport[],.frame_len[],.frame_protocols[],.http_host[],.http_request_uri[],.http_request_method[],.http_user_agent[],.http_referer[],.dns_qry_name[],.dns_resp_name[],.ssl_handshake_extensions_server_name[],.x509sat_uTF8String[],.x509ce_dNSName,"END"' > injest.json
done

Вывод json, который выглядит следующим образом, затем отправляется в настроенный мной кластер Elasticsearch:

{
"layers": {
    "frame.time_epoch": ["1579755811.545369005"],
    "frame.number": ["3508"],
    "tcp.stream": ["0"],
    "ip.src": ["10.0.10.10"],
    "tcp.srcport": ["22"],
    "ip.dst": ["1.1.1.1"],
    "tcp.dstport": ["54116"],
    "frame.len": ["102"],
    "frame.protocols": ["eth:ethertype:ip:tcp:ssh"]
    }
}

Я хотел бы знать, могу ли я в любом случае добавить Linux имя пользователя, добавленное к захвату пакета, или в качестве дополнительного поля в конечном json перед отправкой в ​​ELK.

Другими словами, если оба пользователя 'user_a' и 'user_b' зарегистрированы на сервере, я бы хотел, чтобы их соответствующие inte rnet traffi c регистрировали там имена пользователей. Это вообще возможно с Tshark? Я читал, что iptables может «помечать» traffi c, но я не уверен, как именно он работает, и если он достигнет sh того, что я пытаюсь сделать.

1 Ответ

1 голос
/ 27 февраля 2020

Регистрация пользователей по отправленным пакетам

Хотелось бы узнать, есть ли у меня в любом случае Linux имя пользователя, добавленное к захвату пакета

Это возможно, добавив комментарий захвата, как описано ниже

или в качестве дополнительного поля в окончательном json перед отправкой в ​​ELK.

, пока это не так потому что tshark не знает, как показать вам параметры заголовка pcapng, даже если он может их прочитать (Wireshark может сделать это с reload as file format/capture).

Другими словами, если 'user_a' и 'user_b' оба зарегистрированы на сервере. Я бы хотел, чтобы их соответствующие inte rnet traffi c записывали свои имена пользователей. С tshark это вообще возможно?

Нет, с tshark это невозможно. Похоже, возможно , чтобы использовать auditl для получения PID, а затем найти пользователей, которые создали PID. Собрав таким образом имена пользователей, вы можете интегрироваться в приведенный ниже поток.

Добавление комментария захвата

Чтобы получить активные имена пользователей, вы можете использовать что-то вроде этого:

names="$(who | cut -d ' ' -f 1 | sort | uniq)"

Чтобы сохранить как часть захвата пакета, используйте команду tshark --capture-comment, чтобы добавить дополнительную информацию. Обратите внимание, что эта опция доступна только в том случае, если вы сохраняете как pcapng. Тип сохранения по умолчанию - pcapng. Если вы не уверены, вы можете использовать captype $file, где captype поставляется с Wireshark.

tshark -b filesize:1024 -w traffic.pcap --capture-comment "$names"

Извлечение комментария захвата

У tshark нет способа извлечь уровень комментария, поэтому я использую python, со знанием двоичного формата pcapng для извлечения комментария:

import struct

def read_header(infile, header_code):
  with open(infile, "rb") as f:
      filebytes = f.read()
  header_len = struct.unpack("iill", filebytes[:24])[1]
  header = filebytes[24:24+header_len]
  seek = 24
  while seek < header_len:
      opt_code, opt_length = struct.unpack("hh", filebytes[seek:seek+4])
      if opt_code == header_code:
          value = filebytes[seek+4:seek+4+opt_length].decode('utf-8')
          return value
      seek += 4 + opt_length
  return ""

comment_option_code = 1
comment = read_header("traffic.pcap", comment_option_code)
print(comment)

Предоставил user_a и user_b в $names, это будет затем напечатайте

user_a user_b

Добавление к JSON

Затем вы можете добавить данные к существующему json следующим образом:

echo '{"data": "values"}' | jq --arg names "${names}" '. + {users:$names}'
{
  "data": "values",
  "users": "user_a user_b"
}
...