zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Laravel 框架
    tp5
    jq关于对象类型的判断
    简易的 js 留言板
    学习任务
    实验报告:指针与地址
    C语言数据类型
    嗯,关于 nanxI 的50条~(算是自我介绍吧)
    初学C语言
    dropload.js
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/14260223.html
Copyright © 2011-2022 走看看