【问题标题】:Linux group scheduling for user not being applied to setuid-ed process未将用户的 Linux 组调度应用于 setuid 进程
【发布时间】:2010-12-27 14:47:43
【问题描述】:

在 2.6.28-11 Linux 内核上,我使用 setpriority 来调整不同用户进程接收的 cpu 时间量。用户 1 将获得用户 2 的两倍 CPU 功率。使用 Linux 的 setpriority,我为用户 2 分配了较低的优先级(在 nice 值方面较高)。当我在计算机负载下通过 shell 运行完全相同的程序时,用户 2 的执行时间是用户 1 的两倍。但是,如果我以 root 身份运行程序,然后使用 setuid、seteuid、setgid、setegid 和 setgroups 成为用户 2(计算机再次处于负载状态,用户 1 以相同的方式运行完全相同的程序) ,程序执行的时间完全相同;用户 2 的进程的调度时间不低于用户 1 的进程。我怎样才能解决这个问题?我是否需要为调度程序设置其他任何内容才能意识到该进程现在是不同用户的一部分?

正在运行的程序是用 Python 编写的。

【问题讨论】:

    标签: python linux scheduling scheduler setuid


    【解决方案1】:

    是的,这是设计的行为,即使它不是您想要的。如果您正常启动,您可以更新自己的优先级以匹配您应该继承的优先级:

    /* C */
    #include <sys/resource.h>
    int proc_prio = getpriority(PRIO_PROCESS, getpid()),
        pgrp_prio = getpriority(PRIO_PGRP, getpgrp()),
        user_prio = getpriority(PRIO_USER, getuid());
    setpriority(PRIO_PROCESS, getpid(),
        proc_prio < pgrp_prio ? pgrp_prio < user_prio ? user_prio
                                                      : pgrp_prio
                              : proc_prio < user_prio ? user_prio
                                                      : proc_prio);
    
    # Python
    import ctypes
    import os
    PRIO_PROCESS, PRIO_PGRP, PRIO_USER = 0, 1, 2
    libc = ctypes.CDLL('libc.so.6')
    libc.setpriority(PRIO_PROCESS, os.getpid(),
        max(libc.getpriority(PRIO_PROCESS, os.getpid()),
            libc.getpriority(PRIO_PGRP, os.getpgrp()),
            libc.getpriority(PRIO_USER, os.getuid())))
    

    当然,您也可以使用适当的权限修复另一个进程的优先级。

    【讨论】:

    • 感谢您的澄清。你有什么好的阅读材料可以涵盖 Linux 如何处理和优先级排序吗?鉴于您上面的解决方案确实有效,似乎无法确保所有用户 1 的进程仅使用 x% 的 cpu,如果他们有任何进程来自 setuid-编。这是真的吗?
    • 没有任何好的阅读材料,但setuid 检查的唯一内容是“我是 root* 并且目标 UID 的进程数是否少于 RLIMIT_NPROC?”。其他资源限制和优先级不被检查或触及。 *(实际上检查是“除非 LSM 禁止,我是否有 CAP_SETUID 并且如果我实际上正在更改真实 UID,目标是否少于 RLIMIT_NPROC 进程,或者指定的 UID 是否等于当前真实 UID 或已保存UID?”)
    • 在一定程度上,您可以查看 PROC_EVENT_UID 事件的 netlink 连接器以应用这些修复,但我认为您真正想要的是基于 UID 的 cpuset 和基于 cgroup 的调度。
    • 我已经按照您的建议通过 netlink 使用进程事件连接器实现了我想要的系统。当我发现 CFS(完全公平调度器)中有可靠的用户组调度时,我认为这值得进一步研究。我一定会查看基于 cgroup 的调度。再次感谢。
    猜你喜欢
    • 2020-12-22
    • 2013-09-03
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    相关资源
    最近更新 更多