3

我有一个脚本,我想作为守护进程运行,监听低编号端口(< 1024)

脚本在 python 中,但 perl 中的答案也是可以接受的。

该脚本正在使用启动脚本中的start-stop-daemon进行守护,这可能会使答案复杂化

我真正(认为)不想要的是输入 ps -few 并看到该进程在其行上以“root”运行。

我该怎么做?

(从我对系统调用的了解不足的角度来看,我可以看到 3 条途径,

  1. 以 root 身份运行脚本(没有 --user/--group/--chuid 到 start-stop-daemon),并在它声明端口后让它降级它的用户
  2. 在脚本上设置 root (chmod u+s),并以运行用户身份运行脚本,(通过 --user/--group/--chuid 到 start-stop-daemon,启动脚本仍然必须调用为root),在脚本中,获取 root 权限,声明端口,然后恢复为普通用户
  3. 我不知道的其他事情

)

4

4 回答 4

2

“你不知道的东西”是“能力”,但正如其他地方提到的那样,能力不能很好地与使用 shebang 方法的脚本配合使用,所以这里没有太多答案。我会使用“绑定端口,然后删除权限”方法。

于 2010-04-04T12:27:24.600 回答
2

这个页面有一些代码让我找到了它,http://antonym.org/2005/12/dropping-privileges-in-python.html

我想设置 umask 是完成这项工作所必需的,这是这段代码似乎做的唯一我的尝试没有做的事情(我不确定设置 umask 的真正作用,在将其应用于进程的上下文中)

我把他的例子撕了一点,此外,那个页面是 2005 年的,所以我在这里重新发布我的工作解决方案,

def drop_privileges(uid_name='nobody', gid_name='nogroup'):
    # Get the uid/gid from the name
    running_uid = pwd.getpwnam(uid_name)[2]
    running_gid = grp.getgrnam(gid_name)[2]

    # Try setting the new uid/gid
    try:
        os.setgid(running_gid)
    except OSError, e:
        logging.error('Could not set effective group id: %s' % e)
        exit()

    try:
        os.setuid(running_uid)
    except OSError, e:
        logging.error('Could not set effective user id: %s' % e)
        exit()

    # Ensure a very convervative umask
    new_umask = 077
    old_umask = os.umask(new_umask)
    logging.info('drop_privileges: Old umask: %s, new umask: %s' % \
             (oct(old_umask), oct(new_umask)))

    final_uid = os.getuid()
    final_gid = os.getgid()
    logging.info('drop_privileges: running as %s/%s' % \
             (pwd.getpwuid(final_uid)[0],
              grp.getgrgid(final_gid)[0]))    
于 2010-04-04T13:44:21.190 回答
1

选项 1 是 Apache httpd 采用的路线。如果它对于世界上最流行的 Web 服务器来说足够好,那么对于自己的守护进程来说,它是值得认真考虑的。

于 2010-04-04T12:22:54.847 回答
0

您可以安装一个库,如果LD_PRELOAD-ed,它将伪造任何可执行文件(脚本或其他)的 root 权限:http: //fakeroot.alioth.debian.org/

在脚本上设置粘滞位权限(至少在我的经验中)没有效果;它是 ELF 二进制解释器(/usr/bin/python、/bin/sh、/usr/bin/perl 等)需要粘性权限才能工作。您可以做的是将二进制文件复制到另一个位置,在其上设置粘性位,然后将脚本的 bang line 指向它。

但是,如果您在正在执行的系统上没有 root 访问权限,则可以修改路由器设置以将 <1024 外部端口定向到 >=1024 内部端口。

编辑:我忘了提到这个小工具:redir。这是一个本地端口重定向服务。它甚至对 inetd 友好。

于 2010-04-04T12:30:47.370 回答