将设备文件公开给在非特权用户帐户上运行的用户态应用程序的标准方法?

将设备文件公开给在非特权用户帐户上运行的用户态应用程序的标准方法?

我刚刚完成了第一个版本Linux内核模块我用 C 语言编写。该模块创建一个设备文件 ( /dev/wn0),用于控制带有三个 LED 灯的 USB 设备。例如,以 root 身份运行,我可以这样做:

echo "#ff0000" >/dev/wn0

...并且该设备将发出亮红色光。

我的问题是我希望非特权用户能够访问该设备(通过将数据写入/dev/wn0)。有没有标准的方法来做到这一点?是否像更改文件的权限一样简单/dev/wn0?这会产生安全问题吗?

答案1

好吧,我看到了一些可能性:

  • 最快的方法,POSIX 权限和所有权的全部要点:您希望某人能够读取和/或写入,您可以相应地设置权限。只需将这些人放入一个组中,然后将设备所有权更改为该组,并授予该组写入权限即可。如果您的服务器由 管理,您可能必须将其放入udev规则中。这就是某些工具的作用,例如 bluez 可以让用户使用蓝牙,或者至少这是我的发行版中使用的方法,除非我尝试使用“ConsoleKit”。/devudev

  • 如果设备很简单,大家都用没有问题,就可以让大家在上面写字。

  • 编写一个守护进程,以某个可以在设备上写入的用户身份启动,获取设备并通过更改其 UID 来放弃其特权,然后通过 TCP 等方式处理来自任何用户的请求。

  • 编写一个小的二进制文件来为设备写入,即setuid某个用户可以在设备上写入并让用户使用它来写入设备。这就是它mount的作用,它是setuidroot,因此普通用户可以在/etc/fstab允许的情况下挂载文件系统。

它不会创建任何额外的安全问题,只要您同意这些用户能够使用该设备即可。当然,任何有权访问该设备的人都可以利用该模块中的任何漏洞,但无论您如何授予人们访问它的权限,这都是可能的。如果您编写一个守护进程,则可以被利用。也许最好保持简单并确保您的代码不易受到攻击。

我想说,没有单一的标准方法可以做到这一点——UNIX 系统的某些部分有一些方法可以做到这一点,并且每个部分都以最方便的方式来解决所解决的问题。

相关内容