Linux t按本地用户名共享日志记录

Linux t按本地用户名共享日志记录,linux,ubuntu,iptables,packet-capture,tshark,Linux,Ubuntu,Iptables,Packet Capture,Tshark,我试图在tshark转储中将网络流量与相应流量关联的登录用户进行属性化 我在一个公司网络上运行一个Ubuntu服务器,用户可以通过RDP或带有x-forwarding的SSH登录。我的应用程序是用bash编写的,并使用tshark使用以下命令记录所有网络流量: tshark -b filesize:1024 -w traffic.pcap 然后,我在chron作业上运行了一个while循环来解析pcap文件,提取我想要的字段,并将它们保存到json: for f in *.pcap do

我试图在tshark转储中将网络流量与相应流量关联的登录用户进行属性化

我在一个公司网络上运行一个Ubuntu服务器,用户可以通过RDP或带有x-forwarding的SSH登录。我的应用程序是用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用户名发送给ELK之前,是否可以将其添加到数据包捕获或作为最终json中的附加字段

换句话说,如果“user_a”和“user_b”都登录到服务器,我希望它们各自的internet流量记录在这些用户名上。这对tshark有可能吗?我已经读到iptables可以“标记”流量,但我不确定它到底是如何工作的,以及它是否能完成我试图做的事情。

通过发送的数据包记录用户 我想知道是否有任何方法可以将Linux用户名添加到数据包捕获中

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

或者在发送给ELK之前作为最终json中的附加字段

这并不是因为tshark不知道如何显示pcapng头选项,即使它可以读取它们(Wireshark可以通过
以文件格式重新加载/capture
)来实现)

换句话说,如果'user_a'和'user_b'都登录到服务器,我希望他们各自的internet流量记录他们的用户名。这对tshark有可能吗

不,这在tshark是不可能的。看起来像是使用auditctl获取PID,然后查找创建PID的用户。通过收集用户名,您可以集成到下面的流程中

添加捕获注释 要获取活动用户名,您可以使用如下内容:

names=“$(who | cut-d'-f1 | sort | uniq)”
要保存为数据包捕获的一部分,请使用tshark的--capture注释添加其他信息。请注意,此选项仅在另存为pcapng时可用。默认保存类型为pcapng。如果您不确定,可以使用
captype$file
,其中captype随Wireshark一起提供

tshark -b filesize:1024 -w traffic.pcap --capture-comment "$names"
提取捕获注释 tshark没有提取捕获级别注释的方法,因此我使用python,并了解如何提取注释:

导入结构
def read_标题(填充,标题代码):
以开放式(填充“rb”)作为f:
filebytes=f.read()
header_len=struct.unpack(“iill”,filebytes[:24])[1]
header=filebytes[24:24+header\u len]
搜索=24
当搜索
如果在
$names
中提供了用户a和用户b,则将打印此文件

用户a用户b
添加到JSON 然后,您可以将数据附加到现有json中,如下所示:

echo'{“data”:“values”}| jq--arg names“${names}”.+{用户:$names}'
{
“数据”:“值”,
“用户”:“用户a用户b”
}

将用户名添加到数据包捕获与将用户名添加到要发送到elasticsearch部署的tshark输出不同。如果这里涉及到bash,那么您应该将其包括在内,以便这个问题是关于堆栈溢出(即与编程相关)的主题,并提供更多的上下文。感谢您的回答。是的,我有一系列bash脚本,运行Tshark,保存输出,并将其发送到ELK.Good。您的问题下方有一个编辑按钮。您还应该阅读Stack Overflow's和.Edited,其中包括代码片段,并解释了应用程序当前的工作方式以及我正在尝试完成的工作。谢谢,这非常有用,但我想更进一步。您提供的解决方案将列出特定网络通信时的所有活动用户。我想实际将网络流量归因于特定的用户。在以下示例中:“user_a”和“user_b”都已登录到服务器;'用户_a'请求;'用户_b'向发出请求;我希望能够将stackoverflow流量归因于“user_a”,将github流量归因于“user_b”。更新了答案以更好地回答您的问题。谢谢,我将尝试一下您的解决方案,看看是否可以在中构建它。我会让你知道事情的进展!令人惊叹的!如果这回答了您的问题,请将其标记为。谢谢,我能够使用您的建议将用户PID添加到网络流中。我感谢你的帮助!