用户root
是否绕过内核中的能力检查,或者root
从 Linux 2.2 开始用户是否受到能力检查?
root
如果某些功能从其功能集中删除,应用程序是否可以检查并拒绝用户的访问?
默认情况下,root 用户拥有全套功能。
我问的原因如下,除了man capabilities
:
Privileged processes bypass all kernel permission checks
然而,没有说明这个规则在 Linux 2.2 发布后是否仍然有效。
额外的:Docker 在启动新容器时会删除 root 用户的某些功能。但是Docker默认不使用用户命名空间,那么root
用户的能力是如何恢复的呢?
man capabilities
:
为了执行权限检查,传统的 UNIX 实现区分两类进程:特权进程(其有效用户 ID 为 0,称为超级用户或 root)和非特权进程(其有效 UID 不为零)。特权进程绕过所有内核权限检查,而非特权进程则受到基于进程凭据(通常:有效 UID、有效 GID 和补充组列表)的完全权限检查。
从内核 2.2 开始,Linux 将传统上与超级用户相关的权限划分为不同的单元,称为功能,可以独立启用和禁用。能力是每个线程的属性。
答案1
用户root
的能力可能受到限制。从capabilities(7)
:
如果有效用户 ID 从非零更改为 0,则允许集将复制到有效集。
这意味着在能力模型中,成为root
用户并不授予所有权限,这与传统模型不同。 Linux 2.2及更高版本中使用了能力模型。
进程的边界功能集是从其父进程继承的。当 Docker 从启动容器的线程的边界集中删除功能时,容器的这些功能也会被删除,从而影响该容器的每个进程,无论是对于用户root
还是其他进程。root
当容器内的用户获得用户 ID 0(在由 创建的给定命名空间中)时,容器内的用户将继承剩余的功能clone(2)
。
这些功能的范围受到传递给 的参数的限制clone(2)
,这些参数为各种子系统创建新的命名空间; cgroup;以及任何其他安全子系统,例如 AppArmor 或 SELinux。
答案2
我认为你应该将第一段的全部内容视为对“旧方式”的描述,将第二段视为对当前情况(过去 21 年左右)的描述。
为了执行权限检查的目的,传统 UNIX 实现区分两类进程:[...]特权进程绕过所有内核权限检查
从内核 2.2 开始Linux 将传统上与超级用户相关的权限划分为不同的单元,称为功能,可以独立启用和禁用。能力是每个线程的属性。