如何在 USB 设备上设置 ACL?

如何在 USB 设备上设置 ACL?

我是 acl 的新手,所以这对我来说是黑魔法。但我有一台相机,我想跟它对话。

因此我得到了一台通过网络启动的 Debian 机器:

ulf@term13:~(0)$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 6.0.10 (squeeze)
Release:    6.0.10
Codename:   squeeze

我给那台机器装了一个摄像头:

ulf@term13:~(0)$ lsusb | grep Nikon
Bus 001 Device 092: ID 04b0:0428 Nikon Corp. 
ulf@term13:~(0)$ ls -alF /dev/bus/usb/001/092 
crw-rw-r--+ 1 root root 189, 91 25 sep 10.05 /dev/bus/usb/001/092

请注意+权限字符串末尾的crw-rw-r--+。这表明有一个访问控制列表在这里工作:

ulf@term13:~(1)$ getfacl /dev/bus/usb/001/092 
getfacl: Removing leading '/' from absolute path names
# file: dev/bus/usb/001/092
# owner: root
# group: root
user::rw-
user:knut:rw-
group::rw-
mask::rw-
other::r--

显然,用户 knutrw在这里拥有额外的权限。但是他是如何得到它们的呢?

我可以使用 为我的用户设置相同的权限setfacl。但无论设置什么,在重新连接相机后都不会出现。在打开和关闭相机后,它实际上会安装在另一台设备上:

ulf@term13:~(0)$ lsusb | grep Nikon
Bus 001 Device 093: ID 04b0:0428 Nikon Corp. 

但是新的 093 设备的权限与旧的 092 相同(没有我添加到 092 的任何额外权限)。

我认为有一个udev规则文件应该是负责的,但它是空的???

ulf@term13:~(0)$ ls -alF /etc/udev/rules.d/90-libgphoto2.rules 
-rw-r--r-- 1 root root 0 26 aug  2014 /etc/udev/rules.d/90-libgphoto2.rules

并且其他 udev 文件都没有任何与此相关的内容。

是否有某个文件对此进行了配置?这是由系统管理员设置的,但现在系统管理员已不再存在,所以我需要自己修复它。

答案1

显然,用户 knut 在这里拥有额外的 rw 权限。但他是如何获得这些权限的?

用户“knut”是否已在控制台登录?在许多最近的 Linux 系统上,udev根据当前登录的用户授予设备访问权限。

(此处“控制台”是指主显示器+键盘直接连接到计算机– 无论是文本模式还是图形模式都无关紧要。)

较旧版本(包括 Debian 6)具有规则,TAGS+="udev-acl"如果存在 ConsoleKit,则从 ConsoleKit 获取会话状态,否则从 pam_console 获取。检查who、的内容/var/run/console以及可能的内容ck-list-sessions。这些机制相对简单 - 如果用户登录到“控制台”,他们就可以访问,否则则不能。

使用 systemd 的发行版从systemd-logind并使用"uaccess"标签。除了控制台之外,logind 还支持“多座席”系统,其中多个用户可以同时在多个显示器上工作,每个显示器都分配有一个 USB 端口。

如果您想绕过这个问题并授予其他用户访问权限,您可以使用传统的“组”权限 - 编写一个 udev 规则将您的设备分配给该GROUP="camera-users"组并将人员添加到该组。

打开和关闭相机后,它实际上被安装在另一台设备上:

ulf@term13:~(0)$ lsusb | grep Nikon
Bus 001 Device 093: ID 04b0:0428 Nikon Corp. 

在 Linux(通常是 Unix)上,“mount”是指将文件系统附加到某个目录(“/dev/sda2 安装在 /boot 上” – /dev/sda2 包含的文件系统可在 /boot 上访问)。同时,USB 设备编号只是按顺序分配的数字;这并不构成“安装”设备。

答案2

好的,我看到了类似的行为。有一个 udev 规则:

$ cat /etc/udev/rules.d/50-blinkstick.rules 
# This file is installed by libbs to enable write access to BlinkStick devices
# to any seated user

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="41e5", TAG+="uaccess", TAG+="udev-acl"

# vim: ft=udevrules

确实,它使用了 uaccess。但是,如果我查看文件 (/dev/bus/usb/001/003),我会看到正常权限和授予“我”访问权限的 ACL。如果我通过另一个伪控制台 (ctrl-alt-Fn) 和另一个用户登录,我会看到授予“我”(不同 uid)访问权限的 ACL 条目。

因此,对于同一文件的不同用户,getfacl 将返回不同的 ACL:

1:这看起来是非常错误的行为

2:我没看到任何地方有记录“授予 seat0 的 RW 访问权限”?只有用户和组(一如既往)

AFYI:文件 /run/systemd/seats/seat0 的功能如下:

相关内容