在Linux中打开原始套接字,无需setcap cap_net_raw

3 投票
2 回答
4275 浏览
提问于 2025-04-18 11:47

我想在Linux上打开一个原始套接字(用Python),但不想给Python程序这个cap_net_raw的权限。我希望这个权限是给用户的,而不是给程序的。我现在使用的是Ubuntu 12.4。

2 个回答

0

我也遇到过这个问题。看起来没有什么好的解决办法,特别是对于像Python这样的解释型语言。要么以管理员身份运行,要么就别捕获原始数据包。唯一能想到的办法就是把脚本当作一个后台进程来执行。

可以用这个命令来启动:

sudo service start snifferd

其中snifferd可以是类似这样的东西:

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/home/<user>/projects/sniffer.py
DAEMON_NAME=snifferd

case "$1" in
    start)
      log_daemon_msg "Starting $DAEMON_NAME"
      setcap cap_net_raw=+ep /usr/bin/python2.7
      start-stop-daemon --start --background --pidfile $PIDFILE --make-pid --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON
      setcap cap_net_raw=-ep /usr/bin/python2.7
      log_end_msg $?
    ;;
...

我尝试在初始化套接字之前在代码中执行setcap,然后在之后移除这个权限,但似乎Python在实例启动之前就需要这些权限。

还有一个链接 http://www.subspacefield.org/security/privilege/code/privilege/ 提到了一些权限降级的内容,但我还没有仔细研究过。

编辑 1
我刚试了一下。它可以工作,但如果后台进程在程序需要权限之前就把权限去掉了,程序就会失败。看来中间需要一些暂停之类的东西。

3

能力是和进程有关的(准确来说是线程),而不是和用户有关。

正如@wheredidthatnamecomefrom指出的,你可以利用环境能力来执行一个python脚本,只需要 cap_net_raw,而不需要给 python 这个程序设置任何文件能力。

你可以查看下面的问题,了解一下如何做到这一点。

撰写回答