为 Mono 应用程序提供提升权限的正确方法是什么?

为 Mono 应用程序提供提升权限的正确方法是什么?

我有一个 mono 应用程序(在 Ubuntu 上),它会跟踪 /var/log/messages 并获取 USB 插入,如果该设备位于某个端口上,则需要对其进行分区、格式化和挂载。显然,这需要 root 权限。我是 Linux 新手,我想知道实现这一点的“正确”方法是什么。

始终以 root 身份运行我的应用程序是否更好?或者,授予我的应用程序权限是否更好(或可能)卸载分开文件系统, 和以及我需要的任何其他仅限 root 的进程?

背景:
安装后,一些特定客户请求的文件将加载到驱动器中。每个驱动器都是唯一的,因此克隆将不起作用,而且我每周将支持数百个驱动器,所以我需要尽可能自动化。我意识到这很危险,所以是的,我会在机器上发出警告,所有驱动器都将被格式化。我使用 mono,因为它非常适合用 C# .net 编写的大型应用程序。

答案1

实际上,您无需拥有 root 权限即可执行此操作。事实上,我强烈建议不要让任何东西以 root 身份运行。这是我建议的最安全的方法。

  1. 编写一行 shell 脚本,chown在设备节点上向运行 Mono 应用程序的用户执行操作,或者chmod打开足够的世界或组权限,以便您的应用程序可以修改设备。
  2. 将脚本保存/usr/local/bin为 root 所有,并且用户不可写入。
  3. 添加一条规则sudoers,允许用户使用您的 Mono 应用程序运行您刚刚创建的脚本。
  4. 在您的应用程序检测到设备后,首先运行该脚本,sudo以便您的用户可以读取/写入该设备。
  5. 以用户身份在设备上执行所有操作!

注意:不要授予您的应用程序对、chmod或任何其他此类管理工具的 sudo 访问权限,只授予您编写的受保护的单一用途脚本的访问权限,该脚本仅在您的一台设备上打开权限。chownfdisk

答案2

除了 Caleb 的回答之外,对于和mountumount您不需要 root 权限来执行这些操作,只要您/etc/fstab使用“user,noauto”设置每个设备名称和挂载点(除了您需要的任何其他选项之外。user授予普通用户挂载和卸载设备的权限,noauto告诉启动过程不要在启动时尝试挂载所有设备……fsckdump列也应为 0)。您需要为每个设备创建一个条目和目录(例如,/mnt/sda1与一起使用/dev/sda1)。

如果要将这些文件格式化为 FAT,您可能可以完全忽略挂载。使用mkfs.msdos创建文件系统后,使用mtools直接编辑文件系统。查看 mtools 文档,至少有一个临时文件(我发现.mcwd)使得同时使用多个文件系统变得困难(每个进程都需要设置一个唯一的$MCWD环境变量来指向此文件的不同位置或文件名),因此请务必仔细阅读文档。

使用 ext2 文件系统,又出现了新的麻烦:用户和组所有权以及文件权限。解决此问题的最简单方法是在chown文件系统挂载后使用脚本来访问挂载点,就像 chown 设备文件的脚本一样。然后用户可以写入文件并使用 chmod 适当设置权限。这里的问题是驱动器的接收者可能没有匹配的用户,但只要您确保“其他”读/写/执行位正确,并且避免使用 suid/sgid 位,这主要是表面问题(除非他们确实有一个与您的 uid 匹配的用户,那么除非接收者立即更改权限,否则该人将能够写入驱动器)。

相关内容