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
原文地址:https://www.cnblogs.com/hellokitty2/p/14260223.html