Cgroup内核文档翻译(6)——Documentation/cgroup-v1/devices.txt

设备白名单控制器(Device Whitelist Controller)

1.说明:

实现一个cgroup来跟踪并强制执行对设备文件的打开和mknod限制。 设备cgroup将设备访问白名单与每个cgroup相关联。 白名单条目具有4个字段。 'type' 是 a (all), c (char), 或 b (block)。 'all'表示适用于所有类型以及所有major和minor数字。 major 和 minor 是整数或全部为*。 访问是r(read),w(write)和 m(mknod)的组合。

根设备 cgroup 以 rwm 开头为“all”。 子设备cgroup获取父设备的副本。 管理员然后可以从白名单中删除设备或添加新条目。 子级cgroup永远不会收到其父级拒绝的设备的访问权限。

 

2.用户接口

使用 devices.allow 添加条目,使用 devices.deny 删除条目。 例如

echo 'c 1:3 mr' > /sys/fs/cgroup/1/devices.allow

允许 cgroup 1读取并 mknod 通常称为 /dev/null 的设备。

echo a > /sys/fs/cgroup/1/devices.deny

将删除默认的 'a *:* rwm' 条目。 

echo a > /sys/fs/cgroup/1/devices.allow

会将 'a *:* rwm' 条目添加到白名单。

 

3.安全性

任何任务都可以在cgroup之间移动。 显然这是不够的,但是随着人们对此有所了解,我们可以决定适当限制运动的最佳方法。 我们可能只需要 CAP_SYS_ADMIN,至少与 CAP_MKNOD 是一个单独的位。 我们可能只想拒绝迁移到不是当前cgroup的后代的cgroup。 或者我们可能要使用 CAP_MAC_ADMIN,因为我们实际上是在尝试锁定root用户。

需要 CAP_SYS_ADMIN 来修改白名单或将另一个任务移至新的cgroup。 (再次,我们可能要更改它)。不能向cgroup授予比其父级更大的权限。

 

4.层次结构

设备cgroup通过确保cgroup的访问权限永远不会超过其父级来维护层次结构。 每次将条目写入 cgroup 的 devices.deny 文件时,其所有子级都会将该条目从其白名单中删除,并且将重新评估所有本地设置的白名单条目。 如果本地设置的白名单条目之一提供的访问权限大于cgroup的父级,则将从白名单中删除该条目。

例子:

      A
     / \
        B

    group        behavior    exceptions
    A            allow       "b 8:* rwm", "c 116:1 rw"
    B            deny        "c 1:3 rwm", "c 116:2 rwm", "b 3:* rwm"

如果一个设备在组A中被拒绝:

# echo "c 116:* r" > A/devices.deny

它会向下传播,并在重新验证B的条目之后,将删除白名单条目“c 116:2 rwm”:

    group        whitelist entries                denied devices
    A            all                              "b 8:* rwm", "c 116:* rw"
    B            "c 1:3 rwm", "b 3:* rwm"         all the rest

万一父母的例外发生了变化并且不再允许本地例外,它们将被删除。

请注意,不会传播新的白名单条目:

      A
     / \
        B

    group        whitelist entries             denied devices
    A            "c 1:3 rwm", "c 1:5 r"       all the rest
    B            "c 1:3 rwm", "c 1:5 r"       all the rest

当添加 "c *:3 rwm":

# echo "c *:3 rwm" > A/devices.allow

结果:

    group        whitelist entries           denied devices
    A            "c *:3 rwm", "c 1:5 r"     all the rest
    B            "c 1:3 rwm", "c 1:5 r"      all the rest

现在可能要向B添加新的条目:

# echo "c 2:3 rwm" > B/devices.allow
# echo "c 50:3 r" > B/devices.allow

甚至

# echo "c *:3 rwm" > B/devices.allow

一旦device cgroups拥有子代,就无法通过在 device.allow 或 devices.deny 中写入“a”来允许或拒绝所有操作。

 

4.1 层次结构(内部实现)

设备 cgroup 是通过使用行为(ALLOW,DENY)和例外列表在内部实现的。 使用相同的用户接口控制内部状态,以保持与以前的仅白名单实现的兼容性。 将减少对设备访问权限异常的删除或添加将在层次结构中向下传播。 对于每个传播的异常,将根据当前父级的访问规则重新评估有效规则。

 

5. 补充

5.1. 排查某个设备的问题时,把怀疑的进程分组进行排除。

5.2. Qcom手机没有使用devices这个cgroup

复制代码
# strings /dev/cgroup_info/cgroup.rc
blkio
/dev/blkio
cgroup2
/dev/cg2_bpf
/dev/cpuctl
cpuacct
/acct
cpuset
/dev/cpuset
freezer
/dev/freezer
memory
/dev/memcg
schedtune
/dev/stune
复制代码

 

posted on   Hello-World3  阅读(531)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示