在没有setcap cap_net_raw的Linux中打开原始套接字

时间:2014-07-01 20:51:02

标签: python linux sockets raw-sockets linux-capabilities

我想在Linux(使用Python)中打开一个原始套接字,而不给Python提供cap_net_raw功能。我希望用户拥有此功能,而不是程序。我正在使用Ubuntu 12.4。

2 个答案:

答案 0 :(得分:0)

我也一直在努力解决这个问题。似乎没有任何好的解决方法,至少对于像python这样的解释性语言。要么以root身份运行,要么不要捕获原始数据包:)。我唯一能想到的就是将脚本作为守护进程执行。

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,并在之后删除了cap,但似乎python在实例启动之前需要权限。

还有http://www.subspacefield.org/security/privilege/code/privilege/因为我没有真正看过它。

编辑1 刚试了一下。它可以工作,但如果deamon在程序需要之前删除了该功能,它将失败。猜猜看,它需要某种停顿等等。

答案 1 :(得分:0)

功能与进程(线程准确)有关,而与用户无关。

正如@wheredidthatnamecomefrom所指出的,您可以利用环境功能仅使用cap_net_raw执行python脚本,而无需为python二进制文件设置任何文件功能。

您可以查看the following question有关如何执行此操作的一般概念。