通过本地用户名进行 Tshark 日志记录

Tshark logging by local username

我正在尝试将 tshark 转储中的网络流量归因于与相应流量关联的登录用户。

我是 运行 公司网络上的 Ubuntu 服务器,用户可以通过 RDP 或 SSH 使用 x-forwarding 登录。我的应用程序是用 bash 编写的,并使用 tshark 使用以下命令记录所有网络流量:

 tshark -b filesize:1024 -w traffic.pcap

然后我有一个在 chron 作业上运行的 while 循环来解析 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' 都登录到服务器,我希望他们各自的互联网流量记录用户名。这对 tshark 来说有可能吗?我读过 iptables 可以 "tag" 流量,但我不确定它到底是如何工作的,以及它是否能完成我正在尝试做的事情。

通过发送的数据包记录用户

I'd like to know if there is anyway I can have the Linux username added to the packet capture

这可以通过添加如下详述的捕获注释来实现

or as an additional field in the final json before it is sent to ELK.

虽然这不是因为 tshark 不知道如何向您显示 pcapng header 选项,即使它可以读取它们(Wireshark 可以用 reload as file format/capture 做到这一点)。

In other words if 'user_a' and 'user_b' are both logged into the server I'd like their respective internet traffic to log their usernames. Is this at all possible with tshark?

不,tshark 做不到这一点。貌似it's possible使用auditctl获取PID,然后找到创建PID的用户。有了这样收集到的用户名,您就可以整合到下面的流程中了。

添加捕捉评论

要获取活动用户名,您可以使用如下方式:

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

要保存为数据包捕获的一部分,请使用 tshark 的 --capture-comment 添加附加信息。请注意,此选项仅在您另存为 pcapng 时可用。默认 save-type 是 pcapng。如果不确定,可以使用 captype $file,其中 captype 是 Wireshark 自带的。

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

提取捕获评论

tshark 没有办法提取 capture-level 评论,所以我使用 python,了解 pcapng's binary format 来提取评论:

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)

$names 中提供 user_a 和 user_b,然后将打印

user_a user_b

添加到 JSON

然后您可以将数据附加到现有的 json,如下所示:

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