1

在 linux 中,可以为实用程序分配某些用户/组,从而限制对它们的访问。我明白了,但是linux如何在系统调用级别应用权限。例如,如果我尝试通过 pthread_setschedparam 更改调度策略或提高线程的优先级,则调用将失败,除非我以 root 身份运行我的进程。

所以我的问题是linux中的哪个组件负责将权限应用于系统调用?如果我了解负责系统调用级别权限的组件,那么我可以请求系统管理员授予我的用户访问某些系统调用的权限。也许权限不是在系统调用中,而是在某些操作中,例如更改线程优先级。我需要告诉系统管理员什么,以便他可以让我有选择地访问这些操作?

4

4 回答 4

6

内核的源代码如下所示:

让我们以settimeofday()设置内核时间为例,这将需要root权限

有一个security_settime()检查安全性以设置时间的功能

它调用cap_settime() 使用该capable()函数

capable(int capability)[内核/capability.c]

这将检查当前用户是否有能力做某些事情,并且在设定时间的情况下,该上限是CAP_SYS_TIME


int do_sys_settimeofday(const struct timespec *tv, const struct timezone *tz)
{
    static int firsttime = 1;
    int error = 0;

    if (tv && !timespec_valid(tv))
        return -EINVAL;

    error = security_settime(tv, tz);
    if (error)
        return error;

    if (tz) {
        sys_tz = *tz;
        update_vsyscall_tz();
        if (firsttime) {
            firsttime = 0;
            if (!tv)
                warp_clock();
        }
    }
    if (tv)
        return do_settimeofday(tv);
    return 0;
}
于 2013-02-08T19:40:05.760 回答
1

这是不言自明的。系统调用是对内核的调用,因此内核负责将安全策略应用于某些系统调用。

从 Linux 2.6 开始,Linux 安全模块 (LSM) 框架已经到位,允许开发模块来控制内核中的某些访问。使用 LSM 的最常见的实现可能是SELinux。另一个已知的实现是AppArmor

此外,一些capabilities(7)内置于 2.6+ 内核的功能允许您控制某些特权系统调用是否可以由非特权用户执行。

于 2013-02-08T19:42:20.887 回答
1

在 pthread_setschedparam(3) 的特定情况下,答案取决于 Linux 内核版本,并且有点复杂。查看由. _ _sched_setscheduler(2)pthread_setschedparam(3)

通常,使用某些系统调用的权限可能由调用者的capabilites(7)

于 2013-02-08T19:49:55.103 回答
0

一旦 CPU 跳入内核空间,它就会有效地以root[*] 运行。

也就是说,它的工作方式与您从用户角度考虑的方式完全相反:root内核空间代码始终在运行,而不是以普通用户身份运行并且不得不以某种方式提升自己以访问您通常无法访问的文件/设备因为root并且必须进行用户权限检查,以确保它将代表用户所做的事情限制为仅允许该用户执行的操作。


[*]当然,像 SELinux 这样的MAC系统会对此进行修改。

于 2013-02-11T19:52:33.697 回答