我正在评估如何以尽可能少的权限以更安全的方式使用 tcpdump。两种可能性:
1.-Z
选项
如果 tcpdump 以 root 身份运行,则在打开捕获设备或输入保存文件之后,但在打开任何保存文件进行输出之前,请将用户 ID 更改为 user,将组 ID 更改为用户的主要组。
此行为也可以在编译时默认启用。
Afaik tcpdump 打开网络接口以混杂模式进行嗅探,并-r
使用 root 可能打开一个文件(标志),但会更改用户权限前开始任何进一步的输出。
这应该最大限度地减少可能的攻击媒介,因为解析网络流量和可能的恶意网络数据包是作为非特权用户完成的。例如,如何让用户nobody
确保最低权限:
tcpdump -i wlan0 -s 0 -Z nobody src portrange 1-80
2.setcap
用于按照建议setcap
添加文件功能CAP_NET_ADMIN
, CAP_NET_RAW
to/usr/sbin/tcpdump
这里和这里:
sudo su
groupadd pcap
usermod -a -G pcap $USER
chgrp pcap /usr/sbin/tcpdump
chmod 750 /usr/sbin/tcpdump
setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
比较
上述解决方案似乎是相互排斥的:-Z
选项文档指出,只有当 tcpdump 以 root 身份运行时,才会进行用户切换。
我看到解决方案 2 的缺点:恶意代码仍然拥有 tcpdump 和CAP_NET_ADMIN
/ 的用户权限CAP_NET_RAW
。所以我倾向于解决方案1。
你怎么认为?
答案1
你的第一个解决方案是优越的。当 tcpdump 下降到非 root 用户时,它也会失去您列出的功能(以及所有其他功能)。如果您想限制任何受损的 tcpdump 进程造成的损害,那么使用它-Z
是一个很好的开始,并且比以 root 权限运行要好得多。
请注意,该nobody
用户不应用作通用“非特权”用户。这是因为以该用户身份运行的所有内容都将能够相互干扰。最好专门为 tcpdump 创建一个新用户,并添加您想要的所有限制并删除那用户代替。
如果您想要进一步的安全性,可以在 chroot 中设置它(请注意,只有当进程没有特权时,这才提供安全性,否则它可以逃离 chroot),或者强制访问控制(例如 AppArmor 或 SELinux),以最大限度地减少流氓文件系统使用权。 Rlimits 也很聪明,因为某些漏洞利用需要分配大量资源。如果 RLIMIT_AS 较低,则无法利用需要分配 2 GiB 内存才能触发的缓冲区大小的整数溢出!
最后,意识到 tcpdump 发送了一个带通滤波器当内核运行时。然后,BPF 过滤器会自动运行,并且内核仅在过滤器匹配时将数据包返回到 tcpdump。由于 tcpdump 支持大量协议,并且每个协议都有复杂的解析器,因此严格的过滤器仅匹配确切地您想要的将使代码更难被利用。要监视 10.0.0.1 和 10.0.0.0/24 中任意一个之间的 ICMP 流量,请使用icmp and host 10.0.0.1 net 10.0.0.0/24
而不是host 10.0.0.1
。这两种方法都会捕获一台主机和网络之间的 ICMP 流量,但后者可能允许 10.0.4.6 上的攻击者利用 tcpdump 的 FTP 解析代码中的错误。虽然前者不能阻止攻击者发送恶意流量,但它将要阻止内核处理 tcpdump 数据包并要求其解码。