抓包权限与 capabilities 是什么
抓包需要读取原始套接字,在 Linux 上对应 CAP_NET_RAW 能力。生产环境里长期放开 root 或 sudo 风险更大,更合适的做法是给 tcpdump 这个可执行文件单独授予 capabilities,或者用受限用户加文件能力组合。要注意:能力绑定在文件上,tcpdump 被升级或替换后能力会丢失,需要重新授权;授权范围也要定期审计,避免留下被遗忘的高能力二进制。
基本信息
| 适用平台 | Linux(setcap、getcap)+ 容器(--cap-add) |
|---|---|
| 所需能力 | CAP_NET_RAW 读原始套接字,部分场景还需 CAP_NET_ADMIN |
| 查看方式 | getcap /usr/sbin/tcpdump |
| 典型路径 | /usr/sbin/tcpdump 或 /usr/bin/tcpdump,按发行版不同 |
典型使用场景
- 生产机免 sudo 抓包:用最小能力授权替代长期 root
- 容器内抓包:确认容器是否具备 NET_RAW 与 NET_ADMIN
- 安全基线核查:审计哪些文件被授予了过高能力
- 升级后回归:tcpdump 更新后确认能力是否仍存在
- 受限用户排障:为特定用户提供抓包能力而不提升其整体权限
权限配置
权限配置
# 授予抓包所需能力(路径按发行版实际情况调整)
sudo setcap cap_net_raw,cap_net_admin+eip /usr/sbin/tcpdump
# 查看是否已授权
getcap /usr/sbin/tcpdump
# 容器内抓包需显式添加能力(谨慎使用)
docker run --rm --net=host --cap-add=NET_RAW --cap-add=NET_ADMIN nicolaka/netshoot tcpdump -i eth0 -c 5
# 验证:以普通用户执行抓包
id -u; tcpdump -i eth0 -c 1 -nn常见场景与要求
| 场景 | 需要的能力 | 备注 |
|---|---|---|
| 物理机普通用户抓包 | CAP_NET_RAW | 走 setcap 授权文件 |
| 容器抓包 | NET_RAW,必要时加 NET_ADMIN | 默认被丢弃,需显式添加 |
| 抓宿主机流量 | 还需共享宿主网络命名空间 | 仅加能力不够,需 --net=host |
| 带文件写入的抓包 | 通常仅 NET_RAW | 写文件权限由目录权限决定 |
给 tcpdump 授权前先确认它的真实路径:不同发行版可能是 /usr/sbin/tcpdump 或 /usr/bin/tcpdump,授权错文件不会生效,容易误判为权限配置失败。
审计与回退
审计与回退
# 列出系统中被授予能力的文件,用于安全基线核查
sudo getcap -r / 2>/dev/null | head -20
# 撤销错误或不再需要的授权
sudo setcap -r /usr/sbin/tcpdump
# 升级后核对能力是否仍然存在
dpkg -l tcpdump 2>/dev/null | tail -2
getcap /usr/sbin/tcpdump临时排查授权与例行安全审计要分开看待:前者只需 getcap 单点确认,后者要用 getcap -r 全盘扫描并纳入基线清单,避免能力长期积累却无人知晓。
给程序加 capabilities 会扩大攻击面:只对可信且版本固定的 tcpdump 授权,并在升级或替换二进制后立即重新执行 setcap,否则能力静默失效。