设备白名单控制器(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