我有一个设备(视频卡),我只需要两个程序(表示为路径,例如/usr/bin/myprogram
)即可访问。
该设备有一个/dev
文件(例如/dev/mydev1
),但如果需要,我也可以使用其他参考(总线 ID、供应商/产品 ID 等)。
我可以做些什么(例如udev
规则)来阻止任何程序访问,除了我指定的程序之外?
答案1
经典的 UNIX 解决方案是创建一个系统组(例如groupadd -r vidcard
),然后将设备的权限设置为仅允许 root 和该组的成员访问它。在 Linux 中,这将采用 udev 规则的形式,/dev
每次启动时都会从头开始重新生成。该规则可能看起来像这样:
KERNEL=="mydev[0-9]*", MODE="0660", GROUP="vidcard"
最后,需要访问的程序需要将其组所有者设置为vidcard
并设置 setgid 位。所以:
chown root:vidcard /usr/bin/myprogram
chmod 2711 /usr/bin/myprogram # this results in permissions -rwx--s--x
普通用户应该不是被授予该vidcard
团体的成员资格。他们获得会员资格的唯一方法是参加竞选myprogram
。
如果myprogram
具有“运行 shell”功能或某种其他方式供用户运行他们选择的其他程序,那么这些 shell/其他程序可能会继承vidcard
组成员身份,除非myprogram
被编程为采取措施删除由该用户授予的额外权限。在启动其他程序之前设置 gid 位(setregid()
在 Linux 中)。