我想控制使用声卡的权限。有设备“/dev/snd/*”,所有者是“root”,组是“audio”,权限是“660”。因此,我希望只有“audio”组中的用户才能使用声卡,但这行不通。我有一个用户“u1”,他不在“audio”组中,但他有访问权限!我发现访问是由 ACL 控制的,因此getfacl
显示以下内容:
# file: timer
# owner: root
# group: audio
# flags: --t
user::rw-
user:u1:rw-
group::rw-
mask::rw-
other::---
即使我用 删除它,“user:u1:rw-”这一行也会神奇地再次出现setfacl
。
对我来说,似乎有一个 root 拥有的进程,它会自动向任何用户添加权限,而忽略“音频”组成员身份。
为何授予访问权限?如何撤销用户对声卡的访问权限?
答案1
检查系统
要启用 ACL,必须使用 acl 选项挂载文件系统。ACL
选项很可能已作为文件系统的默认挂载选项处于活动状态。
检查输入(将 sdXY 替换为正确的分区):
sudo tune2fs -l /dev/sdXY | grep "Default mount options"
输出应该是这样的:
Default mount options: user_xattr acl
还要检查默认安装选项是否未被覆盖,如果被覆盖,您将在相关行中看到。输入noacl
:/proc/mounts
sudo cat /proc/mounts | grep noacl
如果需要,您可以使用 tune2fs -o option partion 命令设置文件系统的默认挂载选项,例如:
tune2fs -o acl /dev/sdXY
使用 ACL:
修改 ACL 使用setfacl
:
setfacl -m "u:username:permissions
或者
setfacl -m "u:uid:permissions
例如,要撤销用户对声卡的访问权限,请输入:
setfacl -m "u:u1:---" /dev/snd/controlC0
您可以轻松尝试是否有效,播放音轨,然后执行命令:如果声音中断,则表示命令已执行
您还可以使用以下命令检查权限是否已更改:
getfacl /dev/snd/controlC0 ( Control Interface /dev/snd/controlCX )
请参阅手册man acl
以 man setfacl
了解更多选项。
答案2
声音设备(和其他“座位”设备)的 ACL 由座位管理服务控制。对于 Ubuntu Xenial(16.04)及更早版本,此操作由 ConsoleKit 服务完成。对于更高版本,此操作由 systemd-logind 取代。这篇 Ubuntu 知识库文章解释了其中的原因。
从技术上讲,您可以通过更改 udev 规则(seat
从设备中删除“ ”)或使用 D-Bus API 从座位管理器设备数据库中删除设备(所有这些都来自 systemd-logind - 我不知道这与 ConsoleKit 有何关系),从座位定义中删除设备,但我想不出一种方法来阻止只有一个特定的登录本地用户访问设备,而其他本地登录用户可以访问设备。